.inc "blkdev.h" .inc "fs.h" .inc "err.h" .inc "ascii.h" .equ RAMSTART 0x2000 .equ USER_CODE 0x4200 .equ STDIO_PORT 0x00 .equ FS_DATA_PORT 0x01 .equ FS_ADDR_PORT 0x02 jp init ; *** JUMP TABLE *** jp strncmp jp upcase jp findchar jp blkSelPtr jp blkSel jp blkSet jp blkSeek jp blkTell jp blkGetB jp blkPutB jp fsFindFN jp fsOpen jp fsGetB jp fsPutB jp fsSetSize jp fsOn jp fsIter jp fsAlloc jp fsDel jp fsHandle jp printstr jp printnstr jp _blkGetB jp _blkPutB jp _blkSeek jp _blkTell jp printcrlf jp stdioGetC jp stdioPutC jp stdioReadLine .inc "core.asm" .inc "str.asm" .equ BLOCKDEV_RAMSTART RAMSTART .equ BLOCKDEV_COUNT 4 .inc "blockdev.asm" ; List of devices .dw fsdevGetB, fsdevPutB .dw stdoutGetB, stdoutPutB .dw stdinGetB, stdinPutB .dw mmapGetB, mmapPutB .equ MMAP_START 0xe000 .inc "mmap.asm" .equ STDIO_RAMSTART BLOCKDEV_RAMEND .equ STDIO_GETC emulGetC .equ STDIO_PUTC emulPutC .inc "stdio.asm" .equ FS_RAMSTART STDIO_RAMEND .equ FS_HANDLE_COUNT 2 .inc "fs.asm" ; *** BASIC *** ; RAM space used in different routines for short term processing. .equ SCRATCHPAD_SIZE STDIO_BUFSIZE .equ SCRATCHPAD FS_RAMEND .inc "lib/util.asm" .inc "lib/ari.asm" .inc "lib/parse.asm" .inc "lib/fmt.asm" .equ EXPR_PARSE parseLiteralOrVar .inc "lib/expr.asm" .inc "basic/util.asm" .inc "basic/parse.asm" .inc "basic/tok.asm" .equ VAR_RAMSTART SCRATCHPAD+SCRATCHPAD_SIZE .inc "basic/var.asm" .equ BUF_RAMSTART VAR_RAMEND .inc "basic/buf.asm" .equ BFS_RAMSTART BUF_RAMEND .inc "basic/fs.asm" .inc "basic/blk.asm" .equ BAS_RAMSTART BFS_RAMEND .inc "basic/main.asm" init: di ; setup stack ld sp, 0xffff call fsInit ld a, 0 ; select fsdev ld de, BLOCKDEV_SEL call blkSel call fsOn call basInit ld hl, basFindCmdExtra ld (BAS_FINDHOOK), hl jp basStart basFindCmdExtra: ld hl, basFSCmds call basFindCmd ret z ld hl, basBLKCmds call basFindCmd ret z jp basPgmHook emulGetC: ; Blocks until a char is returned in a, (STDIO_PORT) cp a ; ensure Z ret emulPutC: out (STDIO_PORT), a ret fsdevGetB: ld a, e out (FS_ADDR_PORT), a ld a, h out (FS_ADDR_PORT), a ld a, l out (FS_ADDR_PORT), a in a, (FS_ADDR_PORT) or a ret nz in a, (FS_DATA_PORT) cp a ; ensure Z ret fsdevPutB: push af ld a, e out (FS_ADDR_PORT), a ld a, h out (FS_ADDR_PORT), a ld a, l out (FS_ADDR_PORT), a in a, (FS_ADDR_PORT) cp 2 ; only A > 1 means error jr nc, .error ; A >= 2 pop af out (FS_DATA_PORT), a cp a ; ensure Z ret .error: pop af jp unsetZ ; returns .equ STDOUT_HANDLE FS_HANDLES stdoutGetB: ld ix, STDOUT_HANDLE jp fsGetB stdoutPutB: ld ix, STDOUT_HANDLE jp fsPutB .equ STDIN_HANDLE FS_HANDLES+FS_HANDLE_SIZE stdinGetB: ld ix, STDIN_HANDLE jp fsGetB stdinPutB: ld ix, STDIN_HANDLE jp fsPutB