add mmap part
This also introduces the "seek" shell command.
This commit is contained in:
parent
af13b0bd00
commit
a27da6f41a
@ -32,6 +32,7 @@ table describes those codes:
|
|||||||
| `01` | Unknown command |
|
| `01` | Unknown command |
|
||||||
| `02` | Badly formatted arguments |
|
| `02` | Badly formatted arguments |
|
||||||
| `03` | Out of bounds |
|
| `03` | Out of bounds |
|
||||||
|
| `04` | Unsupported command |
|
||||||
|
|
||||||
## mptr
|
## mptr
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
; *** CONSTS ***
|
; *** CONSTS ***
|
||||||
BLOCKDEV_ERR_OUT_OF_BOUNDS .equ 0x03
|
BLOCKDEV_ERR_OUT_OF_BOUNDS .equ 0x03
|
||||||
|
BLOCKDEV_ERR_UNSUPPORTED .equ 0x04
|
||||||
|
|
||||||
; *** VARIABLES ***
|
; *** VARIABLES ***
|
||||||
; A memory pointer to a device table. A device table is a list of addresses
|
; A memory pointer to a device table. A device table is a list of addresses
|
||||||
@ -60,7 +61,6 @@ blkSel:
|
|||||||
|
|
||||||
blkBselCmd:
|
blkBselCmd:
|
||||||
.db "bsel", 0b001, 0, 0
|
.db "bsel", 0b001, 0, 0
|
||||||
blkBsel:
|
|
||||||
ld a, (hl) ; argument supplied
|
ld a, (hl) ; argument supplied
|
||||||
cp BLOCKDEV_COUNT
|
cp BLOCKDEV_COUNT
|
||||||
jr nc, .error ; if selection >= device count, error
|
jr nc, .error ; if selection >= device count, error
|
||||||
@ -71,6 +71,7 @@ blkBsel:
|
|||||||
ld a, BLOCKDEV_ERR_OUT_OF_BOUNDS
|
ld a, BLOCKDEV_ERR_OUT_OF_BOUNDS
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
; In those routines below, IY is destroyed (we don't push it to the stack). We
|
; In those routines below, IY is destroyed (we don't push it to the stack). We
|
||||||
; seldom use it anyways...
|
; seldom use it anyways...
|
||||||
|
|
||||||
@ -91,20 +92,50 @@ _blkCall:
|
|||||||
ld ixh, d
|
ld ixh, d
|
||||||
ld ixl, e
|
ld ixl, e
|
||||||
pop de
|
pop de
|
||||||
|
; Before we call... is it zero? We don't want to call a zero.
|
||||||
|
push af
|
||||||
|
ld a, ixh
|
||||||
|
add a, ixl
|
||||||
|
jr c, .ok ; if there's a carry, it isn't zero
|
||||||
|
cp 0
|
||||||
|
jr z, .error ; if no carry and zero, then both numbers are
|
||||||
|
; zero
|
||||||
|
.ok:
|
||||||
|
pop af
|
||||||
call callIX
|
call callIX
|
||||||
|
jr .end
|
||||||
|
|
||||||
|
.error:
|
||||||
|
pop af
|
||||||
|
ld a, BLOCKDEV_ERR_UNSUPPORTED
|
||||||
|
.end:
|
||||||
pop ix
|
pop ix
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; Reads one character from blockdev ID specified at A and returns its value
|
; Reads one character from selected device and returns its value in A. Always
|
||||||
; in A. Always returns a character and waits until read if it has to.
|
; returns a character and waits until read if it has to.
|
||||||
blkGetC:
|
blkGetC:
|
||||||
ld iyl, 0
|
ld iyl, 0
|
||||||
jr _blkCall
|
jr _blkCall
|
||||||
|
|
||||||
|
; Writes character in A in current position in the selected device
|
||||||
blkPutC:
|
blkPutC:
|
||||||
ld iyl, 2
|
ld iyl, 2
|
||||||
jr _blkCall
|
jr _blkCall
|
||||||
|
|
||||||
|
blkSeekCmd:
|
||||||
|
.db "seek", 0b011, 0b001, 0
|
||||||
|
; HL points to two bytes that contain out address. Seek expects HL
|
||||||
|
; to directly contain that address.
|
||||||
|
ld a, (hl)
|
||||||
|
ex af, af'
|
||||||
|
inc hl
|
||||||
|
ld a, (hl)
|
||||||
|
ld l, a
|
||||||
|
ex af, af'
|
||||||
|
ld h, a
|
||||||
|
xor a
|
||||||
|
; Set position of selected device to the value specified in HL
|
||||||
blkSeek:
|
blkSeek:
|
||||||
ld iyl, 4
|
ld iyl, 4
|
||||||
jr _blkCall
|
jr _blkCall
|
||||||
|
54
parts/mmap.asm
Normal file
54
parts/mmap.asm
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
; mmap
|
||||||
|
;
|
||||||
|
; Block device that maps to memory.
|
||||||
|
;
|
||||||
|
; *** DEFINES ***
|
||||||
|
; MMAP_START: Memory address where the mmap begins
|
||||||
|
|
||||||
|
; *** VARIABLES ***
|
||||||
|
MMAP_PTR .equ MMAP_RAMSTART
|
||||||
|
MMAP_RAMEND .equ MMAP_PTR+2
|
||||||
|
|
||||||
|
; *** CODE ***
|
||||||
|
|
||||||
|
; Increase mem pointer by one
|
||||||
|
_mmapForward:
|
||||||
|
ld hl, (MMAP_PTR)
|
||||||
|
inc hl
|
||||||
|
ld (MMAP_PTR), hl
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Returns absolute addr of memory pointer in HL.
|
||||||
|
_mmapAddr:
|
||||||
|
push de
|
||||||
|
ld hl, (MMAP_PTR)
|
||||||
|
ld de, MMAP_START
|
||||||
|
add hl, de
|
||||||
|
jr nc, .end
|
||||||
|
; we have carry? out of bounds, set to maximum
|
||||||
|
ld hl, 0xffff
|
||||||
|
.end:
|
||||||
|
pop de
|
||||||
|
ret
|
||||||
|
|
||||||
|
; if out of bounds, will continually return the last char
|
||||||
|
mmapGetC:
|
||||||
|
push hl
|
||||||
|
call _mmapAddr
|
||||||
|
ld a, (hl)
|
||||||
|
call _mmapForward
|
||||||
|
pop hl
|
||||||
|
ret
|
||||||
|
|
||||||
|
mmapPutC:
|
||||||
|
push hl
|
||||||
|
call _mmapAddr
|
||||||
|
ld (hl), a
|
||||||
|
call _mmapForward
|
||||||
|
pop hl
|
||||||
|
ret
|
||||||
|
|
||||||
|
mmapSeek:
|
||||||
|
ld (MMAP_PTR), hl
|
||||||
|
ret
|
||||||
|
|
Loading…
Reference in New Issue
Block a user