diff options
| author | 2024-04-25 21:24:10 +0100 | |
|---|---|---|
| committer | 2024-04-25 22:32:27 +0000 | |
| commit | 2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch) | |
| tree | 80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/CMD/DEBUG/DEBCOM2.ASM | |
| parent | Merge pull request #430 from jpbaltazar/typoptbr (diff) | |
| download | ms-dos-main.tar.gz ms-dos-main.tar.xz ms-dos-main.zip | |
Diffstat (limited to 'v4.0/src/CMD/DEBUG/DEBCOM2.ASM')
| -rw-r--r-- | v4.0/src/CMD/DEBUG/DEBCOM2.ASM | 1308 |
1 files changed, 1308 insertions, 0 deletions
diff --git a/v4.0/src/CMD/DEBUG/DEBCOM2.ASM b/v4.0/src/CMD/DEBUG/DEBCOM2.ASM new file mode 100644 index 0000000..b22795f --- /dev/null +++ b/v4.0/src/CMD/DEBUG/DEBCOM2.ASM | |||
| @@ -0,0 +1,1308 @@ | |||
| 1 | PAGE 60,132 ; | ||
| 2 | TITLE DEBCOM2.ASM - PART2 DEBUGGER COMMANDS PC DOS | ||
| 3 | ;======================= START OF SPECIFICATIONS ========================= | ||
| 4 | ; | ||
| 5 | ; MODULE NAME: DECOM2.SAL | ||
| 6 | ; | ||
| 7 | ; DESCRIPTIVE NAME: DEBUGGING TOOL | ||
| 8 | ; | ||
| 9 | ; FUNCTION: PROVIDES USERS WITH A TOOL FOR DEBUGGING PROGRAMS. | ||
| 10 | ; | ||
| 11 | ; ENTRY POINT: ANY CALLED ROUTINE | ||
| 12 | ; | ||
| 13 | ; INPUT: NA | ||
| 14 | ; | ||
| 15 | ; EXIT NORMAL: NA | ||
| 16 | ; | ||
| 17 | ; EXIT ERROR: NA | ||
| 18 | ; | ||
| 19 | ; INTERNAL REFERENCES: | ||
| 20 | ; | ||
| 21 | ; EXTERNAL REFERENCES: | ||
| 22 | ; | ||
| 23 | ; ROUTINE: DEBCOM1 - CONTAINS ROUTINES CALLED BY DEBUG | ||
| 24 | ; DEBCOM3 - CONTAINS ROUTINES CALLED BY DEBUG | ||
| 25 | ; DEBASM - CONTAINS ROUTINES CALLED BY DEBUG | ||
| 26 | ; DEBUASM - CONTAINS ROUTINES CALLED BY DEBUG | ||
| 27 | ; DEBMES - CONTAINS ROUTINES CALLED BY DEBUG | ||
| 28 | ; | ||
| 29 | ; NOTES: THIS MODULE IS TO BE PREPPED BY SALUT WITH THE "PR" OPTIONS. | ||
| 30 | ; LINK DEBUG+DEBCOM1+DEBCOM2+DEBCOM3+DEBASM+DEBUASM+DEBERR+ | ||
| 31 | ; DEBCONST+DEBDATA+DEBMES | ||
| 32 | ; | ||
| 33 | ; REVISION HISTORY: | ||
| 34 | ; | ||
| 35 | ; AN000 VERSION 4.00 - REVISIONS MADE RELATE TO THE FOLLOWING: | ||
| 36 | ; AC000 VERSION 4.00 - | ||
| 37 | ; | ||
| 38 | ; - IMPLEMENT DBCS HANDLING DMS:6/17/87 | ||
| 39 | ; - IMPLEMENT MESSAGE RETRIEVER DMS:6/17/87 | ||
| 40 | ; - IMPLEMENT > 32MB SUPPORT DMS:6/17/87 | ||
| 41 | ; | ||
| 42 | ; COPYRIGHT: "MS DOS DEBUG UTILITY" | ||
| 43 | ; "VERSION 4.00 (C) COPYRIGHT 1988 Microsoft" | ||
| 44 | ; "LICENSED MATERIAL - PROPERTY OF Microsoft " | ||
| 45 | ; | ||
| 46 | ;======================= END OF SPECIFICATIONS =========================== | ||
| 47 | |||
| 48 | ; Routines to perform debugger commands except ASSEMble and UASSEMble | ||
| 49 | |||
| 50 | IF1 | ||
| 51 | %OUT COMPONENT=DEBUG, MODULE=DEBCOM2 | ||
| 52 | ENDIF | ||
| 53 | .XLIST | ||
| 54 | .XCREF | ||
| 55 | INCLUDE DOSSYM.INC | ||
| 56 | INCLUDE DEBEQU.ASM | ||
| 57 | .CREF | ||
| 58 | .LIST | ||
| 59 | CODE SEGMENT PUBLIC BYTE | ||
| 60 | CODE ENDS | ||
| 61 | |||
| 62 | CONST SEGMENT PUBLIC BYTE | ||
| 63 | EXTRN NOTFND_PTR:BYTE,NOROOM_PTR:BYTE,DRVLET:BYTE,ERRMES_PTR:BYTE | ||
| 64 | EXTRN NAMBAD_PTR:BYTE,NOSPACE_PTR:BYTE,TOOBIG_PTR:BYTE | ||
| 65 | EXTRN HEXERR_PTR:BYTE,HEXWRT_PTR:BYTE,ACCMES_PTR:BYTE | ||
| 66 | EXTRN EXEBAD_PTR:BYTE,EXEWRT_PTR:BYTE | ||
| 67 | EXTRN EXECEMES_PTR:BYTE,NONAMESPEC_PTR:BYTE | ||
| 68 | |||
| 69 | EXTRN FLAGTAB:WORD,EXEC_BLOCK:BYTE,COM_LINE:DWORD,COM_FCB1:DWORD | ||
| 70 | EXTRN COM_FCB2:DWORD,COM_SSSP:DWORD,COM_CSIP:DWORD,RETSAVE:WORD | ||
| 71 | EXTRN NEWEXEC:BYTE,HEADSAVE:WORD | ||
| 72 | EXTRN REGTAB:BYTE,TOTREG:BYTE,NOREGL:BYTE | ||
| 73 | EXTRN USER_PROC_PDB:WORD,STACK:BYTE,RSTACK:WORD,AXSAVE:WORD | ||
| 74 | EXTRN BXSAVE:WORD,DSSAVE:WORD,ESSAVE:WORD,CSSAVE:WORD,IPSAVE:WORD | ||
| 75 | EXTRN SSSAVE:WORD,CXSAVE:WORD,SPSAVE:WORD,FLSAVE:WORD | ||
| 76 | EXTRN SREG:BYTE,SEGTAB:WORD,REGDIF:ABS,RDFLG:BYTE | ||
| 77 | EXTRN REGTABEND:WORD | ||
| 78 | EXTRN NAMESPEC:BYTE | ||
| 79 | CONST ENDS | ||
| 80 | |||
| 81 | CSTACK SEGMENT STACK | ||
| 82 | CSTACK ENDS | ||
| 83 | |||
| 84 | DATA SEGMENT PUBLIC BYTE | ||
| 85 | EXTRN DEFDUMP:BYTE,TRANSADD:DWORD,INDEX:WORD,BUFFER:BYTE | ||
| 86 | EXTRN ASMADD:BYTE,DISADD:BYTE,NSEG:WORD | ||
| 87 | EXTRN SWITCHAR:BYTE,XNXCMD:BYTE,XNXOPT:BYTE | ||
| 88 | EXTRN AWORD:BYTE,EXTPTR:WORD,HANDLE:WORD,PARSERR:BYTE | ||
| 89 | EXTRN REG_NAME:WORD,REG_CONTENTS:WORD,REGISTER_PTR:BYTE | ||
| 90 | EXTRN ARG_BUF:BYTE,ARG_BUF_PTR:BYTE,LOC_ADD:WORD,LOC_PTR:BYTE | ||
| 91 | EXTRN BIG_CONTENTS:WORD,BIG_PTR:BYTE,LITTLE_CONTENTS:WORD,LITTLE_PTR:BYTE | ||
| 92 | EXTRN SINGLE_REG_ARG:WORD,CHANGE_FLAG_PTR:BYTE,DF_ERROR:BYTE | ||
| 93 | EXTRN BR_ERROR:BYTE,BF_ERROR:BYTE,SINGLE_REG_PTR:WORD | ||
| 94 | EXTRN WRT_ARG1:WORD,WRT_ARG2:WORD,WRTMES_PTR:BYTE,BEGSEG:WORD | ||
| 95 | EXTRN FILESTRT:WORD,FILEEND:WORD | ||
| 96 | EXTRN ERR_TYPE:BYTE ;ac000;converted to buffer | ||
| 97 | |||
| 98 | extrn rel_read_write_tab:dword ;an000;primitive I/O | ||
| 99 | extrn rel_rw_add:dword ;an000;transfer address | ||
| 100 | extrn rel_low_sec:word ;an000;low sector word | ||
| 101 | extrn rel_high_sec:word ;an000;high sector word | ||
| 102 | extrn rel_sec_num:word ;an000;# of sectors | ||
| 103 | |||
| 104 | fnd_dbcs db 0 | ||
| 105 | DATA ENDS | ||
| 106 | |||
| 107 | DG GROUP CODE,CONST,CSTACK,DATA | ||
| 108 | |||
| 109 | CODE SEGMENT PUBLIC BYTE | ||
| 110 | ASSUME CS:DG,DS:DG,ES:DG,SS:DG | ||
| 111 | PUBLIC DEFIO,PREPNAME,DEBUG_FOUND | ||
| 112 | PUBLIC REG,LOAD | ||
| 113 | PUBLIC NAMED,DWRITE | ||
| 114 | PUBLIC DISPREG,ERR,DELIM1,DELIM2,delim0 | ||
| 115 | public getchrup,open1,open2,open3,open4,oc_file,opnret ;an001;bgb | ||
| 116 | public delete_a_file, parse_a_file, exec_a_file, open_a_file, create_a_file ;an001;bgb | ||
| 117 | public gcur,ifhex ;an001;bgb | ||
| 118 | public comtail ;an001;bgb | ||
| 119 | extrn test_lead:near ;an001;bgb | ||
| 120 | EXTRN OUTSI:NEAR,OUTDI:NEAR,INBUF:NEAR,SCANB:NEAR,SCANP:NEAR | ||
| 121 | EXTRN COMMAND:NEAR,DISASLN:NEAR,SET_TERMINATE_VECTOR:NEAR | ||
| 122 | EXTRN RESTART:NEAR,TERMINATE:NEAR,DRVERR:NEAR | ||
| 123 | EXTRN GETHEX:NEAR,GETEOL:NEAR,SKIP_FILE:NEAR | ||
| 124 | EXTRN HEXCHK:NEAR,GETHEX1:NEAR,PRINT:NEAR | ||
| 125 | EXTRN CRLF:NEAR,BLANK:NEAR | ||
| 126 | EXTRN HEX:NEAR,DIGIT:NEAR | ||
| 127 | EXTRN FIND_DEBUG:NEAR | ||
| 128 | EXTRN ADDRESS:NEAR,PERROR:NEAR | ||
| 129 | EXTRN STD_PRINTF:NEAR,PRINTF_CRLF:NEAR | ||
| 130 | DEBCOM2: | ||
| 131 | DISPLAY_LINE: | ||
| 132 | mov ax,word ptr [si] ;an000;move reg name to ax | ||
| 133 | MOV [REG_NAME],ax ;ac000;save it in reg_name | ||
| 134 | ADD SI,3 | ||
| 135 | MOV AX,[BX] | ||
| 136 | ADD BX,2 | ||
| 137 | MOV [REG_CONTENTS],AX | ||
| 138 | MOV DX,OFFSET DG:REGISTER_PTR | ||
| 139 | CALL STD_PRINTF | ||
| 140 | |||
| 141 | LOOP DISPLAY_LINE | ||
| 142 | |||
| 143 | RETURN | ||
| 144 | |||
| 145 | DISPLAY_FLAGS: | ||
| 146 | MOV DI,OFFSET DG:ARG_BUF | ||
| 147 | MOV AL,CHAR_BLANK | ||
| 148 | STOSB | ||
| 149 | DISPLAY_FLAGS_2: | ||
| 150 | MOV SI,OFFSET DG:FLAGTAB | ||
| 151 | MOV CX,16 | ||
| 152 | MOV DX,[FLSAVE] | ||
| 153 | DFLAGS: | ||
| 154 | LODS CS:WORD PTR [SI] | ||
| 155 | SHL DX,1 | ||
| 156 | JC FLAGSET | ||
| 157 | |||
| 158 | MOV AX,CS:[SI+30] | ||
| 159 | FLAGSET: | ||
| 160 | OR AX,AX | ||
| 161 | JZ NEXT_FLAG | ||
| 162 | |||
| 163 | STOSW | ||
| 164 | MOV AL,CHAR_BLANK | ||
| 165 | STOSB | ||
| 166 | NEXT_FLAG: | ||
| 167 | LOOP DFLAGS | ||
| 168 | XOR AL,AL | ||
| 169 | STOSB | ||
| 170 | RETURN | ||
| 171 | |||
| 172 | DISPREG: | ||
| 173 | MOV SI,OFFSET DG:REGTAB | ||
| 174 | MOV DI,OFFSET DG:ARG_BUF | ||
| 175 | MOV BX,OFFSET DG:AXSAVE | ||
| 176 | MOV BYTE PTR TOTREG,CR | ||
| 177 | MOV CH,0 | ||
| 178 | MOV CL,NOREGL | ||
| 179 | SET_DISPLAY: | ||
| 180 | REPEAT_DISPLAY: | ||
| 181 | SUB TOTREG,CL | ||
| 182 | CALL DISPLAY_LINE | ||
| 183 | |||
| 184 | CALL CRLF | ||
| 185 | |||
| 186 | XOR CH,CH | ||
| 187 | MOV CL,NOREGL | ||
| 188 | CMP CL,TOTREG | ||
| 189 | JB REPEAT_DISPLAY | ||
| 190 | |||
| 191 | MOV CL,TOTREG | ||
| 192 | CALL DISPLAY_LINE | ||
| 193 | |||
| 194 | CALL DISPLAY_FLAGS | ||
| 195 | |||
| 196 | MOV DX,OFFSET DG:ARG_BUF_PTR | ||
| 197 | CALL PRINTF_CRLF | ||
| 198 | |||
| 199 | MOV AX,[IPSAVE] | ||
| 200 | MOV WORD PTR [DISADD],AX | ||
| 201 | PUSH AX | ||
| 202 | MOV AX,[CSSAVE] | ||
| 203 | MOV WORD PTR [DISADD+WORD],AX | ||
| 204 | PUSH AX | ||
| 205 | MOV [NSEG],-1 | ||
| 206 | CALL DISASLN | ||
| 207 | |||
| 208 | POP WORD PTR DISADD+WORD | ||
| 209 | POP WORD PTR DISADD | ||
| 210 | MOV AX,[NSEG] | ||
| 211 | CMP AL,-1 | ||
| 212 | JNZ ASSEM_LIN_CONT | ||
| 213 | |||
| 214 | JMP CRLF | ||
| 215 | |||
| 216 | ASSEM_LIN_CONT: | ||
| 217 | CMP AH,-1 | ||
| 218 | JZ NOOVER | ||
| 219 | |||
| 220 | XCHG AL,AH | ||
| 221 | NOOVER: | ||
| 222 | CBW | ||
| 223 | MOV BX,AX | ||
| 224 | SHL BX,1 | ||
| 225 | MOV AX,WORD PTR [BX+SREG] | ||
| 226 | MOV DI,OFFSET DG:ARG_BUF | ||
| 227 | STOSB | ||
| 228 | XCHG AL,AH | ||
| 229 | STOSB | ||
| 230 | XOR AL,AL | ||
| 231 | STOSB | ||
| 232 | MOV DX,[INDEX] | ||
| 233 | MOV LOC_ADD,DX | ||
| 234 | MOV DX,OFFSET DG:LOC_PTR | ||
| 235 | CALL STD_PRINTF | ||
| 236 | |||
| 237 | MOV BX,[BX+SEGTAB] | ||
| 238 | PUSH DS | ||
| 239 | MOV DS,[BX] | ||
| 240 | MOV BX,CS:[INDEX] | ||
| 241 | MOV BX,[BX] | ||
| 242 | POP DS | ||
| 243 | MOV BIG_CONTENTS,BX | ||
| 244 | MOV DX,OFFSET DG:BIG_PTR | ||
| 245 | TEST BYTE PTR [AWORD],-1 | ||
| 246 | JNZ SHOW_CHARS | ||
| 247 | |||
| 248 | XOR BH,BH | ||
| 249 | MOV LITTLE_CONTENTS,BX | ||
| 250 | MOV DX,OFFSET DG:LITTLE_PTR | ||
| 251 | SHOW_CHARS: | ||
| 252 | CALL PRINTF_CRLF | ||
| 253 | |||
| 254 | RETURN | ||
| 255 | |||
| 256 | DISPREGJ: | ||
| 257 | JMP DISPREG | ||
| 258 | |||
| 259 | ; Perform register dump if no parameters or set register if a | ||
| 260 | ; register designation is a parameter. | ||
| 261 | REG: | ||
| 262 | CALL SCANP | ||
| 263 | |||
| 264 | JZ DISPREGJ | ||
| 265 | |||
| 266 | MOV DL,[SI] | ||
| 267 | INC SI | ||
| 268 | MOV DH,[SI] | ||
| 269 | CMP DH,CR | ||
| 270 | JZ FLAG | ||
| 271 | |||
| 272 | INC SI | ||
| 273 | CALL GETEOL | ||
| 274 | |||
| 275 | CMP DH,CHAR_BLANK | ||
| 276 | JZ FLAG | ||
| 277 | |||
| 278 | MOV DI,OFFSET DG:REGTAB | ||
| 279 | XCHG AX,DX | ||
| 280 | PUSH CS | ||
| 281 | POP ES | ||
| 282 | XOR CX,CX | ||
| 283 | CHECK_NEXT_REG: | ||
| 284 | CMP AX,WORD PTR[ DI] | ||
| 285 | JZ REG_FOUND | ||
| 286 | |||
| 287 | ADD DI,3 | ||
| 288 | INC CX | ||
| 289 | CMP DI,OFFSET DG:REGTABEND | ||
| 290 | JB CHECK_NEXT_REG | ||
| 291 | |||
| 292 | JMP BADREG | ||
| 293 | |||
| 294 | REG_FOUND: | ||
| 295 | CMP DI,OFFSET DG:REGTABEND | ||
| 296 | JNZ NOTPC | ||
| 297 | |||
| 298 | DEC DI | ||
| 299 | DEC DI | ||
| 300 | DEC DI | ||
| 301 | MOV AX,CS:[DI-WORD] | ||
| 302 | NOTPC: | ||
| 303 | PUSH DI | ||
| 304 | MOV DI,OFFSET DG:ARG_BUF | ||
| 305 | STOSB | ||
| 306 | XCHG AL,AH | ||
| 307 | STOSB | ||
| 308 | XOR AL,AL | ||
| 309 | STOSB | ||
| 310 | POP DI | ||
| 311 | PUSH DS | ||
| 312 | POP ES | ||
| 313 | LEA BX,[DI+REGDIF] | ||
| 314 | SUB BX,CX | ||
| 315 | MOV DX,[BX] | ||
| 316 | MOV SINGLE_REG_ARG,DX | ||
| 317 | MOV DX,OFFSET DG:SINGLE_REG_PTR | ||
| 318 | CALL STD_PRINTF | ||
| 319 | |||
| 320 | CALL INBUF | ||
| 321 | |||
| 322 | CALL SCANB | ||
| 323 | |||
| 324 | RETZ | ||
| 325 | |||
| 326 | push bx ;an000;save bx - we stomp it | ||
| 327 | MOV CX,4 | ||
| 328 | CALL GETHEX1 | ||
| 329 | pop bx ;an000;restore it | ||
| 330 | |||
| 331 | CALL GETEOL | ||
| 332 | |||
| 333 | MOV [BX],DX | ||
| 334 | RETURN | ||
| 335 | BADREG: | ||
| 336 | MOV DX,OFFSET DG:BR_ERROR ; BR ERROR | ||
| 337 | JMP ERR | ||
| 338 | |||
| 339 | FLAG: | ||
| 340 | CMP DL,UPPER_F | ||
| 341 | JNZ BADREG | ||
| 342 | |||
| 343 | MOV DI,OFFSET DG:ARG_BUF | ||
| 344 | CALL DISPLAY_FLAGS_2 | ||
| 345 | |||
| 346 | MOV DX,OFFSET DG:CHANGE_FLAG_PTR | ||
| 347 | CALL STD_PRINTF | ||
| 348 | |||
| 349 | CALL INBUF | ||
| 350 | |||
| 351 | CALL SCANB | ||
| 352 | |||
| 353 | XOR BX,BX | ||
| 354 | MOV DX,[FLSAVE] | ||
| 355 | GETFLG: | ||
| 356 | LODSW | ||
| 357 | CMP AL,CR | ||
| 358 | JZ SAVCHG | ||
| 359 | |||
| 360 | CMP AH,CR | ||
| 361 | JZ FLGERR | ||
| 362 | |||
| 363 | MOV DI,OFFSET DG:FLAGTAB | ||
| 364 | MOV CX,32 | ||
| 365 | PUSH CS | ||
| 366 | POP ES | ||
| 367 | REPNE SCASW | ||
| 368 | JNZ FLGERR | ||
| 369 | |||
| 370 | MOV CH,CL | ||
| 371 | AND CL,0FH | ||
| 372 | MOV AX,1 | ||
| 373 | ROL AX,CL | ||
| 374 | TEST AX,BX | ||
| 375 | JNZ REPFLG | ||
| 376 | |||
| 377 | OR BX,AX | ||
| 378 | OR DX,AX | ||
| 379 | TEST CH,16 | ||
| 380 | JNZ NEXFLG | ||
| 381 | |||
| 382 | XOR DX,AX | ||
| 383 | NEXFLG: | ||
| 384 | CALL SCANP | ||
| 385 | |||
| 386 | JMP SHORT GETFLG | ||
| 387 | |||
| 388 | REPFLG: | ||
| 389 | MOV DX,OFFSET DG:DF_ERROR ; DF ERROR | ||
| 390 | FERR: | ||
| 391 | CALL SAVCHG | ||
| 392 | ERR: | ||
| 393 | push si ;an000;save affected registers | ||
| 394 | push di ;an000; | ||
| 395 | push cx ;an000; | ||
| 396 | mov cx,03h ;an000;move only three bytes | ||
| 397 | mov di,offset dg:err_type ;an000;point to buffer | ||
| 398 | mov si,dx ;an000;dx holds the string | ||
| 399 | rep movsb ;an000;fill up the buffer | ||
| 400 | pop cx ;an000;restore registers | ||
| 401 | pop di ;an000; | ||
| 402 | pop si ;an000; | ||
| 403 | MOV DX,OFFSET DG:ERRMES_PTR | ||
| 404 | JMP PRINT | ||
| 405 | |||
| 406 | SAVCHG: | ||
| 407 | MOV [FLSAVE],DX | ||
| 408 | RETURN | ||
| 409 | |||
| 410 | FLGERR: | ||
| 411 | MOV DX,OFFSET DG:BF_ERROR ; BF ERROR | ||
| 412 | JMP SHORT FERR | ||
| 413 | |||
| 414 | PREPNAME: | ||
| 415 | MOV ES,DSSAVE | ||
| 416 | PUSH SI | ||
| 417 | MOV DI,81H | ||
| 418 | COMTAIL: | ||
| 419 | LODSB | ||
| 420 | STOSB | ||
| 421 | CMP AL,CR | ||
| 422 | JNZ COMTAIL | ||
| 423 | |||
| 424 | SUB DI,82H | ||
| 425 | XCHG AX,DI | ||
| 426 | MOV ES:(BYTE PTR [80H]),AL | ||
| 427 | POP SI | ||
| 428 | MOV DI,FCB ;05cH | ||
| 429 | MOV AX,(PARSE_FILE_DESCRIPTOR SHL 8) OR SET_DRIVEID_OPTION ;AL=01H | ||
| 430 | INT 21H | ||
| 431 | |||
| 432 | MOV BYTE PTR [AXSAVE],AL ; Indicate analysis of first parm | ||
| 433 | CALL SKIP_FILE | ||
| 434 | |||
| 435 | MOV DI,6CH | ||
| 436 | MOV AX,(PARSE_FILE_DESCRIPTOR SHL 8) OR SET_DRIVEID_OPTION ;AL=01H | ||
| 437 | INT 21H | ||
| 438 | |||
| 439 | MOV BYTE PTR [AXSAVE+1],AL ; Indicate analysis of second parm | ||
| 440 | RETURN | ||
| 441 | |||
| 442 | ; OPENS A XENIX PATHNAME SPECIFIED IN THE UNFORMATTED PARAMETERS | ||
| 443 | ; VARIABLE [XNXCMD] SPECIFIES WHICH COMMAND TO OPEN IT WITH | ||
| 444 | |||
| 445 | ; VARIABLE [HANDLE] CONTAINS THE HANDLE | ||
| 446 | ; VARIABLE [EXTPTR] POINTS TO THE FILES EXTENSION | ||
| 447 | DELETE_A_FILE: | ||
| 448 | MOV BYTE PTR [XNXCMD],UNLINK | ||
| 449 | JMP SHORT OC_FILE | ||
| 450 | |||
| 451 | PARSE_A_FILE: | ||
| 452 | MOV BYTE PTR [XNXCMD],0 | ||
| 453 | JMP SHORT OC_FILE | ||
| 454 | |||
| 455 | EXEC_A_FILE: | ||
| 456 | MOV BYTE PTR CS:[XNXCMD],EXEC | ||
| 457 | MOV BYTE PTR CS:[XNXOPT],1 | ||
| 458 | JMP SHORT OC_FILE | ||
| 459 | |||
| 460 | OPEN_A_FILE: | ||
| 461 | MOV BYTE PTR [XNXCMD],OPEN | ||
| 462 | MOV BYTE PTR [XNXOPT],2 ; Try read write | ||
| 463 | CALL OC_FILE | ||
| 464 | |||
| 465 | RETNC | ||
| 466 | MOV BYTE PTR [XNXCMD],OPEN | ||
| 467 | MOV BYTE PTR [XNXOPT],0 ; Try read only | ||
| 468 | JMP SHORT OC_FILE | ||
| 469 | |||
| 470 | CREATE_A_FILE: | ||
| 471 | MOV BYTE PTR [XNXCMD],CREAT | ||
| 472 | OC_FILE: | ||
| 473 | PUSH DS | ||
| 474 | PUSH ES | ||
| 475 | PUSH AX | ||
| 476 | PUSH BX | ||
| 477 | PUSH CX | ||
| 478 | PUSH DX | ||
| 479 | PUSH SI | ||
| 480 | XOR AX,AX | ||
| 481 | MOV CS:[EXTPTR],AX ; INITIALIZE POINTER TO EXTENSIONS | ||
| 482 | MOV AH,CHAR_OPER | ||
| 483 | INT 21H | ||
| 484 | |||
| 485 | MOV CS:[SWITCHAR],DL ; GET THE CURRENT SWITCH CHARACTER | ||
| 486 | MOV SI,81H | ||
| 487 | |||
| 488 | open1: CALL GETCHRUP ;convert 1 byte to uppercase | ||
| 489 | CALL DELIM2 ; END OF LINE? | ||
| 490 | JZ OPEN4 | ||
| 491 | |||
| 492 | CALL DELIM1 ; SKIP LEADING DELIMITERS | ||
| 493 | JZ OPEN1 | ||
| 494 | |||
| 495 | MOV DX,SI ; SAVE POINTER TO BEGINNING | ||
| 496 | cmp fnd_dbcs,1 | ||
| 497 | ; $if z | ||
| 498 | JNZ $$IF1 | ||
| 499 | dec dx ;dec it twice if dbcs | ||
| 500 | ; $endif | ||
| 501 | $$IF1: | ||
| 502 | DEC DX | ||
| 503 | open2: CMP AL,CHAR_PERIOD ; LAST CHAR A "."? | ||
| 504 | JNZ OPEN3 | ||
| 505 | |||
| 506 | MOV CS:[EXTPTR],SI ; SAVE POINTER TO THE EXTENSION | ||
| 507 | OPEN3: | ||
| 508 | CALL GETCHRUP | ||
| 509 | |||
| 510 | CALL DELIM1 ; LOOK FOR END OF PATHNAME | ||
| 511 | |||
| 512 | JZ OPEN4 | ||
| 513 | |||
| 514 | CALL DELIM2 | ||
| 515 | |||
| 516 | JNZ OPEN2 | ||
| 517 | |||
| 518 | OPEN4: DEC SI ; POINT BACK TO LAST CHAR | ||
| 519 | PUSH [SI] ; SAVE TERMINATION CHAR | ||
| 520 | MOV BYTE PTR [SI],0 ; NULL TERMINATE THE STRING | ||
| 521 | MOV AL,CS:[XNXOPT] | ||
| 522 | MOV AH,CS:[XNXCMD] ; OPEN OR CREATE FILE | ||
| 523 | OR AH,AH | ||
| 524 | JZ OPNRET | ||
| 525 | |||
| 526 | MOV CS:[FILESTRT],DX ; Set values for later call on this file | ||
| 527 | MOV CS:[FILEEND],SI | ||
| 528 | PUSH CS | ||
| 529 | POP ES ; Set ES seg for EXEC_BLOCK | ||
| 530 | MOV BX,OFFSET DG:EXEC_BLOCK | ||
| 531 | XOR CX,CX | ||
| 532 | INT 21H | ||
| 533 | |||
| 534 | MOV CS:[HANDLE],AX ; SAVE ERROR CODE OR HANDLE | ||
| 535 | OPNRET: | ||
| 536 | POP [SI] | ||
| 537 | POP SI | ||
| 538 | POP DX | ||
| 539 | POP CX | ||
| 540 | POP BX | ||
| 541 | POP AX ; blow away error code... | ||
| 542 | POP ES | ||
| 543 | POP DS | ||
| 544 | RETURN | ||
| 545 | |||
| 546 | GETCHRUP: ;an001;bgb | ||
| 547 | lodsb ;get the character from [si] ;an001;bgb | ||
| 548 | call test_lead ;is it a dbcs lead byte? ;an001;bgb | ||
| 549 | ; $IF C ;yes ;an001;bgb | ||
| 550 | JNC $$IF3 | ||
| 551 | inc si ;bump ptr to past 2nd dbcs byte ;an001;bgb | ||
| 552 | mov fnd_dbcs,1 ;found a dbcs char | ||
| 553 | jmp gcur ;dont capitalize it ;an001;bgb | ||
| 554 | ; $ENDIF ;an001;bgb | ||
| 555 | $$IF3: | ||
| 556 | ; ;an001;bgb | ||
| 557 | mov fnd_dbcs,0 ;did not find a dbcs char | ||
| 558 | cmp al,lower_a ;is it >= "a" ? ;an001;bgb | ||
| 559 | jb gcur ;no - exit ;an001;bgb | ||
| 560 | ;an001;bgb | ||
| 561 | cmp al,lower_z ;is it =< "z" ? ;an001;bgb | ||
| 562 | ja gcur ;no - exit ;an001;bgb | ||
| 563 | ;an001;bgb | ||
| 564 | ;if we get here, the char is lowercase, so change it ;an001;bgb | ||
| 565 | sub al,32 ;convert to uppercase ;an001;bgb | ||
| 566 | mov [si-1],al ;move it back (si points 1 past) ;an001;bgb | ||
| 567 | gcur: return ;an001;bgb | ||
| 568 | |||
| 569 | DELIM0: | ||
| 570 | CMP AL,CHAR_LEFT_BRACKET | ||
| 571 | RETZ | ||
| 572 | DELIM1: | ||
| 573 | CMP AL,CHAR_BLANK ; SKIP THESE GUYS | ||
| 574 | RETZ | ||
| 575 | |||
| 576 | CMP AL,CHAR_SEMICOLON | ||
| 577 | RETZ | ||
| 578 | |||
| 579 | CMP AL,CHAR_EQUAL | ||
| 580 | RETZ | ||
| 581 | |||
| 582 | CMP AL,CHAR_TAB | ||
| 583 | RETZ | ||
| 584 | |||
| 585 | CMP AL,CHAR_COMMA | ||
| 586 | RETURN | ||
| 587 | |||
| 588 | DELIM2: | ||
| 589 | CMP AL,CS:[SWITCHAR] ; STOP ON THESE GUYS | ||
| 590 | RETZ | ||
| 591 | |||
| 592 | CMP AL,CR | ||
| 593 | RETURN | ||
| 594 | |||
| 595 | NAMED: | ||
| 596 | OR [NAMESPEC],1 ; Flag a name command executed | ||
| 597 | CALL PREPNAME | ||
| 598 | |||
| 599 | MOV AL,BYTE PTR AXSAVE | ||
| 600 | MOV PARSERR,AL | ||
| 601 | PUSH ES | ||
| 602 | POP DS | ||
| 603 | PUSH CS | ||
| 604 | POP ES | ||
| 605 | MOV SI,FCB ; DS:SI points to user FCB | ||
| 606 | MOV DI,SI ; ES:DI points to DEBUG FCB | ||
| 607 | MOV CX,82 | ||
| 608 | REP MOVSW | ||
| 609 | RETURN | ||
| 610 | |||
| 611 | BADNAM: | ||
| 612 | MOV DX,OFFSET DG:NAMBAD_PTR | ||
| 613 | JMP RESTART | ||
| 614 | |||
| 615 | IFHEX: | ||
| 616 | CMP BYTE PTR [PARSERR],-1 ; Invalid drive specification? | ||
| 617 | JZ BADNAM | ||
| 618 | |||
| 619 | CALL PARSE_A_FILE | ||
| 620 | |||
| 621 | MOV BX,[EXTPTR] | ||
| 622 | CMP WORD PTR DS:[BX],"EH" ; "HE" | ||
| 623 | RETNZ | ||
| 624 | |||
| 625 | CMP BYTE PTR DS:[BX+WORD],UPPER_X | ||
| 626 | RETURN | ||
| 627 | |||
| 628 | IFEXE: | ||
| 629 | PUSH BX | ||
| 630 | MOV BX,[EXTPTR] | ||
| 631 | CMP WORD PTR DS:[BX],"XE" ; "EX" | ||
| 632 | JNZ RETIF | ||
| 633 | |||
| 634 | CMP BYTE PTR DS:[BX+WORD],UPPER_E | ||
| 635 | RETIF: | ||
| 636 | POP BX | ||
| 637 | RETURN | ||
| 638 | |||
| 639 | LOAD: | ||
| 640 | MOV BYTE PTR [RDFLG],READ | ||
| 641 | JMP SHORT DSKIO | ||
| 642 | |||
| 643 | DWRITE: | ||
| 644 | MOV BYTE PTR [RDFLG],WRITE | ||
| 645 | DSKIO: | ||
| 646 | MOV BP,[CSSAVE] | ||
| 647 | CALL SCANB | ||
| 648 | |||
| 649 | JNZ PRIMIO | ||
| 650 | |||
| 651 | JMP DEFIO | ||
| 652 | |||
| 653 | PRIMIO: | ||
| 654 | CALL ADDRESS | ||
| 655 | |||
| 656 | CALL SCANB | ||
| 657 | |||
| 658 | JNZ PRMIO | ||
| 659 | |||
| 660 | JMP FILEIO | ||
| 661 | |||
| 662 | ;========================================================================= | ||
| 663 | ; PRMIO: This routine builds the necessary table for the new | ||
| 664 | ; generic IOCtl primitive read/write logical sector function. | ||
| 665 | ; | ||
| 666 | ; Inputs : Binary addresses and values converted by GETHEX | ||
| 667 | ; | ||
| 668 | ; Outputs: REL_READ_WRITE_TAB - Table needed by IOCtl function to | ||
| 669 | ; perform 32 bit sector addressing. | ||
| 670 | ; | ||
| 671 | ; Date : 6/17/87 | ||
| 672 | ;========================================================================= | ||
| 673 | |||
| 674 | PRMIO: | ||
| 675 | mov word ptr dg:[rel_rw_add],dx ;ac000;save transfer address | ||
| 676 | ; in table | ||
| 677 | mov word ptr dg:[rel_rw_add+2],ax ;ac000;save segment of transfer | ||
| 678 | ; address | ||
| 679 | MOV CX,2 | ||
| 680 | CALL GETHEX ; Drive number must be 2 digits or less | ||
| 681 | |||
| 682 | PUSH DX ;save drive number | ||
| 683 | MOV CX,8 ;ac000;allow 32 bit addressibilty | ||
| 684 | CALL GETHEX ; Logical record number | ||
| 685 | mov word ptr dg:[rel_low_sec],dx ;ac000;save low word of logical | ||
| 686 | ; sector address | ||
| 687 | mov word ptr dg:[rel_high_sec],bx ;ac000;save high word of | ||
| 688 | ; logical sector address | ||
| 689 | |||
| 690 | MOV CX,3 | ||
| 691 | CALL GETHEX ; Number of records | ||
| 692 | mov word ptr dg:[rel_sec_num],dx ;ac000;save number of sectors | ||
| 693 | ; to read/write | ||
| 694 | |||
| 695 | CALL GETEOL | ||
| 696 | |||
| 697 | POP BX ;ac000;drive number | ||
| 698 | CBW ; Turn off verify after write | ||
| 699 | MOV BYTE PTR DRVLET,bl ;ac000;save drive in case of error | ||
| 700 | PUSH BX | ||
| 701 | MOV DL,bL ;ac000;move drive to dl | ||
| 702 | ; Clean off the buffer cache for physical I/O | ||
| 703 | push ds | ||
| 704 | MOV AH,DISK_RESET | ||
| 705 | INT 21H | ||
| 706 | |||
| 707 | INC DL | ||
| 708 | MOV AH,GET_DPB | ||
| 709 | INT 21H | ||
| 710 | pop ds | ||
| 711 | |||
| 712 | or al,al ;ac000;see if an error occurred | ||
| 713 | pop ax ;ac000;restore drive | ||
| 714 | |||
| 715 | JNZ DRVERRJ | ||
| 716 | |||
| 717 | CMP CS:BYTE PTR [RDFLG],WRITE | ||
| 718 | ; $if z ;an000;we will write to sector(s) | ||
| 719 | JNZ $$IF5 | ||
| 720 | call ABSWRT ;an000;logical sector write | ||
| 721 | ; $else ;an000; | ||
| 722 | JMP SHORT $$EN5 | ||
| 723 | $$IF5: | ||
| 724 | call ABSREAD ;an000;we will read sector(s) | ||
| 725 | ; $endif ;an000; | ||
| 726 | $$EN5: | ||
| 727 | |||
| 728 | |||
| 729 | ENDABS: | ||
| 730 | JNC RET0 | ||
| 731 | |||
| 732 | DRVERRJ: | ||
| 733 | JMP DRVERR | ||
| 734 | |||
| 735 | RET0: | ||
| 736 | ; Clean cache again... | ||
| 737 | MOV AH,DISK_RESET | ||
| 738 | INT 21H | ||
| 739 | |||
| 740 | RETURN | ||
| 741 | |||
| 742 | |||
| 743 | ;called from debug.sal | ||
| 744 | DEFIO: | ||
| 745 | MOV AX,[CSSAVE] ; Default segment | ||
| 746 | MOV DX,100H ; Default file I/O offset | ||
| 747 | CALL IFHEX | ||
| 748 | JNZ EXECHK | ||
| 749 | XOR DX,DX ; If HEX file, default OFFSET is zero | ||
| 750 | HEX2BINJ: | ||
| 751 | JMP HEX2BIN | ||
| 752 | |||
| 753 | FILEIO: | ||
| 754 | ; AX and DX have segment and offset of transfer, respectively | ||
| 755 | CALL IFHEX | ||
| 756 | JZ HEX2BINJ | ||
| 757 | |||
| 758 | EXECHK: | ||
| 759 | CALL IFEXE | ||
| 760 | JNZ BINFIL | ||
| 761 | CMP BYTE PTR [RDFLG],READ | ||
| 762 | JZ EXELJ | ||
| 763 | MOV DX,OFFSET DG:EXEWRT_PTR | ||
| 764 | JMP RESTART ; Can't write .EXE files | ||
| 765 | |||
| 766 | BINFIL: | ||
| 767 | CMP BYTE PTR [RDFLG],WRITE | ||
| 768 | JZ BINLOAD | ||
| 769 | CMP WORD PTR DS:[BX],4F00H + UPPER_C ;"CO" | ||
| 770 | JNZ BINLOAD | ||
| 771 | CMP BYTE PTR DS:[BX+WORD],UPPER_M | ||
| 772 | JNZ BINLOAD | ||
| 773 | |||
| 774 | EXELJ: | ||
| 775 | DEC SI | ||
| 776 | CMP DX,100H | ||
| 777 | JNZ PRER | ||
| 778 | |||
| 779 | CMP AX,[CSSAVE] | ||
| 780 | JZ OAF | ||
| 781 | |||
| 782 | PRER: | ||
| 783 | JMP PERROR | ||
| 784 | |||
| 785 | OAF: | ||
| 786 | CALL OPEN_A_FILE | ||
| 787 | |||
| 788 | JNC GDOPEN | ||
| 789 | |||
| 790 | MOV AX,ERROR_FILE_NOT_FOUND | ||
| 791 | JMP EXECERR | ||
| 792 | |||
| 793 | GDOPEN: | ||
| 794 | XOR DX,DX | ||
| 795 | XOR CX,CX | ||
| 796 | MOV BX,[HANDLE] | ||
| 797 | MOV AL,2 | ||
| 798 | MOV AH,LSEEK | ||
| 799 | INT 21H | ||
| 800 | |||
| 801 | CALL IFEXE ; SUBTRACT 512 BYTES FOR EXE | ||
| 802 | |||
| 803 | JNZ BIN2 ; FILE LENGTH BECAUSE OF | ||
| 804 | |||
| 805 | SUB AX,512 ; THE HEADER | ||
| 806 | BIN2: | ||
| 807 | MOV [BXSAVE],DX ; SET UP FILE SIZE IN DX:AX | ||
| 808 | MOV [CXSAVE],AX | ||
| 809 | MOV AH,CLOSE | ||
| 810 | INT 21H | ||
| 811 | |||
| 812 | JMP EXELOAD | ||
| 813 | |||
| 814 | NO_MEM_ERR: | ||
| 815 | MOV DX,OFFSET DG:TOOBIG_PTR | ||
| 816 | CALL PRINTF_CRLF | ||
| 817 | |||
| 818 | JMP COMMAND | ||
| 819 | |||
| 820 | WRTFILEJ: | ||
| 821 | JMP WRTFILE | ||
| 822 | NOFILEJ: | ||
| 823 | JMP NOFILE | ||
| 824 | |||
| 825 | BINLOAD: | ||
| 826 | PUSH AX | ||
| 827 | PUSH DX | ||
| 828 | CMP BYTE PTR [RDFLG],WRITE | ||
| 829 | JZ WRTFILEJ | ||
| 830 | |||
| 831 | CALL OPEN_A_FILE | ||
| 832 | |||
| 833 | JC NOFILEJ | ||
| 834 | |||
| 835 | MOV BX,[HANDLE] | ||
| 836 | MOV AX,(LSEEK SHL 8) OR LSEEK_EOF_OPTION | ||
| 837 | XOR DX,DX ;CX:DX=DISTANCE (OFFSET) TO MOVE IN BYTES | ||
| 838 | MOV CX,DX | ||
| 839 | INT 21H ; GET SIZE OF FILE | ||
| 840 | |||
| 841 | MOV SI,DX | ||
| 842 | MOV DI,AX ; SIZE TO SI:DI | ||
| 843 | MOV AX,(LSEEK SHL 8) OR LSEEK_FROM_START | ||
| 844 | XOR DX,DX | ||
| 845 | MOV CX,DX | ||
| 846 | INT 21H ; RESET POINTER BACK TO BEGINNING | ||
| 847 | |||
| 848 | POP AX | ||
| 849 | POP BX | ||
| 850 | PUSH BX | ||
| 851 | PUSH AX ; TRANS ADDR TO BX:AX | ||
| 852 | ADD AX,15 | ||
| 853 | RCR AX,1 | ||
| 854 | MOV CL,3 | ||
| 855 | MOV CL,4 | ||
| 856 | SHR AX,CL | ||
| 857 | ADD BX,AX ; Start of transfer rounded up to seg | ||
| 858 | MOV DX,SI | ||
| 859 | MOV AX,DI ; DX:AX is size | ||
| 860 | cmp dx,10h | ||
| 861 | jnc no_mem_err | ||
| 862 | MOV CX,16 | ||
| 863 | DIV CX | ||
| 864 | OR DX,DX | ||
| 865 | JZ NOREM | ||
| 866 | |||
| 867 | INC AX | ||
| 868 | NOREM: ; AX is number of paras in transfer | ||
| 869 | ADD AX,BX ; AX is first seg that need not exist | ||
| 870 | jc no_mem_err | ||
| 871 | CMP AX,CS:[PDB_BLOCK_LEN] | ||
| 872 | JA NO_MEM_ERR | ||
| 873 | |||
| 874 | MOV CXSAVE,DI | ||
| 875 | MOV BXSAVE,SI | ||
| 876 | POP DX | ||
| 877 | POP AX | ||
| 878 | ; AX:DX is disk transfer address (segment:offset) | ||
| 879 | ; SI:DI is length (32-bit number) | ||
| 880 | RDWR: | ||
| 881 | RDWRLOOP: | ||
| 882 | MOV BX,DX ; Make a copy of the offset | ||
| 883 | AND DX,000FH ; Establish the offset in 0H-FH range | ||
| 884 | MOV CL,4 | ||
| 885 | SHR BX,CL ; Shift offset and | ||
| 886 | ADD AX,BX ; Add to segment register to get new Seg:offset | ||
| 887 | PUSH AX | ||
| 888 | PUSH DX ; Save AX,DX register pair | ||
| 889 | MOV WORD PTR [TRANSADD],DX | ||
| 890 | MOV WORD PTR [TRANSADD+WORD],AX | ||
| 891 | MOV CX,0FFF0H ; Keep request in segment | ||
| 892 | OR SI,SI ; Need > 64K? | ||
| 893 | JNZ BIGRDWR | ||
| 894 | |||
| 895 | MOV CX,DI ; Limit to amount requested | ||
| 896 | BIGRDWR: | ||
| 897 | PUSH DS | ||
| 898 | PUSH BX | ||
| 899 | MOV BX,[HANDLE] | ||
| 900 | MOV AH,[RDFLG] | ||
| 901 | LDS DX,[TRANSADD] | ||
| 902 | INT 21H ; Perform read or write | ||
| 903 | |||
| 904 | POP BX | ||
| 905 | POP DS | ||
| 906 | JC BADWR | ||
| 907 | |||
| 908 | CMP BYTE PTR [RDFLG],WRITE | ||
| 909 | JNZ GOODR | ||
| 910 | |||
| 911 | CMP CX,AX | ||
| 912 | JZ GOODR | ||
| 913 | |||
| 914 | BADWR: | ||
| 915 | MOV CX,AX | ||
| 916 | STC | ||
| 917 | POP DX ; READ OR WRITE BOMBED OUT | ||
| 918 | POP AX | ||
| 919 | RETURN | ||
| 920 | |||
| 921 | GOODR: | ||
| 922 | MOV CX,AX | ||
| 923 | SUB DI,CX ; Request minus amount transferred | ||
| 924 | SBB SI,0 ; Ripple carry | ||
| 925 | OR CX,CX ; End-of-file? | ||
| 926 | POP DX ; Restore DMA address | ||
| 927 | POP AX | ||
| 928 | JZ DOCLOSE | ||
| 929 | |||
| 930 | ADD DX,CX ; Bump DMA address by transfer length | ||
| 931 | MOV BX,SI | ||
| 932 | OR BX,DI ; Finished with request | ||
| 933 | JNZ RDWRLOOP | ||
| 934 | |||
| 935 | DOCLOSE: | ||
| 936 | SAVEREG <AX,BX> | ||
| 937 | MOV BX,HANDLE | ||
| 938 | MOV AH,CLOSE | ||
| 939 | INT 21H | ||
| 940 | |||
| 941 | RESTOREREG <BX,AX> | ||
| 942 | RETURN | ||
| 943 | |||
| 944 | NOFILE: | ||
| 945 | MOV DX,OFFSET DG:NOTFND_PTR | ||
| 946 | JMP RESTART | ||
| 947 | |||
| 948 | NO_NAME_GIVEN: | ||
| 949 | MOV DX,OFFSET DG:NONAMESPEC_PTR | ||
| 950 | RESTARTJMP: | ||
| 951 | JMP RESTART | ||
| 952 | |||
| 953 | WRTFILE: | ||
| 954 | CMP [NAMESPEC],0 | ||
| 955 | JZ NO_NAME_GIVEN ; Hey User, you forgot to specify a name | ||
| 956 | |||
| 957 | CALL CREATE_A_FILE ; Create file we want to write to | ||
| 958 | |||
| 959 | JC CHECKREADONLY ; ARR 2.4 | ||
| 960 | |||
| 961 | MOV SI,BXSAVE ; Get high order number of bytes to transfer | ||
| 962 | CMP SI,000FH | ||
| 963 | JLE WRTSIZE ; Is bx less than or equal to FH | ||
| 964 | |||
| 965 | XOR SI,SI ; Ignore BX if greater than FH - set to zero | ||
| 966 | WRTSIZE: | ||
| 967 | MOV WRT_ARG2,SI | ||
| 968 | MOV DI,CXSAVE | ||
| 969 | MOV WRT_ARG1,DI | ||
| 970 | MOV DX,OFFSET DG:WRTMES_PTR | ||
| 971 | CALL PRINTF_CRLF | ||
| 972 | |||
| 973 | POP DX | ||
| 974 | POP AX | ||
| 975 | CALL RDWR | ||
| 976 | |||
| 977 | JNC CLSFLE | ||
| 978 | |||
| 979 | CALL CLSFLE | ||
| 980 | |||
| 981 | CALL DELETE_A_FILE | ||
| 982 | |||
| 983 | MOV DX,OFFSET DG:NOSPACE_PTR | ||
| 984 | JMP RESTARTJMP | ||
| 985 | |||
| 986 | CALL CLSFLE ;is this dead code? - edk | ||
| 987 | |||
| 988 | JMP COMMAND | ||
| 989 | |||
| 990 | CHECKREADONLY: ; ARR 2.4 | ||
| 991 | MOV DX,[FILESTRT] | ||
| 992 | MOV SI,[FILEEND] | ||
| 993 | PUSH [SI] | ||
| 994 | MOV BYTE PTR [SI],0 | ||
| 995 | MOV AX,CHMOD SHL 8 ;AL=0,REQUEST FILE'S CURRENT | ||
| 996 | ; ATTRIBUTE BE RETURNED IN CX | ||
| 997 | INT 21H | ||
| 998 | |||
| 999 | POP [SI] | ||
| 1000 | MOV DX,OFFSET DG:NOROOM_PTR ; Creation error - report error | ||
| 1001 | JC RESTARTJMP | ||
| 1002 | |||
| 1003 | TEST CX,ATTR_READ_ONLY+ATTR_HIDDEN+ATTR_SYSTEM | ||
| 1004 | JZ RESTARTJMP | ||
| 1005 | |||
| 1006 | MOV DX,OFFSET DG:ACCMES_PTR ; Write on read only file | ||
| 1007 | JMP RESTARTJMP | ||
| 1008 | |||
| 1009 | CLSFLE: | ||
| 1010 | MOV AH,CLOSE | ||
| 1011 | MOV BX,[HANDLE] | ||
| 1012 | INT 21H | ||
| 1013 | |||
| 1014 | RETURN | ||
| 1015 | |||
| 1016 | EXELOAD: | ||
| 1017 | POP [RETSAVE] ; Suck up return addr | ||
| 1018 | INC BYTE PTR [NEWEXEC] | ||
| 1019 | MOV BX,[USER_PROC_PDB] | ||
| 1020 | MOV AX,BEGSEG | ||
| 1021 | MOV DS,AX | ||
| 1022 | ASSUME DS:NOTHING | ||
| 1023 | |||
| 1024 | CMP AX,BX | ||
| 1025 | JZ DEBUG_CURRENT | ||
| 1026 | |||
| 1027 | JMP FIND_DEBUG | ||
| 1028 | |||
| 1029 | DEBUG_CURRENT: | ||
| 1030 | MOV AX,CS:[DSSAVE] | ||
| 1031 | DEBUG_FOUND: | ||
| 1032 | MOV CS:BYTE PTR [NEWEXEC],0 | ||
| 1033 | MOV CS:[HEADSAVE],AX | ||
| 1034 | PUSH CS:[RETSAVE] ; Get the return address back | ||
| 1035 | PUSH AX | ||
| 1036 | MOV BX,CS | ||
| 1037 | SUB AX,BX | ||
| 1038 | PUSH ES | ||
| 1039 | MOV ES,CS:BEGSEG | ||
| 1040 | ASSUME ES:NOTHING | ||
| 1041 | |||
| 1042 | MOV BX,AX ; size of debug in para. | ||
| 1043 | ADD BX,10H | ||
| 1044 | MOV AX,CS ; and the size of printf in para. | ||
| 1045 | SUB AX,CS:BEGSEG | ||
| 1046 | ADD BX,AX | ||
| 1047 | MOV AH,SETBLOCK | ||
| 1048 | INT 21H | ||
| 1049 | |||
| 1050 | POP ES | ||
| 1051 | POP AX | ||
| 1052 | MOV CS:WORD PTR [COM_LINE+WORD],AX | ||
| 1053 | MOV CS:WORD PTR [COM_FCB1+WORD],AX | ||
| 1054 | MOV CS:WORD PTR [COM_FCB2+WORD],AX | ||
| 1055 | PUSH DS | ||
| 1056 | PUSH CS | ||
| 1057 | POP DS | ||
| 1058 | CALL EXEC_A_FILE | ||
| 1059 | |||
| 1060 | POP DS | ||
| 1061 | MOV AX,CS:[HANDLE] | ||
| 1062 | JC EXECERR | ||
| 1063 | |||
| 1064 | CALL SET_TERMINATE_VECTOR ; Reset int 22 | ||
| 1065 | |||
| 1066 | MOV AH,GET_CURRENT_PDB | ||
| 1067 | INT 21H | ||
| 1068 | |||
| 1069 | MOV CS:[USER_PROC_PDB],BX | ||
| 1070 | MOV CS:[DSSAVE],BX | ||
| 1071 | MOV CS:[ESSAVE],BX | ||
| 1072 | MOV ES,BX | ||
| 1073 | MOV WORD PTR ES:[PDB_EXIT],OFFSET DG:TERMINATE | ||
| 1074 | MOV WORD PTR ES:[PDB_EXIT+WORD],CS | ||
| 1075 | LES DI,CS:[COM_CSIP] | ||
| 1076 | MOV CS:[CSSAVE],ES | ||
| 1077 | MOV CS:[IPSAVE],DI | ||
| 1078 | MOV CS:WORD PTR [DISADD+WORD],ES | ||
| 1079 | MOV CS:WORD PTR [DISADD],DI | ||
| 1080 | MOV CS:WORD PTR [ASMADD+WORD],ES | ||
| 1081 | MOV CS:WORD PTR [ASMADD],DI | ||
| 1082 | MOV CS:WORD PTR [DEFDUMP+WORD],ES | ||
| 1083 | MOV CS:WORD PTR [DEFDUMP],DI | ||
| 1084 | MOV BX,DS | ||
| 1085 | MOV AH,SET_CURRENT_PDB | ||
| 1086 | INT 21H | ||
| 1087 | |||
| 1088 | LES DI,CS:[COM_SSSP] | ||
| 1089 | MOV AX,ES:[DI] | ||
| 1090 | INC DI | ||
| 1091 | INC DI | ||
| 1092 | MOV CS:[AXSAVE],AX | ||
| 1093 | MOV CS:[SSSAVE],ES | ||
| 1094 | MOV CS:[SPSAVE],DI | ||
| 1095 | RETURN | ||
| 1096 | |||
| 1097 | EXECERR: | ||
| 1098 | PUSH CS | ||
| 1099 | POP DS | ||
| 1100 | MOV DX,OFFSET DG:NOTFND_PTR | ||
| 1101 | CMP AX,ERROR_FILE_NOT_FOUND | ||
| 1102 | JZ GOTEXECEMES | ||
| 1103 | |||
| 1104 | MOV DX,OFFSET DG:ACCMES_PTR | ||
| 1105 | CMP AX,ERROR_ACCESS_DENIED | ||
| 1106 | JZ GOTEXECEMES | ||
| 1107 | |||
| 1108 | MOV DX,OFFSET DG:TOOBIG_PTR | ||
| 1109 | CMP AX,ERROR_NOT_ENOUGH_MEMORY | ||
| 1110 | JZ GOTEXECEMES | ||
| 1111 | |||
| 1112 | MOV DX,OFFSET DG:EXEBAD_PTR | ||
| 1113 | CMP AX,ERROR_BAD_FORMAT | ||
| 1114 | JZ GOTEXECEMES | ||
| 1115 | |||
| 1116 | MOV DX,OFFSET DG:EXECEMES_PTR | ||
| 1117 | GOTEXECEMES: | ||
| 1118 | CALL PRINTF_CRLF | ||
| 1119 | |||
| 1120 | JMP COMMAND | ||
| 1121 | |||
| 1122 | HEX2BIN: | ||
| 1123 | MOV [INDEX],DX | ||
| 1124 | MOV DX,OFFSET DG:HEXWRT_PTR | ||
| 1125 | CMP BYTE PTR [RDFLG],WRITE | ||
| 1126 | JNZ RDHEX | ||
| 1127 | |||
| 1128 | JMP RESTARTJ2 | ||
| 1129 | |||
| 1130 | RDHEX: | ||
| 1131 | MOV ES,AX | ||
| 1132 | CALL OPEN_A_FILE | ||
| 1133 | |||
| 1134 | MOV DX,OFFSET DG:NOTFND_PTR | ||
| 1135 | JNC HEXFND | ||
| 1136 | |||
| 1137 | JMP RESTART | ||
| 1138 | |||
| 1139 | HEXFND: | ||
| 1140 | XOR BP,BP | ||
| 1141 | MOV SI,OFFSET DG:(BUFFER+BUFSIZ) ; Flag input buffer as empty | ||
| 1142 | READHEX: | ||
| 1143 | CALL GETCH | ||
| 1144 | |||
| 1145 | CMP AL,CHAR_COLON ; Search for : to start line | ||
| 1146 | JNZ READHEX | ||
| 1147 | |||
| 1148 | CALL GETBYT ; Get byte count | ||
| 1149 | |||
| 1150 | MOV CL,AL | ||
| 1151 | MOV CH,0 | ||
| 1152 | JCXZ HEXDONE | ||
| 1153 | |||
| 1154 | CALL GETBYT ; Get high byte of load address | ||
| 1155 | |||
| 1156 | MOV BH,AL | ||
| 1157 | CALL GETBYT ; Get low byte of load address | ||
| 1158 | |||
| 1159 | MOV BL,AL | ||
| 1160 | ADD BX,[INDEX] ; Add in offset | ||
| 1161 | MOV DI,BX | ||
| 1162 | CALL GETBYT ; Throw away type byte | ||
| 1163 | |||
| 1164 | READLN: | ||
| 1165 | CALL GETBYT ; Get data byte | ||
| 1166 | |||
| 1167 | STOSB | ||
| 1168 | CMP DI,BP ; Check if this is the largest address so far | ||
| 1169 | JBE HAVBIG | ||
| 1170 | |||
| 1171 | MOV BP,DI ; Save new largest | ||
| 1172 | HAVBIG: | ||
| 1173 | LOOP READLN | ||
| 1174 | |||
| 1175 | JMP SHORT READHEX | ||
| 1176 | |||
| 1177 | GETCH: | ||
| 1178 | CMP SI,OFFSET DG:(BUFFER+BUFSIZ) | ||
| 1179 | JNZ NOREAD | ||
| 1180 | |||
| 1181 | MOV DX,OFFSET DG:BUFFER | ||
| 1182 | MOV SI,DX | ||
| 1183 | MOV AH,READ | ||
| 1184 | PUSH BX | ||
| 1185 | PUSH CX | ||
| 1186 | MOV CX,BUFSIZ | ||
| 1187 | MOV BX,cs:[HANDLE] | ||
| 1188 | INT 21H | ||
| 1189 | |||
| 1190 | POP CX | ||
| 1191 | POP BX | ||
| 1192 | OR AX,AX | ||
| 1193 | JZ HEXDONE | ||
| 1194 | |||
| 1195 | NOREAD: | ||
| 1196 | LODSB | ||
| 1197 | CMP AL,CHAR_EOF | ||
| 1198 | JZ HEXDONE | ||
| 1199 | |||
| 1200 | OR AL,AL | ||
| 1201 | RETNZ | ||
| 1202 | |||
| 1203 | HEXDONE: | ||
| 1204 | MOV [CXSAVE],BP | ||
| 1205 | MOV BXSAVE,0 | ||
| 1206 | RETURN | ||
| 1207 | |||
| 1208 | HEXDIG: | ||
| 1209 | CALL GETCH | ||
| 1210 | |||
| 1211 | CALL HEXCHK | ||
| 1212 | |||
| 1213 | RETNC | ||
| 1214 | |||
| 1215 | MOV DX,OFFSET DG:HEXERR_PTR | ||
| 1216 | RESTARTJ2: | ||
| 1217 | JMP RESTART | ||
| 1218 | |||
| 1219 | GETBYT: | ||
| 1220 | CALL HEXDIG | ||
| 1221 | |||
| 1222 | MOV BL,AL | ||
| 1223 | CALL HEXDIG | ||
| 1224 | |||
| 1225 | SHL BL,1 | ||
| 1226 | SHL BL,1 | ||
| 1227 | SHL BL,1 | ||
| 1228 | SHL BL,1 | ||
| 1229 | OR AL,BL | ||
| 1230 | RETURN | ||
| 1231 | |||
| 1232 | ;========================================================================= | ||
| 1233 | ; ABSREAD: This routine performs a primitive logical sector read of | ||
| 1234 | ; the specified drive. This routine replaces the old | ||
| 1235 | ; INT 25h function which only allowed 16 bit addressibility. | ||
| 1236 | ; The new generic IOCtl logical sector read will permit | ||
| 1237 | ; 32 bit addressibility on a disk device. | ||
| 1238 | ; | ||
| 1239 | ; Inputs : REL_READ_WRITE_TAB - Table provides dword sector | ||
| 1240 | ; addressibility. | ||
| 1241 | ; | ||
| 1242 | ; Outputs: Data located at specified transfer address. | ||
| 1243 | ; | ||
| 1244 | ; Error : Carry is set on error. | ||
| 1245 | ; | ||
| 1246 | ; Date : 6/17/87 | ||
| 1247 | ;========================================================================= | ||
| 1248 | |||
| 1249 | ABSREAD proc near ;an000;read logical sector(s) | ||
| 1250 | |||
| 1251 | push ds ;an000;save affected regs | ||
| 1252 | push cx ;an000;save affected regs | ||
| 1253 | push bx ;an000; | ||
| 1254 | |||
| 1255 | mov cx,-1 ;an000;extended format | ||
| 1256 | mov bx,offset dg:rel_read_write_tab ;an000;point to read/write table | ||
| 1257 | int 25h ;an000;invoke relative sector read | ||
| 1258 | pop bx ;an000;discard stack word | ||
| 1259 | |||
| 1260 | pop bx ;an000;restore regs | ||
| 1261 | pop cx ;an000; | ||
| 1262 | pop ds ;an000; | ||
| 1263 | |||
| 1264 | ret ;an000;return to caller | ||
| 1265 | |||
| 1266 | ABSREAD endp ;an000;end proc | ||
| 1267 | |||
| 1268 | |||
| 1269 | ;========================================================================= | ||
| 1270 | ; ABSWRT: This routine performs a primitive logical sector write of | ||
| 1271 | ; the specified drive. This routine replaces the old | ||
| 1272 | ; INT 26h function which only allowed 16 bit addressibility. | ||
| 1273 | ; The new generic IOCtl logical sector write will permit | ||
| 1274 | ; 32 bit addressibility on a disk device. | ||
| 1275 | ; | ||
| 1276 | ; Inputs : REL_READ_WRITE_TAB - Table provides dword sector | ||
| 1277 | ; addressibility. | ||
| 1278 | ; | ||
| 1279 | ; Outputs: Data moved from transfer address to applicable sector(s). | ||
| 1280 | ; | ||
| 1281 | ; Error : Carry is set on error. | ||
| 1282 | ; | ||
| 1283 | ; Date : 6/17/87 | ||
| 1284 | ;========================================================================= | ||
| 1285 | |||
| 1286 | ABSWRT proc near ;an000;write logical sector(s) | ||
| 1287 | |||
| 1288 | push ds ;an000;save affected regs | ||
| 1289 | push cx ;an000; | ||
| 1290 | push bx ;an000; | ||
| 1291 | |||
| 1292 | mov cx,-1 ;an000;extended format | ||
| 1293 | mov bx,offset dg:rel_read_write_tab ;an000;point to read/write table | ||
| 1294 | int 26h ;an000;invoke relative sector write | ||
| 1295 | pop bx ;an000;discard stack word | ||
| 1296 | |||
| 1297 | pop bx ;an000;restore regs | ||
| 1298 | pop cx ;an000; | ||
| 1299 | pop ds ;an000; | ||
| 1300 | |||
| 1301 | ret ;an000;return to caller | ||
| 1302 | |||
| 1303 | ABSWRT endp ;an000;end proc | ||
| 1304 | |||
| 1305 | |||
| 1306 | CODE ENDS | ||
| 1307 | END DEBCOM2 | ||
| 1308 | \ No newline at end of file | ||