PrintShopCompanion-Apple-II/PSC Source Disk 2 - Editors.../S_BOEDIT5.txt

294 lines
5.0 KiB
Plaintext

;
; S:BOEDIT5
;
; Here is the nifty flood-fill
; routine. (Same as in Dazzle Draw)
;
FLZ EPZ $80
;
FLTMP0 EPZ FLZ
FLINVERT EPZ FLZ+1
FLXMIN EPZ FLZ+2
FLXMAX EPZ FLZ+3
FLMASK EPZ FLZ+4
FLSTACK1 EPZ FLZ+5
FLSTACK2 EPZ FLZ+6
;
FLODFILL LDA XCOOR
PHA
LDA YCOOR
PHA
;
LDY #47
LDA #0
^0 STA FFBUFFER,Y
DEY
BPL <0
;
STA FLSTACK1
STA FLSTACK2
STA FLINVERT
;
JSR FLODPUSH
JSR FLGETBIT
STA FLINVERT
;
; Main recursive routine:
;
FLODMAIN JSR FLODPULL
;
; If we've already been here,
; then don't bother checking
;
JSR FLGETBIT
LDA FLMASK
AND FFBUFFER,Y
BNE FLODRDON
;
; Fill left
;
LDA XCOOR
PHA
^0 DEC XCOOR
BMI >1
JSR FLODCHEK
BEQ <0
;
; Fill right
;
^1 LDX XCOOR
INX
STX FLXMIN
PLA
STA XCOOR
;
^2 JSR FLODCHEK
BNE >3
INC XCOOR
LDA XCOOR
CMP #XMAX
BLT <2
;
; Now scan above and below
;
^3 LDA XCOOR
STA FLXMAX
;
INC YCOOR
JSR FLODSCAN
DEC YCOOR
DEC YCOOR
JSR FLODSCAN
;
; Is stack empty?
;
FLODRDON LDA FLSTACK1
CMP FLSTACK2
BNE FLODMAIN
PLA
STA YCOOR
PLA
STA XCOOR
RTS
;---
;
; Scan a line for new runs
;
FLODSCAN LDA YCOOR
CMP #YMAX
BGE >2
LDA FLXMAX
STA XCOOR
;
^0 JSR FLDECGET
BNE <0
LDA FLMASK
AND FFBUFFER,Y
BNE >1
JSR FLODPUSH
;
^1 JSR FLDECGET
BEQ <1
BNE <0
;
^2 RTS
;
BITS8 HEX 8040201008040201
;
FLODCHEK JSR FLGETBIT
BNE >9
;
; Get bit from pattern
;
LDA YCOOR
AND #7
STA FLTMP0
LDA CURRPATT
ASL
ASL
ASL
ADC FLTMP0
TAX
LDA FILLPATT,X
STA FLTMP0
LDA XCOOR
AND #7
TAX
LDA BITS8,X
AND FLTMP0
BEQ >0
LDA FLMASK
^0 STA FLTMP0
;
; Set bit in temp buffer
;
LDA FLMASK
ORA FFBUFFER,Y
STA FFBUFFER,Y
;
; Set bit in edit buffer
;
LDA FLMASK
EOR #$FF
AND (BORDER),Y
;
ORA FLTMP0
STA (BORDER),Y
JSR PLOTOFF
LDA FLTMP0
BEQ >8
JSR PLOTON
^8 LDA #0
^9 RTS
;
; Push current point on stack
;
FLODPUSH LDY FLSTACK1
LDA XCOOR
STA FFSTACK,Y
LDA YCOOR
STA FFSTACK+1,Y
INC FLSTACK1
INC FLSTACK1
RTS
;
; Pull next point from stack
;
FLODPULL LDY FLSTACK2
LDA FFSTACK,Y
STA XCOOR
LDA FFSTACK+1,Y
STA YCOOR
INC FLSTACK2
INC FLSTACK2
RTS
;
; Decrement X, check for min
;
FLDECGET LDA XCOOR
CMP FLXMIN
BNE >0
PLA
PLA
RTS
;
^0 DEC XCOOR
;
; Check bit
;
FLGETBIT JSR GETMASK
STA FLMASK
AND (BORDER),Y
PHP
PLA
EOR FLINVERT
AND #2
RTS
;-----------
;
; Increment pattern pointer
;
NEXTPATT INC CURRPATT
SHOWFILL LDA #01
CURRPATT = *-1
CMP #FILLPATS/8
BNE >0
LDA #0
^0 STA CURRPATT
LDY PAGENUM
CPY #3
BNE >1
JSR SHOWPATT
^1 RTS
;
; Fill patterns:
;
FILLPATT HEX FFFFFFFFFFFFFFFF
HEX 55AA55AA55AA55AA
HEX 8822882288228822
HEX 8800220088002200
HEX 8000080080000800
HEX 0000000000000000
HEX 8010022001084004
;
HEX FF808080FF080808
HEX 8040200002040800
HEX 8244384482010101
HEX F87422478F172271
HEX FF000000FF000000
HEX 8888888888888888
HEX 081C22C180010204
HEX 40A00000040A0000
HEX 8080413E080814E3
HEX 0102040810204080
FILLPATS = *-FILLPATT
;-----------
;
; Display current pattern on screen
;
SHOWPATT ASL
ASL
ASL
STA TMP0
LDA #8
STA TMP1
LDX #FFYLOC
;
^0 LDA YBASELO,X
STA HIRES1
LDA YBASEHI,X
STA HIRES1+1
;
LDY TMP0
INC TMP0
LDA FILLPATT,Y
EOR #$FF
PHA
ASL
PHP
LDY #FFXLOC
LDA (HIRES1),Y
ASL
ASL
PLP
ROR
LSR
STA (HIRES1),Y
PLA
AND #$7F
TAY
LDA FLIPPER,Y
LDY #FFXLOC+1
STA (HIRES1),Y
INX
DEC TMP1
BNE <0
RTS
;-----------
;
;
;
USR "BOEDIT,S4",ORG
;
ICL "S:COMMON"