Add IO instruction to Forth

This commit is contained in:
Jeremiah Orians 2016-10-29 17:53:22 -04:00
parent f0f13843a8
commit 236a905e77
No known key found for this signature in database
GPG Key ID: 7457821534D2ACCD
1 changed files with 79 additions and 0 deletions

View File

@ -16,6 +16,7 @@
;; Forth STATE [R10]
;; Forth LATEST (Pointer to last defined function) [R9]
;; Forth HERE (Pointer to next free byte in HEAP) [R8]
;; IO source [R7]
;; Start function
;; Loads contents of tape_01
@ -619,5 +620,83 @@
POPR R14 R14 ; Replace parameter stack pointer from parameter stack
JSR_COROUTINE R11 ; NEXT
;; Input and output
;; KEY
:Key_Text
"KEY"
:Key_Entry
&DSPStore_Entry ; Pointer to DSP!
&Key_Text ; Pointer to Name
NOP ; Flags
COPY R1 R7 ; Using designated IO
FGETC ; Get a byte
PUSHR R0 R14 ; And push it onto the stack
JSR_COROUTINE R11 ; NEXT
;; EMIT
:Emit_Text
"EMIT"
:Emit_Entry
&Key_Entry ; Pointer to Key
&Emit_Text ; Pointer to Name
NOP ; Flags
POPR R0 R14 ; Get value off the parameter stack
COPY R1 R7 ; Using designated IO
FPUTC ; Write out the byte
JSR_COROUTINE R11 ; NEXT
;; WORD
:Word_Text
"WORD"
:Word_Entry
&Emit_Entry ; Pointer to Emit
&Word_Text ; Pointer to Name
NOP ; Flags
COPY R1 R7 ; Using designated IO
FALSE R2 ; Starting at index 0
:Word_Start
FGETC ; Read a byte
CMPSKIPI.NE R0 9 ; If Tab
JUMP @Word_Start ; Get another byte
CMPSKIP.NE R0 32 ; If space
JUMP @Word_Start ; Get another byte
:Word_Main
CMPSKIPI.NE R0 4 ; If EOF
JUMP @Word_Done ; Stop processing
CMPSKIPI.NE R0 9 ; If Tab
JUMP @Word_Done ; Be done
CMPSKIPI.NE R0 32 ; If space
JUMP @Word_Done ; Be done
CMPSKIPI.NE R0 92 ; If comment
JUMP @Word_Comment ; Purge it and be done
STOREX8 R0 R8 R2 ; Store byte onto HEAP
ADDUI R2 R2 1 ; Increment index
FGETC ; Read a byte
JUMP @Word_Main ; Keep looping
:Word_Comment
FGETC ; Get another byte
CMPSKIPI.NE R0 4 ; IF EOF
JUMP @Word_Done ; Be done
CMPSKIPI.NE R0 10 ; IF Line Feed
JUMP @Word_Done ; Be done
JUMP @Word_Comment ; Otherwise keep looping
:Word_Done
PUSHR R8 R14 ; Push pointer to string on parameter stack
PUSHR R2 R14 ; Push number of bytes in length onto stack
CMPSKIPI.LE R2 0 ; If number of bytes is greater than 0
ADDUI R2 R2 1 ; Add a null to end of string
ADD R8 R8 R2 ; Update HEAP pointer
JSR_COROUTINE R11 ; NEXT
:cold_start
;;