From 322c54d2b96ca9512ca207e13380b1f31ec2e10f Mon Sep 17 00:00:00 2001 From: Joppe Blondel Date: Wed, 7 Oct 2026 17:04:23 +0200 Subject: [PATCH] Added drom/erom/bank0/bank1 commands to basic --- apps/basic/basic.asm | 70 ++++++++++++++++++++++++++++++++++--------- bios.asm | 71 ++++++++++++++++++++++++++++++++++++++++++-- bios.inc | 2 ++ memory.mk | 7 +++-- 4 files changed, 131 insertions(+), 19 deletions(-) diff --git a/apps/basic/basic.asm b/apps/basic/basic.asm index 71cdd99..142cf1b 100644 --- a/apps/basic/basic.asm +++ b/apps/basic/basic.asm @@ -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 diff --git a/bios.asm b/bios.asm index b15f732..d5a0a7c 100644 --- a/bios.asm +++ b/bios.asm @@ -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 diff --git a/bios.inc b/bios.inc index 5b34ce3..e711b26 100644 --- a/bios.inc +++ b/bios.inc @@ -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 diff --git a/memory.mk b/memory.mk index 90bd7fd..c7b8651 100644 --- a/memory.mk +++ b/memory.mk @@ -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