Merge pull request #201 from jgharston/main

Current language preserved over Break
This commit is contained in:
Bobbi Webber-Manners 2022-11-09 13:55:01 -05:00 committed by GitHub
commit ed6a9a5257

View File

@ -3,6 +3,8 @@
* *
* Initialization code running in Apple //e aux memory * Initialization code running in Apple //e aux memory
* 08-Nov-2022 ResetType OSBYTE set * 08-Nov-2022 ResetType OSBYTE set
* 09-Nov-2022 Current language re-entered, reset on Power/Hard Reset
* BUG: If Ctrl-Break pressed during a service call, wrong ROM gets paged in
*********************************************************** ***********************************************************
@ -10,6 +12,10 @@
*********************************************************** ***********************************************************
MAXROM EQU $F9 ; Max sideways ROM number MAXROM EQU $F9 ; Max sideways ROM number
FXLANG EQU BYTEVARBASE+$FC ; Current language
FXRESET EQU BYTEVARBASE+$FD ; Last Reset type
FXOPTIONS EQU BYTEVARBASE+$FF ; Startup options
ZP1 EQU $90 ; $90-$9f are spare Econet space ZP1 EQU $90 ; $90-$9f are spare Econet space
; so safe to use ; so safe to use
@ -30,7 +36,7 @@ MOSSHIM
* *
* Initially executing at $2000 until copied to $D000 * Initially executing at $2000 until copied to $D000
* *
* When running APLCORN.SYSTEM: * When first run from loading from disk:
* Code will be at $2000-$4FFF, then copied to $D000-$FFFF * Code will be at $2000-$4FFF, then copied to $D000-$FFFF
* When Ctrl-Reset pressed: * When Ctrl-Reset pressed:
* AUX RESET code jumps to MAIN $D000 * AUX RESET code jumps to MAIN $D000
@ -44,67 +50,109 @@ MOSINIT SEI ; Ensure IRQs disabled
LDA LCBANK1 ; LC RAM Rd/Wt, 1st 4K bank LDA LCBANK1 ; LC RAM Rd/Wt, 1st 4K bank
LDA LCBANK1 LDA LCBANK1
LDY #$00 ; $02=Soft Reset LDY #$00 ; $00=Soft Reset
:MODBRA BRA :RELOC ; NOPped out on first run :MODBRA BRA :RELOC ; NOPped out on first run
BRA :NORELOC BRA :NORELOC
:RELOC LDA #<AUXMOS1 ; Relocate MOS shim :RELOC LDA #<AUXMOS1 ; Source
STA A1L STA A1L
LDA #>AUXMOS1 LDA #>AUXMOS1
STA A1H STA A1H
LDA #<EAUXMOS1 LDA #<AUXMOS ; Dest
STA A2L STA A2L
LDA #>EAUXMOS1
STA A2H
LDA #<AUXMOS
STA A4L
LDA #>AUXMOS LDA #>AUXMOS
STA A4H STA A2H ; Y=0 from earlier
:L1 LDA (A1L) :L1 LDA (A1L),Y ; Copy from source
STA (A4L) STA (A2L),Y ; to dest
LDA A1H INY
CMP A2H BNE :L1 ; Do 256 bytes
BNE :S1 INC A1H ; Update source
LDA A1L INC A2H ; Update dest
CMP A2L BMI :L1 ; Loop until wrap past &FFFF
BNE :S1 *
BRA :S4 :L2 LDA MOSVEND-AUXMOS+AUXMOS1-256,Y
:S1 INC A1L STA $FF00,Y ; Copy MOS API and vectors
BNE :S2 INY ; to proper place
INC A1H BNE :L2
:S2 INC A4L
BNE :S3
INC A4H
:S3 BRA :L1
:S4 LDA #<MOSVEC-MOSINIT+AUXMOS1 *:S4 LDA #<MOSVEC-MOSINIT+AUXMOS1
STA A1L * STA A1L
LDA #>MOSVEC-MOSINIT+AUXMOS1 * LDA #>MOSVEC-MOSINIT+AUXMOS1
STA A1H * STA A1H
LDA #<MOSVEND-MOSINIT+AUXMOS1 * LDA #<MOSVEND-MOSINIT+AUXMOS1
STA A2L * STA A2L
LDA #>MOSVEND-MOSINIT+AUXMOS1 * LDA #>MOSVEND-MOSINIT+AUXMOS1
STA A2H * STA A2H
LDA #<MOSAPI * LDA #<MOSAPI
STA A4L * STA A4L
LDA #>MOSAPI * LDA #>MOSAPI
STA A4H * STA A4H
:L2 LDA (A1L) *:L2 LDA (A1L)
STA (A4L) * STA (A4L)
LDA A1H * LDA A1H
CMP A2H * CMP A2H
BNE :S5 * BNE :S5
LDA A1L * LDA A1L
CMP A2L * CMP A2L
BNE :S5 * BNE :S5
BRA :S8
:S5 INC A1L * LDA #<AUXMOS1 ; Relocate MOS shim
BNE :S6 * STA A1L
INC A1H * LDA #>AUXMOS1
:S6 INC A4L * STA A1H
BNE :S7 * LDA #<EAUXMOS1
INC A4H * STA A2L
:S7 BRA :L2 * LDA #>EAUXMOS1
* STA A2H
* LDA #<AUXMOS
* STA A4L
* LDA #>AUXMOS
* STA A4H
*:L1 LDA (A1L)
* STA (A4L)
* LDA A1H
* CMP A2H
* BNE :S1
* LDA A1L
* CMP A2L
* BNE :S1
* BRA :S4
*:S1 INC A1L
* BNE :S2
* INC A1H
*:S2 INC A4L
* BNE :S3
* INC A4H
*:S3 BRA :L1
*
*:S4 LDA #<MOSVEC-MOSINIT+AUXMOS1
* STA A1L
* LDA #>MOSVEC-MOSINIT+AUXMOS1
* STA A1H
* LDA #<MOSVEND-MOSINIT+AUXMOS1
* STA A2L
* LDA #>MOSVEND-MOSINIT+AUXMOS1
* STA A2H
* LDA #<MOSAPI
* STA A4L
* LDA #>MOSAPI
* STA A4H
*:L2 LDA (A1L)
* STA (A4L)
* LDA A1H
* CMP A2H
* BNE :S5
* LDA A1L
* CMP A2L
* BNE :S5
* BRA :S8
*:S5 INC A1L
* BNE :S6
* INC A1H
*:S6 INC A4L
* BNE :S7
* INC A4H
*:S7 BRA :L2
:S8 :S8
LDA #$EA ; NOP opcode LDA #$EA ; NOP opcode
@ -124,13 +172,15 @@ MOSHIGH SEI ; Ensure IRQs disabled
LDX #$FF LDX #$FF
TXS ; Initialise stack TXS ; Initialise stack
INX ; X=$00 INX ; X=$00
TXA LDA FXLANG ; Y=ResetType, A=Language
:SCLR STA $0000,X ; Clear Kernel memory
STA $0200,X :SCLR STZ $0000,X ; Clear Kernel memory
STA $0300,X STZ $0200,X
STZ $0300,X
INX INX
BNE :SCLR BNE :SCLR
STY BYTEVARBASE+$FD ; Set ResetType STY FXRESET ; Set ResetType
STA FXLANG ; Current language
LDX #ENDVEC-DEFVEC-1 LDX #ENDVEC-DEFVEC-1
:INITPG2 LDA DEFVEC,X ; Set up vectors :INITPG2 LDA DEFVEC,X ; Set up vectors
@ -146,19 +196,33 @@ MOSHIGH SEI ; Ensure IRQs disabled
JSR KBDINIT ; Returns A=startup MODE JSR KBDINIT ; Returns A=startup MODE
JSR VDUINIT ; Initialise VDU driver JSR VDUINIT ; Initialise VDU driver
JSR PRHELLO JSR PRHELLO
LDA BYTEVARBASE+$FD ; Get ResetType JSR OSNEWL
BEQ :INITSOFT LDA FXRESET ; Get ResetType
LDA #7 ; Beep on HardReset BEQ :INITSOFT ; Soft reset, skip past
LDA #7 ; Beep on HardReset/PowerReset
JSR OSWRCH JSR OSWRCH
LDA #$FF
STA FXLANG ; Current language=none
*
* AppleII MOS beeps anyway, so always get a Beep * AppleII MOS beeps anyway, so always get a Beep
* BRUN APPLECORN -> BBC Beep * APPLECORN startup -> BBC Beep
* Ctrl-Reset -> AppleII Beep * Press Ctrl-Reset -> AppleII Beep
* *
:INITSOFT JSR OSNEWL * Find a language to enter
LDX MAXROM ; *TEMP* X=language to enter :INITSOFT LDX FXLANG ; Get current language
* TO DO: SoftReset->Use CURRLANG, HardReset->Search for language BPL :INITLANG ; b7=ok, use it
LDX ROMMAX ; Look for a language
:FINDLANG JSR ROMSELECT ; Bring ROM X into memory
BIT $8006 ; Check ROM type
BVS :INITLANG ; b6=set, use it
DEX ; Step down to next ROM
BPL :FINDLANG ; Loop until all tested
BRK ; No language found
DB $F9
ASC 'No Language'
BRK
* *
CLC ; CLC=Entering from RESET :INITLANG CLC ; CLC=Entering from RESET
* OSBYTE $8E - Enter language ROM * OSBYTE $8E - Enter language ROM
********************************* *********************************
@ -166,6 +230,7 @@ MOSHIGH SEI ; Ensure IRQs disabled
* *
BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET
JSR ROMSELECT ; Bring ROM X into memory JSR ROMSELECT ; Bring ROM X into memory
STX FXLANG ; Set as current language ROM
LDA #$00 LDA #$00
STA FAULT+0 STA FAULT+0
LDA #$80 LDA #$80
@ -175,7 +240,6 @@ BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET
STY FAULT+0 ; FAULT pointing to version string STY FAULT+0 ; FAULT pointing to version string
JSR OSNEWL JSR OSNEWL
JSR OSNEWL JSR OSNEWL
STX BYTEVARBASE+$FC ; Set current language ROM
PLP ; Get entry type back PLP ; Get entry type back
LDA #$01 ; $01=Entering code with a header LDA #$01 ; $01=Entering code with a header
JMP ROMAUXADDR JMP ROMAUXADDR
@ -186,8 +250,8 @@ BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET
* X=service call, Y=parameter * X=service call, Y=parameter
* *
* SERVICE TAX ; Enter here with A=Service Num * SERVICE TAX ; Enter here with A=Service Num
BYTE8F SERVICEX
SERVICEX LDA $F4 ; Enter here with X=Service Number BYTE8F LDA $F4 ; Enter here with X=Service Number
PHA ; Save current ROM PHA ; Save current ROM
*DEBUG *DEBUG
LDA $E0 LDA $E0
@ -198,7 +262,7 @@ SERVICEX LDA $F4 ; Enter here with X=Service Number
:SERVDEBUG :SERVDEBUG
*DEBUG *DEBUG
TXA ; A=service number TXA ; A=service number
LDX MAXROM ; Start at highest ROM LDX ROMMAX ; Start at highest ROM
:SERVLP JSR ROMSELECT ; Bring it into memory :SERVLP JSR ROMSELECT ; Bring it into memory
BIT $8006 BIT $8006
BPL :SERVSKIP ; No service entry BPL :SERVSKIP ; No service entry
@ -226,7 +290,7 @@ BYTE00 BEQ BYTE00A ; OSBYTE 0,0 - generate error
RTS ; %000x1xxx host type, 'A'pple RTS ; %000x1xxx host type, 'A'pple
BYTE00A BRK BYTE00A BRK
DB $F7 DB $F7
HELLO ASC 'Applecorn MOS 2022-11-08' HELLO ASC 'Applecorn MOS 2022-11-04'
DB $00 ; Unify MOS messages DB $00 ; Unify MOS messages
* TO DO: Move into RAM * TO DO: Move into RAM
GSSPEED DB $00 ; $80 if GS is fast, $00 for slow GSSPEED DB $00 ; $80 if GS is fast, $00 for slow