diff --git a/CHANGELOG.org b/CHANGELOG.org index 32e0550..16cded4 100644 --- a/CHANGELOG.org +++ b/CHANGELOG.org @@ -32,12 +32,14 @@ Added TUCK, MIN, SPACES, :NONAME, FILL, and <> to stage3 FORTH Added LSHIFT and RSHIFT to stage2 FORTH Added PRINT to stage2 FORTH Added Low memory detection to stage2 FORTH and now exits gracefully +Added Low memory detection to stage2 Lisp and now exists gracefully ** Changed Minor refactor of stage3 FORTH by reepa Stage3 FORTH WHILE's compile-time stack effect is now consistent with gforth Changed behavior of stage2 FORTH's CREATE to better match the way it usually works. Stage0 vm now will show an error message if the size of the rom exceeds the available memory +Modified stage3 forth library to dump upper case hex values ** Fixed Updated checksums to reflect changes in stage2 FORTH diff --git a/stage3/inital_library.fs b/stage3/inital_library.fs index ac6c207..d9bdf39 100644 --- a/stage3/inital_library.fs +++ b/stage3/inital_library.fs @@ -108,7 +108,7 @@ : S" STATE IF ['] BRANCH , HERE 0 , STR" ROT HERE TARGET! SWAP LITERAL LITERAL ELSE STR" THEN ; IMMEDIATE -\ Extends S" to behave the way most users want " +\ Extends S" to behave the way most users want : ." [COMPILE] S" STATE IF ['] TYPE , ELSE TYPE THEN ; IMMEDIATE \ add the ANS keyword for modulus @@ -142,7 +142,7 @@ CREATE BASE 10 , \ works for hex and stuff -: >ASCII-DIGIT DUP 10 < IF 48 ELSE 87 THEN + ; +: >ASCII-DIGIT DUP 10 < IF 48 ELSE 55 THEN + ; \ Given a number and address write out string form of number at address and \ returns address and length (address should have at least 10 free bytes). @@ -195,15 +195,13 @@ CREATE BASE 10 , \ that+cell on the stack (for use by what follows DOES>) and run DOCOL. (Note: \ implemented in forth.s) \ Assumes most significant byte is at lower address -\ I'm not sure why that 65535 AND is necessary, but it seems to be. Some issue -\ with signed division I guess. -: 2C, 65535 AND DUP 256 / C, 255 AND C, ; \ ghetto right shift +: 2C, DUP 0xFF00 AND 8 RSHIFT C, 0xFF AND C, ; \ Compiles an assembly-level jump to a location. Note that this isn't \ future-proof, as if HERE gets past 30k or so 16 bits won't be large enough for \ that jump. We may have to compile more than just a jump in the future in order \ for DOES> to work properly - we'd need to load the address into a register, \ having the actual address nearby, and then use that coroutine jump thing. 12 -\ bytes. +\ bytes. : JUMP-TO, HERE 0x3C C, 0x00 C, - 2C, ; \ Sets the action of the latest word : DOES> ['] LATEST , ['] DOER! , 'DODOES JUMP-TO, ; IMMEDIATE