Fixed #199 - ISR now has exclusive use of A3L/A3H.

This commit is contained in:
Bobbi Webber-Manners 2022-12-21 21:04:44 -05:00
parent 754271b618
commit 1027179f6e
7 changed files with 63 additions and 58 deletions

Binary file not shown.

View File

@ -28,6 +28,8 @@ A1L EQU $3C
A1H EQU $3D A1H EQU $3D
A2L EQU $3E A2L EQU $3E
A2H EQU $3F A2H EQU $3F
A3L EQU $40 ; Used for ISR only
A3H EQU $41 ; Used for ISR only
A4L EQU $42 A4L EQU $42
A4H EQU $43 A4H EQU $43

View File

@ -109,11 +109,11 @@ KBDINIT LDX #DEFBYTEEND-DEFBYTE-1
DEX DEX
BPL :KBDINITLP BPL :KBDINITLP
JSR SOFTKEYCHK ; Clear soft keys JSR SOFTKEYCHK ; Clear soft keys
LDX #$C0 LDX #$C3
STX FX254VAR ; b7-b4=default KBD map, b3-b0=default MODE STX FX254VAR ; b7-b4=default KBD map, b3-b0=default MODE
BIT SETV ; Set V BIT SETV ; Set V
JSR KBDTEST ; Test if key being pressed JSR KBDTEST ; Test if key being pressed
BCS :KBDINITOK ; Return default MODE=0 BCS :KBDINITOK ; Return default MODE=3
STA KBDACK ; Ack. keypress STA KBDACK ; Ack. keypress
TAX ; Use keypress as default MODE TAX ; Use keypress as default MODE
:KBDINITOK TXA :KBDINITOK TXA

View File

@ -13,6 +13,15 @@ HGRTAB DW $2000,$2080,$2100,$2180,$2200,$2280,$2300,$2380
DW $2028,$20A8,$2128,$21A8,$2228,$22A8,$2328,$23A8 DW $2028,$20A8,$2128,$21A8,$2228,$22A8,$2328,$23A8
DW $2050,$20D0,$2150,$21D0,$2250,$22D0,$2350,$23D0 DW $2050,$20D0,$2150,$21D0,$2250,$22D0,$2350,$23D0
* Enable HGR mode
HGRVDU22 JSR VDU12 ; Clear text and HGR screen
STA HIRES ; Hi-Res
STA GRON ; Enable Graphics
STA PAGE1 ; PAGE1
STA CLR80VID ; Select 40col text
RTS
* Write character to HGR screen * Write character to HGR screen
PRCHRSOFT CMP #$A0 ; Convert to screen code PRCHRSOFT CMP #$A0 ; Convert to screen code
BCS :B0 BCS :B0

View File

@ -113,14 +113,15 @@ VDUWORKSZ EQU VDUVAREND-VDUWORKSP+1
* Screen definitions * Screen definitions
* 0 1 2 3 6 7 ; MODEs sort-of completed * 0 1 2 3 6 7 ; MODEs sort-of completed
SCNTXTMAXX DB 79, 39, 39, 79, 39, 19, 39, 39 ; Max text column SCNTXTMAXX DB 79, 39, 39, 79, 39, 39, 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 01, 08, 08, 01, 01, 01, 01, 01 ; Bytes per character SCNBYTES DB 08, 08, 08, 01, 01, 01, 01, 01 ; Bytes per character
SCNCOLOURS DB 15, 07, 07, 01, 01, 15, 01, 01 ; Colours-1 SCNCOLOURS DB 03, 15, 07, 01, 01, 01, 01, 01 ; Colours-1
SCNPIXELS DB 00, 07, 07, 00, 00, 00, 00, 00 ; Pixels per byte SCNPIXELS DB 08, 08, 07, 00, 00, 00, 00, 00 ; Pixels per byte
SCNTYPE DB 01,128,128, 01, 00, 00, 00, 64 ; Screen type SCNTYPE DB 32, 32,128, 01, 00, 00, 00, 64 ; Screen type
* b7=FastDraw * b7=FastDraw -> HGR mode
* b6=Teletext * b6=Teletext -> No-op
* b5=SHR mode on Apple IIgs
* b0=40COL/80COL * b0=40COL/80COL
* Colour table * Colour table
@ -556,11 +557,12 @@ VDUINIT STA VDUQ+8
* VDU 22 - MODE n * VDU 22 - MODE n
***************** *****************
* At the moment only MODEs available: * At the moment only MODEs available:
* MODE 1 - 280x192 HGR graphics, 40 cols bitmap text * MODE 0 - 640x200 SHR graphics, 80 cols bitmap text (GS only)
* MODE 1 - 320x200 SHR graphics, 40 cols bitmap text (GS only)
* MODE 2 - 280x192 HGR graphics, 40 cols bitmap text
* MODE 3 - 80x24 text * MODE 3 - 80x24 text
* MODE 6 - 40x24 text * MODE 6 - 40x24 text
* MODE 7 - 40x24 with $80-$9F converted to spaces * MODE 7 - 40x24 with $80-$9F converted to spaces
* MODE 0 defaults to MODE 3
* All others default to MODE 6 * All others default to MODE 6
* *
* Wait for VSync? * Wait for VSync?
@ -592,8 +594,9 @@ VDU22 LDA VDUQ+8
JSR VDU26 ; Default windows JSR VDU26 ; Default windows
STA FULLGR ; Clear MIXED mode STA FULLGR ; Clear MIXED mode
LDA VDUSCREEN LDA VDUSCREEN
BMI VDU22G ; b7=1, graphics mode BPL :NOTHGR
AND #$01 ; 40col/80col bit JMP HGRVDU22 ; b7=1, graphics mode
:NOTHGR AND #$01 ; 40col/80col bit
TAX TAX
STA CLR80VID,X ; Select 40col/80col STA CLR80VID,X ; Select 40col/80col
STA TEXTON ; Enable Text STA TEXTON ; Enable Text
@ -626,16 +629,10 @@ VDU12 STZ FXLINES
STA VDUTEXTX ; COL STA VDUTEXTX ; COL
RTS RTS
* Clear the graphics screen buffer * Clear the graphics screen buffer
VDU12SOFT JMP VDU16 ; *TEMP* VDU12SOFT JMP VDU16 ; *TEMP*
VDU22G JSR VDU12 ; Clear text and HGR screen
STA HIRES ; Hi-Res
STA GRON ; Enable Graphics
STA PAGE1 ; PAGE1
STA CLR80VID ; Select 40col text
RTS
* Clear to EOL, respecting text window boundaries * Clear to EOL, respecting text window boundaries
CLREOL JSR CHARADDR ; Set VDUADDR=>start of line CLREOL JSR CHARADDR ; Set VDUADDR=>start of line

View File

@ -131,12 +131,12 @@ CURRAMP DB $00
* Get address of sound buffer * Get address of sound buffer
* On entry: X is buffer number (4..7) * On entry: X is buffer number (4..7)
* On exit: A1L,A1H points to start of buffer * On exit: A3L,A3H points to start of buffer
* Called with interrupts disabled * Called with interrupts disabled
GETBUFADDR LDA :BUFADDRL,X GETBUFADDR LDA :BUFADDRL,X
STA A1L STA A3L
LDA :BUFADDRH,X LDA :BUFADDRH,X
STA A1H STA A3H
RTS RTS
:BUFADDRL DB $00 :BUFADDRL DB $00
DB $00 DB $00
@ -175,9 +175,9 @@ INS PHP ; Save flags, turn off interrupts
BEQ :FULL BEQ :FULL
LDY ENDINDICES,X ; Current position LDY ENDINDICES,X ; Current position
STA ENDINDICES,X ; Write updated input pointer STA ENDINDICES,X ; Write updated input pointer
JSR GETBUFADDR ; Buffer address into A1L,A1H JSR GETBUFADDR ; Buffer address into A3L,A3H
PLA ; Get value to write back PLA ; Get value to write back
STA (A1L),Y ; Write to buffer STA (A3L),Y ; Write to buffer
PLY PLY
PLP ; Restore flags PLP ; Restore flags
CLC ; Exit with carry clear CLC ; Exit with carry clear
@ -211,8 +211,8 @@ REM PHP ; Save flags, turn off interrupts
CMP ENDINDICES,X CMP ENDINDICES,X
BEQ :EMPTY ; Buffer is empty BEQ :EMPTY ; Buffer is empty
TAY ; Buffer pointer into Y TAY ; Buffer pointer into Y
JSR GETBUFADDR ; Buffer address into A1L,A1H JSR GETBUFADDR ; Buffer address into A3L,A3H
LDA (A1L),Y ; Read byte from buffer LDA (A3L),Y ; Read byte from buffer
PHA ; Stash for later PHA ; Stash for later
BVS :EXAM ; If only examination, done BVS :EXAM ; If only examination, done
INY ; Next byte INY ; Next byte
@ -268,12 +268,12 @@ RELNOTE PHX ; Preserve X
TXA ; Audio channel X->A TXA ; Audio channel X->A
ORA #$04 ; Convert to queue number ORA #$04 ; Convert to queue number
TAX ; Queue number ->X TAX ; Queue number ->X
JSR GETBUFADDR ; Buffer address into A1L,A1H JSR GETBUFADDR ; Buffer address into A3L,A3H
LDA STARTINDICES,X ; Output pointer for buf X LDA STARTINDICES,X ; Output pointer for buf X
TAY TAY
LDA (A1L),Y ; Obtain Hold/Sync byte LDA (A3L),Y ; Obtain Hold/Sync byte
AND #$F0 ; Set sync nybble to zero .. AND #$F0 ; Set sync nybble to zero ..
STA (A1L),Y ; .. to release the note STA (A3L),Y ; .. to release the note
PLX ; Recover original X PLX ; Recover original X
:RTS RTS :RTS RTS
@ -568,30 +568,30 @@ ENVTICKS DEC CHANCTR,X ; Decrement counter
* On return: Sets CHANCTR,X to length of each step in 1/100ths * On return: Sets CHANCTR,X to length of each step in 1/100ths
RSTTICKS LDA CHANENV,X ; Get envelope number RSTTICKS LDA CHANENV,X ; Get envelope number
TAY TAY
JSR GETENVADDR ; Envelope address in A1L,A1H JSR GETENVADDR ; Envelope address in A3L,A3H
LDY #ENVT ; Parm for length of each step LDY #ENVT ; Parm for length of each step
LDA (A1L),Y ; Get value of parm LDA (A3L),Y ; Get value of parm
AND #$7F ; Mask out MSB AND #$7F ; Mask out MSB
STA CHANCTR,X ; Reset counter STA CHANCTR,X ; Reset counter
RTS RTS
* On entry: Y is envelope number * On entry: Y is envelope number
* On return: A1L,A1H point to start of buffer for this envelope * On return: A3L,A3H point to start of buffer for this envelope
* X is preserved * X is preserved
GETENVADDR LDA #<ENVBUF0 ; Copy ENVBUF0 to A1L,A1H GETENVADDR LDA #<ENVBUF0 ; Copy ENVBUF0 to A3L,A3H
STA A1L STA A3L
LDA #>ENVBUF0 LDA #>ENVBUF0
STA A1H STA A3H
:L1 CPY #$00 ; See if Y is zero :L1 CPY #$00 ; See if Y is zero
BEQ :DONE ; If so, we are done BEQ :DONE ; If so, we are done
LDA A1L ; Add 13 to A1L,A1H LDA A3L ; Add 13 to A3L,A3H
CLC CLC
ADC #13 ADC #13
STA A1L STA A3L
LDA A1H LDA A3H
ADC #00 ADC #00
STA A1H STA A3H
DEY ; Decr envelopes remaining DEY ; Decr envelopes remaining
BRA :L1 ; Go again BRA :L1 ; Go again
:DONE RTS :DONE RTS
@ -602,7 +602,7 @@ GETENVADDR LDA #<ENVBUF0 ; Copy ENVBUF0 to A1L,A1H
* X is preserved * X is preserved
PITCHENV LDA CHANENV,X ; Get envelope number PITCHENV LDA CHANENV,X ; Get envelope number
TAY TAY
JSR GETENVADDR ; Addr of envelope -> A1L,A1H JSR GETENVADDR ; Addr of envelope -> A3L,A3H
LDA PITCHSECT,X ; See what section we are in LDA PITCHSECT,X ; See what section we are in
BEQ :SECT1 ; Section 1, encoded as 0 BEQ :SECT1 ; Section 1, encoded as 0
CMP #$01 CMP #$01
@ -612,31 +612,31 @@ PITCHENV LDA CHANENV,X ; Get envelope number
RTS ; Other section, do nothing RTS ; Other section, do nothing
:SECT1 :SECT1
LDY #ENVPN1 ; Parm: num steps in section 1 LDY #ENVPN1 ; Parm: num steps in section 1
LDA (A1L),Y ; Get value of parm LDA (A3L),Y ; Get value of parm
CMP PITCHSTEP,X ; Are we there yet? CMP PITCHSTEP,X ; Are we there yet?
BEQ :NXTSECT ; Yes! BEQ :NXTSECT ; Yes!
LDY #ENVPI1 ; Parm: change pitch/step section 1 LDY #ENVPI1 ; Parm: change pitch/step section 1
LDA (A1L),Y ; Get value of parm LDA (A3L),Y ; Get value of parm
JSR UPDPITCH ; Update the pitch JSR UPDPITCH ; Update the pitch
INC PITCHSTEP,X ; One more step INC PITCHSTEP,X ; One more step
RTS RTS
:SECT2 :SECT2
LDY #ENVPN2 ; Parm: num steps in section 2 LDY #ENVPN2 ; Parm: num steps in section 2
LDA (A1L),Y ; Get value of parm LDA (A3L),Y ; Get value of parm
CMP PITCHSTEP,X ; Are we there yet? CMP PITCHSTEP,X ; Are we there yet?
BEQ :NXTSECT ; Yes! BEQ :NXTSECT ; Yes!
LDY #ENVPI2 ; Parm: change pitch/step section 2 LDY #ENVPI2 ; Parm: change pitch/step section 2
LDA (A1L),Y ; Get value of parm LDA (A3L),Y ; Get value of parm
JSR UPDPITCH ; Update the pitch JSR UPDPITCH ; Update the pitch
INC PITCHSTEP,X ; One more step INC PITCHSTEP,X ; One more step
RTS RTS
:SECT3 :SECT3
LDY #ENVPN3 ; Parm: num steps in section 3 LDY #ENVPN3 ; Parm: num steps in section 3
LDA (A1L),Y ; Get value of parm LDA (A3L),Y ; Get value of parm
CMP PITCHSTEP,X ; Are we there yet? CMP PITCHSTEP,X ; Are we there yet?
BEQ :LASTSECT ; Yes! BEQ :LASTSECT ; Yes!
LDY #ENVPI3 ; Parm: change pitch/step section 3 LDY #ENVPI3 ; Parm: change pitch/step section 3
LDA (A1L),Y ; Get value of parm LDA (A3L),Y ; Get value of parm
JSR UPDPITCH ; Update the pitch JSR UPDPITCH ; Update the pitch
INC PITCHSTEP,X ; One more step INC PITCHSTEP,X ; One more step
RTS RTS
@ -644,7 +644,7 @@ PITCHENV LDA CHANENV,X ; Get envelope number
STZ PITCHSTEP,X ; Back to step 0 of section STZ PITCHSTEP,X ; Back to step 0 of section
RTS RTS
:LASTSECT LDY #ENVT ; Parm: length/step + autorepeat :LASTSECT LDY #ENVT ; Parm: length/step + autorepeat
LDA (A1L),Y ; Get value of parm LDA (A3L),Y ; Get value of parm
AND #$80 ; MSB is auto-repeat flag AND #$80 ; MSB is auto-repeat flag
BNE :NXTSECT ; Not repeating BNE :NXTSECT ; Not repeating
STZ PITCHSECT,X ; Go back to section 1 STZ PITCHSECT,X ; Go back to section 1
@ -669,7 +669,7 @@ UPDPITCH STX OSCNUM
* X is preserved * X is preserved
ADSRENV LDA CHANENV,X ; Get envelope number ADSRENV LDA CHANENV,X ; Get envelope number
TAY TAY
JSR GETENVADDR ; Addr of envelope -> A1L,A1H JSR GETENVADDR ; Addr of envelope -> A3L,A3H
LDA AMPSECT,X ; See what section we are in LDA AMPSECT,X ; See what section we are in
BEQ :ATTACK ; Attack, encoded as 0 BEQ :ATTACK ; Attack, encoded as 0
CMP #$01 CMP #$01
@ -680,31 +680,31 @@ ADSRENV LDA CHANENV,X ; Get envelope number
BEQ :RELEASE ; Release, encoded as 3 BEQ :RELEASE ; Release, encoded as 3
RTS ; Otherwise nothing to do RTS ; Otherwise nothing to do
:ATTACK LDY #ENVAA ; Parm: attack change/step :ATTACK LDY #ENVAA ; Parm: attack change/step
LDA (A1L),Y ; Get value of parm LDA (A3L),Y ; Get value of parm
PHA PHA
LDY #ENVALA ; Parm: level at end of attack LDY #ENVALA ; Parm: level at end of attack
LDA (A1L),Y ; Get value of parm LDA (A3L),Y ; Get value of parm
PLY PLY
JSR ADSRPHASE ; Generic ADSR phase handler JSR ADSRPHASE ; Generic ADSR phase handler
BCS :NEXTSECT ; Phase done -> decay BCS :NEXTSECT ; Phase done -> decay
RTS RTS
:DECAY LDY #ENVAD ; Parm: delay change/step :DECAY LDY #ENVAD ; Parm: delay change/step
LDA (A1L),Y ; Get value of parm LDA (A3L),Y ; Get value of parm
PHA PHA
LDY #ENVALD ; Parm: level at end of delay LDY #ENVALD ; Parm: level at end of delay
LDA (A1L),Y ; Get value of parm LDA (A3L),Y ; Get value of parm
PLY PLY
JSR ADSRPHASE ; Generic ADSR phase handler JSR ADSRPHASE ; Generic ADSR phase handler
BCS :NEXTSECT ; Phase done -> sustain BCS :NEXTSECT ; Phase done -> sustain
RTS RTS
:SUSTAIN LDY #ENVAS ; Parm: delay change/step :SUSTAIN LDY #ENVAS ; Parm: delay change/step
LDA (A1L),Y ; Get value of parm LDA (A3L),Y ; Get value of parm
TAY TAY
LDA #$00 ; Target level zero LDA #$00 ; Target level zero
JSR ADSRPHASE ; Generic ADSR phase handler JSR ADSRPHASE ; Generic ADSR phase handler
RTS RTS
:RELEASE LDY #ENVAR ; Parm: attack change/step :RELEASE LDY #ENVAR ; Parm: attack change/step
LDA (A1L),Y ; Get value of parm LDA (A3L),Y ; Get value of parm
TAY TAY
LDA #$00 ; Target level zero LDA #$00 ; Target level zero
JSR ADSRPHASE ; Generic ADSR phase handler JSR ADSRPHASE ; Generic ADSR phase handler

View File

@ -146,8 +146,6 @@ DRAWCHAR >>> ENTMAIN
* Copy text line A+1 to line A * Copy text line A+1 to line A
HGRSCR1L >>> ENTMAIN HGRSCR1L >>> ENTMAIN
PHP ; Disable interrupts ..
SEI ; .. to prevent corruption while scrolling
INC MTXTWINRGT INC MTXTWINRGT
ASL ; Dest addr->A4L,A4H ASL ; Dest addr->A4L,A4H
TAX TAX
@ -179,7 +177,6 @@ DOHGRSCR1L LDX #$00
INX INX
CPX #8 ; 8 pixel rows in character CPX #8 ; 8 pixel rows in character
BNE :L1 BNE :L1
PLP ; Re-enable interrupts
>>> XF2AUX,HSCR1RET >>> XF2AUX,HSCR1RET
* Copy text line A to line A+1 * Copy text line A to line A+1