mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-23 23:28:05 +11:00
forth: inline kernel's core and str units
This commit is contained in:
parent
548facac0b
commit
ae6334906c
@ -1,7 +1,6 @@
|
|||||||
.inc "user.h"
|
.inc "user.h"
|
||||||
jp forthMain
|
jp forthMain
|
||||||
|
|
||||||
.inc "core.asm"
|
|
||||||
.equ FORTH_RAMSTART RAMSTART
|
.equ FORTH_RAMSTART RAMSTART
|
||||||
.inc "forth/main.asm"
|
.inc "forth/main.asm"
|
||||||
.inc "forth/util.asm"
|
.inc "forth/util.asm"
|
||||||
|
@ -6,6 +6,43 @@
|
|||||||
; give us an idea of Forth's compactness.
|
; give us an idea of Forth's compactness.
|
||||||
; These routines below are copy/paste from apps/lib.
|
; These routines below are copy/paste from apps/lib.
|
||||||
|
|
||||||
|
; Ensures that Z is unset (more complicated than it sounds...)
|
||||||
|
; There are often better inline alternatives, either replacing rets with
|
||||||
|
; appropriate jmps, or if an 8 bit register is known to not be 0, an inc
|
||||||
|
; then a dec. If a is nonzero, 'or a' is optimal.
|
||||||
|
unsetZ:
|
||||||
|
or a ;if a nonzero, Z reset
|
||||||
|
ret nz
|
||||||
|
cp 1 ;if a is zero, Z reset
|
||||||
|
ret
|
||||||
|
|
||||||
|
; copy (HL) into DE, then exchange the two, utilising the optimised HL instructions.
|
||||||
|
; ld must be done little endian, so least significant byte first.
|
||||||
|
intoHL:
|
||||||
|
push de
|
||||||
|
ld e, (hl)
|
||||||
|
inc hl
|
||||||
|
ld d, (hl)
|
||||||
|
ex de, hl
|
||||||
|
pop de
|
||||||
|
ret
|
||||||
|
|
||||||
|
intoDE:
|
||||||
|
ex de, hl
|
||||||
|
call intoHL
|
||||||
|
ex de, hl ; de preserved by intoHL, so no push/pop needed
|
||||||
|
ret
|
||||||
|
|
||||||
|
; add the value of A into HL
|
||||||
|
; affects carry flag according to the 16-bit addition, Z, S and P untouched.
|
||||||
|
addHL:
|
||||||
|
push de
|
||||||
|
ld d, 0
|
||||||
|
ld e, a
|
||||||
|
add hl, de
|
||||||
|
pop de
|
||||||
|
ret
|
||||||
|
|
||||||
; make Z the opposite of what it is now
|
; make Z the opposite of what it is now
|
||||||
toggleZ:
|
toggleZ:
|
||||||
jp z, unsetZ
|
jp z, unsetZ
|
||||||
@ -57,6 +94,38 @@ strcmp:
|
|||||||
; early, set otherwise)
|
; early, set otherwise)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
; Compares strings pointed to by HL and DE up to A count of characters. If
|
||||||
|
; equal, Z is set. If not equal, Z is reset.
|
||||||
|
strncmp:
|
||||||
|
push bc
|
||||||
|
push hl
|
||||||
|
push de
|
||||||
|
|
||||||
|
ld b, a
|
||||||
|
.loop:
|
||||||
|
ld a, (de)
|
||||||
|
cp (hl)
|
||||||
|
jr nz, .end ; not equal? break early. NZ is carried out
|
||||||
|
; to the called
|
||||||
|
cp 0 ; If our chars are null, stop the cmp
|
||||||
|
jr z, .end ; The positive result will be carried to the
|
||||||
|
; caller
|
||||||
|
inc hl
|
||||||
|
inc de
|
||||||
|
djnz .loop
|
||||||
|
; We went through all chars with success, but our current Z flag is
|
||||||
|
; unset because of the cp 0. Let's do a dummy CP to set the Z flag.
|
||||||
|
cp a
|
||||||
|
|
||||||
|
.end:
|
||||||
|
pop de
|
||||||
|
pop hl
|
||||||
|
pop bc
|
||||||
|
; Because we don't call anything else than CP that modify the Z flag,
|
||||||
|
; our Z value will be that of the last cp (reset if we broke the loop
|
||||||
|
; early, set otherwise)
|
||||||
|
ret
|
||||||
|
|
||||||
; Given a string at (HL), move HL until it points to the end of that string.
|
; Given a string at (HL), move HL until it points to the end of that string.
|
||||||
strskip:
|
strskip:
|
||||||
push bc
|
push bc
|
||||||
|
@ -15,8 +15,6 @@
|
|||||||
|
|
||||||
jp init
|
jp init
|
||||||
|
|
||||||
.inc "core.asm"
|
|
||||||
.inc "str.asm"
|
|
||||||
|
|
||||||
.equ STDIO_RAMSTART RAMSTART
|
.equ STDIO_RAMSTART RAMSTART
|
||||||
.equ STDIO_GETC emulGetC
|
.equ STDIO_GETC emulGetC
|
||||||
|
@ -6,9 +6,6 @@
|
|||||||
|
|
||||||
jp init
|
jp init
|
||||||
|
|
||||||
.inc "core.asm"
|
|
||||||
.inc "str.asm"
|
|
||||||
|
|
||||||
.equ STDIO_RAMSTART RAMSTART
|
.equ STDIO_RAMSTART RAMSTART
|
||||||
.equ STDIO_GETC emulGetC
|
.equ STDIO_GETC emulGetC
|
||||||
.equ STDIO_PUTC emulPutC
|
.equ STDIO_PUTC emulPutC
|
||||||
|
Loading…
Reference in New Issue
Block a user