omsxctl/src/omsxctl.asm

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