Added drom/erom/bank0/bank1 commands to basic

This commit is contained in:
Joppe Blondel
2026-10-07 17:04:23 +02:00
parent c77469e1a1
commit 322c54d2b9
4 changed files with 131 additions and 19 deletions
+56 -14
View File
@@ -14,6 +14,7 @@
; - BIOS calls instead of using RST ; - BIOS calls instead of using RST
; - Unsupported functions cause FCERR, not a reset or REM ; - Unsupported functions cause FCERR, not a reset or REM
; - modern backspace handling ; - modern backspace handling
; - Added DROM/EROM/BANK0/BANK1 commands
; ;
;================================================================================== ;==================================================================================
; The updates to the original BASIC within this file are copyright Grant Searle ; The updates to the original BASIC within this file are copyright Grant Searle
@@ -45,6 +46,8 @@ MC_BIOS_TRY_GETC .EQU BIOS_TRY_GETC
MC_BIOS_GETC .EQU BIOS_GETC MC_BIOS_GETC .EQU BIOS_GETC
MC_BIOS_FLUSH .EQU BIOS_FLUSH MC_BIOS_FLUSH .EQU BIOS_FLUSH
MC_BIOS_MONITOR .EQU BIOS_RAM_START MC_BIOS_MONITOR .EQU BIOS_RAM_START
MC_BIOS_ROM .EQU BIOS_ROM
MC_BIOS_BANK .EQU BIOS_BANK
MC_CODE_START .EQU BASIC_RAM_START MC_CODE_START .EQU BASIC_RAM_START
MC_RAM_START .EQU BASIC_RAM_START + BASIC_ROM_SIZE MC_RAM_START .EQU BASIC_RAM_START + BASIC_ROM_SIZE
MC_RAM_END .EQU 0FFFFH MC_RAM_END .EQU 0FFFFH
@@ -377,7 +380,10 @@ WORDS: .BYTE 'E'+80H,"ND"
.BYTE 'L'+80H,"EFT$" .BYTE 'L'+80H,"EFT$"
.BYTE 'R'+80H,"IGHT$" .BYTE 'R'+80H,"IGHT$"
.BYTE 'M'+80H,"ID$" .BYTE 'M'+80H,"ID$"
.BYTE 'H'+80H,"ELLO" .BYTE 'D'+80H,"ROM"
.BYTE 'E'+80H,"ROM"
.BYTE 'B'+80H,"ANK0"
.BYTE 'B'+80H,"ANK1"
.BYTE 80H ; End of list marker .BYTE 80H ; End of list marker
; KEYWORD ADDRESS TABLE ; KEYWORD ADDRESS TABLE
@@ -450,7 +456,10 @@ ZLTH .EQU 0B5H ; <
ZSGN .EQU 0B6H ; SGN ZSGN .EQU 0B6H ; SGN
ZPOINT .EQU 0C7H ; POINT ZPOINT .EQU 0C7H ; POINT
ZLEFT .EQU 0CDH +2 ; LEFT$ ZLEFT .EQU 0CDH +2 ; LEFT$
ZHELLO .EQU 0D2H ZDROM .EQU 0D2H
ZEROM .EQU 0D3H
ZBANK0 .EQU 0D4H
ZBANK1 .EQU 0D5H
; ARITHMETIC PRECEDENCE TABLE ; ARITHMETIC PRECEDENCE TABLE
@@ -1258,12 +1267,30 @@ IFJMP: RET Z ; Go to RUNCNT if end of STMT
ONJMP: ONJMP:
; Own commands ; Own commands
; ------------ ; ------------
CHKHELLO: CHKDROM:
CP ZHELLO CP ZDROM
JP NZ,STDONJMP JP NZ,CHKEROM
ld BC,HELLO ld BC,DROM
PUSH BC PUSH BC
jp GETCHR jp GETCHR
CHKEROM:
CP ZEROM
JP NZ,CHKBANK0
LD BC,EROM
PUSH BC
JP GETCHR
CHKBANK0:
CP ZBANK0
JP NZ,CHKBANK1
LD BC,BANK0
PUSH BC
JP GETCHR
CHKBANK1:
CP ZBANK1
JP NZ,STDONJMP
LD BC,BANK1
PUSH BC
JP GETCHR
; ------------ ; ------------
STDONJMP: STDONJMP:
SUB ZEND ; Is it a token? SUB ZEND ; Is it a token?
@@ -4379,8 +4406,8 @@ MONOUT: JP MC_BIOS_PUTC ; output a char
MONITR: CALL MC_BIOS_FLUSH MONITR: CALL MC_BIOS_FLUSH
JP MC_BIOS_MONITOR ; Restart (Normally Monitor Start) CALL EROM ; enable rom
JP 0 ; reboot
INITST: LD A,0 ; Clear break flag INITST: LD A,0 ; Clear break flag
LD (BRKFLG),A LD (BRKFLG),A
@@ -4399,14 +4426,29 @@ TSTBIT: PUSH AF ; Save bit mask
OUTNCR: CALL OUTC ; Output character in A OUTNCR: CALL OUTC ; Output character in A
JP PRNTCRLF ; Output CRLF JP PRNTCRLF ; Output CRLF
HELLO: DROM: ; disable ROM
RET NZ RET NZ
PUSH HL LD A,0
LD HL,HELLOMSG call MC_BIOS_ROM
CALL PRS RET
POP HL
EROM: ; enable ROM
RET NZ
LD A,1
call MC_BIOS_ROM
RET
BANK0: ; Bank 0
RET NZ
LD A,0
call MC_BIOS_BANK
RET
BANK1: ; Bank 1
RET NZ
LD A,1
call MC_BIOS_BANK
RET RET
HELLOMSG: .asciz "Hello!"
.end .end
+69 -2
View File
@@ -15,7 +15,7 @@ UART_DATA .equ UART_BASE+001h
BUF_SIZE .equ 16 BUF_SIZE .equ 16
BUF_SIZE_MASK .equ 00fh BUF_SIZE_MASK .equ 00fh
WORKSPACE .equ SHARED_MEM_START+00400h WORKSPACE .equ BIOS_WP_RAM_START
TX_HEAD .equ WORKSPACE+000h TX_HEAD .equ WORKSPACE+000h
TX_TAIL .equ WORKSPACE+001h TX_TAIL .equ WORKSPACE+001h
TX_COUNT .equ WORKSPACE+002h TX_COUNT .equ WORKSPACE+002h
@@ -25,6 +25,7 @@ RX_COUNT .equ WORKSPACE+005h
TX_BUSY .equ WORKSPACE+006h TX_BUSY .equ WORKSPACE+006h
TX_BUF .equ WORKSPACE+007h TX_BUF .equ WORKSPACE+007h
RX_BUF .equ TX_BUF+BUF_SIZE RX_BUF .equ TX_BUF+BUF_SIZE
SYSREG_VALUE .equ RX_BUF+BUF_SIZE
; ------------------------------------------------------- ; -------------------------------------------------------
; entry ; entry
@@ -39,7 +40,7 @@ boot_copy:
; banking enabled ; banking enabled
; bank 1 selected ; bank 1 selected
ld a,BOOT_BANK_MAPPING ld a,BOOT_BANK_MAPPING
ld (SYSTEM_REGISTER),a out (SYSTEM_REGISTER),a
ld sp,BIOS_STACK_TOP ld sp,BIOS_STACK_TOP
; copy bios to top 16k ; copy bios to top 16k
ld hl,BIOS_ROM_START ld hl,BIOS_ROM_START
@@ -94,6 +95,10 @@ boot_copy:
jp puts jp puts
.org BIOS_FLUSH .org BIOS_FLUSH
jp flush jp flush
.ORG BIOS_ROM
jp setrom
.ORG BIOS_BANK
jp bank
; ------------------------------------------------------- ; -------------------------------------------------------
; BIOS ENTRY ; BIOS ENTRY
@@ -116,6 +121,10 @@ init:
ld i,a ld i,a
im 2 im 2
; Set boot bank mapping to sysreg shadow copy
ld a,BOOT_BANK_MAPPING
ld (SYSREG_VALUE),a
out (SYSTEM_REGISTER),a
; Initialize tx and rx buffers ; Initialize tx and rx buffers
call buffers_init call buffers_init
; Initialize peripherals ; Initialize peripherals
@@ -452,6 +461,64 @@ flush:
ld a,(TX_COUNT) ld a,(TX_COUNT)
cp 0 cp 0
jr nz,flush jr nz,flush
ld a,(TX_BUSY)
cp 0
jr nz,flush
ret
; -------------------------------------------------------
; ROM enable/disable
; needs a (nonzero is enable, zero is disable)
; -------------------------------------------------------
setrom:
cp 0
jr z,1$
; nonzero -> enable
push bc
ld a,ROM_DISABLE_BIT
cpl ; get mask
ld b,a
ld a,(SYSREG_VALUE)
and b
ld (SYSREG_VALUE),a
out (SYSTEM_REGISTER),a
pop bc
2$:
ret
1$:
; zero -> disable
ld a,(SYSREG_VALUE)
or ROM_DISABLE_BIT
ld (SYSREG_VALUE),a
out (SYSTEM_REGISTER),a
jr 2$
; -------------------------------------------------------
; Select bank
; needs a (nonzero is bank 1, zero is bank 0)
; -------------------------------------------------------
bank:
cp 0
jr nz,1$
; zero -> bank 0
push bc
ld a,BANK_SELECT_BIT
cpl ; get mask
ld b,a
ld a,(SYSREG_VALUE)
and b
ld (SYSREG_VALUE),a
out (SYSTEM_REGISTER),a
pop bc
2$:
ret
1$:
; non zero -> bank 1
ld a,(SYSREG_VALUE)
or BANK_SELECT_BIT
ld (SYSREG_VALUE),a
out (SYSTEM_REGISTER),a
jr 2$
; ------------------------------------------------------- ; -------------------------------------------------------
; Strings ; Strings
+2
View File
@@ -3,3 +3,5 @@ BIOS_GETC .equ 0c053h
BIOS_TRY_GETC .equ 0c056h BIOS_TRY_GETC .equ 0c056h
BIOS_PUTS .equ 0c059h BIOS_PUTS .equ 0c059h
BIOS_FLUSH .equ 0c05ch BIOS_FLUSH .equ 0c05ch
BIOS_ROM .equ 0c05fh
BIOS_BANK .equ 0c062h
+4 -3
View File
@@ -11,10 +11,11 @@ SHARED_MEM_END := 0xffff
BIOS_STACK_TOP := 0xffff BIOS_STACK_TOP := 0xffff
BIOS_ROM_START := 0x0080 BIOS_ROM_START := 0x0080
BIOS_ROM_SIZE := 0x0380 BIOS_ROM_SIZE := 0x0580
BASIC_ROM_START := 0x0400 BASIC_ROM_START := 0x0600
BASIC_ROM_SIZE := 0x2000 BASIC_ROM_SIZE := 0x2000
BIOS_RAM_START := 0xc000 BIOS_RAM_START := 0xc000
BASIC_RAM_START := 0xc800 BIOS_WP_RAM_START := 0xc600
BASIC_RAM_START := 0xca00