; RAMSTART is a label at the end of the file .equ RAMEND 0xcfff ; Address of the *CL driver. Same as in recv.asm .equ COM_DRV_ADDR 0x0238 ; in sync with user.h. Last BAS_RAMEND: 0x600b .equ USER_CODE 0x6100 ; Free memory in TRSDOS starts at 0x3000 .org 0x3000 jp init ; *** Jump Table *** jp strncmp jp upcase jp findchar jp printstr jp printcrlf jp blkSet jp blkSel jp _blkGetB jp _blkPutB jp _blkSeek jp _blkTell jp fsFindFN jp fsOpen jp fsGetB jp fsPutB jp fsSetSize jp stdioPutC jp stdioReadLine .inc "err.h" .inc "blkdev.h" .inc "fs.h" .inc "ascii.h" .inc "core.asm" .inc "str.asm" .inc "trs80/kbd.asm" .inc "trs80/vid.asm" .equ FLOPPY_RAMSTART RAMSTART .inc "trs80/floppy.asm" .equ GRID_RAMSTART FLOPPY_RAMEND .equ GRID_ROWS TRS80_ROWS .equ GRID_COLS TRS80_COLS .equ GRID_SETCELL trs80SetCell .equ GRID_GETC trs80GetC .equ gridPushScr fastPushScr .inc "grid.asm" .equ BLOCKDEV_RAMSTART GRID_RAMEND .equ BLOCKDEV_COUNT 3 .inc "blockdev.asm" ; List of devices .dw floppyGetB, floppyPutB .dw blk1GetB, blk1PutB .dw blk2GetB, blk2PutB .equ STDIO_RAMSTART BLOCKDEV_RAMEND .equ STDIO_GETC gridGetC .equ STDIO_PUTC gridPutC .equ STDIO_SETCUR gridSetCurH .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" .inc "basic/floppy.asm" .equ BAS_RAMSTART BFS_RAMEND .inc "basic/main.asm" .out BAS_RAMEND init: ld sp, RAMEND call gridInit call floppyInit call fsInit call basInit ld hl, basFindCmdExtra ld (BAS_FINDHOOK), hl xor a ld de, BLOCKDEV_SEL call blkSel jp basStart ; Receive a byte from *cl and put it in A. ; Returns A > 0xff when receiving the last byte recvCmd: xor a ld (VAR_TBL+1), a ; pre-set MSB ; put a 0xff mask in B, which will become 0x7f if we receive a 0x20 ld b, 0xff .inner: ld a, 0x03 ; @GET ld de, COM_DRV_ADDR rst 0x28 jr nz, .maybeerror or a jr z, .eof ; Sending a straight NULL ends the comm. ; @PUT that char back ld c, a ld a, 0x04 ; @PUT ld de, COM_DRV_ADDR rst 0x28 ret nz ; error ld a, c cp 0x20 jr z, .escapechar ; not an escape char, good and b ; apply mask ld (VAR_TBL), a xor a ; ensure Z ret .maybeerror: ; was it an error? or a jr z, .inner ; not an error, just loop ret ; error .escapechar: ld b, 0x7f jr .inner .eof: dec a ; A = 0xff ld (VAR_TBL+1), a xor a ; ensure Z ret basFindCmdExtra: ld hl, basFloppyCmds call basFindCmd ret z ld hl, basBLKCmds call basFindCmd ret z ld hl, basFSCmds call basFindCmd ret z ld hl, .cmds call basFindCmd ret z jp basPgmHook .cmds: .db "recv", 0 .dw recvCmd .db 0xff ; end of table fastPushScr: push hl ld hl, GRID_BUF call trs80PushScr pop hl ret ; *** blkdev 1: file handle 0 *** blk1GetB: ld ix, FS_HANDLES jp fsGetB blk1PutB: ld ix, FS_HANDLES jp fsPutB ; *** blkdev 2: file handle 1 *** blk2GetB: ld ix, FS_HANDLES+FS_HANDLE_SIZE jp fsGetB blk2PutB: ld ix, FS_HANDLES+FS_HANDLE_SIZE jp fsPutB RAMSTART: