From b6b1876cc4767dd6c32fc89087d69431262bd0e0 Mon Sep 17 00:00:00 2001 From: Joppe Blondel Date: Thu, 8 Oct 2026 17:12:57 +0200 Subject: [PATCH] Added hexd and exec commands --- Makefile | 2 +- apps/basic/basic.asm | 83 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 82 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 18bfa67..9d76114 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ $(BUILDDIR): $(BUILDDIR)/bios.bin: bios.asm tape.asm $(BUILDDIR)/memory.inc echo '>$<' - $(ASM) $(ASMFLAGS) bios.bin $(BUILDDIR)/bios.bin + $(ASM) $(ASMFLAGS) bios.asm $(BUILDDIR)/bios.bin basic: $(MAKE) -C apps/basic $(or $(MAKECMDGOALS),all) --no-print-directory diff --git a/apps/basic/basic.asm b/apps/basic/basic.asm index 6c1907f..445c93c 100644 --- a/apps/basic/basic.asm +++ b/apps/basic/basic.asm @@ -15,7 +15,7 @@ ; - Unsupported functions cause FCERR, not a reset or REM ; - modern backspace handling ; - Added DROM/EROM/BANK0/BANK1 commands -; - CLOAD +; - Added CLOAD/HEXD/EXEC commands ; ;================================================================================== ; The updates to the original BASIC within this file are copyright Grant Searle @@ -386,6 +386,8 @@ WORDS: .BYTE 'E'+80H,"ND" .BYTE 'B'+80H,"ANK0" .BYTE 'B'+80H,"ANK1" .BYTE 'F'+80H,"ULL" + .BYTE 'H'+80H,"EXD" + .BYTE 'E'+80H,"XEC" .BYTE 80H ; End of list marker ; KEYWORD ADDRESS TABLE @@ -463,6 +465,8 @@ ZEROM .EQU 0D3H ZBANK0 .EQU 0D4H ZBANK1 .EQU 0D5H ZFULL .EQU 0D6H +ZHEXD .EQU 0D7H +ZEXEC .EQU 0D8H ; ARITHMETIC PRECEDENCE TABLE @@ -1296,10 +1300,22 @@ CHKBANK1: JP GETCHR CHKFULL: CP ZFULL - JP NZ,STDONJMP + JP NZ,CHKHEXD LD BC,FULL PUSH BC JP GETCHR +CHKHEXD: + CP ZHEXD + JP NZ,CHKEXEC + LD BC,HEXD + PUSH BC + JP GETCHR +CHKEXEC: + CP ZEXEC + JP NZ,STDONJMP + LD BC,EXEC + PUSH BC + JP GETCHR ; ------------ STDONJMP: SUB ZEND ; Is it a token? @@ -4439,6 +4455,68 @@ TSTBIT: PUSH AF ; Save bit mask OUTNCR: CALL OUTC ; Output character in A JP PRNTCRLF ; Output CRLF +; ------------------------------------------------------- +; Hex dump +; syntax: HEXD start,length +; ------------------------------------------------------- +HEXD: CALL GETNUM ; Get start address + CALL DEINT ; Convert it to 16 bits + PUSH DE ; Save start address + CALL CHKSYN ; Make sure "," follows + .BYTE ',' + CALL GETNUM ; Get length + CALL DEINT ; Convert it to 16 bits + EX (SP),HL ; Save code pointer, get address +HEXDLINE: + LD A,D ; Anything left to print? + OR E + JP Z,HEXDDONE + LD A,H ; Print four-digit address + CALL HEXDBYTE + LD A,L + CALL HEXDBYTE + LD B,16 ; Print up to 16 bytes per line +HEXDLOOP: + LD A,D ; Stop at requested length + OR E + JP Z,HEXDEOL + LD A,' ' + CALL OUTC + LD A,(HL) + CALL HEXDBYTE + INC HL + DEC DE + DJNZ HEXDLOOP +HEXDEOL: + CALL PRNTCRLF + JP HEXDLINE +HEXDDONE: + POP HL ; Restore code pointer + RET + +HEXDBYTE: + PUSH BC + CALL BYT2ASC + LD A,B + CALL OUTC + LD A,C + CALL OUTC + POP BC + RET + +; ------------------------------------------------------- +; Execute machine code +; syntax: EXEC address +; ------------------------------------------------------- +EXEC: CALL GETNUM ; Get address + CALL DEINT ; Convert it to 16 bits + PUSH HL ; Save code pointer + CALL EXECGO ; Call address in DE + POP HL ; Restore code pointer + RET +EXECGO: PUSH DE ; Put target address on stack + RET ; Continue there as a subroutine + DROM: ; disable ROM RET NZ LD A,(BASTXT+1) ; Full mode has program RAM below BIOS @@ -4637,6 +4715,7 @@ CLREADBLOCK: call BIOS_CAS_WAIT_SILENCE pop hl ret + ; Second block failed as well, error CLERR: cp 1 jr z,CLECAL