From 463c4bddc339272449893b73762765cadeddd98b Mon Sep 17 00:00:00 2001 From: Joppe Blondel Date: Wed, 7 Oct 2026 18:00:25 +0200 Subject: [PATCH] added full mode to basic --- apps/basic/basic.asm | 98 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 95 insertions(+), 3 deletions(-) diff --git a/apps/basic/basic.asm b/apps/basic/basic.asm index 142cf1b..96926dc 100644 --- a/apps/basic/basic.asm +++ b/apps/basic/basic.asm @@ -384,6 +384,7 @@ WORDS: .BYTE 'E'+80H,"ND" .BYTE 'E'+80H,"ROM" .BYTE 'B'+80H,"ANK0" .BYTE 'B'+80H,"ANK1" + .BYTE 'F'+80H,"ULL" .BYTE 80H ; End of list marker ; KEYWORD ADDRESS TABLE @@ -460,6 +461,7 @@ ZDROM .EQU 0D2H ZEROM .EQU 0D3H ZBANK0 .EQU 0D4H ZBANK1 .EQU 0D5H +ZFULL .EQU 0D6H ; ARITHMETIC PRECEDENCE TABLE @@ -1287,10 +1289,16 @@ CHKBANK0: JP GETCHR CHKBANK1: CP ZBANK1 - JP NZ,STDONJMP + JP NZ,CHKFULL LD BC,BANK1 PUSH BC JP GETCHR +CHKFULL: + CP ZFULL + JP NZ,STDONJMP + LD BC,FULL + PUSH BC + JP GETCHR ; ------------ STDONJMP: SUB ZEND ; Is it a token? @@ -1584,6 +1592,9 @@ LET: CALL GETVAR ; Get variable name LETSTR: PUSH HL ; Save address of string var LD HL,(FPREG) ; Pointer to string entry PUSH HL ; Save it on stack + LD A,(BASTXT+1) ; Full mode has program RAM below BIOS + CP 0C0H + JP C,CRESTR ; Copy strings into the full-mode heap INC HL ; Skip over length INC HL LD E,(HL) ; LSB of string address @@ -4406,7 +4417,8 @@ MONOUT: JP MC_BIOS_PUTC ; output a char MONITR: CALL MC_BIOS_FLUSH - CALL EROM ; enable rom + LD A,1 ; enable rom + call MC_BIOS_ROM JP 0 ; reboot INITST: LD A,0 ; Clear break flag @@ -4428,27 +4440,107 @@ OUTNCR: CALL OUTC ; Output character in A DROM: ; disable ROM RET NZ + LD A,(BASTXT+1) ; Full mode has program RAM below BIOS + CP 0C0H + JP C,FCERR ; Return error in full mode LD A,0 call MC_BIOS_ROM RET EROM: ; enable ROM RET NZ + LD A,(BASTXT+1) ; Full mode has program RAM below BIOS + CP 0C0H + JP C,FCERR ; Return error in full mode LD A,1 call MC_BIOS_ROM RET BANK0: ; Bank 0 RET NZ + LD A,(BASTXT+1) ; Full mode has program RAM below BIOS + CP 0C0H + JP C,FCERR ; Return error in full mode LD A,0 call MC_BIOS_BANK RET BANK1: ; Bank 1 RET NZ + LD A,(BASTXT+1) ; Full mode has program RAM below BIOS + CP 0C0H + JP C,FCERR ; Return error in full mode LD A,1 call MC_BIOS_BANK RET -.end +FULL: ; New entry. exposes full 48k ram to basic + RET NZ + ; FULL BOOT SEQUENCE + ; ------------------ + LD A,0 + CALL MC_BIOS_ROM ; Expose RAM below the ROM + + LD HL,WRKSPC ; Start of workspace RAM + LD SP,HL ; Set up a temporary stack + + LD DE,INITAB ; Initialise workspace + LD B,INITBE-INITAB+3 + LD HL,WRKSPC +FULLCPY: + LD A,(DE) + LD (HL),A + INC HL + INC DE + DEC B + JP NZ,FULLCPY + + LD SP,HL ; Temporary stack + CALL CLREG ; Clear registers and stack + CALL PRNTCRLF + XOR A + LD (BUFFER+72+1),A ; Mark end of input buffer + + LD HL,0100H ; Program and variables start here + LD (BASTXT),HL + + LD HL,FULLMSG ; Announce the alternate layout + CALL PRS + + LD HL,SHARED_MEM_START-1 + JP FULLSETTOP ; Finish full-memory initialisation + +FULLSETTOP: + LD DE,0-512 ; Reserve 512 bytes for strings + LD (LSTRAM),HL ; Save last available RAM + ADD HL,DE + LD (STRSPC),HL ; Bottom of string space / stack top + CALL CLRPTR ; Clear program and variables + + LD HL,(STRSPC) + LD DE,0-17 ; BASIC's working-space adjustment + ADD HL,DE + LD DE,(BASTXT) ; Relocatable program start + DEC DE ; Preserve original inclusive count + LD A,L + SUB E + LD L,A + LD A,H + SBC A,D + LD H,A + + PUSH HL ; Save calculated free-byte count + LD HL,SIGNON + CALL PRS + POP HL + CALL PRNTHL + LD HL,BFREE + CALL PRS + JP WARMST + ; ------------------ + +FULLMSG: + .BYTE "[FULL MEMORY]",CR,LF,0,0 + +.end