diff options
Diffstat (limited to 'v2.0/source/SYSINIT.ASM')
| -rw-r--r-- | v2.0/source/SYSINIT.ASM | 1424 |
1 files changed, 1424 insertions, 0 deletions
diff --git a/v2.0/source/SYSINIT.ASM b/v2.0/source/SYSINIT.ASM new file mode 100644 index 0000000..0c198b1 --- /dev/null +++ b/v2.0/source/SYSINIT.ASM | |||
| @@ -0,0 +1,1424 @@ | |||
| 1 | TITLE BIOS SYSTEM INITIALIZATION | ||
| 2 | |||
| 3 | FALSE EQU 0 | ||
| 4 | TRUE EQU NOT FALSE | ||
| 5 | |||
| 6 | IBMVER EQU FALSE | ||
| 7 | IBM EQU IBMVER | ||
| 8 | IBMJAPVER EQU FALSE ; If TRUE set KANJI true also | ||
| 9 | MSVER EQU TRUE | ||
| 10 | ALTVECT EQU FALSE ; Switch to build ALTVECT version | ||
| 11 | HIGHMEM EQU FALSE | ||
| 12 | KANJI EQU FALSE | ||
| 13 | |||
| 14 | IF IBMVER OR IBMJAPVER | ||
| 15 | NOEXEC EQU TRUE | ||
| 16 | ELSE | ||
| 17 | NOEXEC EQU FALSE | ||
| 18 | ENDIF | ||
| 19 | |||
| 20 | ; Set to agree with those in DOST:MSHEAD.ASM, ALTVECT version only | ||
| 21 | MAJOR_VERSION EQU 2 | ||
| 22 | MINOR_VERSION EQU 0B ;2.11 | ||
| 23 | |||
| 24 | DOSSIZE EQU 5000H | ||
| 25 | |||
| 26 | ; Internal DOS data returned by DOSINIT | ||
| 27 | |||
| 28 | SYSINITVAR STRUC | ||
| 29 | DPBHEAD DD ? ; Pointer to head of DPB-FAT list | ||
| 30 | sft_addr DD ? ; Pointer to first FCB table | ||
| 31 | ; The following address points to the CLOCK device | ||
| 32 | BCLOCK DD ? | ||
| 33 | ; The following address is used by DISKSTATCHK it is always | ||
| 34 | ; points to the console input device header | ||
| 35 | BCON DD ? ; Console device entry points | ||
| 36 | NUMIO DB 0 ; Number of disk tables | ||
| 37 | MAXSEC DW 0 ; Maximum allowed sector size | ||
| 38 | BUFFHEAD DD ? ; Head of buffer queue | ||
| 39 | DEVHEAD DD ? | ||
| 40 | SYSINITVAR ENDS | ||
| 41 | |||
| 42 | INCLUDE DOSSYM.ASM | ||
| 43 | INCLUDE DEVSYM.ASM | ||
| 44 | |||
| 45 | IF NOT IBM | ||
| 46 | IF NOT IBMJAPVER | ||
| 47 | EXTRN RE_INIT:FAR | ||
| 48 | ENDIF | ||
| 49 | ENDIF | ||
| 50 | |||
| 51 | SYSINITSEG SEGMENT PUBLIC 'SYSTEM_INIT' | ||
| 52 | |||
| 53 | ASSUME CS:SYSINITSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING | ||
| 54 | |||
| 55 | EXTRN BADOPM:BYTE,CRLFM:BYTE,BADCOM:BYTE | ||
| 56 | EXTRN BADSIZ_PRE:BYTE,BADLD_PRE:BYTE | ||
| 57 | EXTRN BADSIZ_POST:BYTE,BADLD_POST:BYTE | ||
| 58 | EXTRN SYSSIZE:BYTE,BADCOUNTRY:BYTE | ||
| 59 | |||
| 60 | PUBLIC CURRENT_DOS_LOCATION | ||
| 61 | PUBLIC FINAL_DOS_LOCATION | ||
| 62 | PUBLIC DEVICE_LIST | ||
| 63 | PUBLIC MEMORY_SIZE | ||
| 64 | PUBLIC DEFAULT_DRIVE | ||
| 65 | PUBLIC BUFFERS | ||
| 66 | PUBLIC FILES | ||
| 67 | PUBLIC SYSINIT | ||
| 68 | |||
| 69 | IF HIGHMEM | ||
| 70 | PUBLIC DPBBUF_SIZ | ||
| 71 | ENDIF | ||
| 72 | |||
| 73 | SYSINIT: | ||
| 74 | JMP GOINIT | ||
| 75 | |||
| 76 | DOSINFO LABEL DWORD | ||
| 77 | DW 0000 | ||
| 78 | CURRENT_DOS_LOCATION DW 0000 | ||
| 79 | |||
| 80 | MSDOS LABEL DWORD | ||
| 81 | ENTRY_POINT LABEL DWORD | ||
| 82 | DW 0000 | ||
| 83 | FINAL_DOS_LOCATION DW 0000 | ||
| 84 | DEVICE_LIST DD 00000000 | ||
| 85 | |||
| 86 | IF HIGHMEM | ||
| 87 | DPBBUF_SIZ DW (4472 + 15) / 16 | ||
| 88 | ENDIF | ||
| 89 | |||
| 90 | MEMORY_SIZE DW 0001 | ||
| 91 | DEFAULT_DRIVE DB 00 | ||
| 92 | BUFFERS DB 2 | ||
| 93 | FILES DB 8 | ||
| 94 | COMMAND_LINE DB 2,0,"P" ; Default Command.com Args | ||
| 95 | DB 29 DUP (0) | ||
| 96 | ZERO DB 0 | ||
| 97 | |||
| 98 | IF NOT NOEXEC | ||
| 99 | COMEXE EXEC0 <0,COMMAND_LINE,DEFAULT_DRIVE,ZERO> | ||
| 100 | ENDIF | ||
| 101 | |||
| 102 | COUNT DW 0000 | ||
| 103 | CHRPTR DW 0000 | ||
| 104 | |||
| 105 | BUFPTR LABEL DWORD ; LEAVE THIS STUFF IN ORDER! | ||
| 106 | MEMLO DW 0 | ||
| 107 | PRMBLK LABEL WORD | ||
| 108 | MEMHI DW 0 | ||
| 109 | LDOFF DW 0 | ||
| 110 | AREA DW 0 | ||
| 111 | |||
| 112 | PACKET DB 22 | ||
| 113 | DB 0 | ||
| 114 | DB 0 ; INITIALIZE CODE | ||
| 115 | DW 0 | ||
| 116 | DB 8 DUP (?) | ||
| 117 | UNITCOUNT DB 0 | ||
| 118 | BREAK_ADDR DD 0 | ||
| 119 | BPB_ADDR DD 0 | ||
| 120 | |||
| 121 | GOINIT: | ||
| 122 | CLD | ||
| 123 | XOR SI,SI | ||
| 124 | MOV DI,SI | ||
| 125 | |||
| 126 | IF MSVER | ||
| 127 | MOV CX,[MEMORY_SIZE] | ||
| 128 | CMP CX,1 | ||
| 129 | JNZ NOSCAN | ||
| 130 | MOV CX,2048 ; START SCANNING AT 32K BOUNDARY | ||
| 131 | XOR BX,BX | ||
| 132 | |||
| 133 | MEMSCAN:INC CX | ||
| 134 | JZ SETEND | ||
| 135 | MOV DS,CX | ||
| 136 | MOV AL,[BX] | ||
| 137 | NOT AL | ||
| 138 | MOV [BX],AL | ||
| 139 | CMP AL,[BX] | ||
| 140 | NOT AL | ||
| 141 | MOV [BX],AL | ||
| 142 | JZ MEMSCAN | ||
| 143 | SETEND: | ||
| 144 | MOV [MEMORY_SIZE],CX | ||
| 145 | ENDIF | ||
| 146 | |||
| 147 | IF IBMVER OR IBMJAPVER | ||
| 148 | MOV CX,[MEMORY_SIZE] | ||
| 149 | ENDIF | ||
| 150 | |||
| 151 | NOSCAN: | ||
| 152 | MOV AX,CS | ||
| 153 | MOV DS,AX | ||
| 154 | ASSUME DS:SYSINITSEG | ||
| 155 | |||
| 156 | IF HIGHMEM | ||
| 157 | SUB CX,(DOSSIZE / 16) ; Leave room for DOS | ||
| 158 | SUB CX,CS:[DPBBUF_SIZ] ; Allow OEM to tune | ||
| 159 | ENDIF | ||
| 160 | |||
| 161 | MOV AX,OFFSET SYSSIZE + 15 | ||
| 162 | SHR AX,1 ; Divide by 16 for paras | ||
| 163 | SHR AX,1 | ||
| 164 | SHR AX,1 | ||
| 165 | SHR AX,1 | ||
| 166 | SUB CX,AX | ||
| 167 | MOV ES,CX | ||
| 168 | MOV CX,OFFSET SYSSIZE + 1 | ||
| 169 | SHR CX,1 ; Divide by 2 to get words | ||
| 170 | REP MOVSW ; RELOCATE SYSINIT | ||
| 171 | |||
| 172 | ASSUME ES:SYSINITSEG | ||
| 173 | |||
| 174 | PUSH ES | ||
| 175 | MOV AX,OFFSET SYSIN | ||
| 176 | PUSH AX | ||
| 177 | |||
| 178 | AAA PROC FAR | ||
| 179 | RET | ||
| 180 | AAA ENDP | ||
| 181 | ; | ||
| 182 | ; MOVE THE DOS TO ITS PROPER LOCATION | ||
| 183 | ; | ||
| 184 | SYSIN: | ||
| 185 | |||
| 186 | ASSUME DS:NOTHING,ES:SYSINITSEG,SS:NOTHING | ||
| 187 | |||
| 188 | MOV AX,[CURRENT_DOS_LOCATION] | ||
| 189 | MOV DS,AX | ||
| 190 | MOV AX,[FINAL_DOS_LOCATION] | ||
| 191 | MOV ES,AX | ||
| 192 | |||
| 193 | ASSUME ES:NOTHING | ||
| 194 | |||
| 195 | XOR SI,SI | ||
| 196 | MOV DI,SI | ||
| 197 | MOV CX,DOSSIZE/2 | ||
| 198 | REP MOVSW | ||
| 199 | |||
| 200 | LDS SI,[DEVICE_LIST] | ||
| 201 | MOV DX,[MEMORY_SIZE] | ||
| 202 | |||
| 203 | CLI | ||
| 204 | MOV AX,CS | ||
| 205 | MOV SS,AX | ||
| 206 | MOV SP,OFFSET LOCSTACK | ||
| 207 | |||
| 208 | ASSUME SS:SYSINITSEG | ||
| 209 | |||
| 210 | IF NOT ALTVECT | ||
| 211 | STI ; Leave INTs disabled for ALTVECT | ||
| 212 | ENDIF | ||
| 213 | LOCSTACK LABEL BYTE | ||
| 214 | |||
| 215 | CALL MSDOS | ||
| 216 | MOV WORD PTR [DOSINFO+2],ES ; SAVE POINTER TO DOS INFO | ||
| 217 | MOV WORD PTR [DOSINFO],DI | ||
| 218 | |||
| 219 | IF NOT IBM | ||
| 220 | IF NOT IBMJAPVER | ||
| 221 | CALL RE_INIT ; Re-call the BIOS | ||
| 222 | ENDIF | ||
| 223 | ENDIF | ||
| 224 | |||
| 225 | STI | ||
| 226 | CLD | ||
| 227 | |||
| 228 | IF HIGHMEM | ||
| 229 | PUSH DS | ||
| 230 | MOV BX,DS | ||
| 231 | ADD BX,10H | ||
| 232 | MOV ES,BX | ||
| 233 | PUSH CS | ||
| 234 | POP DS | ||
| 235 | XOR SI,SI | ||
| 236 | MOV DI,SI | ||
| 237 | MOV CX,OFFSET SYSSIZE + 1 | ||
| 238 | SHR CX,1 ; Divide by 2 to get words | ||
| 239 | REP MOVSW | ||
| 240 | POP DS | ||
| 241 | PUSH ES | ||
| 242 | MOV AX,OFFSET SECONDRELOC | ||
| 243 | PUSH AX | ||
| 244 | BBB PROC FAR | ||
| 245 | RET | ||
| 246 | BBB ENDP | ||
| 247 | |||
| 248 | SECONDRELOC: | ||
| 249 | MOV AX,CS | ||
| 250 | CLI | ||
| 251 | MOV SS,AX | ||
| 252 | MOV SP,OFFSET LOCSTACK | ||
| 253 | STI | ||
| 254 | ELSE | ||
| 255 | MOV BX,CS | ||
| 256 | SUB BX,10H | ||
| 257 | MOV ES,BX | ||
| 258 | XOR SI,SI | ||
| 259 | MOV DI,SI | ||
| 260 | MOV CX,80H | ||
| 261 | REP MOVSW | ||
| 262 | MOV AH,SET_CURRENT_PDB | ||
| 263 | INT 21H | ||
| 264 | ENDIF | ||
| 265 | |||
| 266 | PUSH DS | ||
| 267 | PUSH CS | ||
| 268 | POP DS | ||
| 269 | MOV DX,OFFSET INT24 ; SET UP INT 24 HANDLER | ||
| 270 | MOV AX,(SET_INTERRUPT_VECTOR SHL 8) OR 24H | ||
| 271 | INT 21H | ||
| 272 | |||
| 273 | IF ALTVECT | ||
| 274 | MOV DX,OFFSET BOOTMES | ||
| 275 | CALL PRINT ; Print message DOSINIT couldn't | ||
| 276 | ENDIF | ||
| 277 | |||
| 278 | POP DS | ||
| 279 | |||
| 280 | MOV DL,[DEFAULT_DRIVE] | ||
| 281 | OR DL,DL | ||
| 282 | JZ NODRVSET | ||
| 283 | DEC DL ; A = 0 | ||
| 284 | MOV AH,SET_DEFAULT_DRIVE | ||
| 285 | INT 21H ; SELECT THE DISK | ||
| 286 | NODRVSET: | ||
| 287 | |||
| 288 | CALL DOCONF ; DO THE CONFIG STUFF | ||
| 289 | |||
| 290 | IF HIGHMEM | ||
| 291 | PUSH DS | ||
| 292 | MOV AX,OFFSET SYSSIZE + 15 | ||
| 293 | MOV CL,4 | ||
| 294 | SHR AX,CL ; Divide by 16 to get para | ||
| 295 | MOV CX,ES | ||
| 296 | SUB CX,AX | ||
| 297 | MOV ES,CX | ||
| 298 | PUSH CS | ||
| 299 | POP DS | ||
| 300 | XOR SI,SI | ||
| 301 | MOV DI,SI | ||
| 302 | MOV CX,OFFSET SYSSIZE + 1 | ||
| 303 | SHR CX,1 ; Divide by 2 to get words | ||
| 304 | REP MOVSW | ||
| 305 | POP DS | ||
| 306 | PUSH ES | ||
| 307 | MOV AX,OFFSET THIRDRELOC | ||
| 308 | PUSH AX | ||
| 309 | CCC PROC FAR | ||
| 310 | RET | ||
| 311 | CCC ENDP | ||
| 312 | |||
| 313 | THIRDRELOC: | ||
| 314 | MOV AX,CS | ||
| 315 | CLI | ||
| 316 | MOV SS,AX | ||
| 317 | MOV SP,OFFSET LOCSTACK | ||
| 318 | STI | ||
| 319 | ENDIF | ||
| 320 | |||
| 321 | IF NOEXEC | ||
| 322 | MOV BP,DS ; SAVE COMMAND.COM SEGMENT | ||
| 323 | |||
| 324 | PUSH DS | ||
| 325 | POP ES | ||
| 326 | |||
| 327 | MOV BX,CS | ||
| 328 | SUB BX,10H | ||
| 329 | MOV DS,BX | ||
| 330 | XOR SI,SI | ||
| 331 | MOV DI,SI | ||
| 332 | MOV CX,80H | ||
| 333 | REP MOVSW | ||
| 334 | MOV BX,ES | ||
| 335 | MOV AH,SET_CURRENT_PDB | ||
| 336 | INT 21H | ||
| 337 | |||
| 338 | MOV ES:[PDB_PARENT_PID],ES ; WE ARE THE ROOT | ||
| 339 | ENDIF | ||
| 340 | |||
| 341 | PUSH CS | ||
| 342 | POP DS | ||
| 343 | ASSUME DS:SYSINITSEG | ||
| 344 | MOV AL,[FILES] | ||
| 345 | CBW | ||
| 346 | MOV CX,AX | ||
| 347 | XOR BX,BX ; Close standard input | ||
| 348 | MOV AH,CLOSE | ||
| 349 | INT 21H | ||
| 350 | MOV BX,2 | ||
| 351 | RCCLLOOP: ; Close everybody but standard output | ||
| 352 | MOV AH,CLOSE | ||
| 353 | INT 21H | ||
| 354 | INC BX | ||
| 355 | LOOP RCCLLOOP | ||
| 356 | |||
| 357 | MOV DX,OFFSET CONDEV | ||
| 358 | MOV AL,2 | ||
| 359 | MOV AH,OPEN ; OPEN CON FOR READ/WRITE | ||
| 360 | STC | ||
| 361 | INT 21H | ||
| 362 | JNC GOAUX | ||
| 363 | CALL BADFIL | ||
| 364 | JMP SHORT GOAUX2 | ||
| 365 | |||
| 366 | GOAUX: PUSH AX | ||
| 367 | MOV BX,1 ; close standard output | ||
| 368 | MOV AH,CLOSE | ||
| 369 | INT 21H | ||
| 370 | POP AX | ||
| 371 | |||
| 372 | MOV BX,AX ; New device handle | ||
| 373 | MOV AH,XDUP | ||
| 374 | INT 21H ; Dup to 1, STDOUT | ||
| 375 | MOV AH,XDUP | ||
| 376 | INT 21H ; Dup to 2, STDERR | ||
| 377 | |||
| 378 | GOAUX2: MOV DX,OFFSET AUXDEV | ||
| 379 | MOV AL,2 ; READ/WRITE ACCESS | ||
| 380 | CALL OPEN_DEV | ||
| 381 | |||
| 382 | MOV DX,OFFSET PRNDEV | ||
| 383 | MOV AL,1 ; WRITE ONLY | ||
| 384 | CALL OPEN_DEV | ||
| 385 | ; | ||
| 386 | ; SET UP THE PARAMETERS FOR COMMAND | ||
| 387 | ; | ||
| 388 | GOSET: | ||
| 389 | MOV SI,OFFSET COMMAND_LINE+1 | ||
| 390 | |||
| 391 | IF NOEXEC | ||
| 392 | MOV DI,81H | ||
| 393 | ELSE | ||
| 394 | PUSH DS | ||
| 395 | POP ES | ||
| 396 | MOV DI,SI | ||
| 397 | ENDIF | ||
| 398 | |||
| 399 | MOV CL,-1 | ||
| 400 | COMTRANLP: ; FIND LENGTH OF COMMAND LINE | ||
| 401 | INC CL | ||
| 402 | LODSB | ||
| 403 | STOSB ; COPY COMMAND LINE IN | ||
| 404 | OR AL,AL | ||
| 405 | JNZ COMTRANLP | ||
| 406 | DEC DI | ||
| 407 | MOV AL,0DH | ||
| 408 | STOSB | ||
| 409 | |||
| 410 | IF NOEXEC | ||
| 411 | MOV ES:[80H],CL | ||
| 412 | MOV AL,[DEFAULT_DRIVE] | ||
| 413 | MOV ES:[5CH],AL | ||
| 414 | ELSE | ||
| 415 | MOV [COMMAND_LINE],CL ; Count | ||
| 416 | ENDIF | ||
| 417 | |||
| 418 | PUSH CS | ||
| 419 | POP ES | ||
| 420 | |||
| 421 | ASSUME ES:SYSINITSEG | ||
| 422 | |||
| 423 | MOV DX,OFFSET COMMND ; NOW POINTING TO FILE DESCRIPTION | ||
| 424 | |||
| 425 | IF NOEXEC | ||
| 426 | MOV ES,BP ; SET LOAD ADDRESS | ||
| 427 | MOV BX,100H | ||
| 428 | CALL LDFIL ; READ IN COMMAND | ||
| 429 | JC COMERR | ||
| 430 | MOV DS,BP | ||
| 431 | CLI | ||
| 432 | MOV DX,80H | ||
| 433 | MOV SS,BP | ||
| 434 | MOV SP,DX | ||
| 435 | STI | ||
| 436 | |||
| 437 | XOR AX,AX ; PUSH A WORD OF ZEROS | ||
| 438 | PUSH AX | ||
| 439 | MOV AH,SET_DMA ; SET DISK TRANFER ADDRESS | ||
| 440 | INT 21H | ||
| 441 | PUSH BP ; SET HIGH PART OF JUMP ADDRESS | ||
| 442 | MOV AX,100H | ||
| 443 | PUSH AX ; SET LOW PART OF JUMP ADDRESS | ||
| 444 | CCC PROC FAR | ||
| 445 | RET ; CRANK UP COMMAND! | ||
| 446 | CCC ENDP | ||
| 447 | |||
| 448 | ELSE | ||
| 449 | MOV BX,OFFSET COMEXE | ||
| 450 | MOV WORD PTR [BX.EXEC0_COM_LINE+2],CS | ||
| 451 | MOV WORD PTR [BX.EXEC0_5C_FCB+2],CS | ||
| 452 | MOV WORD PTR [BX.EXEC0_6C_FCB+2],CS | ||
| 453 | |||
| 454 | XOR AX,AX | ||
| 455 | MOV AH,EXEC | ||
| 456 | STC ; IN CASE OF INT 24 | ||
| 457 | INT 21H ; GO START UP COMMAND | ||
| 458 | ENDIF | ||
| 459 | |||
| 460 | COMERR: | ||
| 461 | MOV DX,OFFSET BADCOM ; WANT TO PRINT COMMAND ERROR | ||
| 462 | CALL BADFIL | ||
| 463 | STALL: JMP STALL | ||
| 464 | |||
| 465 | DOCONF: | ||
| 466 | PUSH CS | ||
| 467 | POP DS | ||
| 468 | |||
| 469 | ASSUME DS:SYSINITSEG | ||
| 470 | |||
| 471 | MOV BX,0FFFFH | ||
| 472 | MOV AH,ALLOC | ||
| 473 | INT 21H ; FIRST TIME FAILS | ||
| 474 | MOV AH,ALLOC | ||
| 475 | INT 21H ; SECOND TIME GETS IT | ||
| 476 | MOV [AREA],AX | ||
| 477 | |||
| 478 | IF HIGHMEM | ||
| 479 | ADD AX,BX | ||
| 480 | ENDIF | ||
| 481 | |||
| 482 | MOV [MEMHI],AX | ||
| 483 | |||
| 484 | MOV AX,(CHAR_OPER SHL 8) ; GET SWITCH CHARACTER | ||
| 485 | INT 21H | ||
| 486 | MOV [COMMAND_LINE+1],DL | ||
| 487 | |||
| 488 | MOV DX,OFFSET CONFIG ; NOW POINTING TO FILE DESCRIPTION | ||
| 489 | MOV AX,OPEN SHL 8 ; OPEN FILE "CONFIG.SYS" | ||
| 490 | STC ; IN CASE OF INT 24 | ||
| 491 | INT 21H ; FUNCTION REQUEST | ||
| 492 | JC ENDFILE | ||
| 493 | JMP NOPROB ; PROBLEM WITH OPEN | ||
| 494 | |||
| 495 | ENDFILE: | ||
| 496 | PUSH CS | ||
| 497 | POP DS | ||
| 498 | CALL ROUND | ||
| 499 | MOV AL,[FILES] | ||
| 500 | SUB AL,5 | ||
| 501 | JBE DOBUFF | ||
| 502 | CBW | ||
| 503 | |||
| 504 | IF HIGHMEM | ||
| 505 | PUSH AX | ||
| 506 | MOV BL,SIZE SF_ENTRY | ||
| 507 | MUL BL | ||
| 508 | ADD AX,15+6 | ||
| 509 | MOV CL,4 | ||
| 510 | SHR AX,CL | ||
| 511 | SUB [MEMHI],AX | ||
| 512 | POP AX | ||
| 513 | ENDIF | ||
| 514 | |||
| 515 | MOV BX,[MEMLO] | ||
| 516 | MOV DX,[MEMHI] | ||
| 517 | LDS DI,[DOSINFO] ; GET POINTER TO DOS DATA | ||
| 518 | LDS DI,[DI+SFT_ADDR] ; DS:BP POINTS TO SFT | ||
| 519 | MOV WORD PTR [DI+SFT_LINK],BX | ||
| 520 | MOV WORD PTR [DI+SFT_LINK+2],DX ; SET POINTER TO NEW SFT | ||
| 521 | PUSH CS | ||
| 522 | POP DS | ||
| 523 | LES DI,DWORD PTR [MEMLO] ; POINT TO NEW SFT | ||
| 524 | MOV WORD PTR ES:[DI+SFT_LINK],-1 | ||
| 525 | MOV ES:[DI+SFT_COUNT],AX | ||
| 526 | MOV BL,SIZE SF_ENTRY | ||
| 527 | MUL BL ; AX = NUMBER OF BYTES TO CLEAR | ||
| 528 | MOV CX,AX | ||
| 529 | |||
| 530 | IF HIGHMEM | ||
| 531 | MOV AX,6 | ||
| 532 | ELSE | ||
| 533 | ADD [MEMLO],AX ; ALLOCATE MEMORY | ||
| 534 | MOV AX,6 | ||
| 535 | ADD [MEMLO],AX ; REMEMBER THE HEADER TOO | ||
| 536 | ENDIF | ||
| 537 | |||
| 538 | ADD DI,AX | ||
| 539 | XOR AX,AX | ||
| 540 | REP STOSB ; CLEAN OUT THE STUFF | ||
| 541 | |||
| 542 | DOBUFF: CALL ROUND | ||
| 543 | |||
| 544 | DEC [BUFFERS] | ||
| 545 | JZ BUF1 | ||
| 546 | |||
| 547 | PUSH DS | ||
| 548 | LES DI,BUFPTR | ||
| 549 | LDS BX,DOSINFO | ||
| 550 | |||
| 551 | IF HIGHMEM | ||
| 552 | MOV AX,[BX.MAXSEC] | ||
| 553 | ADD AX,BUFINSIZ + 15 | ||
| 554 | MOV CL,4 | ||
| 555 | SHR AX,CL | ||
| 556 | SUB CS:[MEMHI],AX | ||
| 557 | MOV ES,CS:[MEMHI] | ||
| 558 | ENDIF | ||
| 559 | |||
| 560 | MOV AX,WORD PTR [BX.BUFFHEAD] | ||
| 561 | MOV WORD PTR ES:[DI.NEXTBUF],AX | ||
| 562 | MOV AX,WORD PTR [BX.BUFFHEAD+2] | ||
| 563 | MOV WORD PTR ES:[DI.NEXTBUF+2],AX | ||
| 564 | |||
| 565 | MOV WORD PTR [BX.BUFFHEAD],DI | ||
| 566 | MOV WORD PTR [BX.BUFFHEAD+2],ES | ||
| 567 | |||
| 568 | MOV WORD PTR ES:[DI.BUFDRV],00FFH ; NEW BUFFER FREE | ||
| 569 | MOV BX,[BX.MAXSEC] | ||
| 570 | POP DS | ||
| 571 | |||
| 572 | IF NOT HIGHMEM | ||
| 573 | ADD BX,BUFINSIZ | ||
| 574 | ADD [MEMLO],BX | ||
| 575 | ENDIF | ||
| 576 | |||
| 577 | JMP DOBUFF | ||
| 578 | |||
| 579 | BUF1: CALL ROUND | ||
| 580 | MOV BX,[MEMHI] | ||
| 581 | MOV AX,[AREA] | ||
| 582 | MOV ES,AX ; CALC WHAT WE NEEDED | ||
| 583 | SUB BX,AX | ||
| 584 | |||
| 585 | IF HIGHMEM | ||
| 586 | DEC BX ; Arena | ||
| 587 | PUSH BX | ||
| 588 | ENDIF | ||
| 589 | |||
| 590 | MOV AH,SETBLOCK | ||
| 591 | INT 21H ; GIVE THE REST BACK | ||
| 592 | |||
| 593 | IF NOT HIGHMEM | ||
| 594 | PUSH ES | ||
| 595 | MOV AX,ES | ||
| 596 | DEC AX | ||
| 597 | MOV ES,AX | ||
| 598 | MOV ES:[arena_owner],8 ; Set impossible owner | ||
| 599 | POP ES | ||
| 600 | ENDIF | ||
| 601 | |||
| 602 | IF HIGHMEM | ||
| 603 | MOV BX,0FFFFH | ||
| 604 | MOV AH,ALLOC | ||
| 605 | INT 21H | ||
| 606 | MOV AH,ALLOC | ||
| 607 | INT 21H | ||
| 608 | |||
| 609 | PUSH ES | ||
| 610 | DEC AX | ||
| 611 | MOV ES,AX | ||
| 612 | MOV ES:[arena_owner],8 ; Set impossible owner | ||
| 613 | POP ES | ||
| 614 | |||
| 615 | IF NOT NOEXEC | ||
| 616 | MOV ES,[AREA] | ||
| 617 | MOV AH,DEALLOC | ||
| 618 | INT 21H | ||
| 619 | ENDIF | ||
| 620 | |||
| 621 | POP BX | ||
| 622 | MOV AX,[AREA] | ||
| 623 | MOV DS,AX | ||
| 624 | ADD AX,BX | ||
| 625 | MOV ES,AX | ||
| 626 | ELSE | ||
| 627 | IF NOEXEC | ||
| 628 | MOV BX,0FFFFH ; ALLOCATE THE REST OF MEM FOR COMMAND | ||
| 629 | MOV AH,ALLOC | ||
| 630 | INT 21H | ||
| 631 | MOV AH,ALLOC | ||
| 632 | INT 21H | ||
| 633 | MOV DS,AX | ||
| 634 | ENDIF | ||
| 635 | ENDIF | ||
| 636 | |||
| 637 | RET | ||
| 638 | |||
| 639 | BADOP: MOV DX,OFFSET BADOPM ; WANT TO PRINT COMMAND ERROR | ||
| 640 | CALL PRINT | ||
| 641 | JMP COFF | ||
| 642 | |||
| 643 | NOPROB: ; GET FILE SIZE (NOTE < 64K!!) | ||
| 644 | MOV BX,AX | ||
| 645 | XOR CX,CX | ||
| 646 | XOR DX,DX | ||
| 647 | MOV AX,(LSEEK SHL 8) OR 2 | ||
| 648 | INT 21H | ||
| 649 | MOV [COUNT],AX | ||
| 650 | XOR DX,DX | ||
| 651 | MOV AX,LSEEK SHL 8 ; Reset pointer to beginning of file | ||
| 652 | INT 21H | ||
| 653 | MOV DX,CS | ||
| 654 | |||
| 655 | IF HIGHMEM | ||
| 656 | MOV AX,OFFSET SYSSIZE + 15 | ||
| 657 | MOV CL,4 | ||
| 658 | SHR AX,CL | ||
| 659 | ADD DX,AX | ||
| 660 | ELSE | ||
| 661 | MOV AX,[COUNT] | ||
| 662 | ADD AX,15 | ||
| 663 | MOV CL,4 | ||
| 664 | SHR AX,CL ; NUMBER OF SEGMENTS | ||
| 665 | SUB DX,AX | ||
| 666 | SUB DX,11H ; ROOM FOR HEADER | ||
| 667 | ENDIF | ||
| 668 | |||
| 669 | MOV DS,DX | ||
| 670 | MOV ES,DX | ||
| 671 | ASSUME DS:NOTHING,ES:NOTHING | ||
| 672 | XOR DX,DX | ||
| 673 | MOV CX,[COUNT] | ||
| 674 | MOV AH,READ | ||
| 675 | STC ; IN CASE OF INT 24 | ||
| 676 | INT 21H ; Function request | ||
| 677 | PUSHF | ||
| 678 | PUSH CS | ||
| 679 | POP DS | ||
| 680 | ASSUME DS:SYSINITSEG | ||
| 681 | PUSH AX | ||
| 682 | MOV AH,CLOSE | ||
| 683 | INT 21H | ||
| 684 | POP AX | ||
| 685 | POPF | ||
| 686 | JC CONFERR ; IF NOT WE'VE GOT A PROBLEM | ||
| 687 | CMP CX,AX | ||
| 688 | JZ GETCOM ; COULDN'T READ THE FILE | ||
| 689 | CONFERR: | ||
| 690 | MOV DX,OFFSET CONFIG ; WANT TO PRINT CONFIG ERROR | ||
| 691 | CALL BADFIL | ||
| 692 | ENDFILV:JMP ENDFILE | ||
| 693 | |||
| 694 | GETCOM: | ||
| 695 | CALL ORGANIZE ; ORGANIZE THE FILE | ||
| 696 | CALL GETCHR | ||
| 697 | |||
| 698 | CONFLP: JC ENDFILV | ||
| 699 | MOV AH,AL | ||
| 700 | CALL GETCHR | ||
| 701 | |||
| 702 | CMP AH,'B' ; BUFFER COMMAND? | ||
| 703 | JNZ TRYC | ||
| 704 | CALL GETNUM | ||
| 705 | JZ COFF | ||
| 706 | CMP AX,100 | ||
| 707 | JAE badop | ||
| 708 | MOV [BUFFERS],AL | ||
| 709 | JMP SHORT COFF | ||
| 710 | |||
| 711 | TRYC: CMP AH,'C' | ||
| 712 | JZ GOTC | ||
| 713 | JMP TRYD | ||
| 714 | GOTC: | ||
| 715 | CMP AL,'O' ; FIRST LETTER OF "ON" | ||
| 716 | JNZ COFF | ||
| 717 | CALL GETCHR | ||
| 718 | JC ENDFILV | ||
| 719 | CMP AL,'N' ; SECOND LETTER OF "ON" | ||
| 720 | JNZ COFF | ||
| 721 | MOV AH,SET_CTRL_C_TRAPPING ; TURN ON CONTROL-C CHECK | ||
| 722 | MOV AL,1 | ||
| 723 | MOV DL,AL | ||
| 724 | INT 21H | ||
| 725 | |||
| 726 | COFF: PUSH CS | ||
| 727 | POP DS | ||
| 728 | CALL NEWLINE | ||
| 729 | JMP CONFLP | ||
| 730 | |||
| 731 | TRYD: CMP AH,'D' | ||
| 732 | JZ GOTD | ||
| 733 | JMP TRYF | ||
| 734 | GOTD: MOV BX,CS | ||
| 735 | MOV DS,BX | ||
| 736 | |||
| 737 | MOV WORD PTR [BPB_ADDR],SI | ||
| 738 | MOV WORD PTR [BPB_ADDR+2],ES | ||
| 739 | |||
| 740 | CALL ROUND | ||
| 741 | |||
| 742 | IF HIGHMEM | ||
| 743 | PUSH DS | ||
| 744 | PUSH ES | ||
| 745 | POP DS | ||
| 746 | MOV DX,SI | ||
| 747 | MOV AX,OPEN SHL 8 | ||
| 748 | STC ; In case INT 24H | ||
| 749 | INT 21H | ||
| 750 | POP DS | ||
| 751 | JC BADBRK | ||
| 752 | MOV BX,AX | ||
| 753 | XOR DX,DX | ||
| 754 | MOV CX,DX | ||
| 755 | MOV AX,(LSEEK SHL 8) OR 2 | ||
| 756 | INT 21H | ||
| 757 | PUSH AX | ||
| 758 | MOV AH,CLOSE | ||
| 759 | INT 21H | ||
| 760 | POP AX ; DX:AX is size of file | ||
| 761 | ADD AX,15 | ||
| 762 | ADC DX,0 | ||
| 763 | MOV CL,4 | ||
| 764 | SHR AX,CL | ||
| 765 | MOV CL,12 | ||
| 766 | SHL DX,CL | ||
| 767 | OR AX,DX ; AX is size in PARA | ||
| 768 | MOV CX,[MEMHI] | ||
| 769 | SUB [MEMHI],AX | ||
| 770 | JNC SIZEOK | ||
| 771 | MOV [MEMHI],CX ; Not enough memory | ||
| 772 | JMP SHORT BADBRK | ||
| 773 | SIZEOK: | ||
| 774 | MOV BX,CS | ||
| 775 | ENDIF | ||
| 776 | |||
| 777 | XOR AX,AX | ||
| 778 | MOV WORD PTR [ENTRY_POINT],AX | ||
| 779 | MOV AX,[MEMHI] | ||
| 780 | MOV WORD PTR [ENTRY_POINT+2],AX ; SET ENTRY POINT | ||
| 781 | |||
| 782 | |||
| 783 | IF NOT NOEXEC | ||
| 784 | MOV [LDOFF],AX ; SET LOAD OFFSET | ||
| 785 | ENDIF | ||
| 786 | |||
| 787 | PUSH ES | ||
| 788 | POP DS | ||
| 789 | MOV DX,SI ; DS:DX POINTS TO FILE NAME | ||
| 790 | |||
| 791 | IF NOEXEC | ||
| 792 | LES BX,DWORD PTR CS:[MEMLO] | ||
| 793 | CALL LDFIL ; LOAD IN THE DEVICE DRIVER | ||
| 794 | ELSE | ||
| 795 | MOV ES,BX | ||
| 796 | MOV BX,OFFSET PRMBLK ; ES:BX POINTS TO PARAMETERS | ||
| 797 | MOV AL,3 | ||
| 798 | MOV AH,EXEC | ||
| 799 | STC ; IN CASE OF INT 24 | ||
| 800 | INT 21H ; LOAD IN THE DEVICE DRIVER | ||
| 801 | ENDIF | ||
| 802 | |||
| 803 | PUSH DS | ||
| 804 | POP ES ; ES:SI BACK TO CONFIG.SYS | ||
| 805 | PUSH CS | ||
| 806 | POP DS ; DS BACK TO SYSINIT | ||
| 807 | JNC GOODLD | ||
| 808 | BADBRK: CALL BADLOAD | ||
| 809 | JMP COFF | ||
| 810 | |||
| 811 | GOODLD: PUSH ES ; INITIALIZE THE DEVICE | ||
| 812 | PUSH SI | ||
| 813 | |||
| 814 | PUSH CS | ||
| 815 | POP ES | ||
| 816 | MOV BX,SDEVSTRAT | ||
| 817 | CALL CALLDEV | ||
| 818 | MOV BX,SDEVINT | ||
| 819 | CALL CALLDEV | ||
| 820 | |||
| 821 | PUSH CS | ||
| 822 | POP DS | ||
| 823 | |||
| 824 | IF NOT HIGHMEM | ||
| 825 | MOV AX,WORD PTR [BREAK_ADDR+2] ; REMOVE THE INIT CODE | ||
| 826 | CMP AX,[MEMORY_SIZE] | ||
| 827 | JB BREAKOK | ||
| 828 | POP SI | ||
| 829 | POP ES | ||
| 830 | JMP BADBRK | ||
| 831 | BREAKOK: | ||
| 832 | |||
| 833 | MOV [MEMHI],AX | ||
| 834 | MOV AX,WORD PTR [BREAK_ADDR]; REMOVE THE INIT CODE | ||
| 835 | MOV [MEMLO],AX | ||
| 836 | ENDIF | ||
| 837 | |||
| 838 | LDS DX,[ENTRY_POINT] ; SET DS:DX TO HEADER | ||
| 839 | MOV SI,DX | ||
| 840 | ADD SI,SDEVATT ; DS:SI POINTS TO ATTRIBUTES | ||
| 841 | LES DI,CS:[DOSINFO] ; ES:DI POINT TO DOS INFO | ||
| 842 | MOV AX,DS:[SI] ; GET ATTRIBUTES | ||
| 843 | TEST AX,DEVTYP ; TEST IF BLOCK DEV | ||
| 844 | JZ ISBLOCK | ||
| 845 | |||
| 846 | TEST AX,ISCIN ; IS IT A CONSOLE IN? | ||
| 847 | JZ TRYCLK | ||
| 848 | MOV WORD PTR ES:[DI.BCON],DX | ||
| 849 | MOV WORD PTR ES:[DI.BCON+2],DS | ||
| 850 | |||
| 851 | TRYCLK: TEST AX,ISCLOCK ; IS IT A CLOCK DEVICE? | ||
| 852 | JZ GOLINK | ||
| 853 | MOV WORD PTR ES:[DI+BCLOCK],DX | ||
| 854 | MOV WORD PTR ES:[DI+BCLOCK+2],DS | ||
| 855 | GOLINK: JMP LINKIT | ||
| 856 | |||
| 857 | ISBLOCK: | ||
| 858 | MOV AL,CS:[UNITCOUNT] ; IF NO UNITS FOUND.... | ||
| 859 | OR AL,AL | ||
| 860 | JNZ PERDRV | ||
| 861 | |||
| 862 | IF NOT HIGHMEM | ||
| 863 | MOV CS:[MEMLO],0 ; ...ERASE THE DEVICE | ||
| 864 | ENDIF | ||
| 865 | |||
| 866 | MOV AX,-1 | ||
| 867 | JMP ENDDEV | ||
| 868 | |||
| 869 | PERDRV: | ||
| 870 | CBW | ||
| 871 | MOV CX,AX | ||
| 872 | MOV DH,AH | ||
| 873 | MOV DL,ES:[DI.NUMIO] ; GET NUMBER OF DEVICES | ||
| 874 | ADD ES:[DI.NUMIO],AL ; UPDATE THE AMOUNT | ||
| 875 | |||
| 876 | LDS BX,CS:[BPB_ADDR] ; POINT TO BPB ARRAY | ||
| 877 | PERUNIT: | ||
| 878 | LES BP,CS:[DOSINFO] | ||
| 879 | LES BP,DWORD PTR ES:[BP.DPBHEAD]; GET FIRST DPB | ||
| 880 | |||
| 881 | SCANDPB:CMP WORD PTR ES:[BP.DPB_NEXT_DPB],-1 | ||
| 882 | JZ FOUNDPB | ||
| 883 | LES BP,ES:[BP.DPB_NEXT_DPB] | ||
| 884 | JMP SCANDPB | ||
| 885 | FOUNDPB: | ||
| 886 | MOV AX,CS:[MEMLO] | ||
| 887 | MOV WORD PTR ES:[BP.DPB_NEXT_DPB],AX | ||
| 888 | |||
| 889 | IF HIGHMEM | ||
| 890 | MOV AX,(DPBSIZ + 15) / 16 | ||
| 891 | SUB CS:[MEMHI],AX | ||
| 892 | ENDIF | ||
| 893 | |||
| 894 | MOV AX,CS:[MEMHI] | ||
| 895 | MOV WORD PTR ES:[BP.DPB_NEXT_DPB+2],AX | ||
| 896 | LES BP,DWORD PTR CS:[MEMLO] | ||
| 897 | |||
| 898 | IF NOT HIGHMEM | ||
| 899 | ADD WORD PTR CS:[MEMLO],DPBSIZ | ||
| 900 | ENDIF | ||
| 901 | |||
| 902 | MOV WORD PTR ES:[BP.DPB_NEXT_DPB],-1 | ||
| 903 | MOV ES:[BP.DPB_FIRST_ACCESS],-1 | ||
| 904 | |||
| 905 | MOV SI,[BX] ; DS:SI POINTS TO BPB | ||
| 906 | INC BX | ||
| 907 | INC BX ; POINT TO NEXT GUY | ||
| 908 | MOV WORD PTR ES:[BP.DPB_DRIVE],DX | ||
| 909 | MOV AH,SETDPB ; HIDDEN SYSTEM CALL | ||
| 910 | INT 21H | ||
| 911 | MOV AX,ES:[BP.DPB_SECTOR_SIZE] | ||
| 912 | PUSH ES | ||
| 913 | LES DI,CS:[DOSINFO] ; ES:DI POINT TO DOS INFO | ||
| 914 | CMP AX,ES:[DI.MAXSEC] | ||
| 915 | POP ES | ||
| 916 | JBE NOTMAX | ||
| 917 | POP SI | ||
| 918 | POP ES | ||
| 919 | MOV DX,OFFSET BADSIZ_PRE | ||
| 920 | MOV BX,OFFSET BADSIZ_POST | ||
| 921 | CALL PRNERR | ||
| 922 | JMP COFF | ||
| 923 | |||
| 924 | NOTMAX: PUSH DS | ||
| 925 | PUSH DX | ||
| 926 | LDS DX,CS:[ENTRY_POINT] | ||
| 927 | MOV WORD PTR ES:[BP.DPB_DRIVER_ADDR],DX | ||
| 928 | MOV WORD PTR ES:[BP.DPB_DRIVER_ADDR+2],DS | ||
| 929 | POP DX | ||
| 930 | POP DS | ||
| 931 | INC DX | ||
| 932 | INC DH | ||
| 933 | LOOP PERUNIT | ||
| 934 | |||
| 935 | LINKIT: | ||
| 936 | LES DI,CS:[DOSINFO] ; ES:DI = DOS TABLE | ||
| 937 | MOV CX,WORD PTR ES:[DI.DEVHEAD] ; DX:CX = HEAD OF LIST | ||
| 938 | MOV DX,WORD PTR ES:[DI.DEVHEAD+2] | ||
| 939 | |||
| 940 | LDS SI,CS:[ENTRY_POINT] ; DS:SI = DEVICE LOCATION | ||
| 941 | MOV WORD PTR ES:[DI.DEVHEAD],SI ; SET HEAD OF LIST IN DOS | ||
| 942 | MOV WORD PTR ES:[DI.DEVHEAD+2],DS | ||
| 943 | MOV AX,DS:[SI] ; GET POINTER TO NEXT DEVICE | ||
| 944 | MOV WORD PTR CS:[ENTRY_POINT],AX; AND SAVE IT | ||
| 945 | |||
| 946 | MOV WORD PTR DS:[SI],CX ; LINK IN THE DRIVER | ||
| 947 | MOV WORD PTR DS:[SI+2],DX | ||
| 948 | ENDDEV: | ||
| 949 | POP SI | ||
| 950 | POP ES | ||
| 951 | INC AX ; AX = FFFF? | ||
| 952 | JZ COFFV | ||
| 953 | JMP GOODLD ; OTHERWISE PRETEND WE LOADED IT IN | ||
| 954 | COFFV: JMP COFF | ||
| 955 | |||
| 956 | TRYQ: | ||
| 957 | CMP AH,'Q' | ||
| 958 | JNZ TRYW | ||
| 959 | CALL GETNUM | ||
| 960 | JZ COFFV | ||
| 961 | OR AH,AH | ||
| 962 | JNZ COFFV | ||
| 963 | MOV AH,INTERNATIONAL ; AL is country code | ||
| 964 | MOV DX,-1 ; Set country | ||
| 965 | INT 21H | ||
| 966 | JNC COFFV | ||
| 967 | MOV DX,OFFSET BADCOUNTRY | ||
| 968 | CALL PRINT | ||
| 969 | JMP COFFV | ||
| 970 | |||
| 971 | TRYF: | ||
| 972 | CMP AH,'F' | ||
| 973 | JNZ TRYQ | ||
| 974 | CALL GETNUM | ||
| 975 | JZ COFFV | ||
| 976 | CMP AX,100 | ||
| 977 | JAE TryX | ||
| 978 | MOV [FILES],AL | ||
| 979 | JMP COFFV | ||
| 980 | TRYW: | ||
| 981 | CMP AH,'W' | ||
| 982 | JNZ TRYA | ||
| 983 | MOV DL,AL | ||
| 984 | MOV AX,(CHAR_OPER SHL 8) OR 1 ; SET SWITCH CHARACTER | ||
| 985 | MOV [COMMAND_LINE+1],DL | ||
| 986 | INT 21H | ||
| 987 | JMP COFF | ||
| 988 | |||
| 989 | TRYA: | ||
| 990 | CMP AH,'A' | ||
| 991 | JNZ TRYS | ||
| 992 | CMP AL,'F' ; FIRST LETTER OF "FALSE" | ||
| 993 | JNZ COFFJ | ||
| 994 | MOV AX,(CHAR_OPER SHL 8) OR 3 ; TURN ON "/DEV" PREFIX | ||
| 995 | XOR DL,DL | ||
| 996 | INT 21H | ||
| 997 | COFFJ: JMP COFF | ||
| 998 | |||
| 999 | TRYS: | ||
| 1000 | CMP AH,'S' | ||
| 1001 | JNZ TRYX | ||
| 1002 | MOV [COMMAND_LINE+1],0 | ||
| 1003 | MOV DI,OFFSET COMMND + 1 | ||
| 1004 | MOV [DI-1],AL | ||
| 1005 | STORESHELL: | ||
| 1006 | CALL GETCHR | ||
| 1007 | OR AL,AL | ||
| 1008 | JZ GETSHPARMS | ||
| 1009 | CMP AL," " | ||
| 1010 | JB ENDSH | ||
| 1011 | MOV [DI],AL | ||
| 1012 | INC DI | ||
| 1013 | JMP STORESHELL | ||
| 1014 | |||
| 1015 | ENDSH: | ||
| 1016 | MOV BYTE PTR [DI],0 | ||
| 1017 | CALL GETCHR | ||
| 1018 | CMP AL,10 | ||
| 1019 | JNZ CONV | ||
| 1020 | CALL GETCHR | ||
| 1021 | CONV: JMP CONFLP | ||
| 1022 | |||
| 1023 | TRYX: | ||
| 1024 | JMP BADOP | ||
| 1025 | |||
| 1026 | GETSHPARMS: | ||
| 1027 | MOV BYTE PTR [DI],0 | ||
| 1028 | MOV DI,OFFSET COMMAND_LINE+1 | ||
| 1029 | PARMLOOP: | ||
| 1030 | CALL GETCHR | ||
| 1031 | CMP AL," " | ||
| 1032 | JB ENDSH | ||
| 1033 | MOV [DI],AL | ||
| 1034 | INC DI | ||
| 1035 | JMP PARMLOOP | ||
| 1036 | |||
| 1037 | GETCHR: MOV CX,COUNT | ||
| 1038 | JCXZ NOCHAR | ||
| 1039 | MOV SI,CHRPTR | ||
| 1040 | MOV AL,ES:[SI] | ||
| 1041 | DEC COUNT | ||
| 1042 | INC CHRPTR | ||
| 1043 | CLC | ||
| 1044 | RET | ||
| 1045 | NOCHAR: STC | ||
| 1046 | RET | ||
| 1047 | |||
| 1048 | ORGANIZE: | ||
| 1049 | MOV CX,[COUNT] | ||
| 1050 | JCXZ NOCHAR | ||
| 1051 | CALL MAPCASE | ||
| 1052 | XOR SI,SI | ||
| 1053 | MOV DI,SI | ||
| 1054 | |||
| 1055 | ORG1: CALL GET ; SKIP LEADING CONTROL CHARACTERS | ||
| 1056 | CMP AL,' ' | ||
| 1057 | JB ORG1 | ||
| 1058 | |||
| 1059 | PUSH CX | ||
| 1060 | PUSH SI | ||
| 1061 | PUSH DI | ||
| 1062 | MOV BP,SI | ||
| 1063 | DEC BP | ||
| 1064 | MOV SI,OFFSET COMTAB ; Prepare to search command table | ||
| 1065 | MOV CH,0 | ||
| 1066 | FINDCOM: | ||
| 1067 | MOV DI,BP | ||
| 1068 | MOV CL,[SI] | ||
| 1069 | INC SI | ||
| 1070 | JCXZ NOCOM | ||
| 1071 | REPE CMPSB | ||
| 1072 | LAHF | ||
| 1073 | ADD SI,CX ; Bump to next position without affecting flags | ||
| 1074 | SAHF | ||
| 1075 | LODSB ; Get indicator letter | ||
| 1076 | JNZ FINDCOM | ||
| 1077 | POP DI | ||
| 1078 | POP SI | ||
| 1079 | POP CX | ||
| 1080 | JMP SHORT GOTCOM | ||
| 1081 | |||
| 1082 | NOCOM: | ||
| 1083 | POP DI | ||
| 1084 | POP SI | ||
| 1085 | POP CX | ||
| 1086 | MOV AL,'Z' | ||
| 1087 | GOTCOM: STOSB ; SAVE INDICATOR CHAR IN BUFFER | ||
| 1088 | |||
| 1089 | ORG2: CALL GET2 ; SKIP NAME UNTIL DELIMETER | ||
| 1090 | CALL DELIM ; | ||
| 1091 | JNZ ORG2 | ||
| 1092 | |||
| 1093 | CALL GET ; GET CHARS TO RIGHT OF EQUALS SIGN | ||
| 1094 | STOSB | ||
| 1095 | |||
| 1096 | ORG4: CALL GET2 | ||
| 1097 | STOSB | ||
| 1098 | CMP AL,' ' | ||
| 1099 | JA ORG4 | ||
| 1100 | CMP AL,10 | ||
| 1101 | JZ ORG1 | ||
| 1102 | |||
| 1103 | MOV BYTE PTR ES:[DI-1],0 | ||
| 1104 | ORG5: CALL GET2 | ||
| 1105 | STOSB | ||
| 1106 | CMP AL,10 | ||
| 1107 | JNZ ORG5 | ||
| 1108 | JMP ORG1 | ||
| 1109 | |||
| 1110 | GET2: | ||
| 1111 | JCXZ NOGET | ||
| 1112 | MOV AL,ES:[SI] | ||
| 1113 | INC SI | ||
| 1114 | DEC CX | ||
| 1115 | RET | ||
| 1116 | |||
| 1117 | GET: JCXZ NOGET | ||
| 1118 | MOV AL,ES:[SI] | ||
| 1119 | INC SI | ||
| 1120 | DEC CX | ||
| 1121 | CALL DELIM | ||
| 1122 | JZ GET | ||
| 1123 | GRET: RET | ||
| 1124 | |||
| 1125 | |||
| 1126 | DELIM: CMP AL,' ' | ||
| 1127 | JZ GRET | ||
| 1128 | CMP AL,9 | ||
| 1129 | JZ GRET | ||
| 1130 | CMP AL,'=' | ||
| 1131 | JZ GRET | ||
| 1132 | CMP AL,',' | ||
| 1133 | JZ GRET | ||
| 1134 | CMP AL,';' | ||
| 1135 | RET | ||
| 1136 | |||
| 1137 | |||
| 1138 | NOGET: POP CX | ||
| 1139 | MOV COUNT,DI | ||
| 1140 | XOR SI,SI | ||
| 1141 | MOV CHRPTR,SI | ||
| 1142 | RET | ||
| 1143 | ; | ||
| 1144 | ; NEWLINE RETURNS WITH FIRST CHARACTER OF NEXT LINE | ||
| 1145 | ; | ||
| 1146 | NEWLINE:CALL GETCHR ; SKIP NON-CONTROL CHARACTERS | ||
| 1147 | JC NONEW | ||
| 1148 | CMP AL,10 ; LOOK FOR LINE FEED | ||
| 1149 | JNZ NEWLINE | ||
| 1150 | CALL GETCHR | ||
| 1151 | NONEW: RET | ||
| 1152 | |||
| 1153 | MAPCASE: | ||
| 1154 | PUSH CX | ||
| 1155 | PUSH SI | ||
| 1156 | PUSH DS | ||
| 1157 | PUSH ES | ||
| 1158 | POP DS | ||
| 1159 | XOR SI,SI | ||
| 1160 | CONVLOOP: | ||
| 1161 | LODSB | ||
| 1162 | |||
| 1163 | IF KANJI | ||
| 1164 | CALL TESTKANJ | ||
| 1165 | JZ NORMCONV | ||
| 1166 | INC SI ; Skip next char | ||
| 1167 | DEC CX | ||
| 1168 | JCXZ CONVDONE ; Just ignore 1/2 kanji error | ||
| 1169 | ; Fall through, know AL is not in 'a'-'z' range | ||
| 1170 | NORMCONV: | ||
| 1171 | ENDIF | ||
| 1172 | |||
| 1173 | CMP AL,'a' | ||
| 1174 | JB NOCONV | ||
| 1175 | CMP AL,'z' | ||
| 1176 | JA NOCONV | ||
| 1177 | SUB AL,20H | ||
| 1178 | MOV [SI-1],AL | ||
| 1179 | NOCONV: | ||
| 1180 | LOOP CONVLOOP | ||
| 1181 | CONVDONE: | ||
| 1182 | POP DS | ||
| 1183 | POP SI | ||
| 1184 | POP CX | ||
| 1185 | RET | ||
| 1186 | |||
| 1187 | IF KANJI | ||
| 1188 | TESTKANJ: | ||
| 1189 | CMP AL,81H | ||
| 1190 | JB NOTLEAD | ||
| 1191 | CMP AL,9FH | ||
| 1192 | JBE ISLEAD | ||
| 1193 | CMP AL,0E0H | ||
| 1194 | JB NOTLEAD | ||
| 1195 | CMP AL,0FCH | ||
| 1196 | JBE ISLEAD | ||
| 1197 | NOTLEAD: | ||
| 1198 | PUSH AX | ||
| 1199 | XOR AX,AX ; Set zero | ||
| 1200 | POP AX | ||
| 1201 | RET | ||
| 1202 | |||
| 1203 | ISLEAD: | ||
| 1204 | PUSH AX | ||
| 1205 | XOR AX,AX ; Set zero | ||
| 1206 | INC AX ; Reset zero | ||
| 1207 | POP AX | ||
| 1208 | RET | ||
| 1209 | ENDIF | ||
| 1210 | |||
| 1211 | ASSUME DS:NOTHING | ||
| 1212 | |||
| 1213 | ROUND: MOV AX,[MEMLO] | ||
| 1214 | |||
| 1215 | IF NOT HIGHMEM | ||
| 1216 | ADD AX,15 | ||
| 1217 | ENDIF | ||
| 1218 | |||
| 1219 | SHR AX,1 | ||
| 1220 | SHR AX,1 | ||
| 1221 | SHR AX,1 | ||
| 1222 | SHR AX,1 | ||
| 1223 | ADD [MEMHI],AX | ||
| 1224 | XOR AX,AX | ||
| 1225 | MOV [MEMLO],AX | ||
| 1226 | RET | ||
| 1227 | |||
| 1228 | CALLDEV:MOV DS,WORD PTR CS:[ENTRY_POINT+2] | ||
| 1229 | ADD BX,WORD PTR CS:[ENTRY_POINT]; Do a little relocation | ||
| 1230 | MOV AX,DS:[BX] | ||
| 1231 | PUSH WORD PTR CS:[ENTRY_POINT] | ||
| 1232 | MOV WORD PTR CS:[ENTRY_POINT],AX | ||
| 1233 | MOV BX,OFFSET PACKET | ||
| 1234 | CALL [ENTRY_POINT] | ||
| 1235 | POP WORD PTR CS:[ENTRY_POINT] | ||
| 1236 | RET | ||
| 1237 | |||
| 1238 | BADNUM: POP AX ; POP RETURN ADDRESS | ||
| 1239 | JMP BADOP | ||
| 1240 | |||
| 1241 | ToDigit: | ||
| 1242 | SUB AL,'0' | ||
| 1243 | JB NotDig | ||
| 1244 | CMP AL,9 | ||
| 1245 | JA NotDig | ||
| 1246 | CLC | ||
| 1247 | RET | ||
| 1248 | NotDig: STC | ||
| 1249 | RET | ||
| 1250 | |||
| 1251 | GETNUM: XOR BX,BX ; running count is zero | ||
| 1252 | B2: CALL ToDigit ; do we have a digit | ||
| 1253 | JC BadNum ; no, bomb | ||
| 1254 | XCHG AX,BX ; put total in AX | ||
| 1255 | PUSH BX ; save digit | ||
| 1256 | MOV BX,10 ; base of arithmetic | ||
| 1257 | MUL BX ; shift by one decimal digit | ||
| 1258 | POP BX ; get back digit | ||
| 1259 | ADD AL,BL ; get total | ||
| 1260 | ADC AH,0 ; make that 16 bits | ||
| 1261 | JC BADNUM ; too big a number | ||
| 1262 | XCHG AX,BX ; stash total | ||
| 1263 | CALL GETCHR ; GET NEXT DIGIT | ||
| 1264 | JC B1 ; no more characters | ||
| 1265 | OR AL,AL ; end of line separator? | ||
| 1266 | JNZ B2 ; no, try as a valid character | ||
| 1267 | INC COUNT ; one more character to scan | ||
| 1268 | DEC CHRPTR ; back up over separator | ||
| 1269 | B1: MOV AX,BX ; get proper count | ||
| 1270 | OR AX,AX | ||
| 1271 | RET | ||
| 1272 | ; | ||
| 1273 | ; ES:SI POINTS TO FILE NAME (NUL TERMINATED) | ||
| 1274 | ; DS:DX POINTS TO STRING TO OUTPUT IN FRONT OF NAME ($ TERM) | ||
| 1275 | ; | ||
| 1276 | BADFIL: | ||
| 1277 | PUSH CS | ||
| 1278 | POP ES | ||
| 1279 | MOV SI,DX | ||
| 1280 | BADLOAD: | ||
| 1281 | MOV DX,OFFSET BADLD_PRE ; WANT TO PRINT CONFIG ERROR | ||
| 1282 | MOV BX,OFFSET BADLD_POST | ||
| 1283 | PRNERR: | ||
| 1284 | PUSH CS | ||
| 1285 | POP DS | ||
| 1286 | MOV AH,STD_CON_STRING_OUTPUT | ||
| 1287 | INT 21H | ||
| 1288 | PRN1: MOV DL,ES:[SI] | ||
| 1289 | OR DL,DL | ||
| 1290 | JZ PRN2 | ||
| 1291 | MOV AH,STD_CON_OUTPUT | ||
| 1292 | INT 21H | ||
| 1293 | INC SI | ||
| 1294 | JMP PRN1 | ||
| 1295 | PRN2: MOV DX,BX | ||
| 1296 | PRINT: MOV AH,STD_CON_STRING_OUTPUT | ||
| 1297 | INT 21H | ||
| 1298 | RET | ||
| 1299 | ; | ||
| 1300 | ; LOAD FILE CALLED [DS:DX] AT MEMORY LOCATION ES:BX | ||
| 1301 | ; | ||
| 1302 | LDFIL: | ||
| 1303 | PUSH AX | ||
| 1304 | PUSH BX | ||
| 1305 | PUSH CX | ||
| 1306 | PUSH DX | ||
| 1307 | PUSH SI | ||
| 1308 | PUSH DS | ||
| 1309 | PUSH BX | ||
| 1310 | |||
| 1311 | XOR AX,AX ; OPEN THE FILE | ||
| 1312 | MOV AH,OPEN | ||
| 1313 | STC ; IN CASE OF INT 24 | ||
| 1314 | INT 21H | ||
| 1315 | POP DX ; Trans addr is DS:DX | ||
| 1316 | JC LDRET | ||
| 1317 | |||
| 1318 | PUSH ES ; READ THE FILE IN | ||
| 1319 | POP DS | ||
| 1320 | MOV BX,AX ; Handle in BX | ||
| 1321 | MOV CX,0FF00H | ||
| 1322 | MOV AH,READ | ||
| 1323 | STC ; IN CASE OF INT 24 | ||
| 1324 | INT 21H | ||
| 1325 | JC LDRET | ||
| 1326 | MOV SI,DX ; CHECK FOR EXE FILE | ||
| 1327 | CMP WORD PTR [SI],"ZM" | ||
| 1328 | JNZ LDCLS | ||
| 1329 | LDERR: STC | ||
| 1330 | JMP SHORT LDRET | ||
| 1331 | |||
| 1332 | LDCLS: MOV AH,CLOSE ; CLOSE THE FILE | ||
| 1333 | STC | ||
| 1334 | INT 21H | ||
| 1335 | |||
| 1336 | LDRET: POP DS | ||
| 1337 | POP SI | ||
| 1338 | POP DX | ||
| 1339 | POP CX | ||
| 1340 | POP BX | ||
| 1341 | POP AX | ||
| 1342 | RET | ||
| 1343 | ; | ||
| 1344 | ; OPEN DEVICE POINTED TO BY DX, AL HAS ACCESS CODE | ||
| 1345 | ; IF UNABLE TO OPEN DO A DEVICE OPEN NULL DEVICE INSTEAD | ||
| 1346 | ; | ||
| 1347 | OPEN_DEV: | ||
| 1348 | CALL OPEN_FILE | ||
| 1349 | JNC OPEN_DEV3 | ||
| 1350 | OPEN_DEV1: | ||
| 1351 | MOV DX,OFFSET NULDEV | ||
| 1352 | CALL OPEN_FILE | ||
| 1353 | OPEN_DEV2: | ||
| 1354 | RET | ||
| 1355 | OPEN_DEV3: | ||
| 1356 | XOR AX,AX ; GET DEVICE INFO | ||
| 1357 | MOV AH,IOCTL | ||
| 1358 | INT 21H | ||
| 1359 | TEST DL,10000000B | ||
| 1360 | JNZ OPEN_DEV2 | ||
| 1361 | MOV AH,CLOSE | ||
| 1362 | INT 21H | ||
| 1363 | JMP OPEN_DEV1 | ||
| 1364 | |||
| 1365 | OPEN_FILE: | ||
| 1366 | MOV AH,OPEN | ||
| 1367 | STC | ||
| 1368 | INT 21H | ||
| 1369 | RET | ||
| 1370 | |||
| 1371 | INT24: ADD SP,6 ; RESTORE MACHINE STATE | ||
| 1372 | POP AX | ||
| 1373 | POP BX | ||
| 1374 | POP CX | ||
| 1375 | POP DX | ||
| 1376 | POP SI | ||
| 1377 | POP DI | ||
| 1378 | POP BP | ||
| 1379 | POP DS | ||
| 1380 | POP ES | ||
| 1381 | PUSH AX | ||
| 1382 | MOV AH,GET_DEFAULT_DRIVE ; INITIALIZE DOS | ||
| 1383 | INT 21H | ||
| 1384 | POP AX | ||
| 1385 | IRET ; BACK TO USER | ||
| 1386 | |||
| 1387 | IF ALTVECT | ||
| 1388 | BOOTMES DB 13 | ||
| 1389 | TEN: DB 10 | ||
| 1390 | DB "MS-DOS version " | ||
| 1391 | DB MAJOR_VERSION + "0" | ||
| 1392 | DB "." | ||
| 1393 | DB (MINOR_VERSION / 10) + "0" | ||
| 1394 | DB (MINOR_VERSION MOD 10) + "0" | ||
| 1395 | DB 13,10 | ||
| 1396 | DB "Copyright 1981,82 Microsoft Corp.",13,10,"$" | ||
| 1397 | ENDIF | ||
| 1398 | |||
| 1399 | NULDEV DB "\DEV\NUL",0 | ||
| 1400 | CONDEV DB "\DEV\CON",0 | ||
| 1401 | AUXDEV DB "\DEV\AUX",0 | ||
| 1402 | PRNDEV DB "\DEV\PRN",0 | ||
| 1403 | |||
| 1404 | CONFIG DB "\CONFIG.SYS",0 | ||
| 1405 | |||
| 1406 | COMMND DB "\COMMAND.COM",0 | ||
| 1407 | |||
| 1408 | COMTAB LABEL BYTE | ||
| 1409 | DB 7,"BUFFERS",'B' | ||
| 1410 | DB 5,"BREAK",'C' | ||
| 1411 | DB 5,"SHELL",'S' | ||
| 1412 | DB 6,"DEVICE",'D' | ||
| 1413 | DB 5,"FILES",'F' | ||
| 1414 | DB 8,"SWITCHAR",'W' | ||
| 1415 | DB 8,"AVAILDEV",'A' | ||
| 1416 | DB 7,"COUNTRY",'Q' | ||
| 1417 | DB 0 | ||
| 1418 | |||
| 1419 | |||
| 1420 | SYSINITSEG ENDS | ||
| 1421 | END | ||
| 1422 | |||
| 1423 | |||
| 1424 | \ No newline at end of file | ||