Version 1.0: add checking for sufficient RAM and fix a bug where copying to the same address as the mark would not work

This commit is contained in:
CrazyEttin 2022-09-09 18:27:36 +03:00
parent 47d2589da1
commit 339f117e58
2 changed files with 138 additions and 19 deletions

View File

@ -2,6 +2,32 @@
;*** ;***
;Check the RAM size
;Initialise the comparison value
load r0, #1b
;Check a memory location
mchks: store ffef, r0
mchkl: load r1, ffef
breq r0, r1, svlmit
;Decrement the pointer
load r0, mchks + 1
load r2, #fc
cleq r0, r0, sum
store mchks + 1, r0
store mchkl + 1, r0
;Check the next location
breq r0, r0, mchks
;Save the RAM limit
svlmit: load r0, mchks + 1
store limit, r0
;***
;Save an end-of-file at the start address ;Save an end-of-file at the start address
load r0, #1a load r0, #1a
store buffer + 100, r0 store buffer + 100, r0
@ -273,7 +299,9 @@ cnarg: load r1, #50
breq r0, r1, read breq r0, r1, read
;Print an error and return to the command prompt ;Print an error and return to the command prompt
cmderr: cleq r0, r0, error cmderr: load r0, #3f
store ffff, r0
cleq r0, r0, newln
breq r0, r0, cmdp breq r0, r0, cmdp
cmdesc: load r0, #20 cmdesc: load r0, #20
@ -335,8 +363,12 @@ inline: cleq r0, r0, input
store eofchk + 2, r0 store eofchk + 2, r0
store cmpadr + 1, r0 store cmpadr + 1, r0
;Save the line ;Make room for the line
cleq r0, r0, eofchk cleq r0, r0, eofchk
xor r0, r0
brneq r0, r1, cmdp
;Save the line
cleq r0, r0, save cleq r0, r0, save
;Insert the next line ;Insert the next line
@ -497,6 +529,8 @@ chsend: load r0, 0
;Make room for the copy ;Make room for the copy
cleq r0, r0, eofchk cleq r0, r0, eofchk
xor r0, r0
brneq r0, r1, cmdp
;Check for the end of the space ;Check for the end of the space
cendsp: load r0, movsto + 1 cendsp: load r0, movsto + 1
@ -557,6 +591,9 @@ relodt: load r0, tmp1
;Copy a character ;Copy a character
;Load ;Load
cload: load r1, 0 cload: load r1, 0
;Check for a null
xor r2, r2
breq r1, r2, skip0
;Check for save end ;Check for save end
load r2, #1a load r2, #1a
breq r1, r2, cmdp breq r1, r2, cmdp
@ -601,6 +638,19 @@ cincs: load r0, cload + 1
;Load and save the next character ;Load and save the next character
breq r0, r0, cload breq r0, r0, cload
;Increment the source address
;Load the address
skip0: load r0, cload + 1
load r1, cload + 2
;Increment
cleq r0, r0, incdw
;Store the address
store cload + 1, r0
store cload + 2, r1
;Load the next character
breq r0, r0, cload
;*** ;***
;Delete a line ;Delete a line
@ -845,6 +895,24 @@ iglead: load r1, fffd
breq r1, r2, iglead breq r1, r2, iglead
breq r0, r0, chkend breq r0, r0, chkend
;Check for the RAM limit
load r0, chrsto + 1
load r1, chrsto + 2
chkram: load r2, limit
load r3, limit + 1
brneq r0, r2, chread
brneq r1, r3, chread
;Save an end-of-file at the start address
load r0, #1a
store buffer + 100, r0
;Print an error and return to the command prompt
load r0, #21
store ffff, r0
cleq r0, r0, newln
breq r0, r0, cmdp
;Read a character ;Read a character
chread: load r1, fffd chread: load r1, fffd
@ -877,7 +945,7 @@ chrsto: store buffer + 100, r1
store chrsto + 2, r1 store chrsto + 2, r1
;Read the next character ;Read the next character
breq r0, r0, chread breq r0, r0, chkram
;Return to the command prompt ;Return to the command prompt
redend: breq r0, r0, cmdp redend: breq r0, r0, cmdp
@ -898,13 +966,6 @@ newln: load r0, #d
;*** ;***
;Print an error
error: load r0, #3f
store ffff, r0
cleq r0, r0, newln
;***
;Add r2 to r0 with the overflow stored in r1 ;Add r2 to r0 with the overflow stored in r1
;Reset overflow ;Reset overflow
@ -1454,6 +1515,9 @@ endfnd: load r0, eofchk + 1
load r2, strsz load r2, strsz
cleq r0, r0, sum cleq r0, r0, sum
store strsz, r0 store strsz, r0
;Check for overflow from the high byte
xor r0, r0
brneq r0, r1, lmterr
;Low byte ;Low byte
xor r0, r0 xor r0, r0
xor r0, r3 xor r0, r3
@ -1469,6 +1533,48 @@ endfnd: load r0, eofchk + 1
store movsto + 1, r0 store movsto + 1, r0
load r3, strsz + 1 load r3, strsz + 1
store movsto + 2, r3 store movsto + 2, r3
;Check for overflow from the high byte
xor r0, r0
brneq r0, r1, lmterr
;Negate the RAM limit
;Low byte
load r0, limit + 1
nand r0, r0
load r2, #1
cleq r0, r0, sum
store tmp2 + 1, r0
;Reverse and add the overflow to the high byte
load r0, limit
nand r0, r0
xor r2, r2
xor r2, r1
cleq r0, r0, sum
store tmp2, r0
;Subtract the RAM limit from the new end of the save
;High byte
load r0, movsto + 1
load r2, tmp2
cleq r0, r0, sum
store tmp2, r0
;Check for overflow from the high byte
xor r0, r0
brneq r0, r1, lmterr
;Low byte
load r0, movsto + 2
load r2, tmp2 + 1
cleq r0, r0, sum
store tmp2 + 1, r0
;Add the overflow to the high byte
load r0, tmp2
xor r2, r2
xor r2, r1
cleq r0, r0, sum
store tmp2, r0
;Check for overflow from the high byte
xor r0, r0
brneq r0, r1, lmterr
;Move the End-of-file ;Move the End-of-file
movlod: load r0, 0 movlod: load r0, 0
@ -1506,8 +1612,16 @@ decsav: load r0, movlod + 1
;Move the next character ;Move the next character
breq r0, r0, movlod breq r0, r0, movlod
;Return ;Return with a null at r1
roomnd: ret roomnd: xor r1, r1
ret
;Print an error and return with an exclamation mark at r1
lmterr: load r0, #21
store ffff, r0
cleq r0, r0, newln
load r1, #21
ret
;*** ;***
@ -1739,6 +1853,8 @@ tmp2: data 0
bfstrt: addr buffer bfstrt: addr buffer
bfsize: data fe bfsize: data fe
svstrt: addr buffer + 100 svstrt: addr buffer + 100
limit: data 0
data 0
buffer: buffer:
 

View File

@ -1,5 +1,5 @@
Gidubba Gidubba v1.0
======= ============
Gidubba (Sumerian for 'stylus') is a simple line editor for the Gidubba (Sumerian for 'stylus') is a simple line editor for the
Thingamajig computer architecture. Its git repository can be found at Thingamajig computer architecture. Its git repository can be found at
@ -9,11 +9,11 @@ https://ahti.space/git/crazyettin/Thingamajig.
System requirements System requirements
------------------- -------------------
Gidubba requires a setup with at least 4 KiB of RAM. It uses a terminal Gidubba requires at least 4 KiB of RAM. It uses a terminal with local
with local echo at address FFFF, and optionally a character printer at echo at address FFFF, and optionally a character printer at address FFFE
address FFFE and a punched tape reader and punch or a casette drive at and a punched tape reader and punch or a casette drive at FFFD. Do not
FFFD. Do not be afraid to modify the code yourself if your setup be afraid to modify the code yourself if your setup requires it! (And if
requires it! (And if you do, apologies for the horrible code.) you do, apologies for the spaghetti.)
Format Format
------ ------
@ -57,4 +57,7 @@ carriage return (^M) or a line feed (^J) inputs a newline and commits
the current command or line. An end-of-file (^Z) discards the current the current command or line. An end-of-file (^Z) discards the current
command and halts the computer or discards the current line and returns command and halts the computer or discards the current line and returns
to the command prompt. to the command prompt.
There are two kinds of error messages: a question mark (?) for an
erroneous command and an exclamation mark (!) for lack of RAM.