collapseos/tools/emul/zasm/glue.asm

122 lines
1.7 KiB
NASM
Raw Normal View History

2019-05-10 04:09:40 +10:00
; Glue code for the emulated environment
.equ RAMSTART 0x4000
.equ USER_CODE 0x4800
2019-05-10 04:09:40 +10:00
.equ STDIO_PORT 0x00
.equ STDIN_SEEK 0x01
2019-05-17 03:23:23 +10:00
.equ FS_DATA_PORT 0x02
.equ FS_SEEK_PORT 0x03
.equ STDERR_PORT 0x04
2019-05-10 04:09:40 +10:00
jp init ; 3 bytes
; *** JUMP TABLE ***
2019-06-01 01:12:29 +10:00
jp strncmp
jp addDE
jp addHL
jp upcase
jp unsetZ
jp intoDE
jp intoHL
jp writeHLinDE
jp findchar
jp parseHex
jp parseHexPair
jp blkSel
jp fsFindFN
jp fsOpen
jp fsGetC
jp fsSeek
jp fsTell
jp cpHLDE
2019-05-10 04:09:40 +10:00
2019-05-17 03:23:23 +10:00
#include "core.asm"
#include "parse.asm"
2019-05-17 03:23:23 +10:00
.equ BLOCKDEV_RAMSTART RAMSTART
.equ BLOCKDEV_COUNT 3
#include "blockdev.asm"
; List of devices
.dw emulGetC, 0, emulSeek, emulTell
.dw 0, emulPutC, 0, 0
.dw fsdevGetC, fsdevPutC, fsdevSeek, fsdevTell
.equ FS_RAMSTART BLOCKDEV_RAMEND
.equ FS_HANDLE_COUNT 0
#include "fs.asm"
2019-05-10 04:09:40 +10:00
init:
di
ld hl, 0xffff
2019-05-10 04:09:40 +10:00
ld sp, hl
2019-05-17 03:23:23 +10:00
ld a, 2 ; select fsdev
ld de, BLOCKDEV_GETC
call blkSel
call fsOn
ld h, 0 ; input blkdev
ld l, 1 ; output blkdev
call USER_CODE
2019-05-10 04:09:40 +10:00
; signal the emulator we're done
halt
; *** I/O ***
emulGetC:
in a, (STDIO_PORT)
or a ; cp 0
jr z, .eof
cp a ; ensure z
ret
.eof:
call unsetZ
ret
emulPutC:
out (STDIO_PORT), a
ret
2019-05-11 10:32:05 +10:00
emulSeek:
; the STDIN_SEEK port works by poking it twice. First poke is for high
; byte, second poke is for low one.
ld a, h
out (STDIN_SEEK), a
ld a, l
out (STDIN_SEEK), a
2019-05-11 10:32:05 +10:00
ret
2019-05-16 10:07:21 +10:00
emulTell:
; same principle as STDIN_SEEK
in a, (STDIN_SEEK)
ld h, a
in a, (STDIN_SEEK)
ld l, a
ret
2019-05-17 03:23:23 +10:00
fsdevGetC:
in a, (FS_DATA_PORT)
cp a ; ensure Z
ret
fsdevPutC:
out (FS_DATA_PORT), a
ret
fsdevSeek:
push af
ld a, e
out (FS_SEEK_PORT), a
2019-05-17 03:23:23 +10:00
ld a, h
out (FS_SEEK_PORT), a
2019-05-17 11:15:00 +10:00
ld a, l
out (FS_SEEK_PORT), a
2019-05-17 03:23:23 +10:00
pop af
ret
fsdevTell:
push af
in a, (FS_SEEK_PORT)
ld e, a
in a, (FS_SEEK_PORT)
2019-05-17 03:23:23 +10:00
ld h, a
2019-05-17 11:15:00 +10:00
in a, (FS_SEEK_PORT)
ld l, a
2019-05-17 03:23:23 +10:00
pop af
ret