47 lines
1.4 KiB
Plaintext
47 lines
1.4 KiB
Plaintext
putch: equ 2 ; CP/M syscall to print character
|
|
puts: equ 9 ; CP/M syscall to print $-terminated string
|
|
arglen: equ 80h ; Length of argument
|
|
argmt: equ 81h ; Argument string
|
|
fcb1: equ 5Ch ; FCBs
|
|
fcb2: equ 6Ch
|
|
org 100h
|
|
;;; Print all argument(s) as given
|
|
lxi d,cmdln ; Print 'Command line: '
|
|
mvi c,puts
|
|
call 5
|
|
lda arglen ; Retrieve the length of the argument
|
|
lxi h,argmt ; Pointer to argument string
|
|
call plstr
|
|
;;; CP/M also assumes that the first two words on the command
|
|
;;; line are filenames, and prepares two FCBs with the filenames
|
|
;;; in them. If there are no filenames, they will be blank.
|
|
lxi d,file1 ; Print the first one
|
|
mvi c,puts
|
|
call 5
|
|
mvi a,11 ; Filenames are 8+3 characters long and padded with
|
|
lxi h,fcb1+1 ; spaces
|
|
call plstr
|
|
lxi d,file2 ; Print the second one
|
|
mvi c,puts
|
|
call 5
|
|
mvi a,11
|
|
lxi h,fcb2+1
|
|
; ... fall through - on small systems saving bytes is a virtue
|
|
;;; This subroutine prints a length-A string in HL.
|
|
plstr: ana a ; If A=0, print nothing.
|
|
rz
|
|
push psw ; Save A and HL registers on the stack
|
|
push h ; (CP/M syscalls clobber all registers)
|
|
mov e,m ; Print character under HL
|
|
mvi c,putch
|
|
call 5
|
|
pop h ; Restore A and HL registers
|
|
pop psw
|
|
inx h ; Increment string pointer
|
|
dcr a ; Decrement character counter
|
|
jnz plstr ; Print next character if not zero
|
|
ret
|
|
cmdln: db 'Command line: $'
|
|
file1: db 13,10,'File 1: $'
|
|
file2: db 13,10,'File 2: $'
|