Updated disk image. Builds on Merlin-16 again.

This commit is contained in:
Bobbi Webber-Manners 2021-09-23 12:35:45 -04:00
parent 5eceff7e82
commit fa879f7f52
5 changed files with 239 additions and 257 deletions

Binary file not shown.

View File

@ -58,9 +58,6 @@ COPYBUF EQU $9200 ; File copy needs separate buffer
* Location of FDraw library in main memory * Location of FDraw library in main memory
FDRAWADDR EQU $9400 FDRAWADDR EQU $9400
* Location of bitmap font in main memory
FONTADDR EQU $A900
* Address in aux memory where ROM will be loaded * Address in aux memory where ROM will be loaded
AUXADDR EQU $8000 AUXADDR EQU $8000

View File

@ -23,7 +23,7 @@
* VDU DRIVER ZERO PAGE * VDU DRIVER ZERO PAGE
********************** **********************
* $00D0-$00DF VDU driver zero page workspace * $00D0-$00DF VDU driver zero page workspace
VDUSTATUS EQU $D0 ; $D0 # VDU status VDUSTATUS EQU $D0 ; $D0 # VDU status
* bit 7 = VDU 21 VDU disabled * bit 7 = VDU 21 VDU disabled
* bit 6 = COPY cursor active * bit 6 = COPY cursor active
* bit 5 = VDU 5 Text at graphics cursor * bit 5 = VDU 5 Text at graphics cursor
@ -33,78 +33,78 @@ VDUSTATUS EQU $D0 ; $D0 # VDU status
* bit 1 = Don't scroll (COPY cursor or VDU 5 mode) * bit 1 = Don't scroll (COPY cursor or VDU 5 mode)
* bit 0 = VDU 2 printer echo active * bit 0 = VDU 2 printer echo active
* *
VDUCHAR EQU VDUSTATUS+1 ; $D1 VDUCHAR EQU VDUSTATUS+1 ; $D1
VDUADDR EQU VDUSTATUS+4 ; $D4 address of current char cell VDUADDR EQU VDUSTATUS+4 ; $D4 address of current char cell
OLDCHAR EQU OSKBD1 ; *TEMP* character under cursor OLDCHAR EQU OSKBD1 ; *TEMP* character under cursor
COPYCHAR EQU OSKBD2 ; *TEMP* character under copy cursor COPYCHAR EQU OSKBD2 ; *TEMP* character under copy cursor
* VDU DRIVER MAIN WORKSPACE * VDU DRIVER MAIN WORKSPACE
*************************** ***************************
FXLINES EQU BYTEVARBASE+217 ; Paged scrolling line counter FXLINES EQU BYTEVARBASE+217 ; Paged scrolling line counter
FXVDUQLEN EQU BYTEVARBASE+218 ; Length of pending VDU queue FXVDUQLEN EQU BYTEVARBASE+218 ; Length of pending VDU queue
VDUVARS EQU $290 VDUVARS EQU $290
VDUVAREND EQU $2ED VDUVAREND EQU $2ED
GFXWINLFT EQU VDUVARS+$00 ; # graphics window left GFXWINLFT EQU VDUVARS+$00 ; # graphics window left
GFXWINBOT EQU VDUVARS+$02 ; # graphics window bottom \ window GFXWINBOT EQU VDUVARS+$02 ; # graphics window bottom \ window
GFXWINRGT EQU VDUVARS+$04 ; # graphics window right / size GFXWINRGT EQU VDUVARS+$04 ; # graphics window right / size
GFXWINTOP EQU VDUVARS+$06 ; # graphics window top GFXWINTOP EQU VDUVARS+$06 ; # graphics window top
TXTWINLFT EQU VDUVARS+$08 ; # text window left TXTWINLFT EQU VDUVARS+$08 ; # text window left
TXTWINBOT EQU VDUVARS+$09 ; # text window bottom \ window TXTWINBOT EQU VDUVARS+$09 ; # text window bottom \ window
TXTWINRGT EQU VDUVARS+$0A ; # text window right / size TXTWINRGT EQU VDUVARS+$0A ; # text window right / size
TXTWINTOP EQU VDUVARS+$0B ; # text window top TXTWINTOP EQU VDUVARS+$0B ; # text window top
GFXORIGX EQU VDUVARS+$0C ; graphics X origin GFXORIGX EQU VDUVARS+$0C ; graphics X origin
GFXORIGY EQU VDUVARS+$0E ; graphics Y origin GFXORIGY EQU VDUVARS+$0E ; graphics Y origin
* *
GFXPOSNX EQU VDUVARS+$10 ; current graphics X posn GFXPOSNX EQU VDUVARS+$10 ; current graphics X posn
GFXPOSNY EQU VDUVARS+$12 ; current graphics Y posn GFXPOSNY EQU VDUVARS+$12 ; current graphics Y posn
GFXLASTX EQU VDUVARS+$14 ; last graphics X posn GFXLASTX EQU VDUVARS+$14 ; last graphics X posn
GFXLASTY EQU VDUVARS+$16 ; last graphics Y posn GFXLASTY EQU VDUVARS+$16 ; last graphics Y posn
VDUTEXTX EQU VDUVARS+$18 ; # absolute text X posn = POS+WINLFT VDUTEXTX EQU VDUVARS+$18 ; # absolute text X posn = POS+WINLFT
VDUTEXTY EQU VDUVARS+$19 ; # absolute text Y posn = VPOS+WINTOP VDUTEXTY EQU VDUVARS+$19 ; # absolute text Y posn = VPOS+WINTOP
VDUCOPYX EQU VDUVARS+$1A ; absolute COPY text X posn VDUCOPYX EQU VDUVARS+$1A ; absolute COPY text X posn
VDUCOPYY EQU VDUVARS+$1B ; absolute COPY text Y posn VDUCOPYY EQU VDUVARS+$1B ; absolute COPY text Y posn
* *
PIXELPLOTX EQU VDUVARS+$1C ; PLOT graphics X in pixels PIXELPLOTX EQU VDUVARS+$1C ; PLOT graphics X in pixels
PIXELPLOTY EQU VDUVARS+$1E ; PLOT graphics Y in pixels PIXELPLOTY EQU VDUVARS+$1E ; PLOT graphics Y in pixels
PIXELPOSNX EQU VDUVARS+$20 ; current graphics X in pixels PIXELPOSNX EQU VDUVARS+$20 ; current graphics X in pixels
PIXELPOSNY EQU VDUVARS+$22 ; current graphics Y in pixels PIXELPOSNY EQU VDUVARS+$22 ; current graphics Y in pixels
PIXELLASTX EQU VDUVARS+$24 ; last graphics X in pixels PIXELLASTX EQU VDUVARS+$24 ; last graphics X in pixels
PIXELLASTY EQU VDUVARS+$26 ; last graphics Y in pixels PIXELLASTY EQU VDUVARS+$26 ; last graphics Y in pixels
* *
CURSOR EQU VDUVARS+$28 ; character used for cursor CURSOR EQU VDUVARS+$28 ; character used for cursor
CURSORED EQU VDUVARS+$29 ; character used for edit cursor CURSORED EQU VDUVARS+$29 ; character used for edit cursor
CURSORCP EQU VDUVARS+$2A ; character used for copy cursor CURSORCP EQU VDUVARS+$2A ; character used for copy cursor
* *
VDUQ EQU VDUVARS+$2B ; $2B..$33 VDUQ EQU VDUVARS+$2B ; $2B..$33
VDUQLAST EQU VDUQ+1 ; Neatly becomes VDUVARS+$2C VDUQLAST EQU VDUQ+1 ; Neatly becomes VDUVARS+$2C
VDUQPLOT EQU VDUQ+5 ; Neatly becomes VDUVARS+$30 VDUQPLOT EQU VDUQ+5 ; Neatly becomes VDUVARS+$30
* *
VDUBORDER EQU VDUVARS+$34 ; Border colour VDUBORDER EQU VDUVARS+$34 ; Border colour
VDUMODE EQU VDUVARS+$35 ; # current MODE VDUMODE EQU VDUVARS+$35 ; # current MODE
VDUSCREEN EQU VDUVARS+$36 ; # MODE type VDUSCREEN EQU VDUVARS+$36 ; # MODE type
TXTFGD EQU VDUVARS+$37 ; # Text foreground TXTFGD EQU VDUVARS+$37 ; # Text foreground
TXTBGD EQU VDUVARS+$38 ; # Text background TXTBGD EQU VDUVARS+$38 ; # Text background
GFXFGD EQU VDUVARS+$39 ; # Graphics foreground GFXFGD EQU VDUVARS+$39 ; # Graphics foreground
GFXBGD EQU VDUVARS+$3A ; # Graphics background GFXBGD EQU VDUVARS+$3A ; # Graphics background
GFXPLOTFGD EQU VDUVARS+$3B ; # Foreground GCOL action GFXPLOTFGD EQU VDUVARS+$3B ; # Foreground GCOL action
GFXPLOTBGD EQU VDUVARS+$3C ; # Background GCOL action GFXPLOTBGD EQU VDUVARS+$3C ; # Background GCOL action
VDUVAR3D EQU VDUVARS+$3D VDUVAR3D EQU VDUVARS+$3D
VDUVAR3E EQU VDUVARS+$3E VDUVAR3E EQU VDUVARS+$3E
VDUBYTES EQU VDUVARS+$3F ; # bytes per char, 1=text only VDUBYTES EQU VDUVARS+$3F ; # bytes per char, 1=text only
VDUCOLOURS EQU VDUVARS+$40 ; # colours-1 VDUCOLOURS EQU VDUVARS+$40 ; # colours-1
VDUPIXELS EQU VDUVARS+$41 ; # pixels per byte VDUPIXELS EQU VDUVARS+$41 ; # pixels per byte
VDUWORKSP EQU VDUVARS+$42 ; 28 bytes of general workspace VDUWORKSP EQU VDUVARS+$42 ; 28 bytes of general workspace
VDUWORKSZ EQU VDUVAREND-VDUWORKSP+1 VDUWORKSZ EQU VDUVAREND-VDUWORKSP+1
* *
* Screen definitions * Screen definitions
* 3 6 7 * 3 6 7
SCNTXTMAXX DB 79,39,19,79,39,19,39,39 ; Max text column SCNTXTMAXX DB 79,39,19,79,39,19,39,39 ; Max text column
SCNTXTMAXY DB 23,23,23,23,23,23,23,23 ; Max text row SCNTXTMAXY DB 23,23,23,23,23,23,23,23 ; Max text row
SCNBYTES DB 1, 1, 1, 1, 1, 1, 1, 1 ; Bytes per character SCNBYTES DB 1,1
SCNCOLOURS DB 1, 1, 1, 1, 1, 1, 1, 1 ; Colours-1 SCNCOLOURS DB 1,1
SCNTYPE DB 1, 0,128,1, 0, 0, 0,64 ; Screen type SCNTYPE DB 1,0,128,1
* b7=FastDraw * b7=FastDraw
* b6=Teletext * b6=Teletext
* b0=40COL/80COL * b0=40COL/80COL
@ -123,36 +123,36 @@ SCNTAB DW $800,$880,$900,$980,$A00,$A80,$B00,$B80
* CS if printer echo enabled for this character * CS if printer echo enabled for this character
* *
OUTCHAR LDX FXVDUQLEN OUTCHAR LDX FXVDUQLEN
BNE ADDTOQ ; Waiting for chars BNE ADDTOQ ; Waiting for chars
CMP #$7F CMP #$7F
BEQ CTRLDEL ; =$7F - control char BEQ CTRLDEL ; =$7F - control char
CMP #$20 CMP #$20
BCC CTRLCHAR ; <$20 - control char BCC CTRLCHAR ; <$20 - control char
BIT VDUSTATUS BIT VDUSTATUS
BMI OUTCHEXIT ; VDU disabled BMI OUTCHEXIT ; VDU disabled
OUTCHARCP JSR PRCHRC ; Store char, checking keypress OUTCHARCP JSR PRCHRC ; Store char, checking keypress
JSR VDU09 ; Move cursor right JSR VDU09 ; Move cursor right
* OSBYTE &75 - Read VDUSTATUS * OSBYTE &75 - Read VDUSTATUS
***************************** *****************************
BYTE75 BYTE75
OUTCHEXIT LDA VDUSTATUS OUTCHEXIT LDA VDUSTATUS
TAX TAX
LSR A ; Return Cy=Printer Echo Enabled LSR A ; Return Cy=Printer Echo Enabled
RTS RTS
CTRLDEL LDA #$20 ; $7F becomes $20 CTRLDEL LDA #$20 ; $7F becomes $20
CTRLCHAR CMP #$01 CTRLCHAR CMP #$01
BEQ ADDQ ; One param BEQ ADDQ ; One param
CMP #$11 CMP #$11
BCC CTRLCHARGO ; Zero params BCC CTRLCHARGO ; Zero params
ADDQ STA VDUCHAR ; Save initial character ADDQ STA VDUCHAR ; Save initial character
AND #$0F AND #$0F
TAX TAX
LDA QLEN,X LDA QLEN,X
STA FXVDUQLEN ; Number of params to queue STA FXVDUQLEN ; Number of params to queue
BEQ CTRLCHARGO1 ; Zero, do it now BEQ CTRLCHARGO1 ; Zero, do it now
QDONE CLC ; CLC=Don't echo VDU queue to printer QDONE CLC ; CLC=Don't echo VDU queue to printer
RTS RTS
ADDTOQ STA VDUQ-256+9,X ADDTOQ STA VDUQ-256+9,X
INC FXVDUQLEN INC FXVDUQLEN
@ -160,22 +160,22 @@ ADDTOQ STA VDUQ-256+9,X
CTRLCHARGO1 LDA VDUCHAR CTRLCHARGO1 LDA VDUCHAR
CTRLCHARGO ASL A CTRLCHARGO ASL A
TAY TAY
CMP #$10 ; 8*2 CMP #$10 ; 8*2
BCC CTRLCHARGO2 ; ctrl<$08, don't echo to printer BCC CTRLCHARGO2 ; ctrl<$08, don't echo to printer
EOR #$FF ; ctrl>$0D, don't echo to printer EOR #$FF ; ctrl>$0D, don't echo to printer
CMP #$E5 ; (13*2) EOR 255 CMP #$E5 ; (13*2) EOR 255
CTRLCHARGO2 PHP ; Save CS=(ctrl>=8 && ctrl<=13) CTRLCHARGO2 PHP ; Save CS=(ctrl>=8 && ctrl<=13)
JSR CTRLCHARJMP ; Call routine JSR CTRLCHARJMP ; Call routine
PLP PLP
BCS OUTCHEXIT ; If echoable, test if printer enabled BCS OUTCHEXIT ; If echoable, test if printer enabled
RTS ; Return, CC=Don't echo to printer RTS ; Return, CC=Don't echo to printer
OUTCHARGO ASL A ; Entry point to move COPY cursor OUTCHARGO ASL A ; Entry point to move COPY cursor
TAY ; (TEMP and scroll screen) TAY ; (TEMP and scroll screen)
CTRLCHARJMP CPY #6*2 CTRLCHARJMP CPY #6*2
BEQ CTRLCHAR6 ; Always allow VDU 6 through BEQ CTRLCHAR6 ; Always allow VDU 6 through
BIT VDUSTATUS BIT VDUSTATUS
BMI VDU00 ; VDU disabled BMI VDU00 ; VDU disabled
CTRLCHAR6 LDA CTRLADDRS+1,Y CTRLCHAR6 LDA CTRLADDRS+1,Y
PHA PHA
LDA CTRLADDRS+0,Y LDA CTRLADDRS+0,Y
@ -202,46 +202,46 @@ CTRLADDRS DW VDU00-1,VDU01-1,VDU02-1,VDU03-1
* VDU 2 - Start print job * VDU 2 - Start print job
VDU02 VDU02
* JSR select printer * JSR select printer
LDA #$01 ; Set Printer Echo On LDA #$01 ; Set Printer Echo On
BNE SETSTATUS BNE SETSTATUS
* VDU 5 - Text at graphics cursor * VDU 5 - Text at graphics cursor
VDU05 LDX VDUPIXELS VDU05 LDX VDUPIXELS
BEQ SETEXIT ; 0 pixels per char, text only BEQ SETEXIT ; 0 pixels per char, text only
* Turn cursor off and other stuff * Turn cursor off and other stuff
LDA #$20 ; Set VDU 5 mode LDA #$20 ; Set VDU 5 mode
BNE SETSTATUS BNE SETSTATUS
* VDU 14 - Select paged scrolling * VDU 14 - Select paged scrolling
VDU14 STZ FXLINES ; Reset line counter VDU14 STZ FXLINES ; Reset line counter
LDA #$04 ; Set Paged Mode LDA #$04 ; Set Paged Mode
BNE SETSTATUS BNE SETSTATUS
* VDU 21 - Disable VDU * VDU 21 - Disable VDU
VDU21 LDA #$80 ; Set VDU disabled VDU21 LDA #$80 ; Set VDU disabled
SETSTATUS ORA VDUSTATUS ; Set bits in VDU STATUS SETSTATUS ORA VDUSTATUS ; Set bits in VDU STATUS
STA VDUSTATUS STA VDUSTATUS
SETEXIT RTS SETEXIT RTS
* VDU 3 - End print job * VDU 3 - End print job
VDU03 VDU03
* JSR flush printer * JSR flush printer
LDA #$FE ; Clear Printer Echo LDA #$FE ; Clear Printer Echo
BNE CLRSTATUS BNE CLRSTATUS
* VDU 4 - Text at text cursor * VDU 4 - Text at text cursor
VDU04 VDU04
* Turn cursor on and other stuff * Turn cursor on and other stuff
LDA #$DF ; Clear VDU 5 mode LDA #$DF ; Clear VDU 5 mode
BNE CLRSTATUS BNE CLRSTATUS
* VDU 15 - Disable paged scrolling * VDU 15 - Disable paged scrolling
VDU15 LDA #$FB ; Clear paged scrolling VDU15 LDA #$FB ; Clear paged scrolling
BRA CLRSTATUS BRA CLRSTATUS
* VDU 6 - Enable VDU * VDU 6 - Enable VDU
VDU06 LDA #$7F ; Clear VDU disabled VDU06 LDA #$7F ; Clear VDU disabled
CLRSTATUS AND VDUSTATUS CLRSTATUS AND VDUSTATUS
STA VDUSTATUS STA VDUSTATUS
@ -252,30 +252,30 @@ CLRSTATUS AND VDUSTATUS
* A=cursor key, CS from caller * A=cursor key, CS from caller
COPYMOVE PHA COPYMOVE PHA
BIT VDUSTATUS BIT VDUSTATUS
BVS COPYMOVE2 ; Edit cursor already on BVS COPYMOVE2 ; Edit cursor already on
JSR GETCHRC JSR GETCHRC
STA COPYCHAR STA COPYCHAR
LDA CURSORED LDA CURSORED
JSR PUTCHRC ; Edit cursor JSR PUTCHRC ; Edit cursor
SEC SEC
JSR COPYSWAP2 ; Initialise copy cursor JSR COPYSWAP2 ; Initialise copy cursor
ROR FLASHER ROR FLASHER
ASL FLASHER ; Ensure b0=0 ASL FLASHER ; Ensure b0=0
LDA #$42 LDA #$42
ORA VDUSTATUS ORA VDUSTATUS
STA VDUSTATUS ; Turn cursor editing on STA VDUSTATUS ; Turn cursor editing on
COPYMOVE2 PLA COPYMOVE2 PLA
AND #3 ; Convert to 8/9/10/11 AND #3 ; Convert to 8/9/10/11
ORA #8 ORA #8
COPYMOVE3 JMP OUTCHARGO ; Move edit cursor COPYMOVE3 JMP OUTCHARGO ; Move edit cursor
* Swap between edit and copy cursors * Swap between edit and copy cursors
COPYSWAP1 CLC ; CC=Swap TEXT and COPY COPYSWAP1 CLC ; CC=Swap TEXT and COPY
COPYSWAP2 LDX #1 COPYSWAP2 LDX #1
COPYSWAPLP LDY VDUCOPYX,X COPYSWAPLP LDY VDUCOPYX,X
LDA VDUTEXTX,X LDA VDUTEXTX,X
STA VDUCOPYX,X STA VDUCOPYX,X
BCS COPYSWAP3 ; CS=Copy TEXT to COPY BCS COPYSWAP3 ; CS=Copy TEXT to COPY
TYA TYA
STA VDUTEXTX,X STA VDUTEXTX,X
COPYSWAP3 DEX COPYSWAP3 DEX
@ -284,75 +284,75 @@ COPYSWAP4 RTS
* Perform backspace & delete operation * Perform backspace & delete operation
VDU127 JSR VDU08 ; Move cursor back VDU127 JSR VDU08 ; Move cursor back
LDA #' ' ; Overwrite with a space LDA #' ' ; Overwrite with a space
BNE PUTCHRC BNE PUTCHRC
* Display character at current (TEXTX,TEXTY) * Display character at current (TEXTX,TEXTY)
PRCHRC PHA ; Save character PRCHRC PHA ; Save character
LDA $C000 LDA $C000
BPL :RESUME ; No key pressed BPL :RESUME ; No key pressed
EOR #$80 EOR #$80
:PAUSE1 JSR KBDCHKESC ; Ask KBD to test if Escape :PAUSE1 JSR KBDCHKESC ; Ask KBD to test if Escape
BIT ESCFLAG BIT ESCFLAG
BMI :RESUMEACK ; Escape, skip pausing BMI :RESUMEACK ; Escape, skip pausing
CMP #$13 CMP #$13
BNE :RESUME ; Not Ctrl-S BNE :RESUME ; Not Ctrl-S
STA $C010 ; Ack. keypress STA $C010 ; Ack. keypress
:PAUSE2 LDA $C000 :PAUSE2 LDA $C000
BPL :PAUSE2 ; Loop until keypress BPL :PAUSE2 ; Loop until keypress
EOR #$80 EOR #$80
CMP #$11 ; Ctrl-Q CMP #$11 ; Ctrl-Q
BEQ :RESUMEACK ; Stop pausing BEQ :RESUMEACK ; Stop pausing
JSR KBDCHKESC ; Ask KBD to test if Escape JSR KBDCHKESC ; Ask KBD to test if Escape
BIT ESCFLAG BIT ESCFLAG
BPL :PAUSE2 ; No Escape, keep pausing BPL :PAUSE2 ; No Escape, keep pausing
:RESUMEACK STA $C010 ; Ack. keypress :RESUMEACK STA $C010 ; Ack. keypress
:RESUME PLA :RESUME PLA
* Put character to screen * Put character to screen
PUTCHRC LDY VDUBYTES PUTCHRC LDY VDUBYTES
DEY ; If VDUBYTE=1, text mode DEY ; If VDUBYTE=1, text mode
BNE PRCHRSOFT ; Graphics mode BNE PRCHRSOFT ; Graphics mode
EOR #$80 ; Convert character EOR #$80 ; Convert character
TAY TAY
AND #$A0 AND #$A0
BNE PRCHR4 BNE PRCHR4
CPY #$20 CPY #$20
BCS PRCHR3 ; Not $80-$9F BCS PRCHR3 ; Not $80-$9F
BIT VDUSCREEN BIT VDUSCREEN
BVC PRCHR3 ; Not teletext BVC PRCHR3 ; Not teletext
LDY #$E0 ; Convert $80-$9F to space LDY #$E0 ; Convert $80-$9F to space
PRCHR3 TYA PRCHR3 TYA
EOR #$40 EOR #$40
TAY TAY
PRCHR4 PHY PRCHR4 PHY
JSR CHARADDR ; Find character address JSR CHARADDR ; Find character address
PLA ; Get character back PLA ; Get character back
PHP ; Disable IRQs while PHP ; Disable IRQs while
SEI ; toggling memory SEI ; toggling memory
BCC PRCHR6 ; Aux memory BCC PRCHR6 ; Aux memory
STA $C004 ; Switch to main memory STA $C004 ; Switch to main memory
PRCHR6 STA (VDUADDR),Y ; Store it PRCHR6 STA (VDUADDR),Y ; Store it
STA $C005 ; Back to aux memory STA $C005 ; Back to aux memory
PLP ; Restore IRQs PLP ; Restore IRQs
RTS RTS
PRCHRSOFT RTS ; *TODO* Jump to gfx PRCHRSOFT RTS ; *TODO* Jump to gfx
* Fetch character from screen at (TEXTX,TEXTY) and return MODE in Y * Fetch character from screen at (TEXTX,TEXTY) and return MODE in Y
BYTE87 BYTE87
GETCHRC LDY VDUBYTES GETCHRC LDY VDUBYTES
DEY ; If VDUBYTE=1, text mode DEY ; If VDUBYTE=1, text mode
BNE GETCHRSOFT ; Graphics mode BNE GETCHRSOFT ; Graphics mode
JSR CHARADDR ; Find character address JSR CHARADDR ; Find character address
PHP ; Disable IRQs while PHP ; Disable IRQs while
SEI ; toggling memory SEI ; toggling memory
BCC GETCHR6 ; Aux memory BCC GETCHR6 ; Aux memory
STA $C002 ; Switch to main memory STA $C002 ; Switch to main memory
GETCHR6 LDA (VDUADDR),Y ; Get character GETCHR6 LDA (VDUADDR),Y ; Get character
STA $C003 ; Back to aux memory STA $C003 ; Back to aux memory
PLP ; Restore IRQs PLP ; Restore IRQs
TAY ; Convert character TAY ; Convert character
AND #$A0 AND #$A0
BNE GETCHR7 BNE GETCHR7
TYA TYA
@ -360,30 +360,30 @@ GETCHR6 LDA (VDUADDR),Y ; Get character
TAY TAY
GETCHR7 TYA GETCHR7 TYA
EOR #$80 EOR #$80
LDY VDUMODE ; Y=MODE LDY VDUMODE ; Y=MODE
TAX ; X=char TAX ; X=char
GETCHROK RTS GETCHROK RTS
GETCHRSOFT RTS ; *TODO* Jump to gfx GETCHRSOFT RTS ; *TODO* Jump to gfx
* Get text cursor position * Get text cursor position
BYTE86 LDY VDUTEXTY ; ROW ; $86 = read cursor pos BYTE86 LDY VDUTEXTY ; ROW ; $86 = read cursor pos
LDX VDUTEXTX ; COL LDX VDUTEXTX ; COL
RTS RTS
* Calculate character address * Calculate character address
CHARADDR LDA VDUTEXTY CHARADDR LDA VDUTEXTY
ASL ASL
TAX TAX
LDA SCNTAB+0,X ; LSB of row address LDA SCNTAB+0,X ; LSB of row address
STA VDUADDR+0 STA VDUADDR+0
LDA SCNTAB+1,X ; MSB of row address LDA SCNTAB+1,X ; MSB of row address
STA VDUADDR+1 STA VDUADDR+1
LDA VDUTEXTX LDA VDUTEXTX
BIT $C01F BIT $C01F
SEC SEC
BPL CHARADDR40 ; 40-col BPL CHARADDR40 ; 40-col
LSR A LSR A
CHARADDR40 TAY ; Y=offset into this row CHARADDR40 TAY ; Y=offset into this row
RTS RTS
* (VDUADDR),Y=>character address * (VDUADDR),Y=>character address
* CC=auxmem * CC=auxmem
@ -391,63 +391,63 @@ CHARADDR40 TAY ; Y=offset into this row
* Move cursor left * Move cursor left
VDU08 LDA VDUTEXTX ; COL VDU08 LDA VDUTEXTX ; COL
BEQ :S1 BEQ :S1
DEC VDUTEXTX ; COL DEC VDUTEXTX ; COL
BRA :S3 BRA :S3
:S1 LDA VDUTEXTY ; ROW :S1 LDA VDUTEXTY ; ROW
BEQ :S3 BEQ :S3
DEC VDUTEXTY ; ROW DEC VDUTEXTY ; ROW
LDA #39 LDA #39
BIT $C01F BIT $C01F
BPL :S2 BPL :S2
LDA #79 LDA #79
:S2 STA VDUTEXTX ; COL :S2 STA VDUTEXTX ; COL
:S3 RTS :S3 RTS
* Move cursor right * Move cursor right
VDU09 LDA VDUTEXTX ; COL VDU09 LDA VDUTEXTX ; COL
CMP #39 CMP #39
BCC :S2 BCC :S2
BIT $C01F BIT $C01F
BPL :T11 BPL :T11
CMP #79 CMP #79
BCC :S2 BCC :S2
:T11 STZ VDUTEXTX ; COL :T11 STZ VDUTEXTX ; COL
LDA VDUTEXTY ; ROW LDA VDUTEXTY ; ROW
CMP #23 CMP #23
BEQ SCROLL BEQ SCROLL
INC VDUTEXTY ; ROW INC VDUTEXTY ; ROW
:DONE RTS :DONE RTS
:S2 INC VDUTEXTX ; COL :S2 INC VDUTEXTX ; COL
BRA :DONE BRA :DONE
SCROLL JSR SCROLLER SCROLL JSR SCROLLER
JSR CLREOL JSR CLREOL
RTS RTS
* Move cursor down * Move cursor down
VDU10 LDA VDUTEXTY ; ROW VDU10 LDA VDUTEXTY ; ROW
CMP #23 CMP #23
BEQ :TOSCRL ; JGH BEQ :TOSCRL ; JGH
INC VDUTEXTY ; ROW INC VDUTEXTY ; ROW
RTS RTS
:TOSCRL JMP SCROLL ; JGH :TOSCRL JMP SCROLL ; JGH
* Move cursor up * Move cursor up
VDU11 LDA VDUTEXTY ; ROW VDU11 LDA VDUTEXTY ; ROW
BEQ :DONE BEQ :DONE
DEC VDUTEXTY ; ROW DEC VDUTEXTY ; ROW
:DONE RTS :DONE RTS
* Move to start of line * Move to start of line
VDU13 LDA #$BF VDU13 LDA #$BF
JSR CLRSTATUS ; Turn copy cursor off JSR CLRSTATUS ; Turn copy cursor off
STZ VDUTEXTX ; COL STZ VDUTEXTX ; COL
RTS RTS
* Move to (0,0) * Move to (0,0)
VDU30 STZ VDUTEXTY ; ROW VDU30 STZ VDUTEXTY ; ROW
STZ VDUTEXTX ; COL STZ VDUTEXTX ; COL
RTS RTS
* Move to (X,Y) * Move to (X,Y)
@ -461,8 +461,8 @@ VDU31 LDY VDUQ+8
BMI :T9A BMI :T9A
CPX #40 CPX #40
BCS :DONE BCS :DONE
:T9A STX VDUTEXTX ; COL :T9A STX VDUTEXTX ; COL
STY VDUTEXTY ; ROW STY VDUTEXTY ; ROW
:DONE RTS :DONE RTS
@ -495,14 +495,14 @@ VDUINIT STA VDUQ+8
VDU22 LDA VDUQ+8 VDU22 LDA VDUQ+8
AND #$07 AND #$07
STA VDUMODE STA VDUMODE
TAX ; Set up MODE TAX ; Set up MODE
LDA #'_' ; Set up default cursors LDA #'_' ; Set up default cursors
STA CURSOR ; Normal cursor STA CURSOR ; Normal cursor
STA CURSORCP ; Copy cursor when editing STA CURSORCP ; Copy cursor when editing
LDA #$A0 LDA #$A0
STA CURSORED ; Edit cursor when editing STA CURSORED ; Edit cursor when editing
LDA #$01 LDA #$01
JSR CLRSTATUS ; Clear everything except PrinterEcho JSR CLRSTATUS ; Clear everything except PrinterEcho
JSR VDU26A JSR VDU26A
* *
LDA SCNBYTES,X LDA SCNBYTES,X
@ -511,27 +511,27 @@ VDU22 LDA VDUQ+8
STA VDUCOLOURS STA VDUCOLOURS
LDA SCNTYPE,X LDA SCNTYPE,X
STA VDUSCREEN STA VDUSCREEN
BMI VDU22G ; b7=1, graphics mode BMI VDU22G ; b7=1, graphics mode
* TEMP * TEMP
CPX #2 CPX #2
BEQ VDU22G ; Jump out for MODE 2 BEQ VDU22G ; Jump out for MODE 2
* TEMP * TEMP
* *
AND #$01 ; 40col/80col bit AND #$01 ; 40col/80col bit
TAX TAX
STA $C00C,X ; Select 40col/80col STA $C00C,X ; Select 40col/80col
STA $C051 ; Enable Text STA $C051 ; Enable Text
STA $C055 ; PAGE2 STA $C055 ; PAGE2
STA $C052 ; Clear MIXED STA $C052 ; Clear MIXED
STA $C00F ; Enable alt charset STA $C00F ; Enable alt charset
BRA VDU22CLR BRA VDU22CLR
VDU22G STA $C050 ; Enable Graphics VDU22G STA $C050 ; Enable Graphics
STA $C057 ; Hi-Res STA $C057 ; Hi-Res
STA $C054 ; PAGE1 STA $C054 ; PAGE1
STA $C052 ; Clear MIXED STA $C052 ; Clear MIXED
JMP VDU16 ; Clear HGR screen JMP VDU16 ; Clear HGR screen
VDU22CLR VDU22CLR
* JSR VDU15 ; Turn off paged scrolling * JSR VDU15 ; Turn off paged scrolling
@ -541,38 +541,38 @@ VDU22CLR
VDU12 LDY VDUBYTES VDU12 LDY VDUBYTES
DEY ; If VDUBYTE=1, text mode DEY ; If VDUBYTE=1, text mode
BNE VDU12SOFT ; Graphics mode BNE VDU12SOFT ; Graphics mode
JMP CLEAR JMP CLEAR
* Clear the screen * Clear the screen
CLEAR STZ VDUTEXTY ; ROW CLEAR STZ VDUTEXTY ; ROW
STZ VDUTEXTX ; COL STZ VDUTEXTX ; COL
:L1 JSR CLREOL :L1 JSR CLREOL
:S2 LDA VDUTEXTY ; ROW :S2 LDA VDUTEXTY ; ROW
CMP #23 CMP #23
BEQ :S3 BEQ :S3
INC VDUTEXTY ; ROW INC VDUTEXTY ; ROW
BRA :L1 BRA :L1
:S3 STZ VDUTEXTY ; ROW :S3 STZ VDUTEXTY ; ROW
STZ VDUTEXTX ; COL STZ VDUTEXTX ; COL
RTS RTS
VDU12SOFT JMP VDU16 ; *TEMP* VDU12SOFT JMP VDU16 ; *TEMP*
* Clear to EOL * Clear to EOL
CLREOL LDA VDUTEXTY ; ROW CLREOL LDA VDUTEXTY ; ROW
ASL ASL
TAX TAX
LDA SCNTAB,X ; LSB of row LDA SCNTAB,X ; LSB of row
STA ZP1 STA ZP1
LDA SCNTAB+1,X ; MSB of row LDA SCNTAB+1,X ; MSB of row
STA ZP1+1 STA ZP1+1
LDA VDUTEXTX ; COL LDA VDUTEXTX ; COL
PHA PHA
STZ VDUTEXTX ; COL STZ VDUTEXTX ; COL
:L1 :L1
LDA VDUTEXTX ; COL LDA VDUTEXTX ; COL
LSR LSR
TAY TAY
BCC :S1 BCC :S1
@ -580,13 +580,13 @@ CLREOL LDA VDUTEXTY ; ROW
:S1 LDA #" " :S1 LDA #" "
STA (ZP1),Y STA (ZP1),Y
>>> WRTAUX >>> WRTAUX
LDA VDUTEXTX ; COL LDA VDUTEXTX ; COL
CMP #79 CMP #79
BEQ :S2 BEQ :S2
INC VDUTEXTX ; COL INC VDUTEXTX ; COL
BRA :L1 BRA :L1
:S2 PLA :S2 PLA
STA VDUTEXTX ; COL STA VDUTEXTX ; COL
RTS RTS
* Scroll whole screen one line * Scroll whole screen one line
@ -598,7 +598,7 @@ SCROLLER LDA #$00
CMP #23 CMP #23
BNE :L1 BNE :L1
BIT VDUSTATUS BIT VDUSTATUS
BVC :L2 ; Copy cursor not active BVC :L2 ; Copy cursor not active
JSR COPYSWAP1 JSR COPYSWAP1
LDA #11 LDA #11
JSR OUTCHARGO JSR OUTCHARGO
@ -606,13 +606,13 @@ SCROLLER LDA #$00
:L2 RTS :L2 RTS
* Copy line A+1 to line A * Copy line A+1 to line A
SCR1LINE ASL ; Dest addr->ZP1 SCR1LINE ASL ; Dest addr->ZP1
TAX TAX
LDA SCNTAB,X LDA SCNTAB,X
STA ZP1 STA ZP1
LDA SCNTAB+1,X LDA SCNTAB+1,X
STA ZP1+1 STA ZP1+1
INX ; Source addr->ZP2 INX ; Source addr->ZP2
INX INX
LDA SCNTAB,X LDA SCNTAB,X
STA ZP2 STA ZP2
@ -621,11 +621,11 @@ SCR1LINE ASL ; Dest addr->ZP1
LDY #$00 LDY #$00
:L1 LDA (ZP2),Y :L1 LDA (ZP2),Y
STA (ZP1),Y STA (ZP1),Y
STA $C002 ; Read main mem STA $C002 ; Read main mem
>>> WRTMAIN >>> WRTMAIN
LDA (ZP2),Y LDA (ZP2),Y
STA (ZP1),Y STA (ZP1),Y
STA $C003 ; Read aux mem STA $C003 ; Read aux mem
>>> WRTAUX >>> WRTAUX
INY INY
CPY #40 CPY #40
@ -649,25 +649,25 @@ VDU16RET >>> ENTAUX
VDU17 RTS VDU17 RTS
* VDU 18 - GCOL k,a - select graphics colour and plot action * VDU 18 - GCOL k,a - select graphics colour and plot action
VDU18 LDA VDUQ+7 ; Argument 'k' VDU18 LDA VDUQ+7 ; Argument 'k'
CMP #$04 ; k=4 means XOR CMP #$04 ; k=4 means XOR
LDA #$00 ; Normal drawing mode LDA #$00 ; Normal drawing mode
BNE :NORM BNE :NORM
LDA #$01 ; XOR mode LDA #$01 ; XOR mode
:NORM >>> WRTMAIN :NORM >>> WRTMAIN
STA LINETYPE STA LINETYPE
STA FDRAWADDR+5 STA FDRAWADDR+5
>>> WRTAUX >>> WRTAUX
>>> XF2MAIN,SETLINE >>> XF2MAIN,SETLINE
VDU18RET1 >>> ENTAUX VDU18RET1 >>> ENTAUX
:NORM LDA VDUQ+8 ; Argument 'a' :NORM LDA VDUQ+8 ; Argument 'a'
BPL :FOREGND ; <128 is foreground BPL :FOREGND ; <128 is foreground
>>> WRTMAIN >>> WRTMAIN
STA BGCOLOR ; Stored in main memory STA BGCOLOR ; Stored in main memory
>>> WRTAUX >>> WRTAUX
RTS RTS
:FOREGND >>> WRTMAIN :FOREGND >>> WRTMAIN
STA FGCOLOR ; Stored in main memory STA FGCOLOR ; Stored in main memory
>>> WRTAUX >>> WRTAUX
RTS RTS
@ -687,29 +687,29 @@ VDU24 RTS
* x is in VDUQ+7,VDUQ+8 * x is in VDUQ+7,VDUQ+8
* y is in VDUQ+5,VDUQ+6 * y is in VDUQ+5,VDUQ+6
* k is in VDUQ+4 * k is in VDUQ+4
VDU25 JSR CVTCOORD ; Convert coordinate system VDU25 JSR CVTCOORD ; Convert coordinate system
LDA VDUQ+4 LDA VDUQ+4
AND #$04 ; Bit 2 set -> absolute AND #$04 ; Bit 2 set -> absolute
BNE :ABS BNE :ABS
JSR RELCOORD ; Add coords to XPIXEL/YPIXEL JSR RELCOORD ; Add coords to XPIXEL/YPIXEL
:ABS LDA VDUQ+4 :ABS LDA VDUQ+4
AND #$03 AND #$03
CMP #$0 ; Bits 0,1 clear -> just move CMP #$0 ; Bits 0,1 clear -> just move
BNE :NOTMOVE BNE :NOTMOVE
JMP HGRPOS ; Just update pos JMP HGRPOS ; Just update pos
:NOTMOVE LDA VDUQ+4 :NOTMOVE LDA VDUQ+4
AND #$C0 AND #$C0
CMP #$40 ; Bit 7 clr, bit 6 set -> point CMP #$40 ; Bit 7 clr, bit 6 set -> point
BNE :LINE BNE :LINE
>>> WRTMAIN >>> WRTMAIN
LDA VDUQ+4 LDA VDUQ+4
STA PLOTMODE STA PLOTMODE
LDA VDUQ+5 LDA VDUQ+5
STA FDRAWADDR+6 ; LSB of X1 STA FDRAWADDR+6 ; LSB of X1
LDA VDUQ+6 LDA VDUQ+6
STA FDRAWADDR+7 ; MSB of X1 STA FDRAWADDR+7 ; MSB of X1
LDA VDUQ+7 LDA VDUQ+7
STA FDRAWADDR+8 ; Y1 STA FDRAWADDR+8 ; Y1
>>> WRTAUX >>> WRTAUX
>>> XF2MAIN,DRAWPNT >>> XF2MAIN,DRAWPNT
:LINE >>> WRTMAIN :LINE >>> WRTMAIN
@ -722,11 +722,11 @@ VDU25 JSR CVTCOORD ; Convert coordinate system
LDA YPIXEL LDA YPIXEL
STA FDRAWADDR+8 STA FDRAWADDR+8
LDA VDUQ+5 LDA VDUQ+5
STA FDRAWADDR+9 ; LSB of X1 STA FDRAWADDR+9 ; LSB of X1
LDA VDUQ+6 LDA VDUQ+6
STA FDRAWADDR+10 ; MSB of X1 STA FDRAWADDR+10 ; MSB of X1
LDA VDUQ+7 LDA VDUQ+7
STA FDRAWADDR+11 ; Y1 STA FDRAWADDR+11 ; Y1
>>> WRTAUX >>> WRTAUX
>>> XF2MAIN,DRAWLINE >>> XF2MAIN,DRAWLINE
VDU25RET >>> ENTAUX VDU25RET >>> ENTAUX
@ -739,8 +739,8 @@ HGRPOS LDA VDUQ+5
LDA VDUQ+7 LDA VDUQ+7
STA YPIXEL STA YPIXEL
RTS RTS
XPIXEL DW $0000 ; Previous plot x-coord XPIXEL DW $0000 ; Previous plot x-coord
YPIXEL DB $00 ; Previous plot y-coord YPIXEL DB $00 ; Previous plot y-coord
* VDU 28,left,bottom,right,top - define text window * VDU 28,left,bottom,right,top - define text window
VDU28 RTS VDU28 RTS
@ -753,7 +753,7 @@ VDU29 RTS
* OSBYTE &A0 - Read VDU variable * OSBYTE &A0 - Read VDU variable
******************************** ********************************
BYTEA0 CPX #$40 ; Index into VDU variables BYTEA0 CPX #$40 ; Index into VDU variables
BCC BYTEA02 BCC BYTEA02
TXA TXA
SBC #$20 SBC #$20

View File

@ -30,15 +30,6 @@ START JSR CROUT
CLC ; Load into main CLC ; Load into main
JSR LOADCODE JSR LOADCODE
LDA #<:FNTFILE
STA OPENPL+1
LDA #>:FNTFILE
STA OPENPL+2
LDA #>FONTADDR ; Address in main
LDX #<FONTADDR
CLC ; Load into main
JSR LOADCODE
LDA #<MOSSHIM ; Start address of MOS shim LDA #<MOSSHIM ; Start address of MOS shim
STA A1L STA A1L
LDA #>MOSSHIM LDA #>MOSSHIM
@ -78,7 +69,6 @@ START JSR CROUT
>>> XF2AUX,AUXMOS1 >>> XF2AUX,AUXMOS1
:FDFILE STR "FDRAW.FAST" ; Filename for FDraw lib :FDFILE STR "FDRAW.FAST" ; Filename for FDraw lib
:FNTFILE STR "FONT.DAT" ; Filename for bitmap font
* Load image from file into memory * Load image from file into memory
* On entry: OPENPL set up to point to file to load * On entry: OPENPL set up to point to file to load

View File

@ -1129,11 +1129,6 @@ GFXINIT JSR FDRAWADDR+0 ; Initialize FDRAW library
JSR FDRAWADDR+22 ; FDRAW: clear HGR screen JSR FDRAWADDR+22 ; FDRAW: clear HGR screen
RTS RTS
* Draw character on graphics screen (byte aligned)
* On entry: Character in A
DRAWCHAR
RTS
FGCOLOR DB $00 ; Foreground colour FGCOLOR DB $00 ; Foreground colour
BGCOLOR DB $00 ; Background colour BGCOLOR DB $00 ; Background colour
LINETYPE DB $00 ; 0 normal, 1 XOR LINETYPE DB $00 ; 0 normal, 1 XOR