133 lines
2.2 KiB
NASM
133 lines
2.2 KiB
NASM
; MSX-DOS utility to execute openMSX commands from within the MSX.
|
|
;
|
|
; This can be used to e.g. integrate a MSX program in a build chain
|
|
; on the host computer.
|
|
;
|
|
; For example start openMSX from the command line like this:
|
|
; openmsx -script omsxctl.tcl -diska my_directory
|
|
;
|
|
; And inside my_directory/ put the a AUTOEXEC.BAT with content:
|
|
; omsxctl after time 100 "exit 1"
|
|
; my_tool my_data.in my_data.out
|
|
; omsxctl exit 0
|
|
|
|
bdos .equ 0x5
|
|
PutChr .equ 0x2
|
|
ArgSize .equ 0x0080
|
|
ArgData .equ 0x0081
|
|
ScriptPort .equ 0x2d
|
|
|
|
.area _CODE
|
|
; Detect whether the 'omsxctl.tcl' script is active.
|
|
ld hl,#ZeroStr ; empty command (doesn't produce output)
|
|
scf
|
|
out (ScriptPort),a ; script should change clear carry flag
|
|
jr c,ErrNoScript
|
|
|
|
; Process command line.
|
|
ld a,(ArgSize)
|
|
or a
|
|
jr z,ErrNoArgs
|
|
ld hl,#ArgData
|
|
add a,l
|
|
ld l,a
|
|
ld (hl),#0 ; write 0-terminator (needed for DOS1?)
|
|
|
|
; Execute command.
|
|
ld hl,#ArgData+1 ; skip first space
|
|
ld de,#ResultBuf
|
|
ld bc,#ResultBufSize
|
|
out (ScriptPort),a
|
|
|
|
; Did the command give an error?
|
|
jr nc,NoError
|
|
ld hl,#TxtCmdError
|
|
push bc
|
|
call Print
|
|
pop bc
|
|
NoError:
|
|
|
|
; Was the result string truncated?
|
|
ld a,b
|
|
and c
|
|
inc a ; BC == 0xffff ?
|
|
jr nz,NotTruncated
|
|
ld hl,#TxtTruncated
|
|
call Print
|
|
ld bc,#ResultBufSize
|
|
NotTruncated:
|
|
|
|
; Print the result string and translate \n to \r\n.
|
|
ld hl,#ResultBuf
|
|
ResultLoop:
|
|
ld a,b
|
|
or c
|
|
jr z,Done
|
|
push hl
|
|
push bc
|
|
ld a,(hl)
|
|
cp #10
|
|
jr nz,Not10
|
|
ld e,#13
|
|
ld c,#PutChr
|
|
call bdos
|
|
ld a,#10
|
|
Not10:
|
|
ld e,a
|
|
ld c,#PutChr
|
|
call bdos
|
|
pop bc
|
|
pop hl
|
|
inc hl
|
|
dec bc
|
|
jr ResultLoop
|
|
|
|
Done:
|
|
ld hl,#TxtNewLine
|
|
jr Print
|
|
|
|
ErrNoScript:
|
|
ld hl,#TxtErrNoScript
|
|
jr Print
|
|
|
|
ErrNoArgs:
|
|
ld hl,#TxtErrNoArgs
|
|
; print
|
|
|
|
Print:
|
|
ld a,(hl)
|
|
or a
|
|
ret z
|
|
ld e,a
|
|
ld c,#PutChr
|
|
push hl
|
|
call bdos
|
|
pop hl
|
|
inc hl
|
|
jr Print
|
|
|
|
|
|
TxtErrNoScript:
|
|
.str "The 'omsxctl.tcl' script is not active."
|
|
.db 0
|
|
|
|
TxtErrNoArgs:
|
|
.str "No arguments given."
|
|
.db 0
|
|
|
|
TxtCmdError:
|
|
.str "ERROR: "
|
|
.db 0
|
|
|
|
TxtTruncated:
|
|
.str "[truncated]"
|
|
TxtNewLine:
|
|
.db 13, 10
|
|
ZeroStr:
|
|
.db 0
|
|
|
|
ResultBuf:
|
|
ResultBufSize .equ 0x4000
|
|
|
|
.area _DATA
|