Explorar el Código

shell: place cmd metadata next to the routine

This will facilitate the inclusion of extra commands other parts might
want to define.
pull/10/head
Virgil Dupras hace 5 años
padre
commit
4600b5299c
Se han modificado 2 ficheros con 43 adiciones y 14 borrados
  1. +14
    -0
      parts/core.asm
  2. +29
    -14
      parts/shell.asm

+ 14
- 0
parts/core.asm Ver fichero

@@ -18,6 +18,20 @@ addDE:
ld e, a ld e, a
ret ret


; copy (DE) into DE, little endian style (addresses in z80 are always have
; their LSB before their MSB)
intoDE:
push af
ld a, (de)
inc de
ex af, af'
ld a, (de)
ld d, a
ex af, af'
ld e, a
pop af
ret

; add the value of A into HL ; add the value of A into HL
addHL: addHL:
add a, l add a, l


+ 29
- 14
parts/shell.asm Ver fichero

@@ -137,11 +137,13 @@ shellParse:
ld b, a ld b, a


.loop: .loop:
push de ; we need to keep that table entry around...
call intoDE ; Jump from the table entry to the cmd addr.
ld a, 4 ; 4 chars to compare ld a, 4 ; 4 chars to compare
call strncmp call strncmp
pop de
jr z, .found jr z, .found
ld a, 7 + SHELL_CMD_ARGS_MAXSIZE
call addDE
inc de
djnz .loop djnz .loop


; exhausted loop? not found ; exhausted loop? not found
@@ -150,12 +152,18 @@ shellParse:
jr .end jr .end


.found: .found:
; we found our command. Now, let's parse our args.
; we found our command. DE points to its table entry. Now, let's parse
; our args.
call intoDE ; Jump from the table entry to the cmd addr.

; advance the HL pointer to the beginning of the args.
ld a, 4 ld a, 4
call addHL call addHL

; Now, let's have DE point to the argspecs ; Now, let's have DE point to the argspecs
ld a, 4 ld a, 4
call addDE call addDE

; We're ready to parse args ; We're ready to parse args
call shellParseArgs call shellParseArgs
cp 0 cp 0
@@ -295,12 +303,22 @@ shellParseArgs:
ret ret


; *** COMMANDS *** ; *** COMMANDS ***
; A command is a 4 char names, followed by a SHELL_CMD_ARGS_MAXSIZE bytes of
; argument specs, followed by the routine. Then, a simple table of addresses
; is compiled in a block and this is what is iterated upon when we want all
; available commands.
;
; Format: 4 bytes name followed by SHELL_CMD_ARGS_MAXSIZE bytes specifiers,
; followed by 3 bytes jump. fill names with zeroes
;
; When these commands are called, HL points to the first byte of the ; When these commands are called, HL points to the first byte of the
; parsed command args. ; parsed command args.



; Set memory pointer to the specified address (word). ; Set memory pointer to the specified address (word).
; Example: seek 01fe ; Example: seek 01fe

shellSeekCmd:
.db "seek", 0b011, 0b001, 0
shellSeek: shellSeek:
push af push af
push de push de
@@ -336,6 +354,8 @@ shellSeek:
; optional numerical byte arg is supplied, this number of bytes will be printed ; optional numerical byte arg is supplied, this number of bytes will be printed
; ;
; Example: peek 2 (will print 2 bytes) ; Example: peek 2 (will print 2 bytes)
shellPeekCmd:
.db "peek", 0b101, 0, 0
shellPeek: shellPeek:
push af push af
push bc push bc
@@ -374,6 +394,8 @@ shellPeek:
; Control is returned to the shell only after all bytes are read. ; Control is returned to the shell only after all bytes are read.
; ;
; Example: load 42 ; Example: load 42
shellLoadCmd:
.db "load", 0b001, 0, 0
shellLoad: shellLoad:
push af push af
push bc push bc
@@ -397,6 +419,8 @@ shellLoad:
; parameters, A and HL. The first one is a byte, the second, a word. These are ; parameters, A and HL. The first one is a byte, the second, a word. These are
; the values that A and HL are going to be set to just before calling. ; the values that A and HL are going to be set to just before calling.
; Example: run 42 cafe ; Example: run 42 cafe
shellCallCmd:
.db "call", 0b101, 0b111, 0b001
shellCall: shellCall:
push af push af
push hl push hl
@@ -431,15 +455,6 @@ shellCall:
pop af pop af
ret ret


; Format: 4 bytes name followed by SHELL_CMD_ARGS_MAXSIZE bytes specifiers,
; followed by 3 bytes jump. fill names with zeroes
shellCmdTbl: shellCmdTbl:
.db "seek", 0b011, 0b001, 0
jp shellSeek
.db "peek", 0b101, 0, 0
jp shellPeek
.db "load", 0b001, 0, 0
jp shellLoad
.db "call", 0b101, 0b111, 0b001
jp shellCall
.dw shellSeekCmd, shellPeekCmd, shellLoadCmd, shellCallCmd



Cargando…
Cancelar
Guardar