Applecorn/mainmem.gfx.s
apple2geek b683aab070 Update to bring all one-and-done code into the .SYSTEM loader area.
Remove the HGR clear call from GFXINIT, and relocate the call to VDU12
so that it happens prior to enabling graphics mode in the hardware.
2022-10-10 18:17:17 -06:00

236 lines
7.2 KiB
ArmAsm

* MAINMEM.GFX.S
* (c) Bobbi 2021 GPLv3
*
* Main memory HGR graphics routines.
* Call FDraw Clear routine
CLRHGR >>> ENTMAIN
LDA BGCOLOR
STA FDRAWADDR+5
JSR FDRAWADDR+16 ; FDRAW: SetColor
JSR FDRAWADDR+22 ; FDRAW: Clear
LDA FGCOLOR
STA FDRAWADDR+5
JSR FDRAWADDR+16 ; FDRAW: SetColor
>>> XF2AUX,VDU16RET
* Call FDraw SetLineMode routine
SETLINE >>> ENTMAIN
JSR FDRAWADDR+43 ; FDRAW: SetLineMode
>>> XF2AUX,VDU18RET1
* Helper function to set up colors
SETCOLOR LDA PLOTMODE
AND #$03
CMP #$01 ; Draw in foreground colour
BNE :S1
LDA FGCOLOR
BRA :SETCOLOR
:S1 CMP #$02 ; Draw in inverse colour
BNE :S2
SEC
LDA #$07
SBC FGCOLOR
BRA :SETCOLOR
:S2 LDA BGCOLOR ; Draw in background colour
:SETCOLOR STA FDRAWADDR+5
JMP FDRAWADDR+16 ; FDRAW: SetColor
* Call FDraw DrawLine routine
DRAWLINE >>> ENTMAIN
JSR SETCOLOR
JSR FDRAWADDR+28 ; FDRAW: DrawLine
>>> XF2AUX,VDU25RET
* Call FDraw DrawPoint routine
DRAWPNT >>> ENTMAIN
JSR SETCOLOR
JSR FDRAWADDR+25 ; FDRAW: DrawPoint
>>> XF2AUX,VDU25RET
* Call FDraw DrawCircle routine
DRAWCIRC >>> ENTMAIN
JSR SETCOLOR
JSR FDRAWADDR+37 ; FDRAW: DrawCircle
>>> XF2AUX,VDU25RET
* Call FDraw FillCircle routine
FILLCIRC >>> ENTMAIN
JSR SETCOLOR
JSR FDRAWADDR+40 ; FDRAW: FillCircle
>>> XF2AUX,VDU25RET
* Call FDraw FillRect routine
FILLRECT >>> ENTMAIN
JSR SETCOLOR
LDA FDRAWADDR+8 ; Y1
CMP FDRAWADDR+11 ; Y2
BEQ :S1
BCS :SWAPY ; Y1>Y2 then swap
:S1 LDA FDRAWADDR+7 ; MSB of X1
CMP FDRAWADDR+10 ; MSB of X2
BEQ :S2
BCS :SWAPX ; MSB X1 > MSB X2
:S2 LDA FDRAWADDR+6 ; LSB of X1
CMP FDRAWADDR+9 ; MSB of X2
BEQ :S3
BCS :SWAPX ; LSB X1 > LSB X2
:S3 JSR FDRAWADDR+34 ; FDRAW: FillRect
>>> XF2AUX,VDU25RET
:SWAPY LDA FDRAWADDR+8
LDY FDRAWADDR+11
STY FDRAWADDR+8
STA FDRAWADDR+11
BRA :S1
:SWAPX LDA FDRAWADDR+7
LDY FDRAWADDR+10
STY FDRAWADDR+7
STA FDRAWADDR+10
LDA FDRAWADDR+6
LDY FDRAWADDR+9
STY FDRAWADDR+6
STA FDRAWADDR+9
BRA :S3
* Reset colours and linetype
GFXINIT JSR FDRAWADDR+0 ; Initialize FDRAW library
LDA #$20
STA FDRAWADDR+5
JSR FDRAWADDR+19 ; FDRAW: Set page $2000
STZ LINETYPE
STZ FDRAWADDR+5
JSR FDRAWADDR+43 ; FDRAW: SetLineMode
LDA #$07
STA FGCOLOR
STA FDRAWADDR+5
JSR FDRAWADDR+16 ; FDRAW: SetColor
STZ BGCOLOR
* JSR FDRAWADDR+22 ; FDRAW: clear HGR screen
RTS
* Plot bitmap character on the HGR screen
* On entry: char is in A
DRAWCHAR >>> ENTMAIN
* AND #$7F ; Don't!
STA A1L ; A*8 -> A1L,A1H
STZ A1H
ASL A1L
ROL A1H
ASL A1L
ROL A1H
ASL A1L
ROL A1H
CLC ; FONTADDR+A*8 -> A1L,A1H
LDA A1L
ADC #<FONTADDR
STA A1L
LDA A1H
ADC #>FONTADDR
STA A1H
LDA HGRADDR+0 ; HGRADDR -> A4L,A4H
STA A4L
LDA HGRADDR+1
STA A4H
LDY #$00
:L1 LDA (A1L),Y ; Load line of pixels from font
STA (A4L) ; Store them on screen
INC A4H ; Skip 1024 bytes to next row
INC A4H
INC A4H
INC A4H
INY
CPY #$08 ; All eight rows done?
BNE :L1
>>> XF2AUX,PUTCHRET
* Copy text line A+1 to line A
HGRSCR1L >>> ENTMAIN
INC MTXTWINRGT
ASL ; Dest addr->A4L,A4H
TAX
LDA MHGRTAB,X
STA A4L
LDA MHGRTAB+1,X
STA A4H
INX ; Source addr->A1L,A1H
INX
LDA MHGRTAB,X
STA A1L
LDA MHGRTAB+1,X
STA A1H
DOHGRSCR1L LDX #$00
:L1 LDY MTXTWINLFT
:L2 LDA (A1L),Y
STA (A4L),Y
INY
CPY MTXTWINRGT
BNE :L2
INC A1H ; Advance source 1024 bytes
INC A1H
INC A1H
INC A1H
INC A4H ; Advance dest 1024 bytes
INC A4H
INC A4H
INC A4H
INX
CPX #8 ; 8 pixel rows in character
BNE :L1
>>> XF2AUX,HSCR1RET
* Copy text line A to line A+1
HGRRSCR1L >>> ENTMAIN
INC MTXTWINRGT
ASL ; Source addr->A1L,A1H
TAX
LDA MHGRTAB,X
STA A1L
LDA MHGRTAB+1,X
STA A1H
INX ; Dest addr->A4L,A4H
INX
LDA MHGRTAB,X
STA A4L
LDA MHGRTAB+1,X
STA A4H
BRA DOHGRSCR1L
* Clear one text line on HGR screen,
* from current cursor col to text window right limit
HCLREOL >>> ENTMAIN
INC MTXTWINRGT
LDA HGRADDR+0 ; HGRADDR -> A4L,A4H
STA A4L
LDA HGRADDR+1
STA A4H
LDA #$00
LDX #$00
:L1 LDY MVDUTEXTX
:L2 STA (A4L),Y
INY
CPY MTXTWINRGT
BNE :L2
INC A4H
INC A4H
INC A4H
INC A4H
INX
CPX #$08
BNE :L1
>>> XF2AUX,CLRLNRET
FGCOLOR DB $00 ; Foreground colour
BGCOLOR DB $00 ; Background colour
LINETYPE DB $00 ; 0 normal, 1 XOR
PLOTMODE DB $00 ; K value for PLOT K,X,Y
HGRADDR DW $0000 ; Address 1st line of HGR char
MVDUTEXTX DB $00 ; Main mem copy of VDUTEXTX
MTXTWINLFT DB $00 ; Main mem copy of TEXTWINLFT
MTXTWINRGT DB $00 ; Main mem copy of TEXTWINRGT
* Addresses of start of pixel rows in PAGE1
MHGRTAB DW $2000,$2080,$2100,$2180,$2200,$2280,$2300,$2380
DW $2028,$20A8,$2128,$21A8,$2228,$22A8,$2328,$23A8
DW $2050,$20D0,$2150,$21D0,$2250,$22D0,$2350,$23D0