mirror of
https://github.com/hsoft/collapseos.git
synced 2024-12-26 18:58:07 +11:00
92ddc7ebc1
Not much of a gain in terms of usability (a bit of a loss in fact, things are a bit slow and glitchy), but it's a necessary move if we want to use upcoming grid-enabled userspace apps, such as a visual text editor.
201 lines
3.4 KiB
NASM
201 lines
3.4 KiB
NASM
; 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:
|