; ; ECHO - Resident System Process ; Print Command tail to console ; ; ; DEFININTIONS ; mpmint equ 224 ;mpm entry interrupt mpm_conwrite equ 9 ;print string mpm_qmake equ 134 ;create queue mpm_qopen equ 135 ;open queue mpm_qread equ 137 ;read queue mpm_qwrite equ 139 ;write queue mpm_setprior equ 145 ;set priority mpm_condetach equ 147 ;detach console mpm_setdefcon equ 148 ;set default console pdlen equ 48 ;length of Process ; Descriptor p_cns equ byte ptr 020h ;default cns p_disk equ byte ptr 012h ;default disk p_user equ byte ptr 013h ;default user p_list equ byte ptr 024h ;default list ps_run equ 0 ;PD run status pf_keep equ 2 ;PD nokill flag rsp_top equ 0 ;rsp offset rsp_pd equ 010h ;PD offset rsp_uda equ 040h ;UDA offset rsp_bottom equ 140h ;end rsp header qf_rsp equ 08h ;queue RSP flag ; ; CODE SEGMENT ; CSEG org 0 mpm: int mpmint ret main: ;create ECHO queue mov cl,mpm_qmake ! mov dx,offset qd call mpm ;open ECHO queue mov cl,mpm_qopen ! mov dx,offset qpb call mpm ;set priority to normal mov cl,mpm_setprior ! mov dx,200 call mpm ;ES points to SYSDAT mov es,sdatseg loop: ;forever ;read cmdtail from queue mov cl,mpm_qread ! mov dx,offset qpb call mpm ;set default values from PD mov bx,pdadr ; mov dl,es:p_disk[bx] ;p_disk=0-15 ; inc dl ! mov disk,dl ;make disk=1-16 ; mov dl,es:p_user[bx] ; mov user,dl ; mov dl,es:p_list[bx] ; mov list,dl mov dl,es:p_cns[bx] mov console,dl ;set default console ; mov dl,console mov cl,mpm_setdefcon ! call mpm ;scan cmdtail and look for '$' or 0. ;when found, replace w/ cr,lf,'$' lea bx,cmdtail ! mov al,'$' ! mov ah,0 mov dx,bx ! add dx,131 nextchar: cmp bx,dx ! ja endcmd cmp [bx],al ! je endcmd cmp [bx],ah ! je endcmd inc bx ! jmps nextchar endcmd: mov byte ptr [bx],13 mov byte ptr 1[bx],10 mov byte ptr 2[bx],'$' ;write command tail lea dx,cmdtail ! mov cl,mpm_conwrite call mpm ;detach console mov dl,console mov cl,mpm_condetach ! call mpm ;done, get next command jmps loop ; ; DATA SEGMENT ; DSEG org rsp_top sdatseg dw 0,0,0 dw 0,0,0 dw 0,0 org rsp_pd pd dw 0,0 ; link,thread db ps_run ; status db 190 ; priority dw pf_keep ; flags db 'ECHO ' ; name dw offset uda/10h ; uda seg db 0,0 ; disk,user db 0,0 ; load dsk,usr dw 0 ; mem dw 0,0 ; dvract,wait db 0,0 dw 0 db 0 ; console db 0,0,0 db 0 ; list db 0,0,0 dw 0,0,0,0 org rsp_uda uda dw 0,offset dma,0,0 ;0 dw 0,0,0,0 dw 0,0,0,0 ;10h dw 0,0,0,0 dw 0,0,0,0 ;20h dw 0,0,0,0 dw 0,0,offset stack_tos,0 ;30h dw 0,0,0,0 dw 0,0,0,0 ;40h dw 0,0,0,0 dw 0,0,0,0 ;50h dw 0,0,0,0 dw 0,0,0,0 ;60h org rsp_bottom qbuf rb 131 ;Queue buffer qd dw 0 ;link db 0,0 ;net,org dw qf_rsp ;flags db 'ECHO ' ;name dw 131 ;msglen dw 1 ;nmsgs dw 0,0 ;dq,nq dw 0,0 ;msgcnt,msgout dw offset qbuf ;buffer addr. dma rb 128 stack dw 0cccch,0cccch,0cccch dw 0cccch,0cccch,0cccch dw 0cccch,0cccch,0cccch dw 0cccch,0cccch,0cccch dw 0cccch,0cccch,0cccch stack_tos dw offset main ; start offset dw 0 ; start seg dw 0 ; init flags pdadr rw 1 ; QPB Buffer cmdtail rb 129 ; starts here db 13,10,'$' qpb db 0,0 ;must be zero dw 0 ;queue ID dw 1 ;nmsgs dw offset pdadr ;buffer addr. db 'ECHO ' ;name to open console db 0 ;disk db 0 ;user db 0 ;list db 0 end