collapseos/tools/emul/zasm_glue.asm

52 lines
920 B
NASM
Raw Normal View History

2019-05-10 04:09:40 +10:00
; Glue code for the emulated environment
.equ USER_CODE 0x4000
.equ RAMEND 0xffff
.equ ZASM_INPUT 0xa000
.equ ZASM_OUTPUT 0xd000
.equ STDIO_PORT 0x00
jr init ; 2 bytes
; *** JUMP TABLE ***
jp strncmp
jp addDE
jp upcase
jp unsetZ
jp intoDE
init:
di
ld hl, RAMEND
ld sp, hl
ld hl, ZASM_INPUT
; yes, this means that input can't have null bytes
.inloop:
in a, (STDIO_PORT)
ld (hl), a ; before cond jr so we write a final \0
or a
jr z, .inloopend
inc hl
jr .inloop
.inloopend:
ld hl, ZASM_INPUT
ld de, ZASM_OUTPUT
call USER_CODE
; BC contains the number of written bytes
xor a
cp b
jr nz, .spit
cp c
jr z, .end ; no output
.spit:
ld hl, ZASM_OUTPUT
.outloop:
ld a, (hl)
out (STDIO_PORT), a
cpi ; a trick to inc HL and dec BC at the same time.
; P/V indicates whether BC reached 0
jp pe, .outloop ; BC is not zero, loop
.end:
; signal the emulator we're done
halt
#include "core.asm"