2019-06-01 04:50:43 +10:00
|
|
|
; pgm - execute programs loaded from filesystem
|
|
|
|
;
|
|
|
|
; Implements a shell hook that searches the filesystem for a file with the same
|
|
|
|
; name as the cmd, loads that file in memory and executes it, sending the
|
|
|
|
; program a pointer to *unparsed* arguments in HL.
|
|
|
|
;
|
|
|
|
; We expect the loaded program to return a status code in A. 0 means success,
|
|
|
|
; non-zero means error. Programs should avoid having error code overlaps with
|
|
|
|
; the shell so that we know where the error comes from.
|
|
|
|
;
|
2019-06-03 23:24:43 +10:00
|
|
|
; *** Requirements ***
|
|
|
|
; fs
|
|
|
|
;
|
2019-06-01 04:50:43 +10:00
|
|
|
; *** Defines ***
|
|
|
|
; PGM_CODEADDR: Memory address where to place the code we load.
|
2019-06-03 23:24:43 +10:00
|
|
|
;
|
|
|
|
; *** Variables ***
|
|
|
|
.equ PGM_HANDLE PGM_RAMSTART
|
2019-10-31 07:59:35 +11:00
|
|
|
.equ PGM_RAMEND @+FS_HANDLE_SIZE
|
2019-06-01 04:50:43 +10:00
|
|
|
|
|
|
|
; Routine suitable to plug into SHELL_CMDHOOK. HL points to the full cmdline.
|
2019-07-22 05:57:55 +10:00
|
|
|
; which has been processed to replace the first ' ' with a null char.
|
2019-06-01 04:50:43 +10:00
|
|
|
pgmShellHook:
|
2019-07-22 05:57:55 +10:00
|
|
|
; (HL) is suitable for a direct fsFindFN call
|
2019-06-01 04:50:43 +10:00
|
|
|
call fsFindFN
|
|
|
|
jr nz, .noFile
|
2019-07-22 05:57:55 +10:00
|
|
|
; We have a file! Advance HL to args
|
|
|
|
xor a
|
|
|
|
call findchar
|
|
|
|
inc hl ; beginning of args
|
|
|
|
; Alright, ready to run!
|
2019-11-16 07:37:49 +11:00
|
|
|
jp .run
|
2019-06-01 04:50:43 +10:00
|
|
|
.noFile:
|
|
|
|
ld a, SHELL_ERR_IO_ERROR
|
|
|
|
ret
|
2019-11-16 07:37:49 +11:00
|
|
|
.run:
|
2019-06-03 22:56:39 +10:00
|
|
|
push hl ; unparsed args
|
2019-06-03 23:24:43 +10:00
|
|
|
ld ix, PGM_HANDLE
|
2019-06-01 04:50:43 +10:00
|
|
|
call fsOpen
|
2019-06-06 04:45:38 +10:00
|
|
|
ld hl, 0 ; addr that we read in file handle
|
|
|
|
ld de, PGM_CODEADDR ; addr in mem we write to
|
2019-06-01 04:50:43 +10:00
|
|
|
.loop:
|
2019-10-31 07:59:35 +11:00
|
|
|
call fsGetB ; we use Z at end of loop
|
2019-06-06 04:45:38 +10:00
|
|
|
ld (de), a ; Z preserved
|
2019-06-01 04:50:43 +10:00
|
|
|
inc hl ; Z preserved in 16-bit
|
2019-06-06 04:45:38 +10:00
|
|
|
inc de ; Z preserved in 16-bit
|
2019-06-01 04:50:43 +10:00
|
|
|
jr z, .loop
|
2019-06-03 22:56:39 +10:00
|
|
|
|
|
|
|
pop hl ; recall args
|
2019-06-01 04:50:43 +10:00
|
|
|
; ready to jump!
|
|
|
|
jp PGM_CODEADDR
|