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
; - Unsupported functions cause FCERR, not a reset or REM
; - modern backspace handling
; - Added DROM/EROM/BANK0/BANK1 commands
;
;==================================================================================
; 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_FLUSH .EQU BIOS_FLUSH
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_RAM_START .EQU BASIC_RAM_START + BASIC_ROM_SIZE
MC_RAM_END .EQU 0FFFFH
@@ -377,7 +380,10 @@ WORDS: .BYTE 'E'+80H,"ND"
.BYTE 'L'+80H,"EFT$"
.BYTE 'R'+80H,"IGHT$"
.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
; KEYWORD ADDRESS TABLE
@@ -450,7 +456,10 @@ ZLTH .EQU 0B5H ; <
ZSGN .EQU 0B6H ; SGN
ZPOINT .EQU 0C7H ; POINT
ZLEFT .EQU 0CDH +2 ; LEFT$
ZHELLO .EQU 0D2H
ZDROM .EQU 0D2H
ZEROM .EQU 0D3H
ZBANK0 .EQU 0D4H
ZBANK1 .EQU 0D5H
; ARITHMETIC PRECEDENCE TABLE
@@ -1258,12 +1267,30 @@ IFJMP: RET Z ; Go to RUNCNT if end of STMT
ONJMP:
; Own commands
; ------------
CHKHELLO:
CP ZHELLO
JP NZ,STDONJMP
ld BC,HELLO
CHKDROM:
CP ZDROM
JP NZ,CHKEROM
ld BC,DROM
PUSH BC
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:
SUB ZEND ; Is it a token?
@@ -4379,8 +4406,8 @@ MONOUT: JP MC_BIOS_PUTC ; output a char
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
LD (BRKFLG),A
@@ -4399,14 +4426,29 @@ TSTBIT: PUSH AF ; Save bit mask
OUTNCR: CALL OUTC ; Output character in A
JP PRNTCRLF ; Output CRLF
HELLO:
DROM: ; disable ROM
RET NZ
PUSH HL
LD HL,HELLOMSG
CALL PRS
POP HL
LD A,0
call MC_BIOS_ROM
RET
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
HELLOMSG: .asciz "Hello!"
.end
+69 -2
View File
@@ -15,7 +15,7 @@ UART_DATA .equ UART_BASE+001h
BUF_SIZE .equ 16
BUF_SIZE_MASK .equ 00fh
WORKSPACE .equ SHARED_MEM_START+00400h
WORKSPACE .equ BIOS_WP_RAM_START
TX_HEAD .equ WORKSPACE+000h
TX_TAIL .equ WORKSPACE+001h
TX_COUNT .equ WORKSPACE+002h
@@ -25,6 +25,7 @@ RX_COUNT .equ WORKSPACE+005h
TX_BUSY .equ WORKSPACE+006h
TX_BUF .equ WORKSPACE+007h
RX_BUF .equ TX_BUF+BUF_SIZE
SYSREG_VALUE .equ RX_BUF+BUF_SIZE
; -------------------------------------------------------
; entry
@@ -39,7 +40,7 @@ boot_copy:
; banking enabled
; bank 1 selected
ld a,BOOT_BANK_MAPPING
ld (SYSTEM_REGISTER),a
out (SYSTEM_REGISTER),a
ld sp,BIOS_STACK_TOP
; copy bios to top 16k
ld hl,BIOS_ROM_START
@@ -94,6 +95,10 @@ boot_copy:
jp puts
.org BIOS_FLUSH
jp flush
.ORG BIOS_ROM
jp setrom
.ORG BIOS_BANK
jp bank
; -------------------------------------------------------
; BIOS ENTRY
@@ -116,6 +121,10 @@ init:
ld i,a
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
call buffers_init
; Initialize peripherals
@@ -452,6 +461,64 @@ flush:
ld a,(TX_COUNT)
cp 0
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
+2
View File
@@ -3,3 +3,5 @@ BIOS_GETC .equ 0c053h
BIOS_TRY_GETC .equ 0c056h
BIOS_PUTS .equ 0c059h
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_ROM_START := 0x0080
BIOS_ROM_SIZE := 0x0380
BIOS_ROM_SIZE := 0x0580
BASIC_ROM_START := 0x0400
BASIC_ROM_START := 0x0600
BASIC_ROM_SIZE := 0x2000
BIOS_RAM_START := 0xc000
BASIC_RAM_START := 0xc800
BIOS_WP_RAM_START := 0xc600
BASIC_RAM_START := 0xca00