1
0
mirror of https://github.com/hsoft/collapseos.git synced 2024-11-02 22:10:56 +11:00

Compare commits

..

No commits in common. "beaea6f97843e9c4f64ea2f02341131b3156e2ae" and "8ff4b18c51accad52331c01502d344b148faa49e" have entirely different histories.

14 changed files with 118 additions and 124 deletions

View File

@ -149,11 +149,6 @@ that value in `A`.
`putc <char>`: Puts the specified character to the console. `putc <char>`: Puts the specified character to the console.
`puth <char>`: Puts the specified character to the console, encoded in two
hexadecimal digits. For example, `puth 0x42` yields `42`. This is useful for
spitting binary contents to a console that has special handling of certain
control characters.
`sleep <units>`: Sleep a number of "units" specified by the supplied `sleep <units>`: Sleep a number of "units" specified by the supplied
expression. A "unit" depends on the CPU clock speed. At 4MHz, it is roughly 8 expression. A "unit" depends on the CPU clock speed. At 4MHz, it is roughly 8
microseconds. microseconds.

View File

@ -359,15 +359,6 @@ basPUTC:
xor a ; set Z xor a ; set Z
ret ret
basPUTH:
call rdExpr
ret nz
push ix \ pop hl
ld a, l
call printHex
xor a ; set Z
ret
basSLEEP: basSLEEP:
call rdExpr call rdExpr
ret nz ret nz
@ -483,8 +474,6 @@ basCmds2:
.dw basGETC .dw basGETC
.db "putc", 0 .db "putc", 0
.dw basPUTC .dw basPUTC
.db "puth", 0
.dw basPUTH
.db "sleep", 0 .db "sleep", 0
.dw basSLEEP .dw basSLEEP
.db "addr", 0 .db "addr", 0

View File

@ -1,6 +1,3 @@
; *** Requirements ***
; stdioPutC
;
; Same as fmtDecimal, but DE is considered a signed number ; Same as fmtDecimal, but DE is considered a signed number
fmtDecimalS: fmtDecimalS:
@ -68,47 +65,3 @@ fmtDecimal:
call divide call divide
pop de pop de
ret ret
; Format the lower nibble of A into a hex char and stores the result in A.
fmtHex:
; The idea here is that there's 7 characters between '9' and 'A'
; in the ASCII table, and so we add 7 if the digit is >9.
; daa is designed for using Binary Coded Decimal format, where each
; nibble represents a single base 10 digit. If a nibble has a value >9,
; it adds 6 to that nibble, carrying to the next nibble and bringing the
; value back between 0-9. This gives us 6 of that 7 we needed to add, so
; then we just condtionally set the carry and add that carry, along with
; a number that maps 0 to '0'. We also need the upper nibble to be a
; set value, and have the N, C and H flags clear.
or 0xf0
daa ; now a =0x50 + the original value + 0x06 if >= 0xfa
add a, 0xa0 ; cause a carry for the values that were >=0x0a
adc a, 0x40
ret
; Print the hex char in A as a pair of hex digits.
printHex:
push af
; let's start with the leftmost char
rra \ rra \ rra \ rra
call fmtHex
call stdioPutC
; and now with the rightmost
pop af \ push af
call fmtHex
call stdioPutC
pop af
ret
; Print the hex pair in HL
printHexPair:
push af
ld a, h
call printHex
ld a, l
call printHex
pop af
ret

70
apps/lib/stdio.asm Normal file
View File

@ -0,0 +1,70 @@
; *** Requirements ***
; printnstr
;
; *** Variables ***
; Used to store formatted hex values just before printing it.
.equ STDIO_HEX_FMT STDIO_RAMSTART
.equ STDIO_RAMEND @+2
; *** Code ***
; Format the lower nibble of A into a hex char and stores the result in A.
fmtHex:
; The idea here is that there's 7 characters between '9' and 'A'
; in the ASCII table, and so we add 7 if the digit is >9.
; daa is designed for using Binary Coded Decimal format, where each
; nibble represents a single base 10 digit. If a nibble has a value >9,
; it adds 6 to that nibble, carrying to the next nibble and bringing the
; value back between 0-9. This gives us 6 of that 7 we needed to add, so
; then we just condtionally set the carry and add that carry, along with
; a number that maps 0 to '0'. We also need the upper nibble to be a
; set value, and have the N, C and H flags clear.
or 0xf0
daa ; now a =0x50 + the original value + 0x06 if >= 0xfa
add a, 0xa0 ; cause a carry for the values that were >=0x0a
adc a, 0x40
ret
; Formats value in A into a string hex pair. Stores it in the memory location
; that HL points to. Does *not* add a null char at the end.
fmtHexPair:
push af
; let's start with the rightmost char
inc hl
call fmtHex
ld (hl), a
; and now with the leftmost
dec hl
pop af
push af
rra \ rra \ rra \ rra
call fmtHex
ld (hl), a
pop af
ret
; Print the hex char in A
printHex:
push bc
push hl
ld hl, STDIO_HEX_FMT
call fmtHexPair
ld b, 2
call printnstr
pop hl
pop bc
ret
; Print the hex pair in HL
printHexPair:
push af
ld a, h
call printHex
ld a, l
call printHex
pop af
ret

View File

@ -17,12 +17,12 @@ jp init
.dw blkBselCmd, blkSeekCmd, blkLoadCmd, blkSaveCmd .dw blkBselCmd, blkSeekCmd, blkLoadCmd, blkSaveCmd
.dw fsOnCmd, flsCmd, fnewCmd, fdelCmd, fopnCmd .dw fsOnCmd, flsCmd, fnewCmd, fdelCmd, fopnCmd
.inc "lib/ari.asm" .equ STDIO_RAMSTART SHELL_RAMEND
.inc "lib/fmt.asm" .inc "lib/stdio.asm"
.inc "shell/blkdev.asm" .inc "shell/blkdev.asm"
.inc "shell/fs.asm" .inc "shell/fs.asm"
.equ PGM_RAMSTART SHELL_RAMEND .equ PGM_RAMSTART STDIO_RAMEND
.equ PGM_CODEADDR USER_CODE .equ PGM_CODEADDR USER_CODE
.inc "shell/pgm.asm" .inc "shell/pgm.asm"

View File

@ -9,7 +9,7 @@ jp init
.inc "lib/util.asm" .inc "lib/util.asm"
.inc "lib/parse.asm" .inc "lib/parse.asm"
.inc "lib/args.asm" .inc "lib/args.asm"
.inc "lib/fmt.asm" .inc "lib/stdio.asm"
.equ SHELL_RAMSTART USER_RAMSTART .equ SHELL_RAMSTART USER_RAMSTART
.equ SHELL_EXTRA_CMD_COUNT 0 .equ SHELL_EXTRA_CMD_COUNT 0
.inc "shell/main.asm" .inc "shell/main.asm"

View File

@ -1,4 +1,6 @@
#/bin/sh -e #/usr/bin/env bash
set -e
git submodule init git submodule init
git submodule update git submodule update

View File

@ -4,11 +4,6 @@ TARGETS = cfspack cfsunpack
all: $(TARGETS) all: $(TARGETS)
cfspack: cfspack.c cfspack: cfspack.c
$(CC) $(CFLAGS) -o $@ cfspack.c
cfsunpack: cfsunpack.c cfsunpack: cfsunpack.c
$(CC) $(CFLAGS) -o $@ cfsunpack.c $(TARGETS):
$(CC) -o $@ $^
.PHONY: clean
clean:
rm -f $(TARGETS)

View File

@ -4,44 +4,37 @@ KERNEL = ../../kernel
APPS = ../../apps APPS = ../../apps
ZASMBIN = zasm/zasm ZASMBIN = zasm/zasm
ZASMSH = ../zasm.sh ZASMSH = ../zasm.sh
SHELLAPPS = zasm ed SHELLAPPS = $(addprefix cfsin/, zasm ed)
SHELLTGTS = ${SHELLAPPS:S/^/cfsin\//} CFSIN_CONTENTS = $(SHELLAPPS) cfsin/user.h
CFSIN_CONTENTS = $(SHELLTGTS) cfsin/user.h
OBJS = emul.o libz80/libz80.o
.PHONY: all .PHONY: all
all: $(TARGETS) $(CFSIN_CONTENTS) all: $(TARGETS) $(CFSIN_CONTENTS)
# -o in sync with SHELL_CODE in shell/glue.asm # -o in sync with SHELL_CODE in shell/glue.asm
shell/shell.bin: $(APPS)/shell/glue.asm $(ZASMBIN) shell/shell.bin: $(APPS)/shell/glue.asm $(ZASMBIN)
$(ZASMSH) -o 07 $(KERNEL) shell/user.h $(APPS) < $(APPS)/shell/glue.asm | tee $@ > /dev/null $(ZASMSH) -o 07 $(KERNEL) shell/user.h $(APPS) < $< | tee $@ > /dev/null
shell/kernel-bin.h: shell/glue.asm shell/shell.bin $(ZASMBIN) shell/kernel-bin.h: shell/glue.asm shell/shell.bin $(ZASMBIN)
$(ZASMSH) $(KERNEL) shell/shell.bin < shell/glue.asm | ./bin2c.sh KERNEL | tee $@ > /dev/null $(ZASMSH) $(KERNEL) shell/shell.bin < $< | ./bin2c.sh KERNEL | tee $@ > /dev/null
bshell/shell.bin: bshell/glue.asm $(ZASMBIN) bshell/shell.bin: bshell/glue.asm $(ZASMBIN)
$(ZASMSH) $(KERNEL) bshell/user.h $(APPS) < bshell/glue.asm | tee $@ > /dev/null $(ZASMSH) $(KERNEL) bshell/user.h $(APPS) < $< | tee $@ > /dev/null
bshell/shell-bin.h: bshell/shell.bin bshell/shell-bin.h: bshell/shell.bin
./bin2c.sh KERNEL < bshell/shell.bin | tee $@ > /dev/null ./bin2c.sh KERNEL < $< | tee $@ > /dev/null
zasm/kernel-bin.h: zasm/kernel.bin zasm/kernel-bin.h: zasm/kernel.bin
./bin2c.sh KERNEL < zasm/kernel.bin | tee $@ > /dev/null ./bin2c.sh KERNEL < $< | tee $@ > /dev/null
zasm/zasm-bin.h: zasm/zasm.bin zasm/zasm-bin.h: zasm/zasm.bin
./bin2c.sh USERSPACE < zasm/zasm.bin | tee $@ > /dev/null ./bin2c.sh USERSPACE < $< | tee $@ > /dev/null
shell/shell: shell/shell.c $(OBJS) shell/kernel-bin.h shell/shell: shell/shell.c libz80/libz80.o shell/kernel-bin.h
$(CC) shell/shell.c $(OBJS) -o $@ bshell/shell: bshell/shell.c libz80/libz80.o bshell/shell-bin.h
$(ZASMBIN): zasm/zasm.c emul.o libz80/libz80.o zasm/kernel-bin.h zasm/zasm-bin.h $(CFSPACK)
bshell/shell: bshell/shell.c $(OBJS) bshell/shell-bin.h runbin/runbin: runbin/runbin.c libz80/libz80.o
$(CC) bshell/shell.c $(OBJS) -o $@ $(TARGETS):
$(CC) $< emul.o libz80/libz80.o -o $@
$(ZASMBIN): zasm/zasm.c $(OBJS) zasm/kernel-bin.h zasm/zasm-bin.h $(CFSPACK)
$(CC) zasm/zasm.c $(OBJS) -o $@
runbin/runbin: runbin/runbin.c $(OBJS)
$(CC) runbin/runbin.c $(OBJS) -o $@
libz80/libz80.o: libz80/z80.c libz80/libz80.o: libz80/z80.c
$(MAKE) -C libz80/codegen opcodes $(MAKE) -C libz80/codegen opcodes
@ -54,11 +47,11 @@ $(CFSPACK):
$(MAKE) -C ../cfspack $(MAKE) -C ../cfspack
# -o in sync with USER_CODE in shell/user.h # -o in sync with USER_CODE in shell/user.h
$(SHELLTGTS): $(ZASMBIN) $(SHELLAPPS): $(ZASMBIN)
$(ZASMSH) -o 42 $(KERNEL) $(APPS) shell/user.h < $(APPS)/${@:T}/glue.asm > $@ $(ZASMSH) -o 42 $(KERNEL) $(APPS) shell/user.h < $(APPS)/$(notdir $@)/glue.asm > $@
cfsin/user.h: shell/user.h cfsin/user.h: shell/user.h
cp shell/user.h $@ cp $< $@
.PHONY: updatebootstrap .PHONY: updatebootstrap
updatebootstrap: $(ZASMBIN) $(INCCFS) updatebootstrap: $(ZASMBIN) $(INCCFS)
@ -67,4 +60,4 @@ updatebootstrap: $(ZASMBIN) $(INCCFS)
.PHONY: clean .PHONY: clean
clean: clean:
rm -f $(TARGETS) $(SHELLTGTS) emul.o zasm/*-bin.h shell/*-bin.h rm -f $(TARGETS) $(SHELLAPPS) emul.o zasm/*-bin.h shell/*-bin.h

View File

@ -2,6 +2,6 @@ EMULDIR = ../emul
.PHONY: run .PHONY: run
run: run:
$(MAKE) -C $(EMULDIR) zasm/zasm runbin/runbin make -C $(EMULDIR) zasm runbin
cd unit && ./runtests.sh cd unit && ./runtests.sh
cd zasm && ./runtests.sh cd zasm && ./runtests.sh

View File

@ -1,4 +1,6 @@
#!/bin/sh -e #!/usr/bin/env bash
set -e
BASE=../../.. BASE=../../..
TOOLS=../.. TOOLS=../..
@ -15,7 +17,7 @@ chk() {
fi fi
} }
if [ ! -z $1 ]; then if [[ ! -z $1 ]]; then
chk $1 chk $1
exit 0 exit 0
fi fi

View File

@ -5,8 +5,7 @@ jp test
.inc "lib/ari.asm" .inc "lib/ari.asm"
.inc "lib/fmt.asm" .inc "lib/fmt.asm"
stdioPutC: testNum: .db 1
ret
test: test:
ld sp, 0xffff ld sp, 0xffff
@ -81,8 +80,6 @@ testFmtDecimalS:
.dw 0-1234 .dw 0-1234
.db "-1234", 0 .db "-1234", 0
testNum: .db 1
nexttest: nexttest:
ld a, (testNum) ld a, (testNum)
inc a inc a

View File

@ -1,4 +1,4 @@
#!/bin/sh #!/usr/bin/env bash
# no "set -e" because we test errors # no "set -e" because we test errors
@ -6,11 +6,9 @@ ZASM=../../zasm.sh
chkerr() { chkerr() {
echo "Check that '$1' results in error $2" echo "Check that '$1' results in error $2"
${ZASM} > /dev/null <<XXX ${ZASM} <<< $1 > /dev/null
$1
XXX
local res=$? local res=$?
if [ $res = $2 ]; then if [[ $res == $2 ]]; then
echo "Good!" echo "Good!"
else else
echo "$res != $2" echo "$res != $2"
@ -20,17 +18,15 @@ XXX
chkoom() { chkoom() {
echo "Trying OOM error..." echo "Trying OOM error..."
local tmp=$(mktemp) local s=""
# 300 x 27-29 bytes > 8192 bytes. Large enough to smash the pool. # 300 x 27-29 bytes > 8192 bytes. Large enough to smash the pool.
local i=0 for i in {1..300}; do
while [ "$i" -lt "300" ]; do s+=".equ abcdefghijklmnopqrstuvwxyz$i 42"
echo ".equ abcdefghijklmnopqrstuvwxyz$i 42" >> ${tmp} s+=$'\n'
i=$(($i+1))
done done
${ZASM} < ${tmp} > /dev/null ${ZASM} <<< "$s" > /dev/null
local res=$? local res=$?
rm ${tmp} if [[ $res == 23 ]]; then
if [ $res = 23 ]; then
echo "Good!" echo "Good!"
else else
echo "$res != 23" echo "$res != 23"
@ -61,5 +57,5 @@ chkerr ".db 0x100" 20
# TODO: find out why this tests fails on Travis but not on my machine... # TODO: find out why this tests fails on Travis but not on my machine...
# chkerr $'nop \ nop \ nop\n.fill 2-$' 20 # chkerr $'nop \ nop \ nop\n.fill 2-$' 20
chkerr ".inc \"doesnotexist\"" 21 chkerr ".inc \"doesnotexist\"" 21
chkerr 'foo:\\foo:' 22 chkerr "foo:\\foo:" 22
chkoom chkoom

View File

@ -1,4 +1,6 @@
#!/bin/sh -e #!/usr/bin/env bash
set -e
KERNEL=../../../kernel KERNEL=../../../kernel
APPS=../../../apps APPS=../../../apps
@ -9,7 +11,7 @@ cmpas() {
FN=$1 FN=$1
EXPECTED=$(xxd ${FN}.expected) EXPECTED=$(xxd ${FN}.expected)
ACTUAL=$(cat ${FN} | $ZASM "${KERNEL}" "${APPS}" | xxd) ACTUAL=$(cat ${FN} | $ZASM "${KERNEL}" "${APPS}" | xxd)
if [ "$ACTUAL" = "$EXPECTED" ]; then if [ "$ACTUAL" == "$EXPECTED" ]; then
echo ok echo ok
else else
echo actual echo actual
@ -20,7 +22,7 @@ cmpas() {
fi fi
} }
if [ ! -z $1 ]; then if [[ ! -z $1 ]]; then
cmpas $1 cmpas $1
exit 0 exit 0
fi fi