mirror of
https://github.com/photogrammer/PrintShopCompanion-Apple-II.git
synced 2024-09-27 09:55:09 +00:00
587 lines
9.8 KiB
Plaintext
587 lines
9.8 KiB
Plaintext
|
;
|
||
|
; S:PCAL2
|
||
|
;
|
||
|
; Low-level print buffer routines
|
||
|
; -------------------------------
|
||
|
;
|
||
|
; Install calendar buffer hooks:
|
||
|
;
|
||
|
; INSCFONT : install calendar font
|
||
|
; INSUFONT : install user font
|
||
|
; -------------------------------
|
||
|
; CLRPBUFF : clear print buffer
|
||
|
; PRINBUFF : print buffer to printer
|
||
|
; -------------------------------
|
||
|
;
|
||
|
ROWBUF = $8E00-32
|
||
|
;
|
||
|
STRZ EPZ $50
|
||
|
;
|
||
|
PIXAD EPZ STRZ
|
||
|
XCUR EPZ STRZ+2
|
||
|
WCOUNT EPZ STRZ+4
|
||
|
PBUFLO EPZ STRZ+5
|
||
|
PBUFHI EPZ STRZ+6
|
||
|
XBYTE EPZ STRZ+7
|
||
|
COLORTMP EPZ STRZ+8
|
||
|
; thru 12 available!
|
||
|
YCUR EPZ STRZ+16
|
||
|
;
|
||
|
;PIXAD :pointer into font data
|
||
|
;XCUR :16 bit x-coordinate
|
||
|
;WCOUNT :starts as bit width of line
|
||
|
; but is converted to bytes.
|
||
|
;PBUF :pointer into planes
|
||
|
;XBYTE :byte offset into plane
|
||
|
;COLORTMP:color to use for current line
|
||
|
; (each line different for rainbow)
|
||
|
;
|
||
|
;-----------
|
||
|
;
|
||
|
; Install calendar line draw routine
|
||
|
;
|
||
|
; Calendar font
|
||
|
;
|
||
|
INSCFONT JSR STINSTAL
|
||
|
ADR CLOPTION
|
||
|
ADR CLLINDRW
|
||
|
HBY CLFONT
|
||
|
RTS
|
||
|
;
|
||
|
; User font
|
||
|
;
|
||
|
INSUFONT JSR STINSTAL
|
||
|
ADR CLOPTION
|
||
|
ADR CLLINDRW
|
||
|
HBY UFONT
|
||
|
RTS
|
||
|
;-----------
|
||
|
;
|
||
|
; Clear calendar buffer
|
||
|
;
|
||
|
CLRPBUFF JSR MTHINK
|
||
|
LDY #0
|
||
|
LDA /CLBUFFER
|
||
|
LDX #$40
|
||
|
STA >0+2
|
||
|
TYA
|
||
|
^0 STA CLBUFFER,Y
|
||
|
INY
|
||
|
BNE <0
|
||
|
INC <0+2
|
||
|
DEX
|
||
|
BNE <0
|
||
|
STA LORESH
|
||
|
RTS
|
||
|
;-----------
|
||
|
;
|
||
|
; SMC for OPTION
|
||
|
;
|
||
|
; If normal, Y=00
|
||
|
; erase , Y=FF
|
||
|
; So if erase is desired, then
|
||
|
; set mask to #$00
|
||
|
;
|
||
|
CLOPTION TYA
|
||
|
EOR #$FF
|
||
|
STA CLINVR
|
||
|
;
|
||
|
; Only useful when we exit from
|
||
|
; the linedraw routine.
|
||
|
;
|
||
|
INCPIXAD LDA WCOUNT
|
||
|
CLC
|
||
|
ADC PIXAD
|
||
|
STA PIXAD
|
||
|
BCC >0
|
||
|
INC PIXAD+1
|
||
|
^0 RTS
|
||
|
;-----------
|
||
|
;
|
||
|
; Calendar LINEDRAW routine
|
||
|
;
|
||
|
; Compute byte width of font data
|
||
|
; INT((bits-1)/8)+1
|
||
|
;
|
||
|
CLLINDRW LDX WCOUNT
|
||
|
DEX
|
||
|
TXA
|
||
|
LSR
|
||
|
LSR
|
||
|
LSR
|
||
|
TAX
|
||
|
INX
|
||
|
STX WCOUNT
|
||
|
;
|
||
|
; Now, should we bother with the
|
||
|
; line draw routine?
|
||
|
;
|
||
|
TYA
|
||
|
CLC
|
||
|
ADC CSIZE
|
||
|
SEC
|
||
|
SBC YCLIP
|
||
|
CMP YMAX
|
||
|
BEQ >0
|
||
|
BGE INCPIXAD
|
||
|
;
|
||
|
; Update lores screen?
|
||
|
;
|
||
|
^0 LDA LORESL
|
||
|
ADC WCOUNT
|
||
|
STA LORESL
|
||
|
BCC >0
|
||
|
INC LORESH
|
||
|
LDA LORESH
|
||
|
EOR #4
|
||
|
BNE >0
|
||
|
STA LORESH
|
||
|
JSR CHECKESC
|
||
|
JSR UPLRK
|
||
|
;---
|
||
|
;
|
||
|
; Move data into ROWBUF
|
||
|
;
|
||
|
^0 LDY WCOUNT
|
||
|
DEY
|
||
|
^1 LDA (PIXAD),Y
|
||
|
STA ROWBUF,Y
|
||
|
DEY
|
||
|
BPL <1
|
||
|
;
|
||
|
JSR INCPIXAD
|
||
|
;---
|
||
|
;
|
||
|
; Double size of buffer?
|
||
|
;
|
||
|
LDA CSIZE
|
||
|
BEQ >3
|
||
|
;
|
||
|
; NOTE:XBYTE is used as TEMP var
|
||
|
;
|
||
|
LDX WCOUNT
|
||
|
^2 TXA
|
||
|
ASL
|
||
|
STA XBYTE
|
||
|
;
|
||
|
LDA ROWBUF-1,X
|
||
|
AND #$0F
|
||
|
TAY
|
||
|
LDA DBLTBL,Y
|
||
|
LDY XBYTE
|
||
|
STA ROWBUF-1,Y
|
||
|
;
|
||
|
LDA ROWBUF-1,X
|
||
|
LSR
|
||
|
LSR
|
||
|
LSR
|
||
|
LSR
|
||
|
TAY
|
||
|
LDA DBLTBL,Y
|
||
|
LDY XBYTE
|
||
|
STA ROWBUF-2,Y
|
||
|
DEX
|
||
|
BNE <2
|
||
|
ASL WCOUNT
|
||
|
;---
|
||
|
;
|
||
|
; Rotate buffer to the right if
|
||
|
; necessary.
|
||
|
;
|
||
|
^3 LDA XCUR
|
||
|
AND #7
|
||
|
TAY
|
||
|
BEQ >6
|
||
|
;
|
||
|
; Rotate (XCUR & 7) times
|
||
|
;
|
||
|
LDX WCOUNT
|
||
|
LDA #0
|
||
|
STA ROWBUF,X
|
||
|
INC WCOUNT
|
||
|
^4 LDX #0
|
||
|
CLC
|
||
|
^5 ROR ROWBUF,X
|
||
|
INX
|
||
|
TXA
|
||
|
EOR WCOUNT
|
||
|
BNE <5
|
||
|
DEY
|
||
|
BNE <4
|
||
|
;
|
||
|
; Starting X-byte offset = XCUR/8
|
||
|
;
|
||
|
^6 LDA XCUR+1
|
||
|
STA XBYTE
|
||
|
LDA XCUR
|
||
|
LSR XBYTE
|
||
|
ROR
|
||
|
LSR XBYTE
|
||
|
ROR
|
||
|
LSR
|
||
|
STA XBYTE
|
||
|
;
|
||
|
; Now draw ROWBUF into buffer
|
||
|
;
|
||
|
LDY YCUR
|
||
|
JSR PUTROW
|
||
|
LDA CSIZE
|
||
|
BEQ PUTROWX
|
||
|
LDY YCUR
|
||
|
INY
|
||
|
;---
|
||
|
;
|
||
|
; Draw ROWBUF into buffers
|
||
|
;
|
||
|
; $2000.2FFF yellow (black in B/W)
|
||
|
; 3000.3FFF red
|
||
|
; 4000.4FFF blue
|
||
|
; 5000.5FFF black
|
||
|
;
|
||
|
; Set PBUF pointer to yellow plane
|
||
|
;
|
||
|
PUTROW TYA
|
||
|
STA RAINY
|
||
|
SEC
|
||
|
SBC YCLIP
|
||
|
CMP YMAX
|
||
|
BGE PUTROWX
|
||
|
;
|
||
|
LSR
|
||
|
TAY
|
||
|
LDA #0
|
||
|
ROR
|
||
|
ORA XBYTE
|
||
|
STA PBUFLO
|
||
|
TYA
|
||
|
ADC /CLBUFFER
|
||
|
STA PBUFHI
|
||
|
;
|
||
|
; Set color plane
|
||
|
; NOTE:if erasing, then CLINVR will
|
||
|
; be set to #$00, causing all 4
|
||
|
; planes to be erased.
|
||
|
;
|
||
|
LDY COLOR
|
||
|
^0 LDA COLORTBL,Y
|
||
|
AND #$FF ; smc
|
||
|
CLINVR = *-1
|
||
|
STA COLORTMP
|
||
|
BPL >1
|
||
|
;
|
||
|
; If rainbow, go back and get new color!
|
||
|
;
|
||
|
LDA #00
|
||
|
RAINY = *-1
|
||
|
AND #$0F
|
||
|
TAX
|
||
|
LDY RBTBL,X
|
||
|
BPL <0
|
||
|
;---
|
||
|
;
|
||
|
; Now determine whether or not to
|
||
|
; turn bits on or off!
|
||
|
;
|
||
|
^1 LDA #$19 ; ORA ABS,Y
|
||
|
LSR COLORTMP
|
||
|
BCS *+4
|
||
|
LDA #$59 ; EOR ABS,Y
|
||
|
STA >3+0
|
||
|
LDY WCOUNT
|
||
|
DEY
|
||
|
^2 LDA (PBUFLO),Y
|
||
|
ORA ROWBUF,Y
|
||
|
^3 ORA ROWBUF,Y ; (EOR ROWBUF,Y)
|
||
|
STA (PBUFLO),Y
|
||
|
DEY
|
||
|
BPL <2
|
||
|
;
|
||
|
; Point to next color plane
|
||
|
;
|
||
|
LDA PBUFHI
|
||
|
CLC
|
||
|
ADC #$10
|
||
|
STA PBUFHI
|
||
|
CMP /CLBUFFER+$4000
|
||
|
BGE PUTROWX
|
||
|
;
|
||
|
; If color, go back and do it!
|
||
|
;
|
||
|
LDA COLORPR
|
||
|
BNE <1
|
||
|
;
|
||
|
PUTROWX RTS
|
||
|
;-----------
|
||
|
;
|
||
|
; ----- RIBBON COLOR -----
|
||
|
;
|
||
|
; bit 0 yellow
|
||
|
; bit 1 red
|
||
|
; bit 2 blue
|
||
|
; bit 3 black
|
||
|
;
|
||
|
; BLACK,RED,ORANGE,YELLOW,GREEN
|
||
|
; BLUE,PURPLE,RAINBOW,CLEAR
|
||
|
;
|
||
|
COLORTBL BYT 8,2,3,1,5,4,6
|
||
|
RAINBOW BYT $80,0
|
||
|
;
|
||
|
; Black ribbon mod
|
||
|
;
|
||
|
; 1 color,4 color,3 color
|
||
|
; 1 only draws to yellow plane!!!
|
||
|
;
|
||
|
BLACKTBL BYT 1,8,7
|
||
|
;
|
||
|
; Rainbow colors
|
||
|
;
|
||
|
RBTBL BYT 1,1,1,2,2,3,3,3
|
||
|
BYT 4,4,4,5,5,5,6,6
|
||
|
;
|
||
|
; Double 4 bits to 8 bits
|
||
|
;
|
||
|
DBLTBL HEX 00030C0F
|
||
|
HEX 30333C3F
|
||
|
HEX C0C3CCCF
|
||
|
HEX F0F3FCFF
|
||
|
;-----------
|
||
|
******** *************************
|
||
|
;-----------
|
||
|
;
|
||
|
PRZ EPZ $80
|
||
|
;
|
||
|
PYEND EPZ PRZ
|
||
|
PXCOOR EPZ PRZ+1
|
||
|
PYCOOR EPZ PRZ+2
|
||
|
PYCOORSV EPZ PRZ+3
|
||
|
;
|
||
|
PXCOUNT EPZ PRZ+4
|
||
|
PYCOUNT EPZ PRZ+5
|
||
|
;
|
||
|
PBUILD EPZ PRZ+6
|
||
|
PYSPACE EPZ PRZ+7
|
||
|
;
|
||
|
PBUFSAVL EPZ PRZ+8
|
||
|
PBUFSAVH EPZ PRZ+9
|
||
|
PBUFL EPZ PRZ+10
|
||
|
PBUFH EPZ PRZ+11
|
||
|
PBUFOFF EPZ PRZ+12
|
||
|
PRRIBBON EPZ PRZ+13
|
||
|
;
|
||
|
; Print buffer A=# of scan lines
|
||
|
; to print.
|
||
|
;
|
||
|
; Returns: SEC=ESC pressed
|
||
|
; CLC=entire buffer printed
|
||
|
;
|
||
|
PRINBUFF STA PYEND
|
||
|
;
|
||
|
JSR MPRINT
|
||
|
;
|
||
|
LDA #0
|
||
|
;
|
||
|
; Print single line of buffer
|
||
|
;
|
||
|
CLPRLOP1 STA PYCOORSV
|
||
|
;
|
||
|
; Calculate buffer address
|
||
|
;
|
||
|
LSR
|
||
|
TAY
|
||
|
LDA #0
|
||
|
ROR
|
||
|
STA PBUFSAVL
|
||
|
TYA
|
||
|
ADC /CLBUFFER
|
||
|
STA PBUFSAVH
|
||
|
;
|
||
|
; COLOR?
|
||
|
;
|
||
|
LDA COLORPR
|
||
|
BEQ >0
|
||
|
LDA #3
|
||
|
^0 STA PRRIBBON
|
||
|
BEQ >1
|
||
|
;---
|
||
|
;
|
||
|
; Loop here for color
|
||
|
;
|
||
|
CLPRCOL1 LDX PRRIBBON
|
||
|
JSR COLORCHG
|
||
|
;
|
||
|
; Check to see if all zeros
|
||
|
;
|
||
|
^1 JSR CLBUFZER
|
||
|
BEQ CLPRSKP1
|
||
|
;
|
||
|
; Tell printer how many bytes
|
||
|
;
|
||
|
LDX #BUFWIDTH
|
||
|
LDY /BUFWIDTH
|
||
|
JSR SENDGC
|
||
|
;
|
||
|
LDX #0
|
||
|
;
|
||
|
; Output line of data
|
||
|
;
|
||
|
CLPRLOP2 STX PXCOOR
|
||
|
LDX #0
|
||
|
;
|
||
|
; Output 8 bytes
|
||
|
;
|
||
|
CLPRLOP3 STX PXCOUNT
|
||
|
LDX PBUFSAVL
|
||
|
LDA PBUFSAVH
|
||
|
STX PBUFL
|
||
|
STA PBUFH
|
||
|
LDX #0
|
||
|
STX PBUILD
|
||
|
LDY PYCOORSV
|
||
|
;
|
||
|
; Output 1 byte
|
||
|
;
|
||
|
; X=counter, 0-6
|
||
|
; Y=Y-coordinate
|
||
|
;
|
||
|
CLPRLOP4 STX PYCOUNT
|
||
|
STY PYCOOR
|
||
|
;
|
||
|
LDY PXCOOR
|
||
|
LDA (PBUFL),Y
|
||
|
LDX PXCOUNT
|
||
|
AND PBITS8,X
|
||
|
BEQ >1
|
||
|
;
|
||
|
LDY PYCOUNT
|
||
|
LDA PBITS7,Y
|
||
|
ORA PBUILD
|
||
|
STA PBUILD
|
||
|
;
|
||
|
^1 LDA PBUFL
|
||
|
EOR #$80
|
||
|
STA PBUFL
|
||
|
BNE *+4
|
||
|
INC PBUFH
|
||
|
;
|
||
|
LDY PYCOOR
|
||
|
INY
|
||
|
LDX PYCOUNT
|
||
|
INX
|
||
|
CPY PYEND
|
||
|
BEQ >2
|
||
|
CPX #7
|
||
|
BLT CLPRLOP4
|
||
|
;
|
||
|
^2 STX PYSPACE
|
||
|
LDA PBUILD
|
||
|
JSR GCOUT
|
||
|
;
|
||
|
LDX PXCOUNT
|
||
|
INX
|
||
|
CPX #8
|
||
|
BLT CLPRLOP3
|
||
|
;
|
||
|
LDX PXCOOR
|
||
|
INX
|
||
|
CPX #BUFWIDTH/8
|
||
|
BLT CLPRLOP2
|
||
|
;
|
||
|
; CR without LF
|
||
|
;
|
||
|
CLPRSKP1 LDA #CR
|
||
|
JSR COUT1
|
||
|
;
|
||
|
; If color then go to next plane
|
||
|
;
|
||
|
LDA COLORPR
|
||
|
BEQ >0
|
||
|
LDA PBUFSAVH
|
||
|
CLC
|
||
|
ADC #$10
|
||
|
STA PBUFSAVH
|
||
|
DEC PRRIBBON
|
||
|
BMI >0
|
||
|
JMP CLPRCOL1
|
||
|
;
|
||
|
; Now do LF
|
||
|
;
|
||
|
^0 LDX PYSPACE
|
||
|
LDY #1
|
||
|
JSR CRLF
|
||
|
;
|
||
|
JSR CHECKESC
|
||
|
;
|
||
|
LDA PYCOORSV
|
||
|
CLC
|
||
|
ADC PYSPACE
|
||
|
CMP PYEND
|
||
|
CLC
|
||
|
BEQ >9
|
||
|
JMP CLPRLOP1
|
||
|
^9 RTS
|
||
|
;
|
||
|
; Bit lookup tables
|
||
|
;
|
||
|
PBITS8 HEX 80
|
||
|
PBITS7 HEX 40201008040201
|
||
|
;-----------
|
||
|
;
|
||
|
; Check current buffer for zeros
|
||
|
;
|
||
|
; BEQ=this line is all zeros
|
||
|
; BNE=this line contains data
|
||
|
;
|
||
|
CLBUFZER LDY PBUFSAVL
|
||
|
LDA PBUFSAVH
|
||
|
STY PBUFL
|
||
|
STA PBUFH
|
||
|
;
|
||
|
; Calculate how many lines to check
|
||
|
;
|
||
|
LDA PYEND
|
||
|
SEC
|
||
|
SBC PYCOORSV
|
||
|
CMP #7
|
||
|
BLT *+4
|
||
|
LDA #7
|
||
|
STA PYSPACE
|
||
|
TAX
|
||
|
;
|
||
|
^0 LDY #0
|
||
|
^1 LDA (PBUFL),Y
|
||
|
BNE >2
|
||
|
INY
|
||
|
BPL <1
|
||
|
LDA PBUFL
|
||
|
EOR #$80
|
||
|
STA PBUFL
|
||
|
BNE *+4
|
||
|
INC PBUFH
|
||
|
DEX
|
||
|
BNE <0
|
||
|
^2 RTS
|
||
|
;-----------
|
||
|
;
|
||
|
; Check for <ESC>, if yes then
|
||
|
; show pausing message and allow
|
||
|
; another <ESC> to abort.
|
||
|
;
|
||
|
CHECKESC JSR POLEKEY
|
||
|
CMP #ESC
|
||
|
BNE <2
|
||
|
JSR DEVICEON
|
||
|
JSR MPAUSE
|
||
|
SEI
|
||
|
PHP
|
||
|
JSR DEVICEOF
|
||
|
PLP
|
||
|
BCC <2
|
||
|
JMP ABORT
|
||
|
;-----------
|
||
|
;
|
||
|
;
|
||
|
;
|
||
|
USR "PCAL",ORG
|
||
|
;
|
||
|
ICL "S:COMMON"
|