PrintShopCompanion-Apple-II/PSC Source Disk 1 - System .../S_EDIT2.txt

982 lines
16 KiB
Plaintext

;
; S:EDIT2
;
; The main editor calls here to
; get a key and let the editor
; do it's job.
;
EDITLOOP LDX XCOOR
LDY YCOOR
STX OLDXCOOR
STY OLDYCOOR
JSR DEVICEST
^0 JSR SETFLASH
;
^1 LDY #2
JOYMOD = *-1
JSR DEVICERD
BCS >2
;
STA BUTTON
JSR DODEVICE
LDA #1
BIT BUTTON
BMI >3
;
^2 LDA #0
STA CNSTRAIN
JSR POLEKEY
BMI KEYPRESS
LDA #2
;
^3 STA JOYMOD
DEC FLASHLO
BNE <1
DEC FLASHHI
BPL <1
BMI <0
;
; Since didn't match one of our
; commands, then return calling
; program and let it handle this
; key.
;
NOTOURS LDA KEYGOT
JMP LOCKOFF
;
; Process keypress
;
KEYPRESS STA KEYGOT
JSR RESETBIT
LDY #$FD
^0 INY
INY
INY
LDA COMMANDS,Y
BEQ NOTOURS
AND #$7F
CMP #00
KEYGOT = *-1
BNE <0
;
; If a "LOCKstopper", then doit!
;
CPY #LOCKSTOP-COMMANDS
BLT >1
JSR LOCKOFF
;
; If move command, and lockmode
; is on, plot!
;
^1 CPY #MOVECOM?-COMMANDS
BGE >1
LDA #00
LOCKMODE = *-1
BPL >1
TYA
PHA
JSR MRPLOT
PLA
TAY
;
^1 LDA COMMANDS+1,Y
STA >4+1
LDA COMMANDS+2,Y
STA >4+2
;
LDA COMMANDS,Y
BPL >3
;
JSR BUFFSAVE
;
^3 LDX XCOOR
LDY YCOOR
;
^4 JSR $FFFF
JMP EDITLOOP
;-----------
;
; Handle input device
;
; First check to see if it moved
;
DODEVICE CPX XCOOR
BNE >0
CPY YCOOR
BEQ >3
;
; Device moved
;
^0 LDA CNSTRAIN
BPL >1
;
; Figure out which direction
; to constrain
;
LDA #1
CPX XCOOR
BEQ *+3
ASL
STA CNSTRAIN
;
^1 STX >1+1
STY >2+1
JSR RESETBIT
LDX XCOOR
LDY YCOOR
STX OLDXCOOR
STY OLDYCOOR
^1 LDX #00
^2 LDY #00
JSR DEVCONST
;
; If button down, plot new point
; else, just plot cursor.
;
BIT BUTTON
BMI DOBUTTON
BPL SETFLASH
;
; End up here if device didn't move.
; If button is not down or if button
; was down last time, then exit.
;
^3 STX OLDXCOOR
STY OLDYCOOR
BIT BUTTON
BPL DEVRTS
BVS DEVRTS
;
; Handle button press
;
DOBUTTON BVS >0
;
; Button down for first time, so
; get bit and invert.
;
LDA LOCKMODE
STA CNSTRAIN
JSR BUFFSAVE
JSR SETPLOTX
;
; Draw a line from
; (OLDXCOOR,OLDYCOOR) to
; (XCOOR,YCOOR)
;
^0 JSR LINE
;
; Invert current position and
; set countdown timer
;
SETFLASH JSR GRFLASH
JSR FLSHINIT
;
; Show coordinates
;
LDA XCOOR
LDX #4
LDY #185
JSR NUMBER
LDA YCOOR
LDX #10
LDY #185
JMP NUMBER
;
DEVRTS RTS
;
; Device input constrain
; but only when the constrain
; feature is selected.
;
DEVCONST BIT DEVRTS
LDA CNSTRAIN
BEQ DEVCLAMP
;
LSR
BCC >0
;
; Constrain X?
;
CPX XCOOR
BEQ DEVCLMP2
LDX XCOOR
CLV
BVC DEVCLMP2
;
; Constrain Y?
;
^0 CPY YCOOR
BEQ DEVCLMP2
LDY YCOOR
CLV
BVC DEVCLMP2
;
; Device input clamping
;
DEVCLAMP BIT DEVRTS
DEVCLMP2 CPX XMAX
BLT >0
CLV
LDX XMAX
DEX
^0 CPY YMAX
BLT >1
CLV
LDY YMAX
DEY
^1 STX XCOOR
STY YCOOR
BVS DEVRTS
JMP DEVICEST
;-----------
;
; Commands followed by their
; locations in memory
;
COMMANDS .DA #'I',MOVEUP
.DA #$0B,MOVEUP
.DA #'M',MOVEDOWN
.DA #$0A,MOVEDOWN
.DA #'J',MOVELEFT
.DA #$08,MOVELEFT
.DA #'K',MOVERITE
.DA #$15,MOVERITE
MOVECOM?:
.DA #'L'-$40,TOGGLOCK
.DA #"D",GRSET
.DA #"E",GRCLEAR
LOCKSTOP:
;
.DA #'W',SCRLUP
.DA #'Z',SCRLDOWN
.DA #'A',SCRLLEFT
.DA #'S',SCRLRITE
;
.DA #"1",INSEROW
.DA #"2",DELEROW
.DA #"3",INSECOLU
.DA #"4",DELECOLU
;
.DA #'H',FLIPHORI
.DA #'V',FLIPVERT
.DA #'N',GRINVERS
.DA #"F",FLODFILL
.DA #'P',NEXTPATT
.DA #'X',NEXTMIRR
;
.DA #'U',UNDO
;
BRK
;-----------
;
; Swap UNDO buffer with EDIT buffer
;
UNDO LDY #EDITBUFF
LDA /EDITBUFF
STY TMP0
STA TMP1
LDY #UNDOBUFF
LDA /UNDOBUFF
STY TMP2
STA TMP3
LDY #0
LDX #0
;
^0 LDA (TMP0),Y
PHA
LDA (TMP2),Y
STA (TMP0),Y
PLA
STA (TMP2),Y
CPX #2
BNE >1
CPY #59
BEQ >2
^1 INY
BNE <0
INC TMP1
INC TMP3
INX
BNE <0
;
^2 JMP SHOWGR
;-----------
;
; Keyboard cursor move
;
MOVEUP DEY
BPL MOVEDONE
LDY YMAX
DEY
BNE MOVEDONE
;
MOVEDOWN INY
CPY YMAX
BLT MOVEDONE
LDY #0
;
; Set new coordinates
;
MOVEDONE STX XCOOR
STY YCOOR
RTS
;
MOVELEFT DEX
BPL MOVEDONE
LDX XMAX
DEX
BNE MOVEDONE
;
MOVERITE INX
CPX XMAX
BLT MOVEDONE
LDX #0
BEQ MOVEDONE
;-----------
;
; Delete row
;
DELEROW LDA YCOOR
STA TMP5
JSR INITBOT2
LDY #11
BNE >0
;
; Insert row
;
INSEROW LDA YCOOR
STA TMP5
JSR INITBOTT
LDY #$F5
;
^0 LDA YMAX
SEC
SBC TMP5
TAX
DEX
JSR MOVEALL
;
LDY #10
LDA #0
^1 STA (BUFLO),Y
DEY
BPL <1
LDA TMP5
STA YCOOR
JMP SHOWGR
;
; Scroll down
;
SCRLDOWN LDA YCOOR
PHA
JSR INITBOTT
LDY #$F5
JSR MOVEALL
PLA
STA YCOOR
BPL SCRLDONE
;
; Scroll up
;
SCRLUP JSR INITTOP
;
LDY #11
JSR MOVEALL
;
; Restore line, redraw
;
SCRLDONE LDY #10
^0 LDA TEMPBUFF,Y
STA (BUFLO),Y
DEY
BPL <0
JMP SHOWGR
;
; Init pointer to bottom
;
INITBOTT LDY YMAX
DEY
STY YCOOR
INITBOT2 JSR BASECALC
JMP SCRLSAVE
;
; Init pointer to top
;
INITTOP LDY #EDITBUFF
LDA /EDITBUFF
STY BUFLO
STA BUFHI
STY TMPLO
STA TMPHI
;
; Bottom or Top line save for
; scroll routines
;
SCRLSAVE LDY #10
^0 LDA (BUFLO),Y
STA TEMPBUFF,Y
DEY
BPL <0
LDX YMAX
DEX
RTS
;
; Given A,Y = add, X=# of lines
;
; move from BUF->TMP
;
MOVEALL STY >1+1
TXA
BEQ >4
LDA #$FF
CPY #$F5
BEQ >0
LDA #$00
^0 STA >2+1
;
^0 LDA BUFLO
STA TMPLO
CLC
^1 ADC #00
STA BUFLO
LDA BUFHI
STA TMPHI
^2 ADC #00
STA BUFHI
LDY #10
^3 LDA (BUFLO),Y
STA (TMPLO),Y
DEY
BPL <3
DEX
BNE <0
^4 RTS
;
; Insert Column
;
INSECOLU LDY #>0
LDA />0
JMP DOLINES
;
^0 LDA TEMPBUFF,X
STA TEMPBUFF+1,X
DEX
BMI >1
CPX XCOOR
BGE <0
^1 LDA #0
INX
STA TEMPBUFF,X
RTS
;
; Delete Column
;
DELECOLU LDY #>0
LDA />0
JMP DOLINES
;
^0 LDY XCOOR
^1 LDA TEMPBUFF+1,Y
STA TEMPBUFF,Y
INY
DEX
BMI >2
CPX XCOOR
BGE <1
^2 LDA #0
STA TEMPBUFF,Y
RTS
;
; Scroll left
;
SCRLLEFT LDY #>0
LDA />0
JMP DOLINES
;
^0 LDA TEMPBUFF
PHA
^1 LDA TEMPBUFF+1,Y
STA TEMPBUFF,Y
INY
DEX
BPL <1
PLA
STA TEMPBUFF,Y
RTS
;
; Scroll right
;
SCRLRITE LDY #>0
LDA />0
JMP DOLINES
;
^0 LDA TEMPBUFF+1,X
PHA
^1 LDA TEMPBUFF,X
STA TEMPBUFF+1,X
DEX
BPL <1
PLA
STA TEMPBUFF
RTS
;-----------
;
; Flip vertical
;
FLIPVERT LDA YCOOR
PHA
JSR INITTOP
JSR INITBOTT
TXA
LSR
TAX
;
^0 LDY #10
^1 LDA (TMPLO),Y
PHA
LDA (BUFLO),Y
STA (TMPLO),Y
PLA
STA (BUFLO),Y
DEY
BPL <1
;
LDA TMPLO
CLC
ADC #11
STA TMPLO
BCC >2
INC TMPHI
^2 LDA BUFLO
SEC
SBC #11
STA BUFLO
BCS >3
DEC BUFHI
^3 DEX
BPL <0
PLA
STA YCOOR
JMP SHOWGR
;
; Flip horizontal
;
FLIPHORI LDY #>0
LDA />0
JMP DOLINES
;
^0 INX
^1 LDA TEMPBUFF,X
PHA
LDA TEMPBUFF,Y
STA TEMPBUFF,X
PLA
STA TEMPBUFF,Y
DEX
STX >2+1
INY
^2 CPY #00
BLT <1
RTS
;
; Invert buffer
;
GRINVERS LDY #>0
LDA />0
JMP DOLINES
;
^0 INX
^1 LDA TEMPBUFF,X
EOR #1
STA TEMPBUFF,X
DEX
BPL <1
RTS
;-----------
;
; General purpose line mod routine
;
DOLINES STY DOLINESB+1
STA DOLINESB+2
LDY #EDITBUFF
LDA /EDITBUFF
STY BUFLO
STA BUFHI
LDA YMAX
DOLINELP PHA
LDX #0
STX TMP0
;
^1 LDY TMP0
INC TMP0
LDA (BUFLO),Y
STA TMP1
LDY #8
;
^2 DEY
BMI <1
ASL TMP1
ROL
STA TEMPBUFF,X
INX
CPX XMAX
BLT <2
;
DEX
DEX
LDY #0
DOLINESB JSR $FFFF
;
LDX #0
STX TMP0
;
^1 LDY #8
;
^2 DEY
BPL >3
LDY TMP0
STA (BUFLO),Y
INC TMP0
BNE <1
;
^3 ROR TEMPBUFF,X
ROL
INX
CPX XMAX
BLT <2
;
^4 DEY
BMI >5
ASL
BPL <4
;
^5 LDY TMP0
STA (BUFLO),Y
;
LDA BUFLO
CLC
ADC #11
STA BUFLO
BCC >6
INC BUFHI
^6 PLA
SEC
SBC #1
BNE DOLINELP
JMP SHOWGR
;-----------
;
; Set bit when "D" is pressed
;
GRSET LDX #PLSET
LDA #$16
BNE >0
;
; Clear bit when "E" is pressed
;
GRCLEAR LDX #PLCLR
LDA #$18
;
^0 PHA
JSR SETPLOT
JSR MRPLOT
PLA
TAY
;
; Click the speaker
;
^0 LDX #7
^1 LDA $C030
TYA
JSR WAIT
DEX
BNE <1
RTS
;-----------
;
; 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 JSR SAVECOOR
LDY #4
JSR BUFFCLR
LDA #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 (TBUFLO),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
JSR DOFONTRF
JMP RESTCOOR
;
; 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 (TBUFLO),Y
BNE >1
JSR FLODPUSH
;
^1 JSR FLDECGET
BEQ <1
BNE <0
;
^2 RTS
;
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
AND FLMASK
STA FLTMP0
;
; Set bit in temp buffer
;
LDA FLMASK
ORA (TBUFLO),Y
STA (TBUFLO),Y
;
; Set bit in edit buffer
;
LDA FLMASK
EOR #$FF
AND (BUFLO),Y
;
ORA FLTMP0
STA (BUFLO),Y
LDA FLMASK
JSR RESETBT2
LDA #0
^9 RTS
;
; Push current point on stack
;
FLODPUSH LDY FLSTACK1
LDA XCOOR
STA XSTACK,Y
LDA YCOOR
STA YSTACK,Y
INC FLSTACK1
RTS
;
; Pull next point from stack
;
FLODPULL LDY FLSTACK2
LDA XSTACK,Y
STA XCOOR
LDA YSTACK,Y
STA YCOOR
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 BASECLCT
STA FLMASK
AND (BUFLO),Y
PHP
PLA
EOR FLINVERT
AND #2
RTS
;-----------
;
SHOWXLOC = 37
FILLPLOC = 39
;
; Increment pattern pointer
;
NEXTPATT INC CURRPATT
SHOWFILL LDA #01
CURRPATT = *-1
CMP #FILLPATS/8
BNE >0
LDA #0
^0 STA CURRPATT
LDY #FILLPLOC
STY SHOWYLOC
LDY #FILLPATT
LDX /FILLPATT
JMP SHOWPATT
;
; 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
;
; Increment mirror pointer
;
MIRRPLOC = 50
;
NEXTMIRR INC CURRMIRR
SHOWMIRR LDA #00
CURRMIRR = *-1
CMP #4
BNE >0
LDA #0
^0 STA CURRMIRR
LDY #MIRRPLOC
STY SHOWYLOC
LDY #MIRRPATT
LDX /MIRRPATT
JMP SHOWPATT
;
; Mirror patterns:
;
MIRRPATT HEX FFFFFFFFFFFFFFFF
HEX E7E7E70000E7E7E7
HEX FFFFFF0000FFFFFF
HEX E7E7E7E7E7E7E7E7
;-----------
;
; Turn off lock mode
;
LOCKOFF STX >0+1
STY >1+1
STA >2+1
LDA LOCKMODE
BPL >2
;
; Toggle lock mode
;
TOGGLOCK LDA LOCKMODE
EOR #$80
STA LOCKMODE
BPL SHOWLOCK
;
; If we are turning on lock mode,
; then save graphic in UNDOBUFF
; and use opposite color of
; current X,Y.
;
JSR BUFFSAVE
JSR SETPLOTX
;
; Show lock mode
;
SHOWLOCK JSR PRINT
BYT RTOSBLAK,39,9,1,9,0
LDA LOCKMODE
BPL >0
JSR PICDRAW
BYT 39,9,1,9
HEX 1C222222C17777777F
^0 LDX #00
^1 LDY #00
^2 LDA #00
^3 RTS
;
;
;
ICL "S:EDIT3"