From 2d04cacc5322951f187bb17e017c12920ac8ebe2 Mon Sep 17 00:00:00 2001 From: Mark Zbikowski Date: Thu, 25 Apr 2024 21:24:10 +0100 Subject: MZ is back! --- v4.0/src/CMD/COMMAND/TMISC2.ASM | 487 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 487 insertions(+) create mode 100644 v4.0/src/CMD/COMMAND/TMISC2.ASM (limited to 'v4.0/src/CMD/COMMAND/TMISC2.ASM') diff --git a/v4.0/src/CMD/COMMAND/TMISC2.ASM b/v4.0/src/CMD/COMMAND/TMISC2.ASM new file mode 100644 index 0000000..cc30428 --- /dev/null +++ b/v4.0/src/CMD/COMMAND/TMISC2.ASM @@ -0,0 +1,487 @@ + page 80,132 +; SCCSID = @(#)tmisc2.asm 4.3 85/06/25 +; SCCSID = @(#)tmisc2.asm 4.3 85/06/25 +TITLE Part7 COMMAND Transient Routines + +; More misc routines + + +.xlist +.xcref + INCLUDE comsw.asm + INCLUDE DOSSYM.INC + INCLUDE comseg.asm + INCLUDE comequ.asm + INCLUDE ioctl.inc +.list +.cref + + +CODERES SEGMENT PUBLIC BYTE ;AC000; +CodeRes ENDS + +DATARES SEGMENT PUBLIC BYTE ;AC000; + EXTRN IFFlag:BYTE + EXTRN PIPEFLAG:BYTE + EXTRN RE_OUTSTR:BYTE + EXTRN RE_OUT_APP:BYTE +DATARES ENDS + +TRANDATA SEGMENT PUBLIC BYTE ;AC000; + EXTRN AccDen_PTR:WORD + EXTRN Extend_buf_ptr:word ;AN000; + EXTRN FULDIR_PTR:WORD + EXTRN msg_disp_class:byte ;AN000; +TRANDATA ENDS + +TRANSPACE SEGMENT PUBLIC BYTE ;AC000; + EXTRN DESTINFO:BYTE + EXTRN DESTISDIR:BYTE + EXTRN KPARSE:BYTE ;AC000; + EXTRN ONE_CHAR_VAL:BYTE ;AN011; + EXTRN PATHCNT:WORD + EXTRN PATHPOS:WORD + EXTRN PATHSW:WORD + EXTRN RE_INSTR:BYTE + EXTRN RESSEG:WORD + EXTRN SRCBUF:BYTE + EXTRN SWITCHAR:BYTE + + IF IBM + EXTRN ROM_CALL:BYTE + EXTRN ROM_CS:WORD + EXTRN ROM_IP:WORD + ENDIF + +TRANSPACE ENDS + +TRANCODE SEGMENT PUBLIC byte + +ASSUME CS:TRANGROUP,DS:NOTHING,ES:NOTHING,SS:NOTHING + + EXTRN CERROR:NEAR + + IF IBM + EXTRN ROM_EXEC:NEAR + EXTRN ROM_SCAN:NEAR + ENDIF + + PUBLIC IOSET + PUBLIC MOVE_TO_SRCBUF ;AN000; + PUBLIC PGETARG + PUBLIC SETPATH + PUBLIC TESTDOREIN + PUBLIC TESTDOREOUT + + +ASSUME DS:TRANGROUP + +SETPATH: +; +; Get an ASCIZ argument from the unformatted parms +; DESTISDIR set if pathchars in string +; DESTINFO set if ? or * in string +; + MOV AX,[PATHCNT] ;AC000; get length of string + MOV SI,[PATHPOS] ;AC000; get start of source buffer + +GETPATH: + MOV [DESTINFO],0 + MOV [DESTISDIR],0 + MOV SI,[PATHPOS] + MOV CX,[PATHCNT] + MOV DX,SI + JCXZ PATHDONE + PUSH CX + PUSH SI + INVOKE SWITCH + MOV [PATHSW],AX + POP BX + SUB BX,SI + POP CX + ADD CX,BX + MOV DX,SI + +SKIPPATH: + +;;;; IF KANJI 3/3/KK + MOV [KPARSE],0 + +SKIPPATH2: +;;;; ENDIF 3/3/KK + + JCXZ PATHDONE + DEC CX + LODSB + +;;;; IF KANJI 3/3/KK + INVOKE TESTKANJ + JZ TESTPPSEP + DEC CX + INC SI + INC [KPARSE] + JMP SKIPPATH2 + +TESTPPSEP: +;;;; ENDIF 3/3/KK + + INVOKE PATHCHRCMP + JNZ TESTPMETA + INC [DESTISDIR] + +TESTPMETA: + CMP AL,'?' + JNZ TESTPSTAR + OR [DESTINFO],2 + +TESTPSTAR: + CMP AL,star + JNZ TESTPDELIM + OR [DESTINFO],2 + +TESTPDELIM: + INVOKE DELIM + JZ PATHDONEDEC + CMP AL,[SWITCHAR] + JNZ SKIPPATH + +PATHDONEDEC: + DEC SI + +PATHDONE: + XOR AL,AL + XCHG AL,[SI] + INC SI + CMP AL,0DH + JNZ NOPSTORE + MOV [SI],AL ;Don't loose the CR + +NOPSTORE: + MOV [PATHPOS],SI + MOV [PATHCNT],CX + return + +PGETARG: + MOV SI,80H + LODSB + OR AL,AL + retz + CALL PSCANOFF + CMP AL,13 + return + +PSCANOFF: + LODSB + INVOKE DELIM + JNZ PSCANOFFD + CMP AL,';' + JNZ PSCANOFF ; ';' is not a delimiter + +PSCANOFFD: + DEC SI ; Point to first non-delimiter + return + +IOSET: +; +; ALL REGISTERS PRESERVED +; +ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING + + PUSH DS + PUSH DX + PUSH AX + PUSH BX + PUSH CX + MOV DS,[RESSEG] +ASSUME DS:RESGROUP + + CMP [PIPEFLAG],0 + JNZ NOREDIR ; Don't muck up the pipe + TEST IFFlag,-1 + JNZ NoRedir + CALL TESTDOREIN + CALL TESTDOREOUT + +NOREDIR: + POP CX + POP BX + POP AX + POP DX + POP DS +ASSUME DS:NOTHING + return + +TESTDOREIN: + +ASSUME DS:RESGROUP + + CMP [RE_INSTR],0 + retz + PUSH DS + PUSH CS + POP DS + MOV DX,OFFSET tranGROUP:RE_INSTR + MOV AX,(OPEN SHL 8) + MOV BX,AX + INT int_command + POP DS + JC REDIRERR + MOV BX,AX + MOV AL,0FFH +; +; Mega sleaze!! We move the SFN from the new handle spot into the old stdin +; spot. We invalidate the new JFN we got. +; + XCHG AL,[BX.PDB_JFN_Table] + MOV DS:[PDB_JFN_Table],AL + + return +; +; We had some kind of error on the redirection. Figure out what the +; appropriate message should be; BX has the system call that failed +; +REDIRERR: + PUSH CS + POP DS + Call TriageError +; +; At this point, we have recognized the network-generated access denied error. +; The correct message is in DX +; + CMP AX,65 + JZ CERRORJ ;AC000; just issue message returned + CMP BH,OPEN + JZ OpenError +; +; The error was for a create operation. Report the error as a creation error. +; + MOV DX,OFFSET TranGroup:FULDIR_PTR + +CERRORJ: + JMP CERROR +; +; The system call was an OPEN. Report either file not found or path not found. +; + +OpenError: + mov msg_disp_class,ext_msg_class ;AN000; set up extended error msg class + mov dx,offset TranGroup:Extend_Buf_ptr ;AC000; get extended message pointer + mov Extend_Buf_ptr,ax ;AN000; get message number in control block + JMP CERROR + +TESTDOREOUT: + +ASSUME DS:RESGROUP + + CMP [RE_OUTSTR],0 + JNZ REOUTEXISTS ;AN017; need long jump + JMP NOREOUT ;AN017; + +REOUTEXISTS: + CMP [RE_OUT_APP],0 + JZ REOUTCRT +; +; The output redirection was for append. We open for write and seek to the +; end. +; + MOV DX,OFFSET RESGROUP:RE_OUTSTR + MOV AX,(OPEN SHL 8) OR 2 ;AC011; Open for read/write + PUSH AX + INT int_command + POP BX + JC OpenWriteError + + MOV BX,AX + MOV AX,IOCTL SHL 8 ;AN035; Get attributes of handle + INT int_command ;AN035; + TEST DL,devid_ISDEV ;AN035; Is it a device? + JNZ SET_REOUT ;AN035; Yes, don't read from it + + MOV AX,(LSEEK SHL 8) OR 2 + MOV CX,-1 ;AC011; MOVE TO EOF -1 + MOV DX,CX ;AC011; + INT int_command + PUSH CS ;AN011; Get transient seg to DS + POP DS ;AN011; + assume DS:Trangroup ;AN011; + MOV AX,(READ SHL 8) ;AN011; Read one byte from the + MOV CX,1 ;AN011; file into one_char_val + MOV DX,OFFSET Trangroup:ONE_CHAR_VAL;AN011; + INT int_command ;AN011; + JC OpenWriteError ;AN011; If error, exit + cmp ax,cx ;AN017; Did we read 1 byte? + jnz reout_0_length ;AN017; No - file must be 0 length + + cmp one_char_val,01ah ;AN011; Was char an eof mark? + mov DS,[resseg] ;AN011; Get resident segment back + assume DS:Resgroup ;AN011; + JNZ SET_REOUT ;AN011; No, just continue + MOV AX,(LSEEK SHL 8) OR 1 ;AN011; EOF mark found + MOV CX,-1 ;AN011; LSEEK back one byte + MOV DX,CX ;AN011; + INT int_command ;AN011; + JMP SHORT SET_REOUT + +reout_0_length: ;AN017; We have a 0 length file + mov DS,[resseg] ;AN017; Get resident segment back + assume DS:Resgroup ;AN017; + MOV AX,(LSEEK SHL 8) ;AN017; Move to beginning of file + XOR CX,CX ;AN017; Offset is 0 + MOV DX,CX ;AN017; + INT int_command ;AN017; + JMP SHORT SET_REOUT ;AN017; now finish setting up redirection + +OpenWriteError: + CMP AX,error_access_denied + STC ; preserve error + JNZ REOUTCRT ;AN017; need long jump + JMP REDIRERR ;AN017; + +REOUTCRT: + MOV DX,OFFSET RESGROUP:RE_OUTSTR + XOR CX,CX + MOV AH,CREAT + PUSH AX + INT int_command + POP BX + JNC NOREDIRERR ;AC011; + JMP REDIRERR ;AC011; + +NOREDIRERR: ;AN011; + MOV BX,AX + +SET_REOUT: +; +; Mega sleaze!! We move the SFN from the new handle spot into the old stdout +; spot. We invalidate the new JFN we got. +; + MOV AL,0FFH + XCHG AL,[BX.PDB_JFN_Table] + MOV DS:[PDB_JFN_Table+1],AL + +NOREOUT: + return + +; +; Compute length of string (including NUL) in DS:SI into CX. Change no other +; registers +; +Procedure DSTRLEN,NEAR + + SaveReg + XOR CX,CX + CLD + +DLoop: LODSB + INC CX + OR AL,AL + JNZ DLoop + SUB SI,CX + RestoreReg + return + +EndProc DSTRLEN + +Break + +; +; TriageError will examine the return from a carry-set system call and +; return the correct error if applicable. +; +; Inputs: outputs from a carry-settable system call +; No system calls may be done in the interrim +; Outputs: If carry was set on input +; carry set on output +; DX contains trangroup offset to printf message +; else +; No registers changed +; + +Procedure TriageError,NEAR + + retnc ; no carry => do nothing... + PUSHF + SaveReg + MOV AH,GetExtendedError + INT 21h + RestoreReg ; restore original AX + MOV DX,OFFSET TranGroup:AccDen_PTR + CMP AX,65 ; network access denied? + JZ NoMove ; Yes, return it. + MOV AX,BX + MOV DX,CX + +NoMove: + RestoreReg + popf + return + +EndProc TriageError + +PUBLIC Triage_Init +Triage_Init proc FAR + call TriageError + ret +Triage_Init endp + + +; **************************************************************** +; * +; * ROUTINE: MOVE_TO_SRCBUF +; * +; * FUNCTION: Move ASCIIZ string from DS:SI to SRCBUF. Change +; * terminating 0 to 0dH. Set PATHCNT to length of +; * string. Set PATHPOS to start of SRCBUF. +; * +; * INPUT: DS:SI points to ASCIIZ string +; * ES points to TRANGROUP +; * +; * OUTPUT: SRCBUF filled in with string terminated by 0dH +; * PATHCNT set to length of string +; * PATHPOS set to start of SRCBUF +; * CX,AX changed +; * +; **************************************************************** + +assume es:trangroup,ds:nothing ;AN000; + +MOVE_TO_SRCBUF PROC NEAR ;AN000; + + push si ;AN000; save si,di + push di ;AN000; + push cx ;AN000; + mov di,offset TRANGROUP:srcbuf ;AN000; set ES:DI to srcbuf + xor cx,cx ;AN000; clear cx for counint + mov ax,cx ;AN000; clear ax + push di ;AN000; save start of srcbuf + lodsb ;AN000; get a character from DS:SI + +mts_get_chars: ;AN000; + cmp al,0 ;AN000; was it a null char? + jz mts_end_string ;AN000; yes - exit + stosb ;AN000; no - store it in srcbuf + inc cx ;AN000; increment length count + lodsb ;AN000; get a character from DS:SI + jmp short mts_get_chars ;AN000; go check it + +mts_end_string: ;AN000; we've reached the end of line + mov al,end_of_line_in ;AN000; store 0dH in srcbuf + stosb ;AN000; + pop di ;AN000; restore start of srcbuf + + push cs ;AN000; set DS to local segment + pop ds ;AN000; +assume ds:trangroup ;AN000; + mov [pathcnt],cx ;AN000; set patchcnt to length count + mov [pathpos],di ;AN000; set pathpos to start of srcbuf + pop cx ;AN000; restore cx,di,si + pop di ;AN000; + pop si ;AN000; + + RET ;AN000; exit + +MOVE_TO_SRCBUF ENDP ;AN000; + +TRANCODE ENDS + END + \ No newline at end of file -- cgit v1.2.3