From e8fa4a2d95b9f88b38d53ed77006931154561247 Mon Sep 17 00:00:00 2001 From: William Moore Date: Fri, 5 Jan 2024 00:22:07 -0600 Subject: [PATCH] Intial work on a FORTH interpreter --- src/1802mc/blinkqslowwithescape.asm | 64 ++++++++++++++++--- src/z80/forth.asm | 95 +++++++++++++++++++++++++++++ 2 files changed, 149 insertions(+), 10 deletions(-) create mode 100644 src/z80/forth.asm diff --git a/src/1802mc/blinkqslowwithescape.asm b/src/1802mc/blinkqslowwithescape.asm index 8aa4140..d725fd2 100644 --- a/src/1802mc/blinkqslowwithescape.asm +++ b/src/1802mc/blinkqslowwithescape.asm @@ -14,14 +14,46 @@ ; You should have received a copy of the GNU General Public License ; along with this program. If not, see . -R1 EQU 1 -R2 EQU 2 -R7 EQU 7 +R0 EQU $00 +R1 EQU $01 +R2 EQU $02 +R3 EQU $03 +R4 EQU $04 +R5 EQU $05 +R7 EQU $07 +RE EQU $0D + +STACK EQU 7F6FH +CALL EQU 8ADBH +RETURN EQU 8AEDH + +MON_INPUT EQU 8005H +MON_OUTSTR EQU 8526H + + CPU 1802 + ; ORG $0000 + + ; Setup code to initialize the stack and SCRT registers + ; SETUP R2 (Stack) + LDI HIGH STACK + PHI R2 + LDI LOW STACK + PLO R2 ;STACK = 7F6FH + SEX R2 ;X = 2 + + ; SETUP R4 (CALL PC) + LDI HIGH CALL + PHI R4 + LDI LOW CALL + PLO R4 ;R4 = PC FOR CALL SUBROUTINE + + LDI HIGH RETURN + PHI R5 + LDI LOW RETURN + PLO R5 ;R5 = PC FOR RETURN SUBROUTINE - ORG 0000H -BEGIN SEQ ; announce running - SEX R7 + INKEY BN4 INKEY REQ @@ -44,11 +76,23 @@ DECR DONE REQ + ; LOAD R7, NullByte + ; SEP R4 + ; DW MON_OUTSTR LOAD R7, NOLED OUT 4 - SEP R1 - -ALLLED BYTE 255 -NOLED BYTE 0 + LOAD R7, BYETXT + SEP R4 + DW MON_OUTSTR + LDI $8B + PHI R0 + LDI $5E + PLO R0 + SEX R0 + SEP R0 +ALLLED BYTE $FF +NOLED BYTE 0 +BYETXT BYTE "$", 0 +NullByte BYTE 0 END diff --git a/src/z80/forth.asm b/src/z80/forth.asm new file mode 100644 index 0000000..2187eab --- /dev/null +++ b/src/z80/forth.asm @@ -0,0 +1,95 @@ +; forth.asm - a TIL implementation of FORTH for Z80 +; Copyright (C) 2023 William R. Moore +; +; This program is free software: you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation, either version 3 of the License, or +; (at your option) any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this program. If not, see . + +STACK EQU 2 ; stack pointer +PC EQU 3 ; program counter +CALLR EQU 4 ; call register +RETR EQU 5 ; return register +TXTPTR EQU 7 ; text pointer +INBUF EQU 8 ; Input line buffer pointer register. +; ; TIL registers +IP EQU 10 ; Instruction Pointer +WA EQU 11 ; Word Address +TPC EQU 12 ; TIL Program Counter + +; Input Restrictions +BUFFER_SIZE EQU 255 + +CR EQU 0DH +LF EQU 0AH +DOLLAR EQU 24H +ESC EQU 27 + +; Screen print calls +WRITESTR EQU 9H +PRTCHR EQU 02H +BDOS EQU 5H + + ORG 100h + +MAIN: + LD DE, GREET + CALL PUTS + +READING: + CALL INPUT + JP READING + +INPUT: + LD C,11 ; C_STAT + LD DE,0 + CALL BDOS + OR A + JR Z,INPUT + + LD C,6 + LD DE,-1 + CALL BDOS + OR A + JP Z,INPUT + + CP 03H + JP Z, EXIT + + CP 0DH + JP Z, EXIT + + LD D, A + LD E, A + CALL PUTC + RET + +; Print a string +PUTS: + LD C, WRITESTR + CALL BDOS + RET + +; Print a character +PUTC: + LD C, PRTCHR + CALL BDOS + RET + +CL: DB ESC,"[H",ESC,"[2J$" +BUFFER: DS BUFFER_SIZE +GREET: DB "William Moore's FORTH TIL!", CR, LF, 0H +PROMPT: DB ESC, ESC, "$ ", 0H + +EXIT: + JP 0h + + END \ No newline at end of file