;**************************** ; 'dos.asm' ;**************************** include vz.inc ;--- Equations --- ;DEBUG21 equ TRUE ;PEEK_4B equ TRUE FROM4B equ 0 ;--- Exec parameter block --- _pblk struc env dw 0 cmd_o dw 0 cmd_s dw 0 fcb1_o dw 5Ch fcb1_s dw 0 fcb2_o dw 6Ch fcb2_s dw 0 _pblk ends ;--- External symbols --- wseg extrn comspec :byte extrn defatr :byte extrn doswapf :byte extrn frompool :byte extrn invz :byte extrn mg_exit :byte extrn nm_vz :byte extrn skipescf :byte extrn swapmode :byte extrn swchr :byte extrn tchdir :byte extrn tsrflag :byte ; extrn breakf :byte extrn cmdlinef :byte extrn basemode :byte extrn stopf :byte extrn doslen :byte extrn dossw :byte extrn flret :byte ; extrn abuf :word extrn code_seg :word extrn conbufsz :word extrn execcmd :word extrn flcmdp :word extrn gends :word ; extrn gsegsz :word extrn gtops :word extrn lastcmd :word extrn loseg :word extrn nears :word extrn rends :word extrn retval :word ; extrn rtops :word extrn sends :word extrn shseg :word extrn stopintnum :word extrn stops :word extrn syssw :word ;extrn texts :word extrn tmpbuf :word ; extrn tmpbuf2 :word extrn parbuf :near ; ##156.96 extrn tocs :dword extrn w_busy :word extrn xbuf :word extrn save_ds :word extrn tpafreep :word extrn pathp :word endws extrn aliasmenu :near extrn chgt_cons :near extrn chkint29 :near extrn clrline :near extrn copyxptrs :near extrn cputc :near extrn cputmg :near extrn cputstr :near extrn disperr :near extrn dispprmpt :near extrn dspscr :near extrn xmem_close :near extrn xmem_extend :near extrn tmp_close :near ; extrn ems_free :near extrn ems_resetmap :near extrn ems_restore :near extrn ems_save :near extrn enter_vz :near extrn filer :near extrn getcurdir :near extrn getdoskey :near extrn getdosloc :near extrn gets :near extrn getwindow :near extrn ld_wact :near extrn lftonull :near extrn locate :near extrn newline :near extrn nextpool :near extrn nextstate :near extrn parseline :near extrn parsepath1 :near extrn parsestate :near extrn postconfile :near extrn putdosscrn :near extrn quit_vz :near extrn resetcrt :near ; extrn resetgbank :near extrn resetint24 :near extrn resetint29 :near extrn scanenv :near extrn sedit :near extrn seg2ofs :near extrn setatr :near extrn setcmdwindow :near extrn setdoscsr :near extrn setdoskey :near extrn setdosloc :near extrn setfnckey :near ; extrn setgbank :near extrn setint24 :near extrn se_open3 :near extrn skipspc :near ; extrn spreadexec :near extrn strcpy :near extrn strlen :near IFNDEF NOSWAP extrn swapin_cs :near extrn swapin_es :near ENDIF extrn swapin_text :near extrn swapout :near extrn swapout_cs :near ; extrn swap_close :near extrn stack_ss :near extrn to_edit1 :near extrn cs_stack :near extrn windgets1 :near ; extrn dos_go :near ;--- Local work --- wseg mulstp dw 0 ; multi statement ptr save_psp dw 0 cs_sp dw 0 buflen db 0 tomode db 0 endws bseg vct21 dd 0 vct06 dd 0 GDATA cmdparm, dd, 0 gtops_cs dw 0 save_sp dw 0 save_ss dw 0 save_sp2 dw 0 parblk _pblk <> ; ##156.97 nm_cmdcom db 'COMMAND',0 assume ds:cgroup ;--- Exec on loader --- lo_exec proc call isfreeme pop dx mov ds,cs:loseg tstb tsrflag _ifn z or tsrflag,4 mov bx,save_psp msdos F_SETPSP _endif movseg ds,cs movseg es,cs mov bx,offset cgroup:parblk mov [bx].cmd_o,offset cgroup:parbuf ; ##156.96 mov [bx].cmd_s,cs mov [bx].fcb1_s,cs mov [bx].fcb2_s,cs clr al pop ds push bp mov cs:save_sp2,sp msdos F_EXEC mov sp,cs:save_sp2 mov ds,cs:loseg and tsrflag,not 4 mov bx,offset cgroup:cs_exec lo_exec1: mov cs:tocs.@off,bx mov cs:tchdir,TRUE pushf pushm ; call setgbank call ems_resetmap movseg ds,cs call freeTPA mov al,invz tst al _if z tstb cs:cmdlinef _ifn z push ax call ems_save ; ##153.49 pop ax _endif ; mov invz,TRUE IFNDEF NOSWAP call swapin_es ENDIF ;_else ; ##156.129 ; mov dl,breakf ; ##155.83 ; msdos F_CTRL_C,1 _endif popm _if c tstb cs:cmdlinef jmpln z,lo_exec_x _endif popf jmp cs:tocs lo_exec endp isfreeme proc mov ax,cs dec ax mov es,ax tstw es:[mcb_psp] _ifn z VZ_RET _endif pop ax mov dx,loseg mov ss,dx push dx push ax retf isfreeme endp endbs eseg ;--- Exec from editor --- public se_command se_command proc tstb cs:cmdlinef _ifn z quit1: jmp quit_vz _endif movseg ds,ss call putdosscrn IFNDEF NOXSCR call chkint29 ENDIF ; call stack_cs exec1: call getcurdir call dispprmpt call setfnckey call setdosloc mov si,xbuf mov buflen,VZ_DOSLEN-2 call dosgets mov flret,0 jnc exec2 exec11: mov tomode,al toeditor: ; from "dosedit" call expandfar ; ##152.26 IFNDEF NOSWAP call swapin_text ENDIF call xmem_extend call enter_vz jc quit1 IFNDEF NOXSCR call postconfile ENDIF mov lastcmd,CM_OPENFILE mov al,tomode cmp al,CM_TOFILER jmpl e,se_open3 cmp al,CM_CONS jmpl e,chgt_cons jmp to_edit1 exec2: push cx mov dl,LF call cputc pop cx movseg es,cs mov di,offset cgroup:parbuf ; ##156.96 mov ax,cx _ifn cxz add al,3 mov ah,swchr ; ##156.140 stosw mov ax,' C' stosw call strcpy _else stosb mov doswapf,TRUE mov dx,offset cgroup:mg_exit call cputmg _endif mov al,CR stosb mov si,offset cgroup:comspec ; ! push bp call scanenv pop bp jnc execx push es movseg es,ss push di ; call setgbank call setdoskey call resetint24 call swapout ; call resetgbank jmp near ptr lo_exec cs_exec: pop bp pushf movseg ds,cs mov invz,FALSE call copyxptrs call stack_ss movseg ds,ss movseg es,ss mov bx,cs msdos F_SETPSP call tmp_close mov dl,LF call cputc ; call setgbank call getdoskey call setint24 ; ##100.13 ; call expandfar ; ##152.26 popf jc execx jmp exec1 execx: mov dl,E_EXEC call disperr mov al,CM_ESC jmp exec11 se_command endp endes ;--- INT21h entry on loader --- bseg int21in proc cld cmp ax,F_EXEC*256 je exec_vz cmp ah,F_TERM ; ##154.64 _if e push ax clr ah cmp ax,cs:retval _if a mov cs:retval,ax mov cs:mulstp,0 _endif pop ax _endif cmp ah,F_LINEIN _if e cmp cs:tsrflag,1 ; -z2 jne toorg21 jmp intdos _endif toorg21: jmp cs:vct21 exec_vz: IFDEF PEEK_4B pushm mov si,dx call cputstr mov dl,'*' call cputc lds si,es:[bx+2] lodsb cbw mov cx,ax _ifn cxz peek4b: lodsb mov dl,al call cputc loop peek4b _endif mov dl,CR call cputc mov dl,LF call cputc popm jmp toorg21 ELSE pushm mov si,dx call is_vz jnc is_vz_z mov si,dx mov di,offset cgroup:nm_cmdcom call iscom jc not_vz lds si,es:[bx+2] inc si call is_vz jc not_vz dec si ; ##156.128 jmps is_vzz0 is_vz_z: lds si,es:[bx+2] inc si is_vzz0: cmp cs:tsrflag,2 ja ignore_vz mov cs:cmdparm.@off,si mov cs:cmdparm.@seg,ds ; ##100.19 isvzz1: lodsb isvzz2: cmp al,CR je intdos1 cmp al,'-' jne isvzz1 lodsb cmp al,'Z' je not_vz cmp al,'z' jne isvzz2 not_vz: popm jmps toorg21 ignore_vz: mov di,sp or byte ptr ss:[di+12],1 popm mov ax,ENOMEM iret ; ##155.71 is_vz: mov di,offset cgroup:nm_vz iscom: pushm movseg es,cs isvz1: lodsb cmp al,SPC je isvz1 jb isvz_x inc si cmp al,'/' je isvz1 cmp al,'-' je isvz1 dec si isvz2: cmp al,'a' _if ae cmp al,'z' _if be sub al,'a'-'A' _endif _endif scasb _ifn e pop di push di _endif clr al scasb lodsb jz isvz3 dec di cmp al,SPC ja isvz2 isvz_x: stc jmps isvz8 isvz3: cmp al,'.' je isvz_o cmp al,SPC ja isvz2 isvz_o: clc isvz8: popm VZ_RET ENDIF intdos: pushm intdos1: pushm push ax mov al,TRUE clr bp cmp ah,F_LINEIN _if e mov bp,sp mov bp,[bp+22] ; get caller's CS mov es,bp cmp word ptr es:[0100h],0EB4h ; B4 0E CD 21 ... _ifn e clr bp cmp cs:swapmode,4 _if e pop ax jmps lo_return _endif _endif _else mov ax,cs mov bp,ds cmp ax,bp mov al,TRUE _if b mov al,FALSE _endif clr bp _endif mov cs:cmdlinef,al mov cs:shseg,bp pop ax IFDEF DEBUG21 pushm mov dx,cs mov ds,dx call resetint21 popm ENDIF mov cs:save_ss,ss mov cs:save_sp,sp mov cs:save_ds,cs cli mov sp,cs mov ss,sp mov sp,offset cgroup:cs_stack sti mov bx,offset cgroup:int21in2 jmp lo_exec1 lo_exec_x: mov cs:invz,FALSE call ems_restore ; ##153.49 popf ; cli mov ss,cs:save_ss mov sp,cs:save_sp lo_return: popm jmp not_vz int21in endp ; MASM6 endbs ;--- INT21h entry on CS --- eseg int21in2 proc clr al cmp ah,F_EXEC _ifn e mov bx,dx mov al,[bx] tst al jmpl z,intdos8 _endif mov ss:buflen,al ; mov bx,cs ; mov ss,bx pushm push ax call stack_ss movseg ds,ss movseg es,ss call tmp_close msdos F_GETPSP mov save_psp,bx mov bx,cs msdos F_SETPSP ; call setgbank call ems_resetmap ; ##153.56 call getdoskey call setint24 call getcurdir call setfnckey call getdosloc ; tstw gtops ; ##152.26 ;_ifn z ; call freeTPA ; call expandfar ;_endif pop ax tst al jnz intdos2 popm mov al,FROM4B call dosedit call setdoscsr jmps intdos7 intdos2: ; mov si,abuf ; tstw shseg ;_ifn z mov si,xbuf ;_endif _repeat push si movseg es,ss mov bx,save_psp ; ##100.05 msdos F_SETPSP call dosgets mov flret,0 pushf push ax mov bx,cs msdos F_SETPSP pop ax popf _break nc call dosedit pop si _until pop ax popm mov al,es:[di] inc di clr ah dec ax cmp cx,ax _if b mov al,cl _endif stosb mov cx,ax rep movsb mov al,CR stosb intdos7: mov retval,0 mov ax,gtops mov cs:gtops_cs,ax ; call setgbank call setdoskey call resetint24 call swapout call ems_restore ; ##153.49 ; call resetgbank mov bx,save_psp msdos F_SETPSP IFDEF DEBUG21 call setint21 ENDIF mov ss,cs:save_ss mov sp,cs:save_sp intdos8: popm iret int21in2 endp ;--- Command line edit --- ;--> ; SI :history buffer ptr ;<-- ; CY :escape ; SI :input string ptr ; CX :string length dosgets proc call setcmdwindow clr al mov doswapf,al xchg cs:stopf,al tst al jnz dosget_i mov ax,mulstp tst ax jnz dosget5 IFNDEF NOFILER tstb doslen jmpln z,doscr1 mov al,flret tst al jmpln z,dosfl0 mov ax,execcmd tst ax _ifn z push si call nextpool pop si _ifn c dec doswapf call parseline jmps dosget51 _endif mov execcmd,0 _endif ENDIF dosget_i: mov al,GETS_DOS dosget1: mov flcmdp,0 ; ##153.43 mov cl,buflen test dossw,VZ_DOS_RETURN _ifn z tstb flret _if z push si mov pathp,0 jmps dos_filer1 _endif _endif mov defatr,ATR_DOS mov basemode,SYS_DOS call gets mov defatr,INVALID jc dos_esc IFNDEF NOFILER cmp al,CM_TOFILER je dos_filer ENDIF cmp al,CM_CONS je dos_cons IFNDEF NOALIAS cmp al,CM_SPREAD je dos_spread cmp al,CM_ALIAS je dos_alias ENDIF cmp al,CM_CR je dos_cr dosget_i1: jmp dosget_i dosget5: mov si,ax dosget51: IFNDEF NOALIAS push si call nextstate pop si ELSE clr ax ENDIF jmp dosget7 dos_cons: tstw conbufsz jz dosget_i dos_esc: clr ah mov execcmd,0 dosesc1:mov frompool,ah stc VZ_RET IFNDEF NOFILER dos_filer: mov pathp,0 push si call skipcmd call parsepath1 dos_filer1: IFNDEF NOSWAP call swapin_cs ENDIF call filer pop si jc dosget_i1 dosfl0: tst al js dosget_i1 tstb doslen ; by DOSBOX _ifn z doscr1: and dossw,not VZ_DOS_GO clr cx xchg cx,word ptr doslen jmps dos_cr _endif tst al _if z tstw flcmdp ; ##1.5 _if z movhl ax,1,CM_TOFILER jmp dosesc1 _endif _endif jmps dosget_c ENDIF IFNDEF NOALIAS dos_alias: push si call aliasmenu pop si jmps dosget_c dos_spread: push si call dosspread pop si dosget_c: mov al,GETS_DOSC jmp dosget1 ENDIF dos_cr: tst cx _if z dec doswapf _endif pushm IFNDEF NOFILER call parseline _if z mov execcmd,0 _endif call nextstate ELSE clr ax ENDIF popm test syssw,SW_REDRAW jz dosget71 cmp cl,dl _if b pushm call getwindow clr dx call clrline popm _endif dosget7: mov di,si dosget71: mov mulstp,ax pushm push cx call setdoscsr pop cx jcxz dosget8 IFNDEF NOXSCR mov skipescf,FALSE ENDIF mov si,di call cputstr dosget8: mov dl,CR call cputc ;IFNDEF NOXSCR ; call copyxptrs ;ENDIF popm clc VZ_RET dosgets endp ;--- Skip command --- ; ##1.5 IFNDEF NOFILER skipcmd proc ; mov flcmdp,0 ; ##153.43 jcxz skcmd8 skcmd1: mov bx,si _repeat lodsb tst al jz skcmd7 cmp al,SPC _until be mov flcmdp,si jmp skcmd1 skcmd7: mov si,bx skcmd8: VZ_RET skipcmd endp ENDIF ;--- Spread command line --- IFNDEF NOALIAS dosspread proc mov di,tmpbuf push di call lftonull pop si call strlen mov cx,ax call parseline push si _repeat call parsestate tst al _break z inc si _until pop si mov di,tmpbuf call strcpy mov al,LF stosb VZ_RET dosspread endp ENDIF ;--- DOS screen edit --- ;--> AL :command code dosedit proc mov cs_sp,sp mov tomode,al IFNDEF NOSWAP call swapin_cs ENDIF mov dx,offset cgroup:sedit push dx jmp toeditor dosedit endp endes cseg public quit_tsr quit_tsr proc ; movseg ds,cs IFNDEF NOXSCR call chkint29 ENDIF cmp gends,INVALID _if e clr ax xchg ax,gtops tst ax _ifn z mov es,ax msdos F_FREE _endif _endif ; cli mov sp,cs_sp ; mov ax,cs ; mov ss,ax ; sti VZ_RET quit_tsr endp endcs iseg ; wseg ;--- Install VZ --- ;<-- BX :end of loader seg. public install_vz install_vz proc call setint21 mov bx,nears IFNDEF NOSWAP cmp swapmode,3 _if e call swapout_cs ; _ifn c ; mov nears,bx ; _endif _endif ENDIF VZ_RET install_vz endp endis ; endws iseg ;--- Remove VZ --- ;--> ES :TSR segment ;<-- NC :exist text public remove_vz remove_vz proc push ds movseg ds,es tstw gtops_cs _if z mov dx,ds call resetint21 IFNDEF NOXSCR call resetint29 ENDIF call resetintstop call resetcrt ; ##152.27 ;IFNDEF NOSWAP ; call swap_close ;ENDIF call xmem_close movseg es,ds msdos F_FREE stc _endif pop ds VZ_RET remove_vz endp endis eseg ;--- Expand far area --- expandfar proc mov ax,gtops tst ax _ifn z push es call checkmcb mov bx,-1 _if e msdos F_REALLOC msdos F_REALLOC _else msdos F_MALLOC msdos F_MALLOC mov gtops,ax _endif add ax,bx mov gends,ax pop es _endif VZ_RET expandfar endp ;--- Init far area --- ;<-- ; AX :prev gtops ; CY :error public initfar initfar proc mov ax,cs ; ##153.56 dec ax mov es,ax clr bx cmp es:[bx].mcb_psp,bx ; if psp==0 then psp=cs _if z mov es:[bx].mcb_psp,cs _endif dec bx msdos F_MALLOC cmp ax,ENOMEM jne inifar_x ; cmp bx,gsegsz ; jb inifar_x msdos F_MALLOC mov gtops,ax ; mov gtops0,ax ; ##152.26 add bx,ax ; add ax,gsegsz ; mov texts,ax ; mov rtops,ax mov rends,ax cmp sends,ONEMS _if ae mov stops,ax mov sends,ax _endif mov gends,bx clr ax VZ_RET inifar_x: stc VZ_RET initfar endp ;--- Allocate TPA --- public allocTPA allocTPA proc tstw shseg jz alloc9 mov bx,save_psp msdos F_SETPSP mov bx,-1 msdos F_MALLOC msdos F_MALLOC push ax call TPAptr pop dx mov es:[bx],dx cmp ax,0314h ; later DOS 3.2 _if ae ; mov ax,dx ; add ax,0FFFh ; and ax,0F000h ; cmp ax,cs:maxseg ; _if ae ; mov ax,dx ; _endif mov es:[di+2],dx _endif push es:[di] mov bx,cs:tpafreep tst bx jnz alloc8 mov di,0600h mov cx,300h cmp ah,5 ; ##16 jae alloc1 ; mov bx,0465h ; cmp ah,5 ; ##156.96 ##157.xx DOS 5.0 ; je alloc8 pop es push es mov di,0200h mov cx,100h alloc1: _repeat mov al,0B4h ; find "mov ah,49h" repne scasb jne alloc_x mov al,49h scasb _until e mov bx,es:[di-4] mov cs:tpafreep,bx alloc8: pop es mov es:[bx],dx alloc9: VZ_RET alloc_x:pop ax VZ_RET allocTPA endp endes bseg ;--- Check MCB --- ;--> AX :MCB seg. checkmcb proc push ax dec ax mov es,ax mov al,es:[mcb_id] cmp al,'M' _ifn e cmp al,'Z' jne chkmcb9 _endif mov ax,cs tstw es:[mcb_psp] jz chkmcb9 cmp es:[mcb_psp],ax chkmcb9:pop es VZ_RET checkmcb endp ;--- Free TPA --- public freeTPA freeTPA proc tstw shseg _ifn z call TPAptr mov ax,es:[bx] call checkmcb _ifn e msdos F_FREE _endif _endif VZ_RET freeTPA endp ;--- Get TPA top seg ptr --- ;<-- ES:BX (TPA seg ptr) ; ES:DI (stay shell seg ptr) TPAptr proc msdos F_VERSION mov es,shseg mov bx,es:[0107h] mov di,bx xchg al,ah cmp ax,0314h ; later DOS 3.2 _if ae add bx,10h-2 _endif inc bx inc bx VZ_RET TPAptr endp ;--- Set/reset INT06h --- int06in proc push ds mov cs:stopf,TRUE mov ds,cs:code_seg mov stopf,TRUE pop ds mov cs:mulstp,0 jmp cs:vct06 int06in endp endbs eseg ;stopintnum equ 06h*4 ;;; public setintstop setintstop proc mov bx,offset cgroup:vct06 mov di,cs:stopintnum mov ax,offset cgroup:int06in call setint mov cs:stopf,FALSE VZ_RET setintstop endp public resetintstop resetintstop proc mov bx,offset cgroup:vct06 mov di,cs:stopintnum call resetint VZ_RET resetintstop endp endes IFDEF DEBUG21 bseg ELSE eseg ENDIF ;--- Set/reset INT21h --- setint21 proc mov bx,offset cgroup:vct21 mov di,21h*4 mov ax,offset cgroup:int21in call setint VZ_RET setint21 endp resetint21 proc mov bx,offset cgroup:vct21 mov di,21h*4 call resetint1 VZ_RET resetint21 endp ;--- Set/reset INT vector --- ; BX :vcttor save ptr ; DI :vcttor ptr ; AX :entry offset ; DX :entry segment public setint,setint1 setint proc mov dx,loseg setint1: cli push ds mov ds,dx push es clr cx mov es,cx mov cx,[bx].@off ; ##154.68 jcxz seti1 cmp cx,es:[di].@off _if e seti1: xchg ax,es:[di].@off xchg dx,es:[di].@seg cmp ax,cx _ifn e mov [bx].@off,ax mov [bx].@seg,dx mov cs:[bx].@off,ax mov cs:[bx].@seg,dx _endif _endif pop es pop ds sti VZ_RET setint endp public resetint,resetint1 resetint proc mov dx,loseg resetint1: cli push ds mov ds,dx clr ax xchg ax,[bx].@off tst ax _ifn z push es clr dx mov es,dx mov cs:[bx].@off,dx mov dx,[bx].@seg mov es:[di].@off,ax mov es:[di].@seg,dx pop es _endif pop ds sti VZ_RET resetint endp IFDEF DEBUG21 endbs ELSE endes ENDIF end ;**************************** ; End of 'dos.asm' ; Copyright (C) 1989 by c.mos ;****************************