Merge PR145 'Updated ROM selection'

This commit is contained in:
Bobbi Webber-Manners 2021-11-13 13:58:20 -05:00
parent 565075e464
commit 0024867910
5 changed files with 390 additions and 240 deletions

Binary file not shown.

View File

@ -204,7 +204,7 @@ BYTE00 BEQ BYTE00A ; OSBYTE 0,0 - generate error
RTS ; %000x1xxx host type, 'A'pple
BYTE00A BRK
DB $F7
HELLO ASC 'Applecorn MOS 2021-11-05'
HELLO ASC 'Applecorn MOS 2021-11-13'
DB $00 ; Unify MOS messages

View File

@ -8,6 +8,7 @@
* 25-Oct-2021 Initial pseudo-sideways ROM selection code.
* 26-Oct-2021 Corrected entry parameters to OSRDRM.
* 03-Nov-2021 Temp'y fix, if can't find SROM, ignores it.
* 13-Nov-2021 ROMSELECT calls mainmem to load ROM.
* OSBYTE $80 - ADVAL
@ -331,182 +332,211 @@ RDROM LDA $F4
* Select a sideways ROM
* X=ROM to select
* All registers must be preserved
ROMSELECT CPX $F8
BEQ :ROMSELOK ; Already selected
ROMSELECT
* Insert code here for faking sideways ROMs by loading or otherwise
* fetching code to $8000. All registers must be preserved.
CPX MAXROM
BEQ :ROMSEL
BCS :ROMSELOK ; Out of range, ignore
:ROMSEL PHA
:ROMSEL PHP
PHA
PHX
PHY
LDA OSLPTR+0
PHA
LDA OSLPTR+1
PHA
TXA
ASL A
TAX
LDA ROMTAB+0,X ; LSB of pointer to name
STA OSFILECB+0
LDA ROMTAB+1,X ; MSB of pointer to name
STA OSFILECB+1
LDX #<OSFILECB
LDY #>OSFILECB
LDA #$05 ; Means 'INFO'
JSR OSFILE
CMP #$01
BNE :ROMNOTFND ; File not found
STZ OSFILECB+2 ; Dest address $8000
LDA #$80
STA OSFILECB+3
STZ OSFILECB+4
STZ OSFILECB+5
STZ OSFILECB+6 ; Load to specified address
LDX #<OSFILECB
LDY #>OSFILECB
LDA #$FF ; Means 'LOAD'
JSR OSFILE
:ROMNOTFND
PLA
STA OSLPTR+1
PLA
STA OSLPTR+0
SEI
TXA ; A=ROM to select
>>> XF2MAIN,SELECTROM
ROMSELDONE >>> ENTAUX
PLY
PLX
PLA
STX $F8 ; Set ROM loaded
PLP
:ROMSELOK STX $F4 ; Set Current ROM number
RTS
ROMXX
* CPX $F8
* BEQ :ROMSELOK ; Already selected
*
** Insert code here for faking sideways ROMs by loading or otherwise
** fetching code to $8000. All registers must be preserved.
* CPX MAXROM
* BEQ :ROMSEL
* BCS :ROMSELOK ; Out of range, ignore
*:ROMSEL PHA
* PHX
* PHY
*
* LDA OSLPTR+0
* PHA
* LDA OSLPTR+1
* PHA
*
* TXA
* ASL A
* TAX
* LDA ROMTAB+0,X ; LSB of pointer to name
* STA OSFILECB+0
* LDA ROMTAB+1,X ; MSB of pointer to name
* STA OSFILECB+1
*
* LDX #<OSFILECB
* LDY #>OSFILECB
* LDA #$05 ; Means 'INFO'
* JSR OSFILE
* CMP #$01
* BNE :ROMNOTFND ; File not found
*
* STZ OSFILECB+2 ; Dest address $8000
* LDA #$80
* STA OSFILECB+3
* STZ OSFILECB+4
* STZ OSFILECB+5
* STZ OSFILECB+6 ; Load to specified address
* LDX #<OSFILECB
* LDY #>OSFILECB
* LDA #$FF ; Means 'LOAD'
* JSR OSFILE
*:ROMNOTFND
* PLA
* STA OSLPTR+1
* PLA
* STA OSLPTR+0
* PLY
* PLX
* PLA
* STX $F8 ; Set ROM loaded
*:ROMSELOK STX $F4 ; Set Current ROM number
EVENT RTS
BASICROM ASC 'BASIC2.ROM'
DB $0D,$00
COMALROM ASC 'COMAL.ROM'
DB $0D,$00
LISPROM ASC 'LISP501.ROM'
DB $0D,$00
FORTHROM ASC 'FORTH103.ROM'
DB $0D,$00
PROLOGROM ASC 'MPROLOG310.ROM'
DB $0D,$00
BCPLROM ASC 'BCPL7.0.ROM'
DB $0D,$00
PASCROM1 ASC 'PASC.1.10.1.ROM'
DB $0D,$00
PASCROM2 ASC 'PASC.1.10.2.ROM'
DB $0D,$00
*BASICROM ASC 'BASIC2.ROM'
* DB $0D,$00
*
*COMALROM ASC 'COMAL.ROM'
* DB $0D,$00
*
*LISPROM ASC 'LISP501.ROM'
* DB $0D,$00
*
*FORTHROM ASC 'FORTH103.ROM'
* DB $0D,$00
*
*PROLOGROM ASC 'MPROLOG310.ROM'
* DB $0D,$00
*
*BCPLROM ASC 'BCPL7.0.ROM'
* DB $0D,$00
*
*PASCROM1 ASC 'PASC.1.10.1.ROM'
* DB $0D,$00
*
*PASCROM2 ASC 'PASC.1.10.2.ROM'
* DB $0D,$00
*
* Initialize ROMTAB according to user selection in menu
ROMINIT STZ MAXROM ; One sideways ROM only
STA $C002 ; Read main mem
LDA USERSEL
STA $C003 ; Read aux mem
ASL ; x2
CLC
ADC #<ROMS
STA OSLPTR+0
LDA #>ROMS
ADC #$00
STA OSLPTR+1
LDY #$00
LDA (OSLPTR),Y
STA ROMTAB+0
INY
LDA (OSLPTR),Y
STA ROMTAB+1
STA $C002 ; Read main mem
LDA USERSEL
STA $C003 ; Read aux mem
CMP #6 ; Menu entry 7 has two ROMs
BNE :S1
LDA #<PASCROM2
STA ROMTAB+2
LDA #>PASCROM2
STA ROMTAB+3
INC MAXROM ; Two ROMs
BRA :DONE
:S1 CMP #7 ; Menu entry 8
BNE :DONE
LDA #<PASCROM1
STA ROMTAB+0
LDA #>PASCROM1
STA ROMTAB+1
LDA #<PASCROM2
STA ROMTAB+2
LDA #>PASCROM2
STA ROMTAB+3
LDA #<LISPROM
STA ROMTAB+4
LDA #>LISPROM
STA ROMTAB+5
LDA #<FORTHROM
STA ROMTAB+6
LDA #>FORTHROM
STA ROMTAB+7
LDA #<PROLOGROM
STA ROMTAB+8
LDA #>PROLOGROM
STA ROMTAB+9
LDA #<BCPLROM
STA ROMTAB+10
LDA #>BCPLROM
STA ROMTAB+11
LDA #<COMALROM
STA ROMTAB+12
LDA #>COMALROM
STA ROMTAB+13
LDA #<BASICROM
STA ROMTAB+14
LDA #>BASICROM
STA ROMTAB+15
LDA #7 ; 8 sideways ROMs
CMP #6
BNE :X1
INC MAXROM
:X1 CMP #7
BNE :X2
STA MAXROM
:DONE LDA #$FF
STA $F8 ; Force ROM to load
RTS
:X2 RTS
* Active sideways ROMs
ROMTAB DW $0000 ; ROM0
DW $0000 ; ROM1
DW $0000 ; ROM2
DW $0000 ; ROM3
DW $0000 ; ROM4
DW $0000 ; ROM5
DW $0000 ; ROM6
DW $0000 ; ROM7
DW $0000 ; ROM8
DW $0000 ; ROM9
DW $0000 ; ROMA
DW $0000 ; ROMB
DW $0000 ; ROMC
DW $0000 ; ROMD
DW $0000 ; ROME
DW $0000 ; ROMF
* ROM filenames in same order as in the menu
* ROMMENU copies these to ROMTAB upon user selection
ROMS DW BASICROM
DW COMALROM
DW LISPROM
DW FORTHROM
DW PROLOGROM
DW BCPLROM
DW PASCROM1
DW PASCROM2
* ASL ; x2
* CLC
* ADC #<ROMS
* STA OSLPTR+0
* LDA #>ROMS
* ADC #$00
* STA OSLPTR+1
* LDY #$00
* LDA (OSLPTR),Y
* STA ROMTAB+0
* INY
* LDA (OSLPTR),Y
* STA ROMTAB+1
* STA $C002 ; Read main mem
* LDA USERSEL
* STA $C003 ; Read aux mem
* CMP #6 ; Menu entry 7 has two ROMs
* BNE :S1
* LDA #<PASCROM2
* STA ROMTAB+2
* LDA #>PASCROM2
* STA ROMTAB+3
* INC MAXROM ; Two ROMs
* BRA :DONE
*:S1 CMP #7 ; Menu entry 8
* BNE :DONE
* LDA #<PASCROM1
* STA ROMTAB+0
* LDA #>PASCROM1
* STA ROMTAB+1
* LDA #<PASCROM2
* STA ROMTAB+2
* LDA #>PASCROM2
* STA ROMTAB+3
* LDA #<LISPROM
* STA ROMTAB+4
* LDA #>LISPROM
* STA ROMTAB+5
* LDA #<FORTHROM
* STA ROMTAB+6
* LDA #>FORTHROM
* STA ROMTAB+7
* LDA #<PROLOGROM
* STA ROMTAB+8
* LDA #>PROLOGROM
* STA ROMTAB+9
* LDA #<BCPLROM
* STA ROMTAB+10
* LDA #>BCPLROM
* STA ROMTAB+11
* LDA #<COMALROM
* STA ROMTAB+12
* LDA #>COMALROM
* STA ROMTAB+13
* LDA #<BASICROM
* STA ROMTAB+14
* LDA #>BASICROM
* STA ROMTAB+15
* LDA #7 ; 8 sideways ROMs
* STA MAXROM
*:DONE LDA #$FF
* STA $F8 ; Force ROM to load
* RTS
*
** Active sideways ROMs
*ROMTAB DW $0000 ; ROM0
* DW $0000 ; ROM1
* DW $0000 ; ROM2
* DW $0000 ; ROM3
* DW $0000 ; ROM4
* DW $0000 ; ROM5
* DW $0000 ; ROM6
* DW $0000 ; ROM7
* DW $0000 ; ROM8
* DW $0000 ; ROM9
* DW $0000 ; ROMA
* DW $0000 ; ROMB
* DW $0000 ; ROMC
* DW $0000 ; ROMD
* DW $0000 ; ROME
* DW $0000 ; ROMF
*
** ROM filenames in same order as in the menu
** ROMMENU copies these to ROMTAB upon user selection
*ROMS DW BASICROM
* DW COMALROM
* DW LISPROM
* DW FORTHROM
* DW PROLOGROM
* DW BCPLROM
* DW PASCROM1
* DW PASCROM2
*EVENT LDA #<OSEVENM
* LDY #>OSEVENM
@ -689,5 +719,3 @@ AUXBLK ASC '**ENDOFCODE**'

View File

@ -3,6 +3,8 @@
*
* Applecorn loader code. Runs in main memory.
* 01-Oct-2021 Copies MOS code to whole $D000-$FFFF.
* 13-Nov-2021 LOADCODE uses absolute path to Applecorn directory.
* Loads Acorn ROM file (16KB) from disk and writes it
* to aux memory starting at $08000. Copies Applecorn MOS
@ -16,8 +18,6 @@ START JSR CROUT
LDA #$20 ; PAGE2 shadow on ROM3 GS
TRB $C035
STZ $C073 ; Force RamWorks bank zero
JSR ROMMENU
* LDA #>AUXADDR ; Address in aux
* LDX #<AUXADDR
@ -84,21 +84,60 @@ START JSR CROUT
:FNTFILE STR "FONT.DAT" ; Filename for bitmap font
* 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 leafname of file to load
* Loads file from directory applecorn started from
* Uses BLKBUF at loading buffer
* Load address in A,X
* Carry set->load to aux, carry clear->load to main
LOADCODE PHP ; Save carry flag
STA :ADDRH ; MSB of load address
STX :ADDRL ; LSB of load address
STZ :BLOCKS
JSR OPENFILE ; Open ROM file
LDX #0
:LP1 LDA CMDPATH+1,X ; Copy Applecorn path to MOSFILE
STA MOSFILE2+1,X
INX
CPX CMDPATH
BCC :LP1
:LP2 DEX
LDA MOSFILE2+1,X
CMP #'/'
BNE :LP2
LDA OPENPL+1
STA A1L
LDA OPENPL+2
STA A1H
LDY #1
LDA (A1L),Y
CMP #'/'
BEQ :L4 ; Already absolute path
:LP3 LDA (A1L),Y
STA MOSFILE2+2,X
INX
INY
TYA
CMP (A1L)
BCC :LP3
BEQ :LP3
INX
STX MOSFILE2+0
LDA #<MOSFILE2 ; Point to absolute path
STA OPENPL+1
LDA #>MOSFILE2
STA OPENPL+2
:L4 JSR OPENFILE ; Open ROM file
BCC :S1
LDX #$00
:L1A LDA :CANTOPEN,X ; Part one of error msg
PLP
BCC :L1A ; Load to main, report error
RTS ; Load to aux, return CS=Failed
:L1A LDX #$00
:L1B LDA :CANTOPEN,X ; Part one of error msg
BEQ :S0
JSR COUT1
INX
BRA :L1A
BRA :L1B
:S0 LDA OPENPL+1 ; Print filename
STA A1L
LDA OPENPL+2
@ -117,9 +156,12 @@ LOADCODE PHP ; Save carry flag
:SPIN BRA :SPIN
:S1 LDA OPENPL+5 ; File reference number
STA READPL+1
:L2 LDA #'.'+$80 ; Read file block by block
:L2 PLP
PHP
BCS :L2A ; Loading to aux, skip dots
LDA #'.'+$80 ; Print progress dots
JSR COUT1
JSR RDFILE
:L2A JSR RDFILE ; Read file block by block
BCS :CLOSE ; EOF (0 bytes left) or some error
LDA #<BLKBUF ; Source start addr -> A1L,A1H
STA A1L
@ -153,6 +195,7 @@ LOADCODE PHP ; Save carry flag
JSR CLSFILE
JSR CROUT
PLP
CLC ; CC=Ok
RTS
:ADDRL DB $00 ; Destination address (LSB)
:ADDRH DB $00 ; Destination address (MSB)
@ -176,8 +219,4 @@ LOADCODE PHP ; Save carry flag

View File

@ -3,36 +3,55 @@
*
* Applecorn ROM menu. Runs in main memory.
ROMMENU JSR HOME ; Clear screen
LDA #<TITLE1 ; Print title
STA A1L
LDA #>TITLE1
STA A1H
JSR PRSTRA1
JSR CROUT
JSR CROUT
LDA #<TITLE2
STA A1L
LDA #>TITLE2
STA A1H
JSR PRSTRA1
JSR CROUT
JSR CROUT
JSR CROUT
* 13-Nov-2021 List of selected ROMs kept locally.
LDX #$00 ; Print menu
:L1 LDA MSGTBL,X
STA A1L
ROMMAX EQU $0382
ROMTHIS EQU $0383
ROMADDRS EQU $0384 ; List of ROM filename addresses
ROMMENU JSR HOME ; Clear screen
LDX #0
:LP0 LDA TITLE1,X ; Print title
BEQ :LP1
JSR COUT1
INX
LDA MSGTBL,X
STA A1H
INX
JSR PRSTRA1
BNE :LP0
:LP1
* LDA #<TITLE1 ; Print title
* STA A1L
* LDA #>TITLE1
* STA A1H
* JSR PRSTRA1
JSR CROUT
JSR CROUT
CPX #8*2
BEQ :KEYIN
BRA :L1
* TEMP
; LDA #$00
; JMP :KEYOK
* TEMP
* JSR CROUT
* LDA #<TITLE2
* STA A1L
* LDA #>TITLE2
* STA A1H
* JSR PRSTRA1
* JSR CROUT
* JSR CROUT
* JSR CROUT
*
* LDX #$00 ; Print menu
*:L1 LDA MSGTBL,X
* STA A1L
* INX
* LDA MSGTBL,X
* STA A1H
* INX
* JSR PRSTRA1
* JSR CROUT
* JSR CROUT
* CPX #8*2
* BEQ :KEYIN
* BRA :L1
:KEYIN LDA $C000 ; Kdb data / strobe
BPL :KEYIN ; Wait for keystroke
@ -45,63 +64,127 @@ ROMMENU JSR HOME ; Clear screen
JSR BELL ; Invalid - beep
BRA :KEYIN ; Go again
:KEYOK STA USERSEL ; Record selection
* Make list of ROMs
LDX #63
LDA #0
:INITLP1 STA ROMADDRS,X
DEX
BPL :INITLP1
STX ROMTHIS ; Current ROM=none
LDY USERSEL ; Index to ROM to load
LDA #0 ; Load it to bank 0
CPY #6
BCC :INITROM2 ; <6, single ROM
LDA #1 ; Load to bank 1 and 0
CPY #7
BCC :INITROM2 ; =7, two ROMs
LDA #7 ; Load to bank 7 to 0
LDY #0 ; Starting at ROM 0
:INITROM2 STA ROMMAX
ASL A
TAX ; X=>ROM address table
TYA
ASL A
TAY ; Y=>ROM addresses
:INITROM3 LDA ROMLIST+0,Y
STA ROMADDRS+0,X
LDA ROMLIST+1,Y
STA ROMADDRS+1,X
INY
INY
DEX
DEX
BPL :INITROM3
RTS
* Print a string pointed to by A1L/A1H
* Trashes A, preserves X and Y
PRSTRA1 PHY
LDY #$00
:L1 LDA (A1L),Y
BEQ :NULL
JSR COUT1
INY
BRA :L1
:NULL PLY
RTS
SELECTROM >>> ENTMAIN
CMP ROMTHIS
BEQ :SELECTDONE ; Already selected
CMP ROMMAX
BCC :GETROM
BNE :SELECTDONE ; Out of range
:GETROM PHA
ASL A
TAX
LDA ROMADDRS+0,X ; ROM filename
STA OPENPL+1
LDA ROMADDRS+1,X
STA OPENPL+2
LDA #$80 ; Load address $8000
LDX #$00
SEC ; Aux memory
JSR LOADCODE ; Try and fetch it
PLA ; Get bank back
BCS :SELECTDONE ; Failed
STA ROMTHIS ; It is paged in
:SELECTDONE >>> XF2AUX,ROMSELDONE
** Print a string pointed to by A1L/A1H
** Trashes A, preserves X and Y
*PRSTRA1 PHY
* LDY #$00
*:L1 LDA (A1L),Y
* BEQ :NULL
* JSR COUT1
* INY
* BRA :L1
*:NULL PLY
* RTS
TITLE1 ASC "** APPLECORN **"
DB $00
DB $8D,$8D
TITLE2 ASC "Choose a BBC Micro ROM:"
DB $00
DB $8D,$8D
MSGTBL DW MSG1
DW MSG2
DW MSG3
DW MSG4
DW MSG5
DW MSG6
DW MSG7
DW MSG8
*MSGTBL DW MSG1
* DW MSG2
* DW MSG3
* DW MSG4
* DW MSG5
* DW MSG6
* DW MSG7
* DW MSG8
MSG1 ASC " 1. BBC BASIC"
DB $00
DB $8D,$8D
MSG2 ASC " 2. Acornsoft COMAL"
DB $00
DB $8D,$8D
MSG3 ASC " 3. Acornsoft Lisp"
DB $00
DB $8D,$8D
MSG4 ASC " 4. Acornsoft Forth"
DB $00
DB $8D,$8D
MSG5 ASC " 5. Acornsoft MicroProlog"
DB $00
DB $8D,$8D
MSG6 ASC " 6. Acornsoft BCPL"
DB $00
DB $8D,$8D
MSG7 ASC " 7. Acornsoft ISO Pascal (2 ROMs)"
DB $8D,$8D
MSG8 ASC " 8. Everything! (8 ROMs)"
DB $8D
DB $00
MSG8 ASC " 8. Everything! (8 ROMs)"
DB $00
ROMLIST DW ROM1
DW ROM2
DW ROM3
DW ROM4
DW ROM5
DW ROM6
DW ROM7
DW ROM8
ROM1 STR "BASIC2.ROM"
ROM2 STR "COMAL.ROM"
ROM3 STR "LISP501.ROM"
ROM4 STR "FORTH103.ROM"
ROM5 STR "MPROLOG310.ROM"
ROM6 STR "BCPL700.ROM"
ROM7 STR "PASCAL110A.ROM"
ROM8 STR "PASCAL110B.ROM"
USERSEL DB $00