diff --git a/applecorn.po b/applecorn.po index e5f2f05..c58f2d6 100644 Binary files a/applecorn.po and b/applecorn.po differ diff --git a/auxmem.init.s b/auxmem.init.s index 9f72808..322553e 100644 --- a/auxmem.init.s +++ b/auxmem.init.s @@ -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 diff --git a/auxmem.misc.s b/auxmem.misc.s index 2767f73..a295999 100644 --- a/auxmem.misc.s +++ b/auxmem.misc.s @@ -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 - 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 - 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 +* 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 +* 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 - 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+3 - INC MAXROM ; Two ROMs - BRA :DONE -:S1 CMP #7 ; Menu entry 8 - BNE :DONE - LDA #PASCROM1 - STA ROMTAB+1 - LDA #PASCROM2 - STA ROMTAB+3 - LDA #LISPROM - STA ROMTAB+5 - LDA #FORTHROM - STA ROMTAB+7 - LDA #PROLOGROM - STA ROMTAB+9 - LDA #BCPLROM - STA ROMTAB+11 - LDA #COMALROM - STA ROMTAB+13 - 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 +* 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+3 +* INC MAXROM ; Two ROMs +* BRA :DONE +*:S1 CMP #7 ; Menu entry 8 +* BNE :DONE +* LDA #PASCROM1 +* STA ROMTAB+1 +* LDA #PASCROM2 +* STA ROMTAB+3 +* LDA #LISPROM +* STA ROMTAB+5 +* LDA #FORTHROM +* STA ROMTAB+7 +* LDA #PROLOGROM +* STA ROMTAB+9 +* LDA #BCPLROM +* STA ROMTAB+11 +* LDA #COMALROM +* STA ROMTAB+13 +* 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 @@ -689,5 +719,3 @@ AUXBLK ASC '**ENDOFCODE**' - - diff --git a/mainmem.ldr.s b/mainmem.ldr.s index 302e9d6..d758af5 100644 --- a/mainmem.ldr.s +++ b/mainmem.ldr.s @@ -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 #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 + 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 # 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 - - - - diff --git a/mainmem.menu.s b/mainmem.menu.s index b690661..a767af9 100644 --- a/mainmem.menu.s +++ b/mainmem.menu.s @@ -3,36 +3,55 @@ * * Applecorn ROM menu. Runs in main memory. -ROMMENU JSR HOME ; Clear screen - LDA #TITLE1 - STA A1H - JSR PRSTRA1 - JSR CROUT - JSR CROUT - 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 +* 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 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 - - - -