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

999 lines
16 KiB
Plaintext

;
; S:EDIT4
;
; Miscellaneous junk
;
; Save coordinates
;
SAVECOOR LDX XCOOR
LDY YCOOR
STX RESTCOOR+1
STY RESTCOOR+3
RTS
;
; Restore coordinates
;
RESTCOOR LDX #00
LDY #00
STX XCOOR
STY YCOOR
RTS
;-----------
;
; Special shape routine
;
; X=0:draw line
; 2:draw box (rectangle)
; 4:draw oval (elipse)
; 6:move reference lines
;
; The initial corner of the shape
; is XCOOR,YCOOR which is stored
; in X1,Y1. Then XCOOR,YCOOR is
; "rubber-banded" around to form
; a rectangle in which the shape
; is drawn. This second coordinate
; is X2,Y2. (XCOOR,YCOOR)
;
^9 ADR DRAWLINE
ADR DRAWBOX
ADR DRAWOVAL
ADR REFMOVER
;
DOSHAPE LDA <9+0,X
STA SHAPEMOD+1
LDA <9+1,X
STA SHAPEMOD+2
;
BCS >0
LDX XCOOR
LDY YCOOR
STX X1
STY Y1
;
; Save graphic in TEMPBUFF
; for later reference
;
^0 LDY #0
LDX #4
JSR BUFFMOVE
;
; Main frame loop
;
SHAPLOOP LDX XCOOR
LDY YCOOR
JSR DEVICEST
;
SHAPLOP2 JSR SETFLASH
;
^0 LDY #2
JSR DEVICERD
BCS >2
ASL
BMI >1
BCS SHAPCR
^1 JSR SHAPEDEV
;
^2 JSR POLEKEY
BMI >3
;
DEC FLASHLO
BNE <0
DEC FLASHHI
BPL <0
BMI SHAPLOP2
;
^3 PHA
JSR RESETBIT
PLA
LDX XCOOR
LDY YCOOR
JSR PARSE
.DA #'I',SHAPUP
.DA #$0B,SHAPUP
.DA #'M',SHAPDOWN
.DA #$0A,SHAPDOWN
.DA #'J',SHAPLEFT
.DA #$08,SHAPLEFT
.DA #'K',SHAPRITE
.DA #$15,SHAPRITE
.DA #'N',SHAPNEG
.DA #'O',SHAPOVMD
.DA #CR,SHAPCR
.DA #ESC,SHAPESC
BRK
JMP SHAPLOP2
;-----------
SHAPESC JSR SHAPEREM
SEC
HEX 90
SHAPCR CLC
RTS
;-----------
SHAPUP DEY
BPL SHAPDONE
;
SHAPDOWN INY
CPY YMAX
BLT SHAPDONE
BGE SHAPUP
;
SHAPDONE JSR SHAPENEW
JMP SHAPLOOP
;
SHAPLEFT DEX
BPL SHAPDONE
;
SHAPRITE INX
CPX XMAX
BLT SHAPDONE
BGE SHAPLEFT
;-----------
;
; See if device moved
;
SHAPEDEV CPX XCOOR
BNE >0
CPY YCOOR
BNE >0
RTS
;
^0 PLA
PLA
JSR SHAPENEW
JMP SHAPLOP2
;
SHAPENEW STX >1+1
STY >2+1
JSR RESETBIT
JSR SHAPEREM
^1 LDX #00
^2 LDY #00
JSR DEVCLAMP
;
; Fall into put new shape
;
; Put or Remove shape from graphic
;
SHAPEPUT LDX PLOTX
HEX 2C
SHAPEREM LDX #PLTEMP
JSR SETPLOT
LDA PLOT
PHA
LDA #$4C
STA PLOT
LDX X1
LDY Y1
STX OLDXCOOR
STY OLDYCOOR
LDX XCOOR
LDY YCOOR
STX X2
STY Y2
SHAPEMOD JSR $FFFF
LDX X2
LDY Y2
STX XCOOR
STY YCOOR
PLA
STA PLOT
JMP DOFONTRF
;-----------
;
; Line handler
;
DRAWLINE JSR LINENORM
JSR >0
JSR LINE
;
LINEMIRR LDY #MRPLOT
LDA /MRPLOT
BNE >0
;
LINENORM LDY #PLOT
LDA /PLOT
;
^0 STY LINETYPE+1
STA LINETYPE+2
RTS
;-----------
;
; Box handler (rectangle)
;
DRAWBOX JSR LINENORM
LDX X2
LDY Y1
JSR >0
LDY Y2
JSR >0
LDX X1
JSR >0
LDY Y1
JSR >0
JMP LINEMIRR
;
^0 STX XCOOR
STY YCOOR
JSR LINE
LDX XCOOR
LDY YCOOR
STX OLDXCOOR
STY OLDYCOOR
RTS
;-----------
;
; Toggle black/white
;
SHAPNEG JSR SHAPEREM
LDA PLOTX
EOR #PLSET^PLCLR
TAX
JSR SETPLTX2
JMP >0
;-----------
;
; Toggle oval mode
;
SHAPOVMD JSR SHAPEREM
LDA OVALMOD
EOR #$80
STA OVALMOD
^0 JSR SHAPEPUT
JMP SHAPLOP2
;
; Oval handler (elipse)
;
DRAWOVAL LDA X1
LDX X2
JSR DRAWOVL2
STA OVXC
STX OVXR
LDA Y1
LDX Y2
JSR DRAWOVL2
STA OVYC
STX OVYR
JMP OVAL
;
; Given A,X
; return A=center, X=radius
;
DRAWOVL2 LDY #$80
OVALMOD = *-1
BMI >1
STA TMP0
STX TMP1
CMP TMP1
BLT >0
STX TMP0
STA TMP1
;
^0 LDA TMP1
SEC
SBC TMP0
TAY
LSR
TAX
CLC
ADC TMP0
RTS
;
; Center oriented oval
;
^1 PHA
STX TMP0
SEC
SBC TMP0
BCS >2
EOR #$FF
ADC #1
^2 TAX
PLA
RTS
;-----------
;
; Print Shop Companion
; Graphic Editor+ "print" routine
;
CRLF = $1803
SENDGC = $1806
GCOUT = $1809
;
PRZ EPZ $80
;
PRTYCOOR EPZ PRZ
PRTBUILD EPZ PRZ+1
PRTCOUNT EPZ PRZ+2
;
PRINTGR JSR SAVECOOR
;
LDA #0
;
; Output a single line of the graphic
;
PRTLOOP1 STA PRTYCOOR
;
; Tell printer how many bytes are
; coming, then send out 32 zeros
;
LDX #32+88
LDY /32+88
JSR SENDGC
;
LDY #32
^0 LDA #$00
JSR GCOUT
DEY
BNE <0
;
LDX #0
;
; Output a byte of the line
;
PRTLOOP2 STX XCOOR
LDY PRTYCOOR
LDX #0
STX PRTBUILD
;
^0 STX PRTCOUNT
STY YCOOR
;
JSR BASECALC
AND (BUFLO),Y
BEQ >1
LDY PRTCOUNT
LDA BITS7,Y
ORA PRTBUILD
STA PRTBUILD
^1 LDY YCOOR
INY
LDX PRTCOUNT
INX
CPY #52
BEQ >2
CPX #7
BLT <0
;
^2 STX PRTSPACE
LDA PRTBUILD
JSR GCOUT
;
LDX XCOOR
INX
CPX #88
BLT PRTLOOP2
;
LDX #00
PRTSPACE = *-1
LDY #1
JSR CRLF
LDA PRTYCOOR
CLC
ADC #7
CMP #52
BLT PRTLOOP1
;
; Be a nice guy and set the spacing
; back to 6 chars per inch.
;
LDX #12
LDY #0
JSR CRLF
;
JMP RESTCOOR
;
BITS7 HEX 40201008040201
;-----------
;
; Draw text on graphic
; --------------------
;
; Spacing between characters
;
TXCSPACE = 2
TXYSPACE = 8
TXXMAX = 86
TXYMAX = 45
;
TXZ EPZ $80
;
TXFONTLO EPZ TXZ
TXFONTHI EPZ TXZ+1
TXCWIDTH EPZ TXZ+2
TXCHITE EPZ TXZ+3
TXBYTE EPZ TXZ+4
TXBITS EPZ TXZ+5
TXXSTART EPZ TXZ+6
TXPOINT EPZ TXZ+7
TXGKFLAG EPZ TXZ+8
TXCHAR EPZ TXZ+9
;
; Borrow buffers from fill routine
;
TXCHRBUF = TEMPBUFF
TXXBUF = XSTACK
TXYBUF = YSTACK
;
DRAWTEXT JSR SAVECOOR
;
; Make sure X,Y are good values
;
LDA XCOOR
CMP #TXXMAX+1
BLT *+4
LDA #TXXMAX
STA XCOOR
STA TXXSTART
;
LDA YCOOR
CMP #TXYMAX+1
BLT *+4
LDA #TXYMAX
STA YCOOR
;
LDX #0
STX TXPOINT
;
TEXTLOOP JSR GKTEXT
;
STA TXCHAR
LDX TXPOINT
INC TXPOINT
STA TXCHRBUF,X
LDA XCOOR
STA TXXBUF,X
LDA YCOOR
STA TXYBUF,X
LDA TXCHAR
;
CMP #CR
BEQ TEXTCR
CMP #ESC
BEQ TEXTESC
CMP #8
BEQ TEXTBS
CMP #127
BEQ TEXTBS
;
CMP #' '
BLT TEXTERR
CMP #'@'
BEQ TEXTERR
CMP #'Z'+1
BGE TEXTERR
;
; Attempt to draw character
;
JSR TEXTSET
BCC TEXTADDX
;
; Didn't fit, so do a CR
;
JSR TEXTCR2
BCS TEXTERR
;
; Try again
;
LDA TXCHAR
JSR TEXTSET
BCC TEXTADDX
;
TEXTERR DEC TXPOINT
JSR BOOP
JMP TEXTLOOP
;
; Add width to XCOOR.
;
TEXTADDX ADC XCOOR
ADC #TXCSPACE
CMP #TXXMAX+1
STA XCOOR
BLT TEXTLOOP
JSR TEXTCR2
JMP TEXTLOOP
;
; Process backspace
;
TEXTBS TXA
BEQ TEXTERR
DEX
STX TXPOINT
JSR TEXTBS2
BEQ >0
JSR TEXTUNDO
BCC >0
JSR TEXTCR2
LDA TXCHAR
JSR TEXTUNDO
JSR TEXTBS2
^0 JMP TEXTLOOP
;
TEXTBS2 LDX TXPOINT
LDA TXXBUF,X
STA XCOOR
LDA TXYBUF,X
STA YCOOR
LDA TXCHRBUF,X
STA TXCHAR
CMP #CR
RTS
;
; Quit the text routine
;
TEXTESC JMP RESTCOOR
;
; Do CR when pressed.
;
TEXTCR JSR TEXTCR2
BCS TEXTERR
JMP TEXTLOOP
;
; Do a CR, if too far then exit
; with SEC, else, update XCOOR,YCOOR.
;
TEXTCR2 LDA YCOOR
CLC
ADC #TXYSPACE
CMP #TXYMAX+1
BCS >0
STA YCOOR
LDA TXXSTART
STA XCOOR
^0 RTS
;
; GETKEY with flashing "I"
;
GKTEXT ASL TXGKFLAG
^0 INC TXGKFLAG
JSR TEXTCURS
JSR FLSHINIT
;
; Flash cursor half-fast
;
ASL FLASHLO
ROL FLASHHI
;
^1 JSR POLEBTN
BMI >2
DEC FLASHLO
BNE <1
DEC FLASHHI
BPL <1
BMI <0
;
^2 PHA
LSR TXGKFLAG
BCC >3
JSR TEXTCURS
^3 PLA
RTS
;
; Draw cursor (letter I)
;
TEXTCURS INC XCOOR
INC XCOOR
JSR >0
DEC XCOOR
DEC XCOOR
^0 LDA #'I'
;
LDX #PLEOR
HEX 2C
;
; Given char in A, eor it into
; the graphic.
;
; Return with SEC=too wide
; CLC=ok, A=width of this char
;
TEXTSET LDX PLOTX
HEX 2C
TEXTUNDO LDX #PLUNDO
PHA
JSR SETPLOT
PLA
;
SEC
SBC #$20
TAX
LDA FONTADRL,X
STA TXFONTLO
LDA FONTADRH,X
STA TXFONTHI
;
; If this character goes over too
; far to right, exit with SEC.
;
LDA FONTWITH,X
STA TXCWIDTH
CLC
ADC XCOOR
CMP #TXXMAX+2
BGE TEXTEOR9
;
; If SPACE, then exit now!
;
TXA
BEQ TEXTEOR8
;
LDA FONTHITE,X
STA TXCHITE
;
LDA YCOOR
PHA
;
; Do one line of the char
;
^0 LDA XCOOR
PHA
LDA TXCWIDTH
PHA
;
; Get a byte from the FONT data
;
^1 LDY #0
LDA (TXFONTLO),Y
STA TXBYTE
INC TXFONTLO
BNE *+4
INC TXFONTHI
LDA #8
STA TXBITS
;
^2 ASL TXBYTE
BCC >3
;
JSR PLOT
;
^3 INC XCOOR
DEC TXCWIDTH
BEQ >4
DEC TXBITS
BNE <2
BEQ <1
;
^4 PLA
STA TXCWIDTH
PLA
STA XCOOR
INC YCOOR
DEC TXCHITE
BNE <0
;
PLA
STA YCOOR
TEXTEOR8 LDA TXCWIDTH
CLC
TEXTEOR9 RTS
;-----------
;
LZ EPZ $80
;
LINEDIR EPZ LZ
LINECONT EPZ LZ+1
;
; Draw a line between
; (OLDXCOOR,OLDYCOOR) - (XCOOR,YCOOR)
;
; Find delta X and delta Y
;
LINE LDX #$7F
LDA XCOOR
SEC
SBC OLDXCOOR
BCS >0
EOR #$FF
ADC #1
INX
^0 STX LINEDIR
STA DELTAX
;
LDA YCOOR
CLC
SBC OLDYCOOR
BCC >1
EOR #$FF
ADC #$FE
^1 STA DELTAY
ROR LINEDIR
SEC
SBC DELTAX
STA LINECONT
EOR #$FF
LSR
;
LDX OLDXCOOR
LDY OLDYCOOR
STX XCOOR
STY YCOOR
;
SEC
BCS >1
;
LINEMOVX BVC >0
DEC XCOOR
DEC XCOOR
^0 INC XCOOR
^1 ADC #00
DELTAY = *-1
;
^2 PHA
PHP
LINETYPE JSR MRPLOT
PLP
PLA
;
INC LINECONT
BEQ >4
;
BIT LINEDIR
BCS LINEMOVX
BMI >3
DEC YCOOR
DEC YCOOR
^3 INC YCOOR
ADC #00
DELTAX = *-1
BVC <2
;
^4 RTS
;-----------
;
; Modified Bresenham circle
; draw routine.
;
; Modified to do ellipses.
;
; 06/18/85 Roland Gustafsson
;
OZ EPZ $80
;
OVXC EPZ OZ
OVYC EPZ OZ+1
OVXR EPZ OZ+2
OVYR EPZ OZ+3
OVYADDLO EPZ OZ+4
OVYADDHI EPZ OZ+5
OVDLO EPZ OZ+6
OVDHI EPZ OZ+7
OVX EPZ OZ+8
OVY EPZ OZ+9
OVY1 EPZ OZ+10
OVY1F EPZ OZ+11
OVY2 EPZ OZ+12
OVY2F EPZ OZ+13
OVA1 EPZ OZ+14
OVA2 EPZ OZ+15
;
; Divide routine
;
ACC1LO EPZ OZ+16
ACC1HI EPZ OZ+17
ACC2LO EPZ OZ+18
ACC2HI EPZ OZ+19
REMLO EPZ OZ+20
REMHI EPZ OZ+21
;
; Draw an oval on the screen
;
; given: OVXR=X radius
; OVYR=Y radius
; OVXC=X center
; OVYC=Y center
;
OVAL LDX OVXR
CPX OVYR
BCS >0
LDY OVYR
STY OVXR
STX OVYR
^0 ROR OVSWAP
;
; Compute (YD*256)/XD
;
LDY #0
LDA OVYR
LDX OVXR
;
STY OVX
STY OVY2
STY OVY2F
STX OVY
STX OVDLO
STA OVY1
STY OVY1F
;
STX ACC2LO
STY ACC2HI
JSR DIVIDE
STY OVYADDLO
STA OVYADDHI
;
; D = 3-2*Y
;
ASL OVDLO
LDA #3
SEC
SBC OVDLO
STA OVDLO
LDA #0
SBC #0
STA OVDHI
;
; Main oval loop
;
OVLOOP LDA OVX
CMP OVY
BGE OVDONE
JSR OVPLOT
LDA OVX
BIT OVDHI
BPL >0
;
; D=D+4*X+6
;
ASL
ASL
ADC #6
BNE OVADDD
;
; D=D+4*(X-Y)+10
;
^0 SEC
SBC OVY
TAX
LDA #0
SBC #0
TAY
TXA
ASL
ASL
CLC
ADC OVDLO
STA OVDLO
TYA
ADC OVDHI
STA OVDHI
;
DEC OVY
;
LDA OVY1F
SEC
SBC OVYADDLO
STA OVY1F
LDA OVY1
SBC OVYADDHI
STA OVY1
JSR OVPLOT
;
LDA #10
;
OVADDD CLC
ADC OVDLO
STA OVDLO
BCC *+4
INC OVDHI
;
INC OVX
;
LDA OVY2F
CLC
ADC OVYADDLO
STA OVY2F
LDA OVY2
ADC OVYADDHI
STA OVY2
JMP OVLOOP
;
; If X=Y then plot points
;
OVDONE BNE OVPLRTS
;
; Plot 8 points around oval
;
OVPLOT LDX OVX
LDY OVY1
JSR OVPLOT1
LDX OVY
LDY OVY2
;
; If special flag set, then swap
; coordinate offsets.
;
OVPLOT1 STX OVA1
STY OVA2
LDA #00
OVSWAP = *-1
BMI >0
STY OVA1
STX OVA2
;
; (X,Y)
;
^0 CLC
LDA OVXC
ADC OVA1
PHA
TAX
LDA OVYC
ADC OVA2
TAY
JSR PLOTXY
;
; (-X,Y)
;
LDA OVXC
SBC OVA1
TAX
JSR PLOTXY
;
; (-X,-Y)
;
LDA OVYC
SBC OVA2
TAY
JSR PLOTXY
;
; (X,-Y)
;
PLA
TAX
;
; Plot a point, ignoring values
; that are too big.
;
PLOTXY STX XCOOR
STY YCOOR
CPX XMAX
BGE >0
CPY YMAX
BGE >0
JSR PLOT
^0 LDX XCOOR
LDY YCOOR
SEC
OVPLRTS RTS
;-----------
;
; 16 bit divide routine
;
; ACC1=ACC1/ACC2, remainder in REM
;
; Enter with A=hi, Y=lo
; ACC2LO,HI set
;
; Return with result in A=hi, Y=lo
;
DIVIDE STY ACC1LO
STA ACC1HI
LDA #0
STA REMLO
STA REMHI
LDY #16
^0 ASL ACC1LO
ROL ACC1HI
ROL REMLO
ROL REMHI
SEC
LDA REMLO
SBC ACC2LO
TAX
LDA REMHI
SBC ACC2HI
BCC >1
STX REMLO
STA REMHI
INC ACC1LO
^1 DEY
BNE <0
LDY ACC1LO
LDA ACC1HI
RTS
;-----------
;
;
;
USR "EDIT,S4",ORG
END