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/DOS/CPMIO2.ASM | 354 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 354 insertions(+) create mode 100644 v4.0/src/DOS/CPMIO2.ASM (limited to 'v4.0/src/DOS/CPMIO2.ASM') diff --git a/v4.0/src/DOS/CPMIO2.ASM b/v4.0/src/DOS/CPMIO2.ASM new file mode 100644 index 0000000..2b31689 --- /dev/null +++ b/v4.0/src/DOS/CPMIO2.ASM @@ -0,0 +1,354 @@ +; SCCSID = @(#)cpmio2.asm 1.1 85/04/11 +TITLE CPMIO2 - device IO for MSDOS +NAME CPMIO2 + +.xlist +.xcref +include dosseg.asm +.cref +.list + +; +; Old style CP/M 1-12 system calls to talk to reserved devices +; +; $Std_Con_Input +; $Std_Con_Output +; OUTT +; TAB +; BUFOUT +; $Std_Aux_Input +; $Std_Aux_Output +; $Std_Printer_Output +; $Std_Con_Input_Status +; $Std_Con_Input_Flush +; +; Revision History: +; +; AN000 version 4.00 - Jan. 1988 +; + +CODE SEGMENT BYTE PUBLIC 'CODE' + ASSUME SS:DOSGROUP,CS:DOSGROUP + +.xcref +.xlist +INCLUDE DOSSYM.INC +INCLUDE DEVSYM.INC +.list +.cref + +; The following routines form the console I/O group (funcs 1,2,6,7,8,9,10,11). +; They assume ES and DS NOTHING, while not strictly correct, this forces data +; references to be SS or CS relative which is desired. + + i_need CARPOS,BYTE + i_need CHARCO,BYTE + i_need PFLAG,BYTE + i_need CurrentPDB,WORD ;AN000; + i_need InterCon,BYTE ;AN000; + i_need SaveCurFlg,BYTE ;AN000; + + +Break + +; Inputs: +; None +; Function: +; Input character from console, echo +; Returns: +; AL = character + + procedure $STD_CON_INPUT,NEAR ;System call 1 +ASSUME DS:NOTHING,ES:NOTHING + + IF DBCS ;AN000; + push word ptr [InterCon] ;AN000; + mov [InterCon],01H ;AN000; + invoke INTER_CON_INPUT_NO_ECHO ;AN000; + pop word ptr [InterCon] ;AN000; + pushf ;AN000; + push AX ;AN000; + mov [SaveCurFlg],0 ;AN000; + jnz sj0 ;AN000; + mov [SaveCurFlg],1 ;AN000; +sj0: ;AN000; + invoke OUTT ;AN000; + mov [SaveCurFLg],0 ;AN000; + pop AX ;AN000; + popf ;AN000; + jz $STD_CON_INPUT ;AN000; + ELSE ;AN000; + invoke $STD_CON_INPUT_NO_ECHO + PUSH AX + invoke OUTT + POP AX + ENDIF ;AN000; + return +EndProc $STD_CON_INPUT + +Break + +; Inputs: +; DL = character +; Function: +; Output character to console +; Returns: +; None + + procedure $STD_CON_OUTPUT,NEAR ;System call 2 + public OUTCHA ;AN000; +ASSUME DS:NOTHING,ES:NOTHING + + MOV AL,DL + + entry OUTT + CMP AL,20H + JB CTRLOUT + CMP AL,c_DEL + JZ OUTCH +OUTCHA: ;AN000; + INC BYTE PTR [CARPOS] +OUTCH: + PUSH DS + PUSH SI + INC BYTE PTR [CHARCO] ;invoke statchk... + AND BYTE PTR [CHARCO],00111111B ;AN000; every 64th char + JNZ OUTSKIP + PUSH AX + invoke STATCHK + POP AX +OUTSKIP: + invoke RAWOUT ;output the character + POP SI + POP DS + IF DBCS ;AN000; + TEST [SaveCurFlg],01H ;AN000;print but no cursor adv? 2/13/KK + retnz ;AN000;if so then do not send to prt2/13/KK + ENDIF + TEST BYTE PTR [PFLAG],-1 + retz + PUSH BX + PUSH DS + PUSH SI + MOV BX,1 + invoke GET_IO_SFT + JC TRIPOPJ + MOV BX,[SI.sf_flags] + TEST BX,sf_isnet ; output to NET? + JNZ TRIPOPJ ; if so, no echo + TEST BX,devid_device ; output to file? + JZ TRIPOPJ ; if so, no echo + MOV BX,4 + invoke GET_IO_SFT + JC TRIPOPJ + TEST [SI.sf_flags],sf_net_spool ; StdPrn redirected? + JZ LISSTRT2J ; No, OK to echo + MOV BYTE PTR [PFLAG],0 ; If a spool, NEVER echo +TRIPOPJ: + JMP TRIPOP + +LISSTRT2J: + JMP LISSTRT2 + +CTRLOUT: + CMP AL,c_CR + JZ ZERPOS + CMP AL,c_BS + JZ BACKPOS + CMP AL,c_HT + JNZ OUTCH + MOV AL,[CARPOS] + OR AL,0F8H + NEG AL + + entry TAB + + PUSH CX + MOV CL,AL + MOV CH,0 + JCXZ POPTAB +TABLP: + MOV AL," " + invoke OUTT + LOOP TABLP +POPTAB: + POP CX + return + +ZERPOS: + MOV BYTE PTR [CARPOS],0 + JMP OUTCH +OUTJ: JMP OUTT + +BACKPOS: + DEC BYTE PTR [CARPOS] + JMP OUTCH + + entry BUFOUT + CMP AL," " + JAE OUTJ ;Normal char + CMP AL,9 + JZ OUTJ ;OUT knows how to expand tabs + +;DOS 3.3 7/14/86 + CMP AL,"U"-"@" ; turn ^U to section symbol + JZ CTRLU + CMP AL,"T"-"@" ; turn ^T to paragraph symbol + JZ CTRLU +NOT_CTRLU: +;DOS 3.3 7/14/86 + + PUSH AX + MOV AL,"^" + invoke OUTT ;Print '^' before control chars + POP AX + OR AL,40H ;Turn it into Upper case mate +CTRLU: + invoke OUTT + return +EndProc $STD_CON_OUTPUT + +Break + +; Inputs: +; None +; Function: +; Returns character from aux input +; Returns: +; Character in AL + + procedure $STD_AUX_INPUT,NEAR ;System call 3 +ASSUME DS:NOTHING,ES:NOTHING + + invoke STATCHK + MOV BX,3 + invoke GET_IO_SFT + retc + JMP SHORT TAISTRT +AUXILP: + invoke SPOOLINT +TAISTRT: + MOV AH,1 + invoke IOFUNC + JZ AUXILP + XOR AH,AH + invoke IOFUNC + return +EndProc $STD_AUX_INPUT + +Break + +; Inputs: +; Character in DL +; Function: +; Output character to aux output +; Returns: +; Nothing + + procedure $STD_AUX_OUTPUT,NEAR ;System call 4 +ASSUME DS:NOTHING,ES:NOTHING + + PUSH BX + MOV BX,3 + JMP SHORT SENDOUT + +EndProc $STD_AUX_OUTPUT + +Break + +; Inputs: +; DL = Character +; Function: +; Output the character to the list device +; Returns: +; None + + procedure $STD_PRINTER_OUTPUT,NEAR ;System call 5 +ASSUME DS:NOTHING,ES:NOTHING + + PUSH BX + MOV BX,4 + +SENDOUT: + MOV AL,DL + PUSH AX + invoke STATCHK + POP AX + PUSH DS + PUSH SI +LISSTRT2: + invoke RAWOUT2 +TRIPOP: + POP SI + POP DS + POP BX + return +EndProc $STD_PRINTER_OUTPUT + +Break + +; Inputs: +; None +; Function: +; Check console input status +; Returns: +; AL = -1 character available, = 0 no character + + procedure $STD_CON_INPUT_STATUS,NEAR ;System call 11 +ASSUME DS:NOTHING,ES:NOTHING + + invoke STATCHK + MOV AL,0 ; no xor!! + retz + OR AL,-1 + return +EndProc $STD_CON_INPUT_STATUS + +Break + +; Inputs: +; AL = DOS function to be called after flush (1,6,7,8,10) +; Function: +; Flush console input buffer and perform call in AL +; Returns: +; Whatever call in AL returns or AL=0 if AL was not 1,6,7,8 or 10 + + procedure $STD_CON_INPUT_FLUSH,NEAR ;System call 12 +ASSUME DS:NOTHING,ES:NOTHING + + PUSH AX + PUSH DX + XOR BX,BX + invoke GET_IO_SFT + JC BADJFNCON + MOV AH,4 + invoke IOFUNC + +BADJFNCON: + POP DX + POP AX + MOV AH,AL + CMP AL,1 + JZ REDISPJ + CMP AL,6 + JZ REDISPJ + CMP AL,7 + JZ REDISPJ + CMP AL,8 + JZ REDISPJ + CMP AL,10 + JZ REDISPJ + MOV AL,0 + return + +REDISPJ: + IF DBCS ;AN000; + mov ds,[CurrentPDB] ;AN000; + ;AN000; set DS same as one from COMMAND entry + ENDIF + CLI + transfer REDISP +EndProc $STD_CON_INPUT_FLUSH + +CODE ENDS + END -- cgit v1.2.3