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: $'