diff options
Diffstat (limited to '')
| -rw-r--r-- | v4.0/src/DOS/CPMIO2.ASM | 354 |
1 files changed, 354 insertions, 0 deletions
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 @@ | |||
| 1 | ; SCCSID = @(#)cpmio2.asm 1.1 85/04/11 | ||
| 2 | TITLE CPMIO2 - device IO for MSDOS | ||
| 3 | NAME CPMIO2 | ||
| 4 | |||
| 5 | .xlist | ||
| 6 | .xcref | ||
| 7 | include dosseg.asm | ||
| 8 | .cref | ||
| 9 | .list | ||
| 10 | |||
| 11 | ; | ||
| 12 | ; Old style CP/M 1-12 system calls to talk to reserved devices | ||
| 13 | ; | ||
| 14 | ; $Std_Con_Input | ||
| 15 | ; $Std_Con_Output | ||
| 16 | ; OUTT | ||
| 17 | ; TAB | ||
| 18 | ; BUFOUT | ||
| 19 | ; $Std_Aux_Input | ||
| 20 | ; $Std_Aux_Output | ||
| 21 | ; $Std_Printer_Output | ||
| 22 | ; $Std_Con_Input_Status | ||
| 23 | ; $Std_Con_Input_Flush | ||
| 24 | ; | ||
| 25 | ; Revision History: | ||
| 26 | ; | ||
| 27 | ; AN000 version 4.00 - Jan. 1988 | ||
| 28 | ; | ||
| 29 | |||
| 30 | CODE SEGMENT BYTE PUBLIC 'CODE' | ||
| 31 | ASSUME SS:DOSGROUP,CS:DOSGROUP | ||
| 32 | |||
| 33 | .xcref | ||
| 34 | .xlist | ||
| 35 | INCLUDE DOSSYM.INC | ||
| 36 | INCLUDE DEVSYM.INC | ||
| 37 | .list | ||
| 38 | .cref | ||
| 39 | |||
| 40 | ; The following routines form the console I/O group (funcs 1,2,6,7,8,9,10,11). | ||
| 41 | ; They assume ES and DS NOTHING, while not strictly correct, this forces data | ||
| 42 | ; references to be SS or CS relative which is desired. | ||
| 43 | |||
| 44 | i_need CARPOS,BYTE | ||
| 45 | i_need CHARCO,BYTE | ||
| 46 | i_need PFLAG,BYTE | ||
| 47 | i_need CurrentPDB,WORD ;AN000; | ||
| 48 | i_need InterCon,BYTE ;AN000; | ||
| 49 | i_need SaveCurFlg,BYTE ;AN000; | ||
| 50 | |||
| 51 | |||
| 52 | Break | ||
| 53 | |||
| 54 | ; Inputs: | ||
| 55 | ; None | ||
| 56 | ; Function: | ||
| 57 | ; Input character from console, echo | ||
| 58 | ; Returns: | ||
| 59 | ; AL = character | ||
| 60 | |||
| 61 | procedure $STD_CON_INPUT,NEAR ;System call 1 | ||
| 62 | ASSUME DS:NOTHING,ES:NOTHING | ||
| 63 | |||
| 64 | IF DBCS ;AN000; | ||
| 65 | push word ptr [InterCon] ;AN000; | ||
| 66 | mov [InterCon],01H ;AN000; | ||
| 67 | invoke INTER_CON_INPUT_NO_ECHO ;AN000; | ||
| 68 | pop word ptr [InterCon] ;AN000; | ||
| 69 | pushf ;AN000; | ||
| 70 | push AX ;AN000; | ||
| 71 | mov [SaveCurFlg],0 ;AN000; | ||
| 72 | jnz sj0 ;AN000; | ||
| 73 | mov [SaveCurFlg],1 ;AN000; | ||
| 74 | sj0: ;AN000; | ||
| 75 | invoke OUTT ;AN000; | ||
| 76 | mov [SaveCurFLg],0 ;AN000; | ||
| 77 | pop AX ;AN000; | ||
| 78 | popf ;AN000; | ||
| 79 | jz $STD_CON_INPUT ;AN000; | ||
| 80 | ELSE ;AN000; | ||
| 81 | invoke $STD_CON_INPUT_NO_ECHO | ||
| 82 | PUSH AX | ||
| 83 | invoke OUTT | ||
| 84 | POP AX | ||
| 85 | ENDIF ;AN000; | ||
| 86 | return | ||
| 87 | EndProc $STD_CON_INPUT | ||
| 88 | |||
| 89 | Break | ||
| 90 | |||
| 91 | ; Inputs: | ||
| 92 | ; DL = character | ||
| 93 | ; Function: | ||
| 94 | ; Output character to console | ||
| 95 | ; Returns: | ||
| 96 | ; None | ||
| 97 | |||
| 98 | procedure $STD_CON_OUTPUT,NEAR ;System call 2 | ||
| 99 | public OUTCHA ;AN000; | ||
| 100 | ASSUME DS:NOTHING,ES:NOTHING | ||
| 101 | |||
| 102 | MOV AL,DL | ||
| 103 | |||
| 104 | entry OUTT | ||
| 105 | CMP AL,20H | ||
| 106 | JB CTRLOUT | ||
| 107 | CMP AL,c_DEL | ||
| 108 | JZ OUTCH | ||
| 109 | OUTCHA: ;AN000; | ||
| 110 | INC BYTE PTR [CARPOS] | ||
| 111 | OUTCH: | ||
| 112 | PUSH DS | ||
| 113 | PUSH SI | ||
| 114 | INC BYTE PTR [CHARCO] ;invoke statchk... | ||
| 115 | AND BYTE PTR [CHARCO],00111111B ;AN000; every 64th char | ||
| 116 | JNZ OUTSKIP | ||
| 117 | PUSH AX | ||
| 118 | invoke STATCHK | ||
| 119 | POP AX | ||
| 120 | OUTSKIP: | ||
| 121 | invoke RAWOUT ;output the character | ||
| 122 | POP SI | ||
| 123 | POP DS | ||
| 124 | IF DBCS ;AN000; | ||
| 125 | TEST [SaveCurFlg],01H ;AN000;print but no cursor adv? 2/13/KK | ||
| 126 | retnz ;AN000;if so then do not send to prt2/13/KK | ||
| 127 | ENDIF | ||
| 128 | TEST BYTE PTR [PFLAG],-1 | ||
| 129 | retz | ||
| 130 | PUSH BX | ||
| 131 | PUSH DS | ||
| 132 | PUSH SI | ||
| 133 | MOV BX,1 | ||
| 134 | invoke GET_IO_SFT | ||
| 135 | JC TRIPOPJ | ||
| 136 | MOV BX,[SI.sf_flags] | ||
| 137 | TEST BX,sf_isnet ; output to NET? | ||
| 138 | JNZ TRIPOPJ ; if so, no echo | ||
| 139 | TEST BX,devid_device ; output to file? | ||
| 140 | JZ TRIPOPJ ; if so, no echo | ||
| 141 | MOV BX,4 | ||
| 142 | invoke GET_IO_SFT | ||
| 143 | JC TRIPOPJ | ||
| 144 | TEST [SI.sf_flags],sf_net_spool ; StdPrn redirected? | ||
| 145 | JZ LISSTRT2J ; No, OK to echo | ||
| 146 | MOV BYTE PTR [PFLAG],0 ; If a spool, NEVER echo | ||
| 147 | TRIPOPJ: | ||
| 148 | JMP TRIPOP | ||
| 149 | |||
| 150 | LISSTRT2J: | ||
| 151 | JMP LISSTRT2 | ||
| 152 | |||
| 153 | CTRLOUT: | ||
| 154 | CMP AL,c_CR | ||
| 155 | JZ ZERPOS | ||
| 156 | CMP AL,c_BS | ||
| 157 | JZ BACKPOS | ||
| 158 | CMP AL,c_HT | ||
| 159 | JNZ OUTCH | ||
| 160 | MOV AL,[CARPOS] | ||
| 161 | OR AL,0F8H | ||
| 162 | NEG AL | ||
| 163 | |||
| 164 | entry TAB | ||
| 165 | |||
| 166 | PUSH CX | ||
| 167 | MOV CL,AL | ||
| 168 | MOV CH,0 | ||
| 169 | JCXZ POPTAB | ||
| 170 | TABLP: | ||
| 171 | MOV AL," " | ||
| 172 | invoke OUTT | ||
| 173 | LOOP TABLP | ||
| 174 | POPTAB: | ||
| 175 | POP CX | ||
| 176 | return | ||
| 177 | |||
| 178 | ZERPOS: | ||
| 179 | MOV BYTE PTR [CARPOS],0 | ||
| 180 | JMP OUTCH | ||
| 181 | OUTJ: JMP OUTT | ||
| 182 | |||
| 183 | BACKPOS: | ||
| 184 | DEC BYTE PTR [CARPOS] | ||
| 185 | JMP OUTCH | ||
| 186 | |||
| 187 | entry BUFOUT | ||
| 188 | CMP AL," " | ||
| 189 | JAE OUTJ ;Normal char | ||
| 190 | CMP AL,9 | ||
| 191 | JZ OUTJ ;OUT knows how to expand tabs | ||
| 192 | |||
| 193 | ;DOS 3.3 7/14/86 | ||
| 194 | CMP AL,"U"-"@" ; turn ^U to section symbol | ||
| 195 | JZ CTRLU | ||
| 196 | CMP AL,"T"-"@" ; turn ^T to paragraph symbol | ||
| 197 | JZ CTRLU | ||
| 198 | NOT_CTRLU: | ||
| 199 | ;DOS 3.3 7/14/86 | ||
| 200 | |||
| 201 | PUSH AX | ||
| 202 | MOV AL,"^" | ||
| 203 | invoke OUTT ;Print '^' before control chars | ||
| 204 | POP AX | ||
| 205 | OR AL,40H ;Turn it into Upper case mate | ||
| 206 | CTRLU: | ||
| 207 | invoke OUTT | ||
| 208 | return | ||
| 209 | EndProc $STD_CON_OUTPUT | ||
| 210 | |||
| 211 | Break | ||
| 212 | |||
| 213 | ; Inputs: | ||
| 214 | ; None | ||
| 215 | ; Function: | ||
| 216 | ; Returns character from aux input | ||
| 217 | ; Returns: | ||
| 218 | ; Character in AL | ||
| 219 | |||
| 220 | procedure $STD_AUX_INPUT,NEAR ;System call 3 | ||
| 221 | ASSUME DS:NOTHING,ES:NOTHING | ||
| 222 | |||
| 223 | invoke STATCHK | ||
| 224 | MOV BX,3 | ||
| 225 | invoke GET_IO_SFT | ||
| 226 | retc | ||
| 227 | JMP SHORT TAISTRT | ||
| 228 | AUXILP: | ||
| 229 | invoke SPOOLINT | ||
| 230 | TAISTRT: | ||
| 231 | MOV AH,1 | ||
| 232 | invoke IOFUNC | ||
| 233 | JZ AUXILP | ||
| 234 | XOR AH,AH | ||
| 235 | invoke IOFUNC | ||
| 236 | return | ||
| 237 | EndProc $STD_AUX_INPUT | ||
| 238 | |||
| 239 | Break | ||
| 240 | |||
| 241 | ; Inputs: | ||
| 242 | ; Character in DL | ||
| 243 | ; Function: | ||
| 244 | ; Output character to aux output | ||
| 245 | ; Returns: | ||
| 246 | ; Nothing | ||
| 247 | |||
| 248 | procedure $STD_AUX_OUTPUT,NEAR ;System call 4 | ||
| 249 | ASSUME DS:NOTHING,ES:NOTHING | ||
| 250 | |||
| 251 | PUSH BX | ||
| 252 | MOV BX,3 | ||
| 253 | JMP SHORT SENDOUT | ||
| 254 | |||
| 255 | EndProc $STD_AUX_OUTPUT | ||
| 256 | |||
| 257 | Break | ||
| 258 | |||
| 259 | ; Inputs: | ||
| 260 | ; DL = Character | ||
| 261 | ; Function: | ||
| 262 | ; Output the character to the list device | ||
| 263 | ; Returns: | ||
| 264 | ; None | ||
| 265 | |||
| 266 | procedure $STD_PRINTER_OUTPUT,NEAR ;System call 5 | ||
| 267 | ASSUME DS:NOTHING,ES:NOTHING | ||
| 268 | |||
| 269 | PUSH BX | ||
| 270 | MOV BX,4 | ||
| 271 | |||
| 272 | SENDOUT: | ||
| 273 | MOV AL,DL | ||
| 274 | PUSH AX | ||
| 275 | invoke STATCHK | ||
| 276 | POP AX | ||
| 277 | PUSH DS | ||
| 278 | PUSH SI | ||
| 279 | LISSTRT2: | ||
| 280 | invoke RAWOUT2 | ||
| 281 | TRIPOP: | ||
| 282 | POP SI | ||
| 283 | POP DS | ||
| 284 | POP BX | ||
| 285 | return | ||
| 286 | EndProc $STD_PRINTER_OUTPUT | ||
| 287 | |||
| 288 | Break | ||
| 289 | |||
| 290 | ; Inputs: | ||
| 291 | ; None | ||
| 292 | ; Function: | ||
| 293 | ; Check console input status | ||
| 294 | ; Returns: | ||
| 295 | ; AL = -1 character available, = 0 no character | ||
| 296 | |||
| 297 | procedure $STD_CON_INPUT_STATUS,NEAR ;System call 11 | ||
| 298 | ASSUME DS:NOTHING,ES:NOTHING | ||
| 299 | |||
| 300 | invoke STATCHK | ||
| 301 | MOV AL,0 ; no xor!! | ||
| 302 | retz | ||
| 303 | OR AL,-1 | ||
| 304 | return | ||
| 305 | EndProc $STD_CON_INPUT_STATUS | ||
| 306 | |||
| 307 | Break | ||
| 308 | |||
| 309 | ; Inputs: | ||
| 310 | ; AL = DOS function to be called after flush (1,6,7,8,10) | ||
| 311 | ; Function: | ||
| 312 | ; Flush console input buffer and perform call in AL | ||
| 313 | ; Returns: | ||
| 314 | ; Whatever call in AL returns or AL=0 if AL was not 1,6,7,8 or 10 | ||
| 315 | |||
| 316 | procedure $STD_CON_INPUT_FLUSH,NEAR ;System call 12 | ||
| 317 | ASSUME DS:NOTHING,ES:NOTHING | ||
| 318 | |||
| 319 | PUSH AX | ||
| 320 | PUSH DX | ||
| 321 | XOR BX,BX | ||
| 322 | invoke GET_IO_SFT | ||
| 323 | JC BADJFNCON | ||
| 324 | MOV AH,4 | ||
| 325 | invoke IOFUNC | ||
| 326 | |||
| 327 | BADJFNCON: | ||
| 328 | POP DX | ||
| 329 | POP AX | ||
| 330 | MOV AH,AL | ||
| 331 | CMP AL,1 | ||
| 332 | JZ REDISPJ | ||
| 333 | CMP AL,6 | ||
| 334 | JZ REDISPJ | ||
| 335 | CMP AL,7 | ||
| 336 | JZ REDISPJ | ||
| 337 | CMP AL,8 | ||
| 338 | JZ REDISPJ | ||
| 339 | CMP AL,10 | ||
| 340 | JZ REDISPJ | ||
| 341 | MOV AL,0 | ||
| 342 | return | ||
| 343 | |||
| 344 | REDISPJ: | ||
| 345 | IF DBCS ;AN000; | ||
| 346 | mov ds,[CurrentPDB] ;AN000; | ||
| 347 | ;AN000; set DS same as one from COMMAND entry | ||
| 348 | ENDIF | ||
| 349 | CLI | ||
| 350 | transfer REDISP | ||
| 351 | EndProc $STD_CON_INPUT_FLUSH | ||
| 352 | |||
| 353 | CODE ENDS | ||
| 354 | END | ||