mirror of
https://github.com/bobbimanners/Applecorn.git
synced 2024-11-18 23:10:05 +00:00
8f83ea188e
Fix a typo-ed reference to CLRALTCHAR to correct location.
266 lines
8.1 KiB
ArmAsm
266 lines
8.1 KiB
ArmAsm
* MAINMEM.MENU.S
|
|
* (c) Bobbi 2021 GPL3
|
|
*
|
|
* Applecorn ROM menu. Runs in main memory.
|
|
|
|
* 13-Nov-2021 List of selected ROMs kept locally.
|
|
|
|
ORG ENDSYSTEM+ENDVEC-AUXMOS+MOSEND-MOSAPI+2
|
|
|
|
ROMTOTL EQU $0382 ; Prevent name clash
|
|
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
|
|
BNE :LP0
|
|
:LP1
|
|
|
|
:KEYIN LDA KEYBOARD ; Kdb data / strobe
|
|
BPL :KEYIN ; Wait for keystroke
|
|
STA KBDSTRB ; Clear strobe
|
|
AND #$7F
|
|
SEC
|
|
SBC #'1' ; '1'->0, '2'->1 etc.
|
|
CMP #9
|
|
BCC :KEYOK
|
|
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
|
|
CPY #8
|
|
BEQ :INITROM2 ; =8, also 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 ROMTOTL
|
|
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
|
|
|
|
SELECTROM >>> ENTMAIN
|
|
CMP ROMTHIS
|
|
BEQ :SELECTDONE ; Already selected
|
|
CMP ROMTOTL
|
|
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
|
|
|
|
|
|
TITLE1 ASC "** APPLECORN **"
|
|
DB $8D,$8D
|
|
TITLE2 ASC "Choose a BBC Micro ROM:"
|
|
DB $8D,$8D
|
|
|
|
MSG1 ASC " 1. BBC BASIC"
|
|
DB $8D,$8D
|
|
MSG2 ASC " 2. Acornsoft COMAL"
|
|
DB $8D,$8D
|
|
MSG3 ASC " 3. Acornsoft Lisp"
|
|
DB $8D,$8D
|
|
MSG4 ASC " 4. Acornsoft Forth"
|
|
DB $8D,$8D
|
|
MSG5 ASC " 5. Acornsoft MicroProlog"
|
|
DB $8D,$8D
|
|
MSG6 ASC " 6. Acornsoft BCPL"
|
|
DB $8D,$8D
|
|
MSG7 ASC " 7. Acornsoft ISO Pascal (2 ROMs)"
|
|
DB $8D,$8D
|
|
MSG8 ASC " 8. 1 through 7 (8 ROMs)"
|
|
DB $8D,$8D
|
|
MSG9 ASC " 9. Acornsoft View"
|
|
DB $8D
|
|
DB $00
|
|
|
|
|
|
ROMLIST DW ROM1
|
|
DW ROM2
|
|
DW ROM3
|
|
DW ROM4
|
|
DW ROM5
|
|
DW ROM6
|
|
DW ROM7
|
|
DW ROM8
|
|
DW ROM9
|
|
|
|
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"
|
|
ROM9 STR "VIEWA3.0.ROM"
|
|
|
|
USERSEL DB $00
|
|
|
|
* Load image from file into memory
|
|
* 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
|
|
|
|
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
|
|
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 :L1B
|
|
:S0 LDA OPENPL+1 ; Print filename
|
|
STA A1L
|
|
LDA OPENPL+2
|
|
STA A1H
|
|
LDY #$00
|
|
LDA (A1L),Y
|
|
STA :LEN
|
|
:L1C CPY :LEN
|
|
BEQ :ERR1
|
|
INY
|
|
LDA (A1L),Y
|
|
JSR COUT1
|
|
BRA :L1C
|
|
:ERR1 JSR CROUT
|
|
JSR BELL
|
|
:SPIN BRA :SPIN
|
|
:S1 LDA OPENPL+5 ; File reference number
|
|
STA READPL+1
|
|
:L2 PLP
|
|
PHP
|
|
BCS :L2A ; Loading to aux, skip dots
|
|
LDA #'.'+$80 ; Print progress dots
|
|
JSR COUT1
|
|
: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
|
|
LDA #>BLKBUF
|
|
STA A1H
|
|
LDA #<BLKBUFEND ; Source end addr -> A2L,A2H
|
|
STA A2L
|
|
LDA #>BLKBUFEND
|
|
STA A2H
|
|
LDA :ADDRL ; Dest in aux -> A4L, A4H
|
|
STA A4L
|
|
LDA :ADDRH
|
|
LDX :BLOCKS
|
|
:L3 CPX #$00
|
|
BEQ :S2
|
|
INC
|
|
INC
|
|
DEX
|
|
BRA :L3
|
|
:S2 STA A4H
|
|
PLP ; Recover carry flag
|
|
PHP
|
|
BCS :TOAUX
|
|
JSR MEMCPY ; Destination in main mem
|
|
BRA :S3
|
|
:TOAUX JSR AUXMOVE ; Carry already set (so to aux)
|
|
:S3 INC :BLOCKS
|
|
BRA :L2
|
|
:CLOSE LDA OPENPL+5 ; File reference number
|
|
STA CLSPL+1
|
|
JSR CLSFILE
|
|
JSR CROUT
|
|
PLP
|
|
CLC ; CC=Ok
|
|
RTS
|
|
:ADDRL DB $00 ; Destination address (LSB)
|
|
:ADDRH DB $00 ; Destination address (MSB)
|
|
:BLOCKS DB $00 ; Counter for blocks read
|
|
:LEN DB $00 ; Length of filename
|
|
:CANTOPEN ASC "Unable to open "
|
|
DB $00
|
|
|
|
|
|
|
|
|
|
|