From c81c2567ab5ccf0e25452390fd8076ef0154067b Mon Sep 17 00:00:00 2001 From: Jeremiah Orians Date: Sat, 23 Dec 2017 17:53:31 -0500 Subject: [PATCH] Shrink stage1_assembler-1 further --- bootstrapping Steps.org | 2 +- stage1/stage1_assembler-1.hex0 | 49 +++++++++++++--------------------- stage1/stage1_assembler-1.s | 13 +++------ test/SHA256SUMS | 2 +- 4 files changed, 24 insertions(+), 42 deletions(-) diff --git a/bootstrapping Steps.org b/bootstrapping Steps.org index d657e34..50a22dd 100644 --- a/bootstrapping Steps.org +++ b/bootstrapping Steps.org @@ -93,7 +93,7 @@ So we are going to limit ourselves to single character labels and pointers (:a a To build our improved hex assembler: ./bin/vm --rom roms/stage1_assembler-0 --tape_01 stage1/stage1_assembler-1.hex0 --tape_02 roms/stage1_assembler-1 -roms/stage1_assembler-1 should have the sha256sum of e59338381ca3ab01a14fa0fc85d0fa1c6e4d59a06ac2d9d75668d878ab469769 +roms/stage1_assembler-1 should have the sha256sum of b6aabcc3418a0a28f4ed32ace43b20103d9d21dffae03e7936cb14fa0e044013 * Step 4 get even long label support Now that we have labels and pointers, I want the ability to have labels like :main_function and :stack_start and be able to reference the absolute address of things in my code like $stack_start and complex objects that have 32bit pointers like &foo_bar. diff --git a/stage1/stage1_assembler-1.hex0 b/stage1/stage1_assembler-1.hex0 index 2d4354d..b08a7eb 100644 --- a/stage1/stage1_assembler-1.hex0 +++ b/stage1/stage1_assembler-1.hex0 @@ -15,7 +15,7 @@ ## along with stage0. If not, see . #:start 0 -2D2B019C # LOADUI R11 $table ; Where we are putting our address pointers +2D2B0200 # LOADUI R11 0x200 ; Where we are putting our address pointers 0D00003C # TRUE R12 ; Our toggle 0D00002D # FALSE R13 ; Our PC counter 2D2E0040 # LOADUI R14 $getLables_2 ; our first iterator @@ -92,7 +92,8 @@ A0300040 # CMPSKIPI.NE R0 64 ; If the Char is @ the next char is the pointer to #:loop 88 42100100 # FGETC ; Read a Char -2CC000FC # JUMP.NP R0 @finish ; Check for EOF +# ;; Check for EOF +2CC000E8 # JUMP.NP R0 @finish # ;; Check for Label A030003A # CMPSKIPI.NE R0 58 ; Make sure we jump over the label @@ -162,61 +163,49 @@ B00300FF # ANDI R0 R3 0xFF ; Preserve bottom half for later #:hex 118 # ;; Deal with line comments starting with # A0300023 # CMPSKIPI.NE R0 35 -3C000058 # JUMP @ascii_comment +3C000044 # JUMP @ascii_comment # ;; Deal with line comments starting with ; A030003B # CMPSKIPI.NE R0 59 -3C000050 # JUMP @ascii_comment +3C00003C # JUMP @ascii_comment # ;; Deal with all ascii less than '0' A0100030 # CMPSKIPI.GE R0 48 -3C000054 # JUMP @ascii_other +3C000040 # JUMP @ascii_other # ;; Deal with '0'-'9' A0000039 # CMPSKIPI.G R0 57 -3C000028 # JUMP @ascii_num +3C00001C # JUMP @ascii_num # ;; Deal with all ascii less than 'A' A0100041 # CMPSKIPI.GE R0 65 -3C000044 # JUMP @ascii_other +3C000030 # JUMP @ascii_other + +# ;; Unset high bit to set everything into uppercase +B00000DF # ANDI R0 R0 0xDF # ;; Deal with 'A'-'F' A0000046 # CMPSKIPI.G R0 70 -3C000028 # JUMP @ascii_high - -# ;; Deal with all ascii less than 'a' -A0100061 # CMPSKIPI.GE R0 97 -3C000034 # JUMP @ascii_other - -# ;; Deal with 'a'-'f' -A0000066 # CMPSKIPI.G R0 102 -3C000010 # JUMP @ascii_low +3C000010 # JUMP @ascii_high # ;; Ignore the rest -3C000028 # JUMP @ascii_other +3C000020 # JUMP @ascii_other -#:ascii_num 15c +#:ascii_num 150 11000030 # SUBUI R0 R0 48 0D01000E # JSR_COROUTINE R14 - -#:ascii_low 164 -11000057 # SUBUI R0 R0 87 -0D01000E # JSR_COROUTINE R14 - -#:ascii_high 16c +#:ascii_high 158 11000037 # SUBUI R0 R0 55 0D01000E # JSR_COROUTINE R14 - -#:ascii_comment 174 +#:ascii_comment 160 42100100 # FGETC ; Read another char A020000A # CMPSKIPI.E R0 10 ; Stop at the end of line 3C00FFF8 # JUMP @ascii_comment ; Otherwise keep looping - -#:ascii_other 180 +#:ascii_other 16c 0D000030 # TRUE R0 0D01000E # JSR_COROUTINE R14 -#:finish 188 +#:finish 174 2D201100 # LOADUI R0 0x1100 ; Close TAPE_01 42100002 # FCLOSE 2D201101 # LOADUI R0 0x1101 ; Close TAPE_02 @@ -224,4 +213,4 @@ A020000A # CMPSKIPI.E R0 10 ; Stop at the end of line FFFFFFFF # HALT # ;; Where all of our pointers will be stored for our locations -#:table 19c +#:table 188 diff --git a/stage1/stage1_assembler-1.s b/stage1/stage1_assembler-1.s index 3bb5d31..ec3adc4 100644 --- a/stage1/stage1_assembler-1.s +++ b/stage1/stage1_assembler-1.s @@ -15,7 +15,7 @@ ; along with stage0. If not, see . :start - LOADUI R11 $table ; Where we are putting our address pointers + LOADUI R11 0x200 ; Where we are putting our address pointers TRUE R12 ; Our toggle FALSE R13 ; Our PC counter LOADUI R14 $getLables_2 ; our first iterator @@ -179,24 +179,17 @@ ;; Deal with all ascii less than 'A' CMPSKIPI.GE R0 65 JUMP @ascii_other + ;; Unset high bit to set everything into uppercase + ANDI R0 R0 0xDF ;; Deal with 'A'-'F' CMPSKIPI.G R0 70 JUMP @ascii_high - ;; Deal with all ascii less than 'a' - CMPSKIPI.GE R0 97 - JUMP @ascii_other - ;; Deal with 'a'-'f' - CMPSKIPI.G R0 102 - JUMP @ascii_low ;; Ignore the rest JUMP @ascii_other :ascii_num SUBUI R0 R0 48 JSR_COROUTINE R14 -:ascii_low - SUBUI R0 R0 87 - JSR_COROUTINE R14 :ascii_high SUBUI R0 R0 55 JSR_COROUTINE R14 diff --git a/test/SHA256SUMS b/test/SHA256SUMS index da4b39b..6385583 100644 --- a/test/SHA256SUMS +++ b/test/SHA256SUMS @@ -6,5 +6,5 @@ b3a910f18c6bc0ef4aa7a53cb3f0216a9f143319da67ed2a02210fe88b1e1131 roms/forth 24a4d74eb2eb7a82e68335643855658b27b5a6c3b13db473539f3e08d6f26ceb roms/SET 0a427b14020354d1c785f5f900677e0059fce8f8d4456e9c19e5528cb17101eb roms/stage0_monitor 3ea7fed1429400c1d6fc5b85180c4114755dfb1e6b88d69e7ecc465a40523bc8 roms/stage1_assembler-0 -e59338381ca3ab01a14fa0fc85d0fa1c6e4d59a06ac2d9d75668d878ab469769 roms/stage1_assembler-1 +b6aabcc3418a0a28f4ed32ace43b20103d9d21dffae03e7936cb14fa0e044013 roms/stage1_assembler-1 61c1b0f2f628847d9491bd678ac7a23231527cc36493b321612f191674ff3c99 roms/stage1_assembler-2