From f3f8ec5a32937405e9a0a4dd23b1a9c0354e61c6 Mon Sep 17 00:00:00 2001 From: Jeremiah Orians Date: Sun, 30 Jul 2017 18:04:29 -0400 Subject: [PATCH] Implemented basic raw string support in stage2 lisp, many more enhancements required to make it fully useful --- CHANGELOG.org | 1 + bootstrapping Steps.org | 2 +- stage2/lisp.s | 67 +++++++++++++++++++++++++++++++++++++++-- test/SHA256SUMS | 2 +- 4 files changed, 67 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.org b/CHANGELOG.org index 54ddcef..a400d23 100644 --- a/CHANGELOG.org +++ b/CHANGELOG.org @@ -35,6 +35,7 @@ Added Low memory detection to stage2 FORTH and now exits gracefully Added Low memory detection to stage2 Lisp and now exists gracefully Improved ISA Notes about M0 and hex2 to help bootstrappers Added rain1's new user forth starting script, which is not actually required for bootstrapping but rather convenience +Added Most primitive raw string support to stage2 lisp ** Changed Minor refactor of stage3 FORTH by reepa diff --git a/bootstrapping Steps.org b/bootstrapping Steps.org index c3e5390..1006871 100644 --- a/bootstrapping Steps.org +++ b/bootstrapping Steps.org @@ -152,7 +152,7 @@ Then we use our M0 Line macro assembler to convert our assembly into hex2 format Then we need to assemble that hex into our desired program: ./bin/vm --rom roms/stage1_assembler-2 --tape_01 temp2 --tape_02 roms/lisp --memory 48K -roms/lisp should have the sha256sum of b386b0e08250421a4d7eb14817b4c3359aef52d7773b3667bb1caaa933cbfe66 +roms/lisp should have the sha256sum of ab9b52c1557c044e912fe099f82a1a8f66f065d86e8840403f10a2a90b8e3f73 Our lisp will first attempt to evaluate any code in tape_01 and then evaluate any code that the user types in. It is recommended to run with no less than 4MB of Memory diff --git a/stage2/lisp.s b/stage2/lisp.s index 65be0c2..891992a 100644 --- a/stage2/lisp.s +++ b/stage2/lisp.s @@ -21,7 +21,7 @@ ;; ;; Type maps to the following values ;; FREE = 1, MARKED = (1 << 1),INT = (1 << 2),SYM = (1 << 3), - ;; CONS = (1 << 4),PROC = (1 << 5),PRIMOP = (1 << 6),ASCII = (1 << 7) + ;; CONS = (1 << 4),PROC = (1 << 5),PRIMOP = (1 << 6),ASCII = (1 << 7), STRING = (1 << 8) ;; CONS space: End of program -> 1MB (0x100000) ;; HEAP space: 1MB -> 1.5MB (0x180000) @@ -139,10 +139,22 @@ CMPSKIPI.G R3 32 ; If control character or SPACE JUMP @tokenize_append ; Stop + CMPSKIPI.NE R3 34 ; If raw string + JUMP @tokenize_string ; Process that whole thing + ;; Walk further down string ADDUI R4 R4 1 ; Next char JUMP @tokenize_loop ; And try again +:tokenize_string + ;; Walk further down string + ADDUI R4 R4 1 ; Next char + LOADXU8 R3 R1 R4 ; Get char + CMPSKIPI.NE R3 34 ; If Found matching quote + JUMP @tokenize_append ; Stop + + JUMP @tokenize_string ; And try again + :tokenize_append FALSE R3 ; NULL terminate STOREX8 R3 R1 R4 ; Found Token @@ -289,7 +301,7 @@ LOADU8 R2 R1 0 ; Get first Char CMPSKIPI.E R2 39 ; If Not Quote Char - JUMP @atom_integer ; Move to next type + JUMP @atom_string ; Move to next type ;; When dealing with a quote ADDUI R1 R1 1 ; Move past quote Char @@ -303,6 +315,21 @@ MOVE R1 R0 ; Put What is being returned into R1 JUMP @atom_done ; We are done +:atom_string + CMPSKIPI.E R2 34 ; If Not Double quote + JUMP @atom_integer ; Move to next type + + ;; a->string = a->string + 1 + ADDUI R1 R1 1 ; Move past quote Char + STORE32 R1 R0 4 ; And write to CAR + + ;; a->type = STRING + LOADUI R1 256 ; Using STRING + STORE32 R1 R0 0 ; Set type to Integer + + COPY R1 R0 ; Put the cell we were given in the right place + JUMP @atom_done ; We are done + :atom_integer COPY R2 R1 ; Preserve String pointer SWAP R0 R1 ; Put string Pointer in R0 @@ -496,6 +523,9 @@ CMPSKIPI.G R0 32 ; If SPACE or below JUMP @Readline_1 + CMPSKIPI.NE R0 34 ; Look for double quote + JUMP @Readline_string ; Keep looping until then + CMPSKIPI.NE R0 59 ; If LINE Comment (;) JUMP @Readline_0 ; Drop until the end of Line @@ -520,6 +550,25 @@ JUMP @Readline_0 ; Otherwise Keep Looping + ;; Deal with strings +:Readline_string + STOREX8 R0 R2 R3 ; Append to String + ADDUI R3 R3 1 ; Increment Size + FGETC ; Get a Byte + + CMPSKIPI.NE R0 13 ; Deal with CR + LOADUI R0 10 ; Convert to LF + + CMPSKIPI.NE R13 0 ; Don't display unless TTY + FPUTC ; Display the Char we just pressed + + CMPSKIPI.E R0 34 ; Look for double quote + JUMP @Readline_string ; Keep looping until then + + STOREX8 R0 R2 R3 ; Append to String + ADDUI R3 R3 1 ; Increment Size + JUMP @Readline_loop ; Resume + ;; Deal with Whitespace and Control Chars :Readline_1 CMPSKIPI.NE R4 0 ; IF Depth 0 @@ -672,6 +721,9 @@ CMPSKIPI.NE R2 128 ; If ASCII JUMP @writeobj_ASCII ; Print the Char + CMPSKIPI.NE R2 256 ; If STRING + JUMP @writeobj_STRING ; Print the String + ;; What the hell is that??? LOADUI R0 $writeobj_Error FALSE R1 @@ -740,6 +792,11 @@ CALLI R15 @Print_String ; Write it to output JUMP @writeobj_done ; Be Done +:writeobj_STRING + LOAD32 R0 R3 4 ; Get HEAD->CAR + CALLI R15 @Print_String ; Write it to output + JUMP @writeobj_done ; Be Done + :writeobj_ASCII LOADU8 R0 R3 7 ; Using bottom 8 bits of HEAD->CAR FPUTC ; We write our desired output @@ -1152,8 +1209,12 @@ :eval_ascii CMPSKIPI.E R4 128 ; If EXP->TYPE is NOT ASCII - JUMP @eval_error ; Move onto next Case + JUMP @eval_string ; Move onto next Case + JUMP @eval_done +:eval_string + CMPSKIPI.E R4 256 ; If EXP->TYPE is NOT ASCII + JUMP @eval_error ; Move onto next Case JUMP @eval_done :eval_error diff --git a/test/SHA256SUMS b/test/SHA256SUMS index 352225c..94f9ab1 100644 --- a/test/SHA256SUMS +++ b/test/SHA256SUMS @@ -1,7 +1,7 @@ 8f465d3ec1cba00a7d024a1964e74bb6d241f86a73c77d95d8ceb10d09c8f7b9 roms/CAT 59f0502748af32e3096e026a95e77216179cccfe803a05803317414643e2fcec roms/DEHEX d7967248be71937d4fa1f38319a5a8473a842b1f6806b977e5fb184565bde0a4 roms/forth -b386b0e08250421a4d7eb14817b4c3359aef52d7773b3667bb1caaa933cbfe66 roms/lisp +ab9b52c1557c044e912fe099f82a1a8f66f065d86e8840403f10a2a90b8e3f73 roms/lisp 2b9727381aec15a504c0898189fbc2344209d8e04451e3fa5d743e08e38f64cf roms/M0 24a4d74eb2eb7a82e68335643855658b27b5a6c3b13db473539f3e08d6f26ceb roms/SET 0a427b14020354d1c785f5f900677e0059fce8f8d4456e9c19e5528cb17101eb roms/stage0_monitor