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

506 lines
8.9 KiB
Plaintext

;
; S:BOEDIT3
; ---------
; Low-level screen stuff
;
;
; Draw Miniature greeting card border
; on hires page, complete with
; right and bottom flipping.
;
MNZ EPZ $80
;
MINIX EPZ MNZ
MINIY EPZ MNZ+1
MINIWITH EPZ MNZ+2
MINIHITE EPZ MNZ+3
;
; Temporary table where miniature
; is built.
;
MINITEMP = $BB00
MINIBUFF = MINITEMP
TEMPTBL = MINITEMP+28*3
;
MINITURE LDX #MINIX1
LDY #MINIY1
STX MINIX
STY MINIY
LDX #MINIW1
LDY #MINIH1
CLC
;-----------
;
; Enter with X=width
; Y=height
;
; z-page MINIX=x position
; MINIY=y position
;
MINITUR2 DEX
STX MINIWITH
DEY
STY MINIHITE
;
; If carry set, then don't do
; the compression, data is all
; ready at MINIBUFF.
;
BCS *+5
JSR MINICALC
;
; Top line
;
LDY #0
JSR MINILINE
;
; Do left and right edges
;
^1 INY
CPY MINIHITE
BEQ MINILINE
LDX #0
JSR MINISTR2
LDX MINIWITH
JSR MINISTR2
JMP <1
;
; Given Y, do one line
;
MINILINE LDX MINIWITH
JSR MINISTR0
^0 DEX
BEQ >1
JSR MINISTR1
JMP <0
^1 JMP MINISTR0
;
; Interpolate from 23x14 to 14x14
; for each of the 3 sections.
;
; TMP0.1 points into BORDBASE
; TMP2.3 points into MINIBUFF
;
MINICALC LDY #BORDBASE+4
LDA /BORDBASE+4
STY TMP0
STA TMP1
LDY #MINIBUFF
LDA /MINIBUFF
STY TMP2
STA TMP3
;
; Now squish the three sections
;
LDA #3
^0 PHA
;
; Do top part then bottom part
;
LDY #24
JSR MINISQSH
LDY #0
JSR MINISQSH
;
LDA TMP0
CLC
ADC #48
STA TMP0
;
PLA
SBC #0
BNE <0
RTS
;
; Squish 23 vertically oriented bytes
; to 14 horizontally oriented bytes.
;
MINISQSH LDX #0
^0 LDA MINIORTB,X
STA TMP4
;
LDA #0
^1 ORA (TMP0),Y
INY
DEC TMP4
BNE <1
;
STX >3+1
ASL
STA TMP4
LDX #12
;
^2 LSR TEMPTBL,X
LSR TEMPTBL+1,X
LDA #0
ROR
ROR
ORA TEMPTBL,X
STA TEMPTBL,X
LDA #0
ASL TMP4
ROR
ROR
ORA TEMPTBL+1,X
STA TEMPTBL+1,X
DEX
DEX
BPL <2
;
^3 LDX #00
INX
CPX #14
BLT <0
;
LDY #13
^4 LDA TEMPTBL,Y
EOR #$7F
STA (TMP2),Y
DEY
BPL <4
LDA TMP2
CLC
ADC #14
STA TMP2
RTS
;
; Table which tells how many
; bytes to OR together
;
MINIORTB HEX 02010202010202
HEX 01020102020102
;
; Draw a section given:
;
; A=section to use
; X,Y=position
;
; Computed:
; TMP0.1= MINIBUFF pointer
;
MINISTR0 LDA #0
HEX 2C
MINISTR1 LDA #28
HEX 2C
MINISTR2 LDA #56
STA TMP0
LDA /MINIBUFF
STA TMP1
STX MINIXSAV
STY MINIYSAV
LDA #0
CPX MINIWITH
BNE *+4
ORA #2
CPY MINIHITE
BNE *+4
ORA #1
AND BORDBASE
PHA
;
; Compute X and Y screen addresses
;
; X= X*2+MINIX
;
TXA
ASL
ADC MINIX
STA MINIXPOS
;
; Y= Y*14+MINIY
;
TYA
ASL
STA TMP2
ASL
ASL
ASL
ADC MINIY
SEC
SBC TMP2
STA MINIYPOS
;
PLA
LSR
AND #1
STA MINIFLIP
;
; If flipping bottom, then start from
; end of MINIBUFF data.
;
LDY #$E6 ; INC
LDA #0
BCC >0
LDA #26
LDY #$C6 ; DEC
^0 CLC
ADC TMP0
STA TMP0
STY MINIBMD0
STY MINIBMD1
LDX #14
;
; Miniature border section store loop
;
MINISLOP LDY #00
MINIYPOS = *-1
LDA YBASELO,Y
CLC
ADC #00
MINIXPOS = *-1
STA HIRES1
LDA YBASEHI,Y
STA HIRES1+1
;
; Now do a single row
;
LDY #0
LDA #00
MINIFLIP = *-1
BNE >0
;
; Standard
;
LDA (TMP0),Y
STA (HIRES1),Y
INY
LDA (TMP0),Y
JMP >1
;
; Flip horizontally
;
^0 LDA (TMP0),Y
TAY
LDA FLIPPER,Y
LDY #1
STA (HIRES1),Y
LDA (TMP0),Y
TAY
LDA FLIPPER,Y
LDY #0
;
^1 STA (HIRES1),Y
MINIBMD0 INC TMP0
MINIBMD1 INC TMP0
;
INC MINIYPOS
DEX
BNE MINISLOP
;
LDX #00
MINIXSAV = *-1
LDY #00
MINIYSAV = *-1
RTS
;-----------
;
; Plot routine entry points
;
PLOTON JSR PLOTINIT
EOR #$7F
STA TMP0
AND (HIRES1),Y
STA (HIRES1),Y
STA (HIRES3),Y
LDA TMP0
AND (HIRES2),Y
STA (HIRES2),Y
TXA
BNE >0
RTS
;
^0 INY
EOR #$7F
TAX
AND (HIRES1),Y
STA (HIRES1),Y
STA (HIRES3),Y
TXA
AND (HIRES2),Y
STA (HIRES2),Y
RTS
;
PLOTOFF JSR PLOTINIT
STA TMP0
ORA (HIRES1),Y
STA (HIRES1),Y
STA (HIRES3),Y
LDA TMP0
ORA (HIRES2),Y
STA (HIRES2),Y
TXA
BNE >0
RTS
;
^0 INY
ORA (HIRES1),Y
STA (HIRES1),Y
STA (HIRES3),Y
TXA
ORA (HIRES2),Y
STA (HIRES2),Y
RTS
;
BRFLASH JSR PLOTINIT
EOR (HIRES2),Y
STA (HIRES2),Y
INY
TXA
EOR (HIRES2),Y
STA (HIRES2),Y
RTS
;
; Init plot routine
;
; Multiply Y by 3 and add
; section offset.
;
PLOTINIT LDA YCOOR
ASL
ADC YCOOR
LDY SECTION
ADC YBYTEOFF,Y
TAX
;
LDA YBASELO+YOFFSET,X
STA HIRES1
LDA YBASEHI+YOFFSET,X
STA HIRES1+1
LDA YBASELO+YOFFSET+1,X
STA HIRES2
LDA YBASEHI+YOFFSET+1,X
STA HIRES2+1
LDA YBASELO+YOFFSET+2,X
STA HIRES3
LDA YBASEHI+YOFFSET+2,X
STA HIRES3+1
;
; Get bit pattern
;
LDA XCOOR
ADC XBITOFF,Y
TAX
;
LDA XLOOK,X
AND #$0F
ASL
TAY
LDA XDATA,Y
STA >0+1
LDA XDATA+1,Y
STA >1+1
;
; Get X byte offset
;
LDA XLOOK,X
LSR
LSR
LSR
LSR
LDY SECTION
ADC XBYTEOFF,Y
TAY
;
^0 LDA #00
^1 LDX #00
RTS
;
; X lookup table
;
XLOOK HEX 0001020314151620
HEX 2122233435364041
HEX 4243545556606162
HEX 63747576
;
XDATA HEX 0300
HEX 0C00
HEX 3000
HEX 4001
HEX 0600
HEX 1800
HEX 6000
;
; Offsets for the 3 border sections
;
XBITOFF BYT 0
BYT 3
BYT 0
;
XBYTEOFF BYT XOFFSET
BYT XOFFSET+6
BYT XOFFSET
;
YBYTEOFF BYT 0
BYT 0
BYT 44
;-----------
;
; If page 3 is being displayed, then
; update "border layout"
;
PAG3DIAG LDA PAGENUM
CMP #2
BEQ >0
RTS
;
^0 JSR PRINT
BYT RTOSWITE,MINIX2+2,MINIY2+14
BYT 2*MINIW2-2,14*MINIH2-2,0
;
LDA BORDBASE
PHA
LDY #>1
LDA />1
STY TMP0
STA TMP1
LDA #28
STA TMP4
LDY #MINIBUFF
LDA /MINIBUFF
LDX #0
JSR GETPSUNP
LDX #MINIX2
LDY #MINIY2
STX MINIX
STY MINIY
LDX #MINIW2
LDY #MINIH2
SEC
PLA
STA BORDBASE
JSR MINITUR2
;
; Display tile boundary info
;
LDA BORDBASE
AND #%100
BEQ >0
LDX #MINIX2+2
LDY #MINIY2-8-MINIH2*7
JMP TILEAROW
;
^0 JSR LINES
BYT "H",MINIX2
BYT GRAY2,14,MINIY2+14,14*MINIW2-2
BYT GRAY2,14,MINIY2+13+14*MINIH2-2,14*MINIW2-2
BYT 1
JSR LINES
BYT "V",MINIX2
BYT GRAY2,14,MINIY2+14,14*MINIH2-2
BYT GRAY2,13+14*MINIW2-2,MINIY2+14,14*MINIH2-2
BYT 1
RTS
;
^1 HEX 877F7E3F7E1F7E3F
HEX 7E3F7E3F7E1F7C8E
HEX 7F0F7E677C7F7C3F
HEX 7E1F7F4F7F077C8E
HEX 7F1F7C4F797F793F
HEX 7C7F794F791F7C88
HEX 7F
;-----------
;
;
;
ICL "S:BOEDIT4"