34ee91a0d7
This will soon allow use to seek and tell on input, which is necessary for a second pass which is necessary for forward symbol references. This require making `blkSel` a bit more flexible. Rather than having one global selected blkdev, each app can select its own, in its own memory space.
71 lines
1.4 KiB
NASM
71 lines
1.4 KiB
NASM
; classic RC2014 setup (8K ROM + 32K RAM) and a stock Serial I/O module
|
|
; The RAM module is selected on A15, so it has the range 0x8000-0xffff
|
|
RAMSTART .equ 0x8000
|
|
RAMEND .equ 0xffff
|
|
ACIA_CTL .equ 0x80 ; Control and status. RS off.
|
|
ACIA_IO .equ 0x81 ; Transmit. RS on.
|
|
|
|
jp init
|
|
|
|
; *** JUMP TABLE ***
|
|
; Why not use this unused space between 0x03 and 0x38 for a jump table?
|
|
jp printstr
|
|
jp printHex
|
|
jp sdcInitialize
|
|
jp sdcSendRecv
|
|
jp sdcWaitResp
|
|
jp sdcCmd
|
|
jp sdcCmdR1
|
|
jp sdcCmdR7
|
|
jp sdcReadBlk
|
|
jp sdcSetBlkSize
|
|
|
|
; interrupt hook
|
|
.fill 0x38-$
|
|
jp aciaInt
|
|
|
|
#include "core.asm"
|
|
ACIA_RAMSTART .equ RAMSTART
|
|
#include "acia.asm"
|
|
.define STDIO_GETC call aciaGetC
|
|
.define STDIO_PUTC call aciaPutC
|
|
STDIO_RAMSTART .equ ACIA_RAMEND
|
|
#include "stdio.asm"
|
|
BLOCKDEV_RAMSTART .equ STDIO_RAMEND
|
|
BLOCKDEV_COUNT .equ 2
|
|
#include "blockdev.asm"
|
|
; List of devices
|
|
.dw aciaGetC, aciaPutC, 0, 0
|
|
.dw sdcGetC, 0, 0, 0
|
|
|
|
#include "blockdev_cmds.asm"
|
|
|
|
SHELL_RAMSTART .equ BLOCKDEV_RAMEND
|
|
.define SHELL_IO_GETC call blkGetCW
|
|
.define SHELL_IO_PUTC call blkPutC
|
|
SHELL_EXTRA_CMD_COUNT .equ 3
|
|
#include "shell.asm"
|
|
.dw sdcInitializeCmd, blkBselCmd, blkSeekCmd
|
|
|
|
.equ SDC_RAMSTART SHELL_RAMEND
|
|
.equ SDC_PORT_CSHIGH 6
|
|
.equ SDC_PORT_CSLOW 5
|
|
.equ SDC_PORT_SPI 4
|
|
#include "sdc.asm"
|
|
|
|
init:
|
|
di
|
|
; setup stack
|
|
ld hl, RAMEND
|
|
ld sp, hl
|
|
im 1
|
|
call aciaInit
|
|
xor a
|
|
ld de, BLOCKDEV_GETC
|
|
call blkSel
|
|
call shellInit
|
|
|
|
ei
|
|
jp shellLoop
|
|
|