diff options
| author | 1983-08-12 17:53:34 -0700 | |
|---|---|---|
| committer | 2018-09-21 17:53:34 -0700 | |
| commit | 80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6 (patch) | |
| tree | ee4357f7f3dd0f2ded59b9c6e7384432d85e7ec9 /v2.0/source/FORMAT.ASM | |
| parent | MS-DOS v1.25 Release (diff) | |
| download | ms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.tar.gz ms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.tar.xz ms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.zip | |
MS-DOS v2.0 Release
Diffstat (limited to 'v2.0/source/FORMAT.ASM')
| -rw-r--r-- | v2.0/source/FORMAT.ASM | 1627 |
1 files changed, 1627 insertions, 0 deletions
diff --git a/v2.0/source/FORMAT.ASM b/v2.0/source/FORMAT.ASM new file mode 100644 index 0000000..694857b --- /dev/null +++ b/v2.0/source/FORMAT.ASM | |||
| @@ -0,0 +1,1627 @@ | |||
| 1 | ;*************************************************************** | ||
| 2 | ; | ||
| 3 | ; 86-DOS FORMAT DISK UTILITY | ||
| 4 | ; | ||
| 5 | ; This routine formats a new disk,clears the FAT and DIRECTORY | ||
| 6 | ; then optionally copies the SYSTEM and COMMAND.COM to this | ||
| 7 | ; new disk | ||
| 8 | ; | ||
| 9 | ; SYNTAX: FORMAT [drive][/switch1][/switch2]...[/switch16] | ||
| 10 | ; | ||
| 11 | ; Regardless of the drive designator , the user will be | ||
| 12 | ; prompted to insert the diskette to be formatted. | ||
| 13 | ; | ||
| 14 | ;*************************************************************** | ||
| 15 | |||
| 16 | ;Mod to ask for volume ID ARR 5/12/82 | ||
| 17 | ; 05/19/82 Fixed rounding bug in CLUSCAL: ARR | ||
| 18 | ;REV 1.5 | ||
| 19 | ; Added rev number message | ||
| 20 | ; Added dir attribute to DELALL FCB | ||
| 21 | ;REV 2.00 | ||
| 22 | ; Redone for 2.0 | ||
| 23 | ;REV 2.10 | ||
| 24 | ; 5/1/83 ARR Re-do to transfer system on small memory systems | ||
| 25 | |||
| 26 | FALSE EQU 0 | ||
| 27 | TRUE EQU NOT FALSE | ||
| 28 | |||
| 29 | IBMJAPVER EQU FALSE ; SET ONLY ONE SWITCH TO TRUE! | ||
| 30 | IBMVER EQU FALSE | ||
| 31 | MSVER EQU TRUE | ||
| 32 | |||
| 33 | KANJI EQU FALSE | ||
| 34 | |||
| 35 | .xlist | ||
| 36 | INCLUDE DOSSYM.ASM | ||
| 37 | .list | ||
| 38 | |||
| 39 | |||
| 40 | ;FORMAT Pre-defined switches | ||
| 41 | SYSSW EQU 1 ; System transfer | ||
| 42 | VOLSW EQU 2 ; Volume ID prompt | ||
| 43 | OLDSW EQU 4 ; E5 dir terminator | ||
| 44 | |||
| 45 | |||
| 46 | DRNUM EQU 5CH | ||
| 47 | |||
| 48 | RECLEN EQU fcb_RECSIZ+7 | ||
| 49 | RR EQU fcb_RR+7 | ||
| 50 | |||
| 51 | ;Per system file data structure | ||
| 52 | |||
| 53 | FILESTRUC STRUC | ||
| 54 | FILE_HANDLE DW ? ; Source handle | ||
| 55 | FILE_SIZEP DW ? ; File size in para | ||
| 56 | FILE_SIZEB DD ? ; File size in bytes | ||
| 57 | FILE_OFFSET DD ? ; Offset in file (partial) | ||
| 58 | FILE_START DW ? ; Para number of start in buffer | ||
| 59 | FILE_DATE DW ? ; Date of file | ||
| 60 | FILE_TIME DW ? ; Time of file | ||
| 61 | FILE_NAME DB ? ; Start of name | ||
| 62 | FILESTRUC ENDS | ||
| 63 | |||
| 64 | CODE SEGMENT PUBLIC 'CODE' | ||
| 65 | |||
| 66 | ASSUME CS:CODE,DS:CODE,ES:CODE | ||
| 67 | |||
| 68 | ORG 100H | ||
| 69 | |||
| 70 | ;For OEM module | ||
| 71 | PUBLIC SWITCHMAP,DRIVE | ||
| 72 | EXTRN HARDFLAG:BYTE ;0 = REMOVABLE MEDIA | ||
| 73 | EXTRN SWITCHLIST:BYTE,FATID:BYTE,FATSPACE:WORD | ||
| 74 | EXTRN STARTSECTOR:WORD,FREESPACE:WORD,INIT:NEAR | ||
| 75 | EXTRN DISKFORMAT:NEAR,BADSECTOR:NEAR,DONE:NEAR | ||
| 76 | EXTRN WRTFAT:NEAR | ||
| 77 | |||
| 78 | ;For FORMES module | ||
| 79 | EXTRN WAITYN:NEAR,REPORT:NEAR | ||
| 80 | PUBLIC PRINT,CRLF,DISP32BITS,UNSCALE,FDSKSIZ,SECSIZ,CLUSSIZ | ||
| 81 | PUBLIC SYSSIZ,BADSIZ | ||
| 82 | |||
| 83 | START: | ||
| 84 | JMP SHORT FSTRT | ||
| 85 | |||
| 86 | HEADER DB "Vers 2.10" | ||
| 87 | |||
| 88 | FSTRT: | ||
| 89 | MOV SP,OFFSET STACK ;Use internal stack | ||
| 90 | |||
| 91 | ;Code to print header | ||
| 92 | ; PUSH AX | ||
| 93 | ; MOV DX,OFFSET HEADER | ||
| 94 | ; CALL PRINT | ||
| 95 | ; POP AX | ||
| 96 | |||
| 97 | DOSVER_HIGH EQU 020BH ;2.11 in hex | ||
| 98 | PUSH AX ;Save DRIVE validity info | ||
| 99 | MOV AH,GET_VERSION | ||
| 100 | INT 21H | ||
| 101 | XCHG AH,AL ;Turn it around to AH.AL | ||
| 102 | CMP AX,DOSVER_HIGH | ||
| 103 | JAE OKDOS | ||
| 104 | GOTBADDOS: | ||
| 105 | MOV DX,OFFSET BADVER | ||
| 106 | MOV AH,STD_CON_STRING_OUTPUT | ||
| 107 | INT 21H | ||
| 108 | INT 20H | ||
| 109 | |||
| 110 | OKDOS: | ||
| 111 | |||
| 112 | IF IBMVER ; IBM WANTS TO CHECK FOR ASSIGN.COM | ||
| 113 | XOR AX,AX | ||
| 114 | MOV ES,AX | ||
| 115 | MOV BX,ES:[4*21H] | ||
| 116 | MOV ES,ES:[4*21H+2] | ||
| 117 | CMP BX,122H | ||
| 118 | JNZ NO_ASSIGN | ||
| 119 | CMP ES:[109H],0807H | ||
| 120 | JNZ NO_ASSIGN | ||
| 121 | CMP ES:[103H],0201H | ||
| 122 | JNZ RE_ASSIGN | ||
| 123 | CMP ES:[105H],0403H | ||
| 124 | JNZ RE_ASSIGN | ||
| 125 | CMP ES:[107H],0605H | ||
| 126 | JZ NO_ASSIGN | ||
| 127 | RE_ASSIGN: | ||
| 128 | MOV DX,OFFSET ASGERR | ||
| 129 | CALL PRINT | ||
| 130 | JMP FEXIT2 | ||
| 131 | NO_ASSIGN: | ||
| 132 | PUSH CS | ||
| 133 | POP ES | ||
| 134 | ENDIF | ||
| 135 | |||
| 136 | POP AX | ||
| 137 | |||
| 138 | CMP AL,0FFH ;See if invalid drive specified | ||
| 139 | JNZ DRVGD ;If not proceed | ||
| 140 | MOV DX,OFFSET INVDRV ;Invalid drive message | ||
| 141 | CALL PRINT ;Print the message | ||
| 142 | JMP FEXIT2 ;Exit | ||
| 143 | DRVGD: | ||
| 144 | MOV AH,GET_DEFAULT_DRIVE ;Must get the default drive | ||
| 145 | INT 21H ;Default now in AL | ||
| 146 | MOV DEFALT,AL ;Save for later | ||
| 147 | ADD AL,"A" | ||
| 148 | MOV [BIODRV],AL | ||
| 149 | MOV [DOSDRV],AL | ||
| 150 | MOV [SYSDRV],AL | ||
| 151 | MOV [COMDRV],AL | ||
| 152 | MOV SI,DRNUM ;So we can get our parameters | ||
| 153 | LODSB ;Fetch drive designation | ||
| 154 | OR AL,AL ;See if specified | ||
| 155 | JNZ DRVSPEC ;If specfied proceed | ||
| 156 | MOV AL,DEFALT | ||
| 157 | INC AL | ||
| 158 | DRVSPEC: | ||
| 159 | DEC AL ;Drive designator now correct | ||
| 160 | MOV BYTE PTR DS:[DRNUM],AL ;And updated | ||
| 161 | MOV DRIVE,AL ;Save copy | ||
| 162 | MOV DX,OFFSET INT_23 | ||
| 163 | MOV AH,SET_INTERRUPT_VECTOR | ||
| 164 | MOV AL,23H | ||
| 165 | INT 21H ;Set ^C vector | ||
| 166 | ;Get all the swith information from the command line | ||
| 167 | XOR AX,AX | ||
| 168 | MOV AH,CHAR_OPER ;GET SWITCH CHARACTER | ||
| 169 | INT 21H ;CALL THE DOS | ||
| 170 | MOV [SWTCH],DL | ||
| 171 | |||
| 172 | XOR BX,BX ;Store switch information in BX | ||
| 173 | MOV SI,81H ;Point to the command line buffer | ||
| 174 | NXTSWT: | ||
| 175 | CALL SCANOFF | ||
| 176 | LODSB | ||
| 177 | CMP AL,[SWTCH] | ||
| 178 | JZ GETPARM | ||
| 179 | CMP AL,13 | ||
| 180 | JZ SAVSWT | ||
| 181 | LODSB ;Get next character | ||
| 182 | CMP AL,":" ;Is it a drive specifier? | ||
| 183 | JNZ INVALID ;No -- invalid parameter | ||
| 184 | CMP BYTE PTR DBLFLG,0 ;Is is the only drive specifier we've seen | ||
| 185 | JNZ INVALID ;No -- invalid parameter | ||
| 186 | INC BYTE PTR DBLFLG ;Yes -- set the flag | ||
| 187 | JMP SHORT NXTSWT | ||
| 188 | GETPARM: | ||
| 189 | LODSB | ||
| 190 | ;Convert any lower case input into upper case | ||
| 191 | CMP AL,41H | ||
| 192 | JL GETCHR ;Switch is a digit don't try to convert it | ||
| 193 | AND AL,0DFH | ||
| 194 | GETCHR: | ||
| 195 | MOV CL,SWITCHLIST ;Number of legal switches | ||
| 196 | OR CL,CL ;If it's none we shouldn't be here | ||
| 197 | JZ INVALID ;Report the error | ||
| 198 | MOV CH,0 | ||
| 199 | MOV DI,1+OFFSET SWITCHLIST ;Point to the legal switch characters | ||
| 200 | REPNE SCASB | ||
| 201 | JNZ INVALID | ||
| 202 | MOV AX,1 | ||
| 203 | SHL AX,CL | ||
| 204 | OR BX,AX ;Set the appropriate bit in SWITCHMAP | ||
| 205 | JMP SHORT NXTSWT ;See if there are anymore | ||
| 206 | |||
| 207 | INVALID: | ||
| 208 | MOV DX,OFFSET INVPAR | ||
| 209 | CALL PRINT | ||
| 210 | JMP FEXIT | ||
| 211 | |||
| 212 | SCANOFF: | ||
| 213 | LODSB | ||
| 214 | CMP AL,20H | ||
| 215 | JZ SCANOFF | ||
| 216 | CMP AL,9 | ||
| 217 | JZ SCANOFF | ||
| 218 | DEC SI | ||
| 219 | RET | ||
| 220 | |||
| 221 | MEMERR: | ||
| 222 | MOV DX,OFFSET MEMEX | ||
| 223 | CALL PRINT | ||
| 224 | JMP FEXIT | ||
| 225 | |||
| 226 | |||
| 227 | SAVSWT: | ||
| 228 | |||
| 229 | IF IBMVER ;/B SWITCH TURNS /8 ON AND /S OFF | ||
| 230 | TEST BX,00100000B | ||
| 231 | JZ NOT_SW_B | ||
| 232 | AND BX,NOT SYSSW ;TURN OFF /S | ||
| 233 | OR BX,00010000B ;TURN ON /8 | ||
| 234 | NOT_SW_B: | ||
| 235 | ENDIF | ||
| 236 | |||
| 237 | MOV SWITCHMAP,BX | ||
| 238 | TEST SWITCHMAP,SYSSW | ||
| 239 | JZ INITCALL | ||
| 240 | CALL SAVUDIRS | ||
| 241 | MOV BX,[FREESPACE] | ||
| 242 | ADD BX,15 | ||
| 243 | MOV CL,4 | ||
| 244 | SHR BX,CL | ||
| 245 | PUSH CS | ||
| 246 | POP ES | ||
| 247 | MOV AH,SETBLOCK | ||
| 248 | INT 21H | ||
| 249 | MOV BX,0FFFFH | ||
| 250 | MOV AH,ALLOC | ||
| 251 | INT 21H | ||
| 252 | OR BX,BX | ||
| 253 | JZ MEMERR ;No memory | ||
| 254 | MOV [MSIZE],BX | ||
| 255 | MOV AH,ALLOC | ||
| 256 | INT 21H | ||
| 257 | JC MEMERR ;No memory | ||
| 258 | MOV [MSTART],AX | ||
| 259 | MOV DX,OFFSET SWTCH | ||
| 260 | MOV AH,CHDIR | ||
| 261 | INT 21H ;Go to root on default drive (source) | ||
| 262 | |||
| 263 | RDFRST: | ||
| 264 | CALL READDOS ;Read BIOS and DOS | ||
| 265 | JNC INITCALL ;OK -- read next file | ||
| 266 | NEEDSYS: | ||
| 267 | CALL SYSPRM ;Prompt for system disk | ||
| 268 | JMP RDFRST ;Try again | ||
| 269 | |||
| 270 | INITCALL: | ||
| 271 | CALL INIT ;Let OEM read any files before disk is changed | ||
| 272 | JNC SWITCHCHK | ||
| 273 | MOV DX,OFFSET FRMTERR | ||
| 274 | CALL PRINT | ||
| 275 | JMP FEXIT | ||
| 276 | |||
| 277 | SWITCHCHK: | ||
| 278 | MOV DX,SWITCHMAP | ||
| 279 | MOV SWITCHCOPY,DX | ||
| 280 | |||
| 281 | SYSLOOP: | ||
| 282 | MOV WORD PTR BADSIZ,0 ;Must intialize for each iteration | ||
| 283 | MOV WORD PTR BADSIZ+2,0 | ||
| 284 | MOV WORD PTR SYSSIZ,0 | ||
| 285 | MOV WORD PTR SYSSIZ+2,0 | ||
| 286 | MOV BYTE PTR DBLFLG,0 | ||
| 287 | MOV BYTE PTR CLEARFLG,0 | ||
| 288 | MOV DX,SWITCHCOPY | ||
| 289 | MOV SWITCHMAP,DX ;Restore original Switches | ||
| 290 | MOV AL,DRIVE ;Fetch drive | ||
| 291 | ADD AL,"A" ;(AL)= ASCII designation | ||
| 292 | MOV BYTE PTR SNGDRV,AL ;Fill out the message | ||
| 293 | MOV BYTE PTR TARGDRV,AL | ||
| 294 | MOV BYTE PTR HRDDRV,AL | ||
| 295 | CALL DSKPRM ;Prompt for new disk | ||
| 296 | CALL DISKFORMAT ;Format the disk | ||
| 297 | JNC GETTRK | ||
| 298 | FRMTPROB: | ||
| 299 | MOV DX,OFFSET FRMTERR | ||
| 300 | CALL PRINT | ||
| 301 | JMP SHORT SYSLOOP | ||
| 302 | |||
| 303 | ;Mark any bad sectors in the FATs | ||
| 304 | ;And keep track of how many bytes there are in bad sectors | ||
| 305 | |||
| 306 | GETTRK: | ||
| 307 | CALL BADSECTOR ;Do bad track fix-up | ||
| 308 | JC FRMTPROB ;Had an error in Formatting - can't recover | ||
| 309 | CMP AX,0 ;Are we finished? | ||
| 310 | JNZ TRKFND ;No - check error conditions | ||
| 311 | JMP DRTFAT ;Yes | ||
| 312 | TRKFND: | ||
| 313 | CMP BX,STARTSECTOR ;Are any sectors in the system area bad? | ||
| 314 | JGE CLRTEST | ||
| 315 | MOV DX,OFFSET NOUSE ;Can't build FATs of Directory | ||
| 316 | CALL PRINT | ||
| 317 | JMP FRMTPROB ;Bad disk -- try again | ||
| 318 | CLRTEST: | ||
| 319 | MOV SECTORS,AX ;Save the number of sectors on the track | ||
| 320 | CMP BYTE PTR CLEARFLG,0 ;Have we already cleared the FAT and DIR? | ||
| 321 | JNZ SYSTEST ;Yes - all set | ||
| 322 | INC CLEARFLG ;Set the flag | ||
| 323 | PUSH BX | ||
| 324 | CALL CLEAR ;Fix-up fat and directory | ||
| 325 | POP BX | ||
| 326 | SYSTEST: | ||
| 327 | TEST SWITCHMAP,SYSSW ;If system requested calculate size | ||
| 328 | JZ BAD100 | ||
| 329 | CMP BYTE PTR DBLFLG,0 ;Have we already calculated System space? | ||
| 330 | JNZ CMPTRKS ;Yes -- all ready for the compare | ||
| 331 | INC BYTE PTR DBLFLG ;No -- set the flag | ||
| 332 | CALL GETSIZE ;Calculate the system size | ||
| 333 | MOV DX,WORD PTR SYSSIZ+2 | ||
| 334 | MOV AX,WORD PTR SYSSIZ | ||
| 335 | DIV SECSIZ | ||
| 336 | ADD AX,STARTSECTOR | ||
| 337 | MOV SYSTRKS,AX ;Space FAT,Dir,and system files require | ||
| 338 | CMPTRKS: | ||
| 339 | CMP BX,SYSTRKS | ||
| 340 | JG BAD100 | ||
| 341 | MOV DX,OFFSET NOTSYS ;Can't transfer a system | ||
| 342 | CALL PRINT | ||
| 343 | AND SWITCHMAP,NOT SYSSW ;Turn off system transfer switch | ||
| 344 | MOV WORD PTR SYSSIZ+2,0 ;No system to transfer | ||
| 345 | MOV WORD PTR SYSSIZ,0 ;No system to transfer | ||
| 346 | BAD100: | ||
| 347 | ; BX is the first bad sector #, SECTORS is the number of bad sectors starting | ||
| 348 | ; at BX. This needs to be converted to clusters. The start sector number may | ||
| 349 | ; need to be rounded down to a cluster boundry, the end sector may need to be | ||
| 350 | ; rounded up to a cluster boundry. Know BX >= STARTSECTOR | ||
| 351 | SUB BX,STARTSECTOR ; BX is now DATA area relative | ||
| 352 | MOV CX,BX | ||
| 353 | ADD CX,SECTORS | ||
| 354 | DEC CX ; CX is now the last bad sector # | ||
| 355 | MOV AX,BX | ||
| 356 | XOR DX,DX | ||
| 357 | DIV CLUSSIZ | ||
| 358 | MOV BX,AX ; BX is rounded down and converted | ||
| 359 | ; to a cluster #. Where cluster 0 = | ||
| 360 | ; first cluster of data. First bad | ||
| 361 | ; Sector is in cluster BX. | ||
| 362 | MOV AX,CX | ||
| 363 | XOR DX,DX | ||
| 364 | DIV CLUSSIZ | ||
| 365 | MOV CX,AX ; CX is rounded up and converted to a | ||
| 366 | ; to a cluster #. Where cluster 0 = | ||
| 367 | ; first cluster of data. Last bad | ||
| 368 | ; Sector is in cluster CX. | ||
| 369 | SUB CX,BX | ||
| 370 | INC CX ; CX is number of clusters to mark bad | ||
| 371 | ADD BX,2 ; Bias start by correct amount since | ||
| 372 | ; first cluster of data is really | ||
| 373 | ; cluster 2. | ||
| 374 | MOV AX,CLUSSIZ ; Sectors/Cluster | ||
| 375 | MUL SECSIZ ; Times Bytes/Sector | ||
| 376 | MOV BP,AX ; = Bytes/Cluster | ||
| 377 | |||
| 378 | ; Mark CX clusters bad starting at cluster BX | ||
| 379 | PACKIT: | ||
| 380 | MOV DX,0FF7H ;0FF7H indicates a bad sector | ||
| 381 | CALL PACK ;Put it in the allocation map | ||
| 382 | CMP DX,DI ;Have we already marked it bad? | ||
| 383 | JZ BAD150 ;if so, don't add it in | ||
| 384 | ADD WORD PTR BADSIZ,BP ;Add in number of bad bytes | ||
| 385 | JNB BAD150 | ||
| 386 | INC WORD PTR BADSIZ+2 | ||
| 387 | BAD150: | ||
| 388 | INC BX ;Next cluster | ||
| 389 | LOOP PACKIT ;Continue for # of clusters | ||
| 390 | JMP GETTRK | ||
| 391 | |||
| 392 | ; Inputs: | ||
| 393 | ;BX = Cluster number | ||
| 394 | ;DX = Data | ||
| 395 | ; Outputs: | ||
| 396 | ;The data is stored in the FAT at the given cluster. | ||
| 397 | ;SI is destroyed | ||
| 398 | ;DI contains the former contents | ||
| 399 | ;No other registers affected | ||
| 400 | PACK: | ||
| 401 | PUSH BX | ||
| 402 | PUSH CX | ||
| 403 | PUSH DX | ||
| 404 | MOV SI,BX | ||
| 405 | SHR BX,1 | ||
| 406 | ADD BX,FATSPACE | ||
| 407 | ADD BX,SI | ||
| 408 | SHR SI,1 | ||
| 409 | MOV SI,WORD PTR [BX] | ||
| 410 | MOV DI,SI | ||
| 411 | JNB ALIGNED | ||
| 412 | MOV CL,4 | ||
| 413 | SHL DX,CL | ||
| 414 | SHR DI,CL | ||
| 415 | AND SI,15 | ||
| 416 | JMP SHORT PACKIN | ||
| 417 | |||
| 418 | ALIGNED: | ||
| 419 | AND SI,0F000H | ||
| 420 | PACKIN: | ||
| 421 | AND DI,00FFFH ;DI CONTAINS FORMER CONTENTS | ||
| 422 | OR SI,DX | ||
| 423 | MOV WORD PTR[BX],SI | ||
| 424 | POP DX | ||
| 425 | POP CX | ||
| 426 | POP BX | ||
| 427 | RET | ||
| 428 | |||
| 429 | DRTFAT: | ||
| 430 | CMP BYTE PTR CLEARFLG,0 | ||
| 431 | JNZ CLEARED | ||
| 432 | CALL CLEAR ;Clear the FAT and Dir | ||
| 433 | TEST SWITCHMAP,SYSSW ;If system requested, calculate size | ||
| 434 | JZ CLEARED | ||
| 435 | CMP BYTE PTR DBLFLG,0 ;Have we already calculated System space? | ||
| 436 | JNZ CLEARED ;Yes | ||
| 437 | INC BYTE PTR DBLFLG ;No -- set the flag | ||
| 438 | CALL GETSIZE ;Calculate the system size | ||
| 439 | CLEARED: | ||
| 440 | CALL WRTFAT | ||
| 441 | JNC FATWRT | ||
| 442 | MOV DX,OFFSET NOUSE | ||
| 443 | CALL PRINT | ||
| 444 | JMP FRMTPROB | ||
| 445 | |||
| 446 | FATWRT: | ||
| 447 | |||
| 448 | TEST SWITCHMAP,SYSSW ;System desired | ||
| 449 | JZ STATUS | ||
| 450 | CALL WRITEDOS ;Write the BIOS & DOS | ||
| 451 | JNC SYSOK | ||
| 452 | MOV DX,OFFSET NOTSYS ;Can't transfer a system | ||
| 453 | CALL PRINT | ||
| 454 | MOV WORD PTR SYSSIZ+2,0 ;No system transfered | ||
| 455 | MOV WORD PTR SYSSIZ,0 ;No system transfered | ||
| 456 | JMP SHORT STATUS | ||
| 457 | |||
| 458 | SYSOK: | ||
| 459 | MOV DX,OFFSET SYSTRAN | ||
| 460 | CALL PRINT | ||
| 461 | STATUS: | ||
| 462 | CALL CRLF | ||
| 463 | CALL VOLID | ||
| 464 | MOV AH,DISK_RESET | ||
| 465 | INT 21H | ||
| 466 | CALL DONE ;Final call to OEM module | ||
| 467 | JNC REPORTC | ||
| 468 | JMP FRMTPROB ;Report an error | ||
| 469 | |||
| 470 | REPORTC: | ||
| 471 | CALL REPORT | ||
| 472 | |||
| 473 | CALL MORE ;See if more disks to format | ||
| 474 | JMP SYSLOOP ;If we returned from MORE then continue | ||
| 475 | |||
| 476 | DISP32BITS: | ||
| 477 | PUSH BX | ||
| 478 | XOR AX,AX | ||
| 479 | MOV BX,AX | ||
| 480 | MOV BP,AX | ||
| 481 | MOV CX,32 | ||
| 482 | CONVLP: | ||
| 483 | SHL SI,1 | ||
| 484 | RCL DI,1 | ||
| 485 | XCHG AX,BP | ||
| 486 | CALL CONVWRD | ||
| 487 | XCHG AX,BP | ||
| 488 | XCHG AX,BX | ||
| 489 | CALL CONVWRD | ||
| 490 | XCHG AX,BX | ||
| 491 | ADC AL,0 | ||
| 492 | LOOP CONVLP | ||
| 493 | ; Conversion complete. Print 8-digit number with 2 leading blanks. | ||
| 494 | MOV CX,1810H | ||
| 495 | XCHG DX,AX | ||
| 496 | CALL DIGIT | ||
| 497 | XCHG AX,BX | ||
| 498 | CALL OUTWORD | ||
| 499 | XCHG AX,BP | ||
| 500 | CALL OUTWORD | ||
| 501 | POP DX | ||
| 502 | CMP DX,0 | ||
| 503 | JZ RET3 | ||
| 504 | CALL PRINT | ||
| 505 | RET3: RET | ||
| 506 | |||
| 507 | OUTWORD: | ||
| 508 | PUSH AX | ||
| 509 | MOV DL,AH | ||
| 510 | CALL OUTBYTE | ||
| 511 | POP DX | ||
| 512 | OUTBYTE: | ||
| 513 | MOV DH,DL | ||
| 514 | SHR DL,1 | ||
| 515 | SHR DL,1 | ||
| 516 | SHR DL,1 | ||
| 517 | SHR DL,1 | ||
| 518 | CALL DIGIT | ||
| 519 | MOV DL,DH | ||
| 520 | DIGIT: | ||
| 521 | AND DL,0FH | ||
| 522 | JZ BLANKZER | ||
| 523 | MOV CL,0 | ||
| 524 | BLANKZER: | ||
| 525 | DEC CH | ||
| 526 | AND CL,CH | ||
| 527 | OR DL,30H | ||
| 528 | SUB DL,CL | ||
| 529 | MOV AH,STD_CON_OUTPUT | ||
| 530 | INT 21H | ||
| 531 | RET | ||
| 532 | |||
| 533 | CONVWRD: | ||
| 534 | ADC AL,AL | ||
| 535 | DAA | ||
| 536 | XCHG AL,AH | ||
| 537 | ADC AL,AL | ||
| 538 | DAA | ||
| 539 | XCHG AL,AH | ||
| 540 | RET2: RET | ||
| 541 | |||
| 542 | UNSCALE: | ||
| 543 | SHR CX,1 | ||
| 544 | JC RET2 | ||
| 545 | SHL AX,1 | ||
| 546 | RCL DX,1 | ||
| 547 | JMP SHORT UNSCALE | ||
| 548 | |||
| 549 | |||
| 550 | ;****************************************** | ||
| 551 | ; Calculate the size in bytes of the system rounded up to sector and | ||
| 552 | ; cluster boundries, Answer in SYSSIZ | ||
| 553 | |||
| 554 | GETSIZE: | ||
| 555 | MOV AX,WORD PTR BIOSSIZB ;And calculate the system size | ||
| 556 | MOV DX,WORD PTR BIOSSIZB+2 | ||
| 557 | CALL FNDSIZ | ||
| 558 | MOV AX,WORD PTR DOSSIZB | ||
| 559 | MOV DX,WORD PTR DOSSIZB+2 | ||
| 560 | CALL FNDSIZ | ||
| 561 | MOV AX,WORD PTR COMSIZB | ||
| 562 | MOV DX,WORD PTR COMSIZB+2 | ||
| 563 | |||
| 564 | ;Calculate the number of sectors used for the system | ||
| 565 | FNDSIZ: | ||
| 566 | DIV SECSIZ | ||
| 567 | OR DX,DX | ||
| 568 | JZ FNDSIZ0 | ||
| 569 | INC AX ; Round up to next sector | ||
| 570 | FNDSIZ0: | ||
| 571 | PUSH AX | ||
| 572 | XOR DX,DX | ||
| 573 | DIV CLUSSIZ | ||
| 574 | POP AX | ||
| 575 | OR DX,DX | ||
| 576 | JZ ONCLUS | ||
| 577 | SUB DX,CLUSSIZ | ||
| 578 | NEG DX | ||
| 579 | ADD AX,DX ; Round up sector count to cluster | ||
| 580 | ; boundry | ||
| 581 | ONCLUS: | ||
| 582 | MUL SECSIZ ; Turn it back into bytes | ||
| 583 | ADD WORD PTR SYSSIZ,AX | ||
| 584 | ADC WORD PTR SYSSIZ+2,DX | ||
| 585 | RET | ||
| 586 | |||
| 587 | PRINT: MOV AH,STD_CON_STRING_OUTPUT ;Print msg pointed to by DX | ||
| 588 | INT 21H | ||
| 589 | RET | ||
| 590 | |||
| 591 | MORE: CMP BYTE PTR [HARDFLAG],0 ;Check if removable media | ||
| 592 | JNZ FEXIT | ||
| 593 | CALL WAITYN ;Get yes or no response | ||
| 594 | JB FEXIT ;Exit if CF=1 | ||
| 595 | CALL CRLF | ||
| 596 | CRLF: | ||
| 597 | MOV DX,OFFSET CRLFMSG | ||
| 598 | CALL PRINT | ||
| 599 | RET | ||
| 600 | |||
| 601 | PERROR: CALL PRINT ;Print message and exit | ||
| 602 | FEXIT: | ||
| 603 | CALL RESTUDIR ;Restore users dirs | ||
| 604 | FEXIT2: | ||
| 605 | INT 20H | ||
| 606 | |||
| 607 | ;Prompt the user for a system diskette in the default drive | ||
| 608 | SYSPRM: | ||
| 609 | MOV AH,GET_DEFAULT_DRIVE ;Will find out the default drive | ||
| 610 | INT 21H ;Default now in AL | ||
| 611 | IF IBMVER OR IBMJAPVER | ||
| 612 | MOV BX,AX | ||
| 613 | ENDIF | ||
| 614 | ADD AL,41H ;Now in Ascii | ||
| 615 | MOV SYSDRV,AL ;Text now ok | ||
| 616 | |||
| 617 | IF IBMVER OR IBMJAPVER | ||
| 618 | INT 11H ;Make sure drive has insertable media | ||
| 619 | AND AL,11000000B | ||
| 620 | ROL AL,1 | ||
| 621 | ROL AL,1 | ||
| 622 | OR AL,AL | ||
| 623 | JNZ NOTONEDRV | ||
| 624 | INC AL | ||
| 625 | NOTONEDRV: | ||
| 626 | CMP BL,AL | ||
| 627 | JBE ISFLOPPY | ||
| 628 | MOV AL,"A" | ||
| 629 | MOV BYTE PTR [SYSDRV],AL | ||
| 630 | MOV [BIODRV],AL | ||
| 631 | MOV [DOSDRV],AL | ||
| 632 | MOV [COMDRV],AL | ||
| 633 | ISFLOPPY: | ||
| 634 | ENDIF | ||
| 635 | |||
| 636 | MOV DX,OFFSET SYSMSG | ||
| 637 | CALL PRINT ;Print first line | ||
| 638 | CALL WAITKY ;Wait for a key | ||
| 639 | CALL CRLF | ||
| 640 | RET | ||
| 641 | |||
| 642 | TARGPRM: | ||
| 643 | MOV DX,OFFSET TARGMSG | ||
| 644 | CALL PRINT ;Print first line | ||
| 645 | CALL WAITKY ;Wait for a key | ||
| 646 | CALL CRLF | ||
| 647 | RET | ||
| 648 | |||
| 649 | DSKPRM: | ||
| 650 | MOV DX,OFFSET SNGMSG ;Point to the message | ||
| 651 | CMP BYTE PTR [HARDFLAG],0 ;Check if removable media | ||
| 652 | JZ GOPRNIT | ||
| 653 | MOV DX,OFFSET HRDMSG | ||
| 654 | GOPRNIT: | ||
| 655 | CALL PRINT ;Print the message | ||
| 656 | CALL WAITKY ;Wait for space bar | ||
| 657 | CALL CRLF | ||
| 658 | CALL CRLF | ||
| 659 | RET | ||
| 660 | |||
| 661 | ;Will wait for any key to be depressed. | ||
| 662 | WAITKY: | ||
| 663 | MOV AX,(STD_CON_INPUT_FLUSH SHL 8) OR STD_CON_INPUT_NO_ECHO | ||
| 664 | INT 21H | ||
| 665 | MOV AX,(STD_CON_INPUT_FLUSH SHL 8) + 0 | ||
| 666 | INT 21H | ||
| 667 | |||
| 668 | return | ||
| 669 | |||
| 670 | FDPB: MOV DL,DRIVE | ||
| 671 | INC DL | ||
| 672 | MOV AH,GET_DPB | ||
| 673 | PUSH DS | ||
| 674 | INT 21H | ||
| 675 | INC AL | ||
| 676 | JZ DRVERR | ||
| 677 | MOV DX,WORD PTR [BX+13] | ||
| 678 | DEC DX | ||
| 679 | MOV AL,BYTE PTR [BX+4] | ||
| 680 | INC AL | ||
| 681 | MOV CX,WORD PTR [BX+2] | ||
| 682 | POP DS | ||
| 683 | RET | ||
| 684 | DRVERR: | ||
| 685 | POP DS | ||
| 686 | MOV DX,OFFSET INVDRV | ||
| 687 | JMP PERROR | ||
| 688 | |||
| 689 | ;Clear the FAT and directory and set Dirty byte in the FAT | ||
| 690 | CLEAR: | ||
| 691 | MOV AL,FATID | ||
| 692 | OR AL,0F8H ;Make sure it's a legal value | ||
| 693 | MOV AH,0FFH | ||
| 694 | MOV DI,FATSPACE | ||
| 695 | MOV WORD PTR[DI],AX | ||
| 696 | MOV BYTE PTR[DI+2],AH | ||
| 697 | MOV AH,DISK_RESET | ||
| 698 | INT 21H | ||
| 699 | CALL WRTFAT | ||
| 700 | |||
| 701 | IF IBMJAPVER | ||
| 702 | PUSH DS | ||
| 703 | MOV DL,[DRIVE] ;GET THE DRIVE PARAMETER | ||
| 704 | INC DL | ||
| 705 | MOV AH,32H | ||
| 706 | INT 21H | ||
| 707 | |||
| 708 | MOV DPB_FIRST_ACCESS[BX],-1 ;FORCE MEDIA CHANGE | ||
| 709 | POP DS | ||
| 710 | ENDIF | ||
| 711 | |||
| 712 | CALL FDPB | ||
| 713 | MOV WORD PTR FDSKSIZ,DX | ||
| 714 | MOV SECSIZ,CX | ||
| 715 | MOV AH,0 | ||
| 716 | MOV CLUSSIZ,AX | ||
| 717 | SHR DX,1 | ||
| 718 | JNC ROUNDED | ||
| 719 | INC DX | ||
| 720 | ROUNDED: | ||
| 721 | ADD DX,WORD PTR FDSKSIZ | ||
| 722 | XOR AX,AX | ||
| 723 | MOV CX,DX | ||
| 724 | MOV DI,FATSPACE | ||
| 725 | ADD DI,3 | ||
| 726 | REP STOSB | ||
| 727 | MOV AH,DISK_RESET | ||
| 728 | INT 21H | ||
| 729 | CALL WRTFAT | ||
| 730 | MOV DL,[DRIVE] | ||
| 731 | ADD DL,'A' | ||
| 732 | MOV [ROOTSTR],DL | ||
| 733 | MOV DX,OFFSET ROOTSTR | ||
| 734 | MOV AH,CHDIR | ||
| 735 | INT 21H ;Go to root on target drive | ||
| 736 | MOV AL,DRIVE | ||
| 737 | INC AL | ||
| 738 | MOV ALLDRV,AL | ||
| 739 | MOV AH,FCB_DELETE | ||
| 740 | MOV DX,OFFSET ALLFILE | ||
| 741 | INT 21H | ||
| 742 | |||
| 743 | TEST SWITCHMAP,OLDSW ;See if E5 terminated DIR requested | ||
| 744 | JZ RET25 | ||
| 745 | MOV AL,DRIVE | ||
| 746 | INC AL | ||
| 747 | MOV BYTE PTR CLEANFILE,AL ;Get the drive | ||
| 748 | MOV DX,OFFSET CLEANFILE | ||
| 749 | MOV AH,FCB_CREATE | ||
| 750 | MAKE_NEXT: | ||
| 751 | INT 21H | ||
| 752 | OR AL,AL | ||
| 753 | JNZ DELETE_THEM | ||
| 754 | INC BYTE PTR CLNNAM | ||
| 755 | CMP BYTE PTR CLNNAM,"Z" + 1 | ||
| 756 | JNZ MAKE_NEXT | ||
| 757 | MOV BYTE PTR CLNNAM,"A" | ||
| 758 | INC BYTE PTR CLNNAM + 1 | ||
| 759 | CMP BYTE PTR CLNNAM + 1,"Z" + 1 | ||
| 760 | JNZ MAKE_NEXT | ||
| 761 | MOV BYTE PTR CLNNAM + 1,"A" | ||
| 762 | INC BYTE PTR CLNNAM + 2 | ||
| 763 | JMP MAKE_NEXT | ||
| 764 | |||
| 765 | DELETE_THEM: | ||
| 766 | MOV WORD PTR CLNNAM,"??" | ||
| 767 | MOV BYTE PTR CLNNAM + 2,"?" | ||
| 768 | MOV AH,FCB_DELETE | ||
| 769 | INT 21H | ||
| 770 | RET25: | ||
| 771 | RET ;And return | ||
| 772 | |||
| 773 | |||
| 774 | ;***************************************** | ||
| 775 | ; Process V switch if set | ||
| 776 | |||
| 777 | VOLID: | ||
| 778 | TEST [SWITCHMAP],VOLSW | ||
| 779 | JNZ DOVOL | ||
| 780 | VRET: CLC | ||
| 781 | RET | ||
| 782 | |||
| 783 | DOVOL: | ||
| 784 | PUSH CX | ||
| 785 | PUSH SI | ||
| 786 | PUSH DI | ||
| 787 | PUSH ES | ||
| 788 | PUSH DS | ||
| 789 | POP ES | ||
| 790 | VOL_LOOP: | ||
| 791 | MOV AL,DRIVE | ||
| 792 | INC AL | ||
| 793 | MOV DS:BYTE PTR[VOLFCB+7],AL | ||
| 794 | MOV DX,OFFSET LABPRMT | ||
| 795 | CALL PRINT | ||
| 796 | MOV DX,OFFSET INBUFF | ||
| 797 | MOV AH,STD_CON_STRING_INPUT | ||
| 798 | INT 21H | ||
| 799 | MOV DX,OFFSET CRLFMSG | ||
| 800 | CALL PRINT | ||
| 801 | MOV DX,OFFSET CRLFMSG | ||
| 802 | CALL PRINT | ||
| 803 | MOV CL,[INBUFF+1] | ||
| 804 | OR CL,CL | ||
| 805 | JZ VOLRET | ||
| 806 | XOR CH,CH | ||
| 807 | MOV SI,OFFSET INBUFF+2 | ||
| 808 | MOV DI,SI | ||
| 809 | ADD DI,CX | ||
| 810 | MOV CX,11 | ||
| 811 | MOV AL,' ' | ||
| 812 | REP STOSB | ||
| 813 | MOV CX,5 | ||
| 814 | MOV DI,OFFSET VOLNAM | ||
| 815 | REP MOVSW | ||
| 816 | MOVSB | ||
| 817 | MOV DX,OFFSET VOLFCB | ||
| 818 | MOV AH,FCB_CREATE | ||
| 819 | INT 21H | ||
| 820 | OR AL,AL | ||
| 821 | JZ GOOD_CREATE | ||
| 822 | MOV DX,OFFSET INVCHR ;PRINT INVALID CHARS MESSAGE | ||
| 823 | CALL PRINT | ||
| 824 | JMP VOL_LOOP | ||
| 825 | GOOD_CREATE: | ||
| 826 | MOV DX,OFFSET VOLFCB | ||
| 827 | MOV AH,FCB_CLOSE | ||
| 828 | INT 21H | ||
| 829 | CALL CRLF | ||
| 830 | VOLRET: | ||
| 831 | POP ES | ||
| 832 | POP DI | ||
| 833 | POP SI | ||
| 834 | POP CX | ||
| 835 | RET | ||
| 836 | |||
| 837 | ;**************************************** | ||
| 838 | ;Copy IO.SYS, MSDOS.SYS and COMMAND.COM into data area. | ||
| 839 | ; Carry set if problems | ||
| 840 | |||
| 841 | READDOS: | ||
| 842 | CALL TESTSYSDISK | ||
| 843 | JNC RDFILS | ||
| 844 | RET | ||
| 845 | |||
| 846 | RDFILS: | ||
| 847 | MOV BYTE PTR [FILSTAT],0 | ||
| 848 | MOV BX,[BIOSHandle] | ||
| 849 | MOV AX,[MSTART] | ||
| 850 | MOV DX,AX | ||
| 851 | ADD DX,[MSIZE] ; CX first bad para | ||
| 852 | MOV [BIOSSTRT],AX | ||
| 853 | MOV CX,[BIOSSIZP] | ||
| 854 | ADD AX,CX | ||
| 855 | CMP AX,DX | ||
| 856 | JBE GOTBIOS | ||
| 857 | MOV BYTE PTR [FILSTAT],00000001B ; Got part of BIOS | ||
| 858 | MOV SI,[MSIZE] | ||
| 859 | XOR DI,DI | ||
| 860 | CALL DISIX4 | ||
| 861 | MOV DS,[BIOSSTRT] | ||
| 862 | ASSUME DS:NOTHING | ||
| 863 | CALL READFILE | ||
| 864 | ASSUME DS:CODE | ||
| 865 | JC CLSALL | ||
| 866 | XOR DX,DX | ||
| 867 | MOV CX,DX | ||
| 868 | MOV AX,(LSEEK SHL 8) OR 1 | ||
| 869 | INT 21H | ||
| 870 | MOV WORD PTR [BIOSOFFS],AX | ||
| 871 | MOV WORD PTR [BIOSOFFS+2],DX | ||
| 872 | FILESDONE: | ||
| 873 | CLC | ||
| 874 | CLSALL: | ||
| 875 | PUSHF | ||
| 876 | CALL COMCLS | ||
| 877 | POPF | ||
| 878 | RET | ||
| 879 | |||
| 880 | GOTBIOS: | ||
| 881 | MOV BYTE PTR [FILSTAT],00000010B ; Got all of BIOS | ||
| 882 | LES SI,[BIOSSIZB] | ||
| 883 | MOV DI,ES | ||
| 884 | MOV DS,[BIOSSTRT] | ||
| 885 | ASSUME DS:NOTHING | ||
| 886 | CALL READFILE | ||
| 887 | ASSUME DS:CODE | ||
| 888 | JC CLSALL | ||
| 889 | MOV BX,[DOSHandle] | ||
| 890 | MOV [DOSSTRT],AX | ||
| 891 | CMP AX,DX ; No room left? | ||
| 892 | JZ CLSALL ; Yes | ||
| 893 | MOV CX,[DOSSIZP] | ||
| 894 | ADD AX,CX | ||
| 895 | CMP AX,DX | ||
| 896 | JBE GOTDOS | ||
| 897 | OR BYTE PTR [FILSTAT],00000100B ; Got part of DOS | ||
| 898 | SUB DX,[DOSSTRT] | ||
| 899 | MOV SI,DX | ||
| 900 | XOR DI,DI | ||
| 901 | CALL DISIX4 | ||
| 902 | MOV DS,[DOSSTRT] | ||
| 903 | ASSUME DS:NOTHING | ||
| 904 | CALL READFILE | ||
| 905 | ASSUME DS:CODE | ||
| 906 | JC CLSALL | ||
| 907 | XOR DX,DX | ||
| 908 | MOV CX,DX | ||
| 909 | MOV AX,(LSEEK SHL 8) OR 1 | ||
| 910 | INT 21H | ||
| 911 | MOV WORD PTR [DOSOFFS],AX | ||
| 912 | MOV WORD PTR [DOSOFFS+2],DX | ||
| 913 | JMP FILESDONE | ||
| 914 | |||
| 915 | GOTDOS: | ||
| 916 | OR BYTE PTR [FILSTAT],00001000B ; Got all of DOS | ||
| 917 | LES SI,[DOSSIZB] | ||
| 918 | MOV DI,ES | ||
| 919 | MOV DS,[DOSSTRT] | ||
| 920 | ASSUME DS:NOTHING | ||
| 921 | CALL READFILE | ||
| 922 | ASSUME DS:CODE | ||
| 923 | CLSALLJ: JC CLSALL | ||
| 924 | MOV BX,[COMHandle] | ||
| 925 | MOV [COMSTRT],AX | ||
| 926 | CMP AX,DX ; No room left? | ||
| 927 | JZ CLSALL ; Yes | ||
| 928 | MOV CX,[COMSIZP] | ||
| 929 | ADD AX,CX | ||
| 930 | CMP AX,DX | ||
| 931 | JBE GOTCOM | ||
| 932 | OR BYTE PTR [FILSTAT],00010000B ; Got part of COMMAND | ||
| 933 | SUB DX,[COMSTRT] | ||
| 934 | MOV SI,DX | ||
| 935 | XOR DI,DI | ||
| 936 | CALL DISIX4 | ||
| 937 | MOV DS,[COMSTRT] | ||
| 938 | ASSUME DS:NOTHING | ||
| 939 | CALL READFILE | ||
| 940 | ASSUME DS:CODE | ||
| 941 | JC CLSALLJ | ||
| 942 | XOR DX,DX | ||
| 943 | MOV CX,DX | ||
| 944 | MOV AX,(LSEEK SHL 8) OR 1 | ||
| 945 | INT 21H | ||
| 946 | MOV WORD PTR [COMOFFS],AX | ||
| 947 | MOV WORD PTR [COMOFFS+2],DX | ||
| 948 | JMP FILESDONE | ||
| 949 | |||
| 950 | GOTCOM: | ||
| 951 | OR BYTE PTR [FILSTAT],00100000B ; Got all of COMMAND | ||
| 952 | LES SI,[COMSIZB] | ||
| 953 | MOV DI,ES | ||
| 954 | MOV DS,[COMSTRT] | ||
| 955 | ASSUME DS:NOTHING | ||
| 956 | CALL READFILE | ||
| 957 | ASSUME DS:CODE | ||
| 958 | JMP CLSALL | ||
| 959 | |||
| 960 | ;************************************************** | ||
| 961 | ;Write BIOS DOS COMMAND to the newly formatted disk. | ||
| 962 | |||
| 963 | WRITEDOS: | ||
| 964 | MOV CX,BIOSATT | ||
| 965 | MOV DX,OFFSET BIOSFIL | ||
| 966 | LES SI,[BIOSSIZB] | ||
| 967 | MOV DI,ES | ||
| 968 | CALL MAKEFIL | ||
| 969 | JNC GOTNBIO | ||
| 970 | RET34: RET | ||
| 971 | |||
| 972 | GOTNBIO: | ||
| 973 | MOV [TempHandle],BX | ||
| 974 | TEST BYTE PTR FILSTAT,00000010B | ||
| 975 | JNZ GOTALLBIO | ||
| 976 | LES SI,[BIOSOFFS] | ||
| 977 | MOV DI,ES | ||
| 978 | MOV WORD PTR [IOCNT],SI | ||
| 979 | MOV WORD PTR [IOCNT+2],DI | ||
| 980 | MOV BP,OFFSET BIOSData | ||
| 981 | CALL GOTTARG | ||
| 982 | JC RET34 | ||
| 983 | JMP SHORT BIOSDONE | ||
| 984 | |||
| 985 | GOTALLBIO: | ||
| 986 | LES SI,[BIOSSIZB] | ||
| 987 | MOV DI,ES | ||
| 988 | MOV DS,[BIOSSTRT] | ||
| 989 | ASSUME DS:NOTHING | ||
| 990 | CALL WRITEFILE | ||
| 991 | ASSUME DS:CODE | ||
| 992 | BIOSDONE: | ||
| 993 | MOV BX,[TempHandle] | ||
| 994 | MOV CX,BTIME | ||
| 995 | MOV DX,BDATE | ||
| 996 | CALL CLOSETARG | ||
| 997 | MOV CX,DOSATT | ||
| 998 | MOV DX,OFFSET DOSFIL | ||
| 999 | LES SI,[DOSSIZB] | ||
| 1000 | MOV DI,ES | ||
| 1001 | CALL MAKEFIL | ||
| 1002 | JC RET34 | ||
| 1003 | |||
| 1004 | GOTNDOS: | ||
| 1005 | MOV [TempHandle],BX | ||
| 1006 | TEST BYTE PTR FILSTAT,00001000B | ||
| 1007 | JNZ GOTALLDOS | ||
| 1008 | MOV BP,OFFSET DOSData | ||
| 1009 | TEST BYTE PTR FILSTAT,00000100B | ||
| 1010 | JNZ PARTDOS | ||
| 1011 | MOV WORD PTR [DOSOFFS],0 | ||
| 1012 | MOV WORD PTR [DOSOFFS+2],0 | ||
| 1013 | CALL GETSYS3 | ||
| 1014 | RET34J: JC RET34 | ||
| 1015 | JMP SHORT DOSDONE | ||
| 1016 | |||
| 1017 | PARTDOS: | ||
| 1018 | LES SI,[DOSOFFS] | ||
| 1019 | MOV DI,ES | ||
| 1020 | MOV WORD PTR [IOCNT],SI | ||
| 1021 | MOV WORD PTR [IOCNT+2],DI | ||
| 1022 | CALL GOTTARG | ||
| 1023 | JC RET34J | ||
| 1024 | JMP SHORT DOSDONE | ||
| 1025 | |||
| 1026 | GOTALLDOS: | ||
| 1027 | LES SI,[DOSSIZB] | ||
| 1028 | MOV DI,ES | ||
| 1029 | MOV DS,[DOSSTRT] | ||
| 1030 | ASSUME DS:NOTHING | ||
| 1031 | CALL WRITEFILE | ||
| 1032 | ASSUME DS:CODE | ||
| 1033 | DOSDONE: | ||
| 1034 | MOV BX,[TempHandle] | ||
| 1035 | MOV CX,DTIME | ||
| 1036 | MOV DX,DDATE | ||
| 1037 | CALL CLOSETARG | ||
| 1038 | MOV CX,COMATT | ||
| 1039 | MOV DX,OFFSET COMFIL | ||
| 1040 | LES SI,[COMSIZB] | ||
| 1041 | MOV DI,ES | ||
| 1042 | CALL MAKEFIL | ||
| 1043 | JNC GOTNCOM | ||
| 1044 | RET35: RET | ||
| 1045 | |||
| 1046 | GOTNCOM: | ||
| 1047 | MOV [TempHandle],BX | ||
| 1048 | TEST BYTE PTR FILSTAT,00100000B | ||
| 1049 | JNZ GOTALLCOM | ||
| 1050 | MOV BP,OFFSET COMData | ||
| 1051 | TEST BYTE PTR FILSTAT,00010000B | ||
| 1052 | JNZ PARTCOM | ||
| 1053 | MOV WORD PTR [COMOFFS],0 | ||
| 1054 | MOV WORD PTR [COMOFFS+2],0 | ||
| 1055 | CALL GETSYS3 | ||
| 1056 | JC RET35 | ||
| 1057 | JMP SHORT COMDONE | ||
| 1058 | |||
| 1059 | PARTCOM: | ||
| 1060 | LES SI,[COMOFFS] | ||
| 1061 | MOV DI,ES | ||
| 1062 | MOV WORD PTR [IOCNT],SI | ||
| 1063 | MOV WORD PTR [IOCNT+2],DI | ||
| 1064 | CALL GOTTARG | ||
| 1065 | JC RET35 | ||
| 1066 | JMP SHORT COMDONE | ||
| 1067 | |||
| 1068 | GOTALLCOM: | ||
| 1069 | LES SI,[COMSIZB] | ||
| 1070 | MOV DI,ES | ||
| 1071 | MOV DS,[COMSTRT] | ||
| 1072 | ASSUME DS:NOTHING | ||
| 1073 | CALL WRITEFILE | ||
| 1074 | ASSUME DS:CODE | ||
| 1075 | COMDONE: | ||
| 1076 | MOV BX,[TempHandle] | ||
| 1077 | MOV CX,CTIME | ||
| 1078 | MOV DX,CDATE | ||
| 1079 | CALL CLOSETARG | ||
| 1080 | CMP BYTE PTR [FILSTAT],00101010B | ||
| 1081 | JZ NOREDOS | ||
| 1082 | RDFRST2: | ||
| 1083 | CALL READDOS ; Start back with BIOS | ||
| 1084 | JNC NOREDOS | ||
| 1085 | CALL SYSPRM ;Prompt for system disk | ||
| 1086 | JMP RDFRST2 ;Try again | ||
| 1087 | NOREDOS: | ||
| 1088 | CLC | ||
| 1089 | RET | ||
| 1090 | |||
| 1091 | ;********************************************* | ||
| 1092 | ; Create a file on target disk | ||
| 1093 | ; CX = attributes, DX points to name | ||
| 1094 | ; DI:SI is size file is to have | ||
| 1095 | ; | ||
| 1096 | ; There is a bug in DOS 2.00 and 2.01 having to do with writes | ||
| 1097 | ; from the end of memory. In order to circumvent it this routine | ||
| 1098 | ; must create files with the length in DI:SI | ||
| 1099 | ; | ||
| 1100 | ; On return BX is handle, carry set if problem | ||
| 1101 | |||
| 1102 | MAKEFIL: | ||
| 1103 | MOV BX,DX | ||
| 1104 | PUSH WORD PTR [BX] | ||
| 1105 | MOV AL,TARGDRV | ||
| 1106 | MOV [BX],AL | ||
| 1107 | MOV AH,CREAT | ||
| 1108 | INT 21H | ||
| 1109 | POP WORD PTR [BX] | ||
| 1110 | MOV BX,AX | ||
| 1111 | JC RET50 | ||
| 1112 | MOV CX,DI | ||
| 1113 | MOV DX,SI | ||
| 1114 | MOV AX,LSEEK SHL 8 | ||
| 1115 | INT 21H ; Seek to eventual EOF | ||
| 1116 | XOR CX,CX | ||
| 1117 | MOV AH,WRITE | ||
| 1118 | INT 21H ; Set size of file to position | ||
| 1119 | XOR CX,CX | ||
| 1120 | MOV DX,CX | ||
| 1121 | MOV AX,LSEEK SHL 8 | ||
| 1122 | INT 21H ; Seek back to start | ||
| 1123 | RET50: | ||
| 1124 | RET | ||
| 1125 | |||
| 1126 | ;********************************************* | ||
| 1127 | ; Close a file on the target disk | ||
| 1128 | ; CX/DX is time/date, BX is handle | ||
| 1129 | |||
| 1130 | CLOSETARG: | ||
| 1131 | MOV AX,(FILE_TIMES SHL 8) OR 1 | ||
| 1132 | INT 21H | ||
| 1133 | MOV AH,CLOSE | ||
| 1134 | INT 21H | ||
| 1135 | RET | ||
| 1136 | |||
| 1137 | SAVUDIRS: | ||
| 1138 | XOR DL,DL | ||
| 1139 | MOV SI,OFFSET USERDIRS | ||
| 1140 | MOV BYTE PTR [SI],'\' | ||
| 1141 | INC SI | ||
| 1142 | MOV AH,CURRENT_DIR | ||
| 1143 | INT 21H | ||
| 1144 | RET43: RET | ||
| 1145 | |||
| 1146 | |||
| 1147 | RESTUDIR: | ||
| 1148 | TEST SWITCHMAP,SYSSW | ||
| 1149 | JZ RET43 | ||
| 1150 | MOV DX,OFFSET USERDIRS | ||
| 1151 | MOV AH,CHDIR | ||
| 1152 | INT 21H ; Restore users DIR | ||
| 1153 | RET | ||
| 1154 | |||
| 1155 | INT_23: | ||
| 1156 | PUSH CS | ||
| 1157 | POP DS | ||
| 1158 | JMP FEXIT | ||
| 1159 | |||
| 1160 | ;**************************************** | ||
| 1161 | ; Transfer system files | ||
| 1162 | ; BP points to data structure for file involved | ||
| 1163 | ; offset is set to current amount read in | ||
| 1164 | ; Start set to start of file in buffer | ||
| 1165 | ; TempHandle is handle to write to on target | ||
| 1166 | |||
| 1167 | IOLOOP: | ||
| 1168 | MOV AL,[SYSDRV] | ||
| 1169 | CMP AL,[TARGDRV] | ||
| 1170 | JNZ GOTTARG | ||
| 1171 | MOV AH,DISK_RESET | ||
| 1172 | INT 21H | ||
| 1173 | CALL TARGPRM ;Get target disk | ||
| 1174 | |||
| 1175 | GOTTARG: | ||
| 1176 | ;Enter here if some of file is already in buffer, IOCNT must be set | ||
| 1177 | ; to size already in buffer. | ||
| 1178 | MOV BX,[TempHandle] | ||
| 1179 | MOV SI,WORD PTR [IOCNT] | ||
| 1180 | MOV DI,WORD PTR [IOCNT+2] | ||
| 1181 | MOV DS,[BP.FILE_START] | ||
| 1182 | ASSUME DS:NOTHING | ||
| 1183 | CALL WRITEFILE ; Write next part | ||
| 1184 | ASSUME DS:CODE | ||
| 1185 | JNC TESTDONE | ||
| 1186 | RET | ||
| 1187 | |||
| 1188 | TESTDONE: | ||
| 1189 | LES AX,[BP.FILE_OFFSET] | ||
| 1190 | CMP AX,WORD PTR [BP.FILE_SIZEB] | ||
| 1191 | JNZ GETSYS3 | ||
| 1192 | MOV AX,ES | ||
| 1193 | CMP AX,WORD PTR [BP.FILE_SIZEB+2] | ||
| 1194 | JNZ GETSYS3 | ||
| 1195 | RET ; Carry clear from CMP | ||
| 1196 | |||
| 1197 | GETSYS3: | ||
| 1198 | ;Enter here if none of file is in buffer | ||
| 1199 | MOV AX,[MSTART] ; Furthur IO done starting here | ||
| 1200 | MOV [BP.FILE_START],AX | ||
| 1201 | MOV AL,[SYSDRV] | ||
| 1202 | CMP AL,[TARGDRV] | ||
| 1203 | JNZ TESTSYS | ||
| 1204 | MOV AH,DISK_RESET | ||
| 1205 | INT 21H | ||
| 1206 | GSYS: | ||
| 1207 | CALL SYSPRM ;Prompt for system disk | ||
| 1208 | TESTSYS: | ||
| 1209 | CALL TESTSYSDISK | ||
| 1210 | JC GSYS | ||
| 1211 | MOV BX,[BP.FILE_HANDLE] | ||
| 1212 | LES DX,[BP.FILE_OFFSET] | ||
| 1213 | PUSH DX | ||
| 1214 | MOV CX,ES | ||
| 1215 | MOV AX,LSEEK SHL 8 | ||
| 1216 | INT 21H | ||
| 1217 | POP DX | ||
| 1218 | LES SI,[BP.FILE_SIZEB] | ||
| 1219 | MOV DI,ES | ||
| 1220 | SUB SI,DX | ||
| 1221 | SBB DI,CX ; DI:SI is #bytes to go | ||
| 1222 | PUSH DI | ||
| 1223 | PUSH SI | ||
| 1224 | ADD SI,15 | ||
| 1225 | ADC DI,0 | ||
| 1226 | CALL DISID4 | ||
| 1227 | MOV AX,SI | ||
| 1228 | POP SI | ||
| 1229 | POP DI | ||
| 1230 | CMP AX,[MSIZE] | ||
| 1231 | JBE GOTSIZ2 | ||
| 1232 | MOV SI,[MSIZE] | ||
| 1233 | XOR DI,DI | ||
| 1234 | CALL DISIX4 | ||
| 1235 | GOTSIZ2: | ||
| 1236 | MOV WORD PTR [IOCNT],SI | ||
| 1237 | MOV WORD PTR [IOCNT+2],DI | ||
| 1238 | MOV DS,[MSTART] | ||
| 1239 | ASSUME DS:NOTHING | ||
| 1240 | CALL READFILE | ||
| 1241 | ASSUME DS:CODE | ||
| 1242 | JNC GETOFFS | ||
| 1243 | CALL CLSALL | ||
| 1244 | JMP GSYS | ||
| 1245 | GETOFFS: | ||
| 1246 | XOR DX,DX | ||
| 1247 | MOV CX,DX | ||
| 1248 | MOV AX,(LSEEK SHL 8) OR 1 | ||
| 1249 | INT 21H | ||
| 1250 | MOV WORD PTR [BP.FILE_OFFSET],AX | ||
| 1251 | MOV WORD PTR [BP.FILE_OFFSET+2],DX | ||
| 1252 | CALL CLSALL | ||
| 1253 | JMP IOLOOP | ||
| 1254 | |||
| 1255 | ;************************************************* | ||
| 1256 | ; Test to see if correct system disk. Open handles | ||
| 1257 | |||
| 1258 | TESTSYSDISK: | ||
| 1259 | MOV AX,OPEN SHL 8 | ||
| 1260 | MOV DX,OFFSET BIOSFIL | ||
| 1261 | INT 21H | ||
| 1262 | JNC SETBIOS | ||
| 1263 | CRET12: STC | ||
| 1264 | RET12: RET | ||
| 1265 | |||
| 1266 | SETBIOS: | ||
| 1267 | MOV [BIOSHandle],AX | ||
| 1268 | MOV BX,AX | ||
| 1269 | CALL GETFSIZ | ||
| 1270 | CMP [BIOSSIZP],0 | ||
| 1271 | JZ SETBIOSSIZ | ||
| 1272 | CMP [BIOSSIZP],AX | ||
| 1273 | JZ SETBIOSSIZ | ||
| 1274 | BIOSCLS: | ||
| 1275 | MOV AH,CLOSE | ||
| 1276 | MOV BX,[BIOSHandle] | ||
| 1277 | INT 21H | ||
| 1278 | JMP CRET12 | ||
| 1279 | |||
| 1280 | SETBIOSSIZ: | ||
| 1281 | MOV [BIOSSIZP],AX | ||
| 1282 | MOV WORD PTR [BIOSSIZB],SI | ||
| 1283 | MOV WORD PTR [BIOSSIZB+2],DI | ||
| 1284 | MOV [BDATE],DX | ||
| 1285 | MOV [BTIME],CX | ||
| 1286 | MOV AX,OPEN SHL 8 | ||
| 1287 | MOV DX,OFFSET DOSFIL | ||
| 1288 | INT 21H | ||
| 1289 | JNC DOSOPNOK | ||
| 1290 | JMP BIOSCLS | ||
| 1291 | |||
| 1292 | DOSOPNOK: | ||
| 1293 | MOV [DOSHandle],AX | ||
| 1294 | MOV BX,AX | ||
| 1295 | CALL GETFSIZ | ||
| 1296 | CMP [DOSSIZP],0 | ||
| 1297 | JZ SETDOSSIZ | ||
| 1298 | CMP [DOSSIZP],AX | ||
| 1299 | JZ SETDOSSIZ | ||
| 1300 | DOSCLS: | ||
| 1301 | MOV AH,CLOSE | ||
| 1302 | MOV BX,[DOSHandle] | ||
| 1303 | INT 21H | ||
| 1304 | JMP BIOSCLS | ||
| 1305 | |||
| 1306 | SETDOSSIZ: | ||
| 1307 | MOV [DOSSIZP],AX | ||
| 1308 | MOV WORD PTR [DOSSIZB],SI | ||
| 1309 | MOV WORD PTR [DOSSIZB+2],DI | ||
| 1310 | MOV [DDATE],DX | ||
| 1311 | MOV [DTIME],CX | ||
| 1312 | MOV AX,OPEN SHL 8 | ||
| 1313 | MOV DX,OFFSET COMFIL | ||
| 1314 | INT 21H | ||
| 1315 | JC DOSCLS | ||
| 1316 | MOV [COMHandle],AX | ||
| 1317 | MOV BX,AX | ||
| 1318 | CALL GETFSIZ | ||
| 1319 | CMP [COMSIZP],0 | ||
| 1320 | JZ SETCOMSIZ | ||
| 1321 | CMP [COMSIZP],AX | ||
| 1322 | JZ SETCOMSIZ | ||
| 1323 | COMCLS: | ||
| 1324 | MOV AH,CLOSE | ||
| 1325 | MOV BX,[COMHandle] | ||
| 1326 | INT 21H | ||
| 1327 | JMP DOSCLS | ||
| 1328 | |||
| 1329 | SETCOMSIZ: | ||
| 1330 | MOV [COMSIZP],AX | ||
| 1331 | MOV WORD PTR [COMSIZB],SI | ||
| 1332 | MOV WORD PTR [COMSIZB+2],DI | ||
| 1333 | MOV [CDATE],DX | ||
| 1334 | MOV [CTIME],CX | ||
| 1335 | CLC | ||
| 1336 | RET | ||
| 1337 | |||
| 1338 | ;******************************************* | ||
| 1339 | ; Handle in BX, return file size in para in AX | ||
| 1340 | ; File size in bytes DI:SI, file date in DX, file | ||
| 1341 | ; time in CX. | ||
| 1342 | |||
| 1343 | GETFSIZ: | ||
| 1344 | MOV AX,(LSEEK SHL 8) OR 2 | ||
| 1345 | XOR CX,CX | ||
| 1346 | MOV DX,CX | ||
| 1347 | INT 21H | ||
| 1348 | MOV SI,AX | ||
| 1349 | MOV DI,DX | ||
| 1350 | ADD AX,15 ; Para round up | ||
| 1351 | ADC DX,0 | ||
| 1352 | AND DX,0FH ; If the file is larger than this | ||
| 1353 | ; it is bigger than the 8086 address space! | ||
| 1354 | MOV CL,12 | ||
| 1355 | SHL DX,CL | ||
| 1356 | MOV CL,4 | ||
| 1357 | SHR AX,CL | ||
| 1358 | OR AX,DX | ||
| 1359 | PUSH AX | ||
| 1360 | MOV AX,LSEEK SHL 8 | ||
| 1361 | XOR CX,CX | ||
| 1362 | MOV DX,CX | ||
| 1363 | INT 21H | ||
| 1364 | MOV AX,FILE_TIMES SHL 8 | ||
| 1365 | INT 21H | ||
| 1366 | POP AX | ||
| 1367 | RET | ||
| 1368 | |||
| 1369 | ;******************************************** | ||
| 1370 | ; Read/Write file | ||
| 1371 | ; DS:0 is Xaddr | ||
| 1372 | ; DI:SI is byte count to I/O | ||
| 1373 | ; BX is handle | ||
| 1374 | ; Carry set if screw up | ||
| 1375 | ; | ||
| 1376 | ; I/O SI bytes | ||
| 1377 | ; I/O 64K - 1 bytes DI times | ||
| 1378 | ; I/O DI bytes | ||
| 1379 | ; DS=CS on output | ||
| 1380 | |||
| 1381 | |||
| 1382 | READFILE: | ||
| 1383 | ; Must preserve AX,DX | ||
| 1384 | PUSH AX | ||
| 1385 | PUSH DX | ||
| 1386 | PUSH BP | ||
| 1387 | MOV BP,READ SHL 8 | ||
| 1388 | CALL FILIO | ||
| 1389 | POP BP | ||
| 1390 | POP DX | ||
| 1391 | POP AX | ||
| 1392 | PUSH CS | ||
| 1393 | POP DS | ||
| 1394 | RET | ||
| 1395 | |||
| 1396 | WRITEFILE: | ||
| 1397 | PUSH BP | ||
| 1398 | MOV BP,WRITE SHL 8 | ||
| 1399 | CALL FILIO | ||
| 1400 | POP BP | ||
| 1401 | PUSH CS | ||
| 1402 | POP DS | ||
| 1403 | RET | ||
| 1404 | |||
| 1405 | FILIO: | ||
| 1406 | XOR DX,DX | ||
| 1407 | MOV CX,SI | ||
| 1408 | JCXZ K64IO | ||
| 1409 | MOV AX,BP | ||
| 1410 | INT 21H | ||
| 1411 | JC IORET | ||
| 1412 | ADD DX,AX | ||
| 1413 | CMP AX,CX ; If not =, AX<CX, carry set. | ||
| 1414 | JNZ IORET | ||
| 1415 | CALL NORMALIZE | ||
| 1416 | K64IO: | ||
| 1417 | CLC | ||
| 1418 | MOV CX,DI | ||
| 1419 | JCXZ IORET | ||
| 1420 | MOV AX,BP | ||
| 1421 | INT 21H | ||
| 1422 | JC IORET | ||
| 1423 | ADD DX,AX | ||
| 1424 | CMP AX,CX ; If not =, AX<CX, carry set. | ||
| 1425 | JNZ IORET | ||
| 1426 | CALL NORMALIZE | ||
| 1427 | MOV CX,DI | ||
| 1428 | K64M1: | ||
| 1429 | PUSH CX | ||
| 1430 | XOR AX,AX | ||
| 1431 | OR DX,DX | ||
| 1432 | JZ NORMIO | ||
| 1433 | MOV CX,10H | ||
| 1434 | SUB CX,DX | ||
| 1435 | MOV AX,BP | ||
| 1436 | INT 21H | ||
| 1437 | JC IORETP | ||
| 1438 | ADD DX,AX | ||
| 1439 | CMP AX,CX ; If not =, AX<CX, carry set. | ||
| 1440 | JNZ IORETP | ||
| 1441 | CALL NORMALIZE | ||
| 1442 | NORMIO: | ||
| 1443 | MOV CX,0FFFFH | ||
| 1444 | SUB CX,AX | ||
| 1445 | MOV AX,BP | ||
| 1446 | INT 21H | ||
| 1447 | JC IORETP | ||
| 1448 | ADD DX,AX | ||
| 1449 | CMP AX,CX ; If not =, AX<CX, carry set. | ||
| 1450 | JNZ IORETP | ||
| 1451 | CALL NORMALIZE ; Clears carry | ||
| 1452 | POP CX | ||
| 1453 | LOOP K64M1 | ||
| 1454 | PUSH CX | ||
| 1455 | IORETP: | ||
| 1456 | POP CX | ||
| 1457 | IORET: | ||
| 1458 | RET | ||
| 1459 | |||
| 1460 | |||
| 1461 | ;********************************* | ||
| 1462 | ; Shift DI:SI left 4 bits | ||
| 1463 | DISIX4: | ||
| 1464 | MOV CX,4 | ||
| 1465 | SH32: | ||
| 1466 | SHL SI,1 | ||
| 1467 | RCL DI,1 | ||
| 1468 | LOOP SH32 | ||
| 1469 | RET | ||
| 1470 | |||
| 1471 | ;********************************* | ||
| 1472 | ; Shift DI:SI right 4 bits | ||
| 1473 | DISID4: | ||
| 1474 | MOV CX,4 | ||
| 1475 | SH32B: | ||
| 1476 | SHR DI,1 | ||
| 1477 | RCR SI,1 | ||
| 1478 | LOOP SH32B | ||
| 1479 | RET | ||
| 1480 | |||
| 1481 | ;******************************** | ||
| 1482 | ; Normalize DS:DX | ||
| 1483 | |||
| 1484 | NORMALIZE: | ||
| 1485 | PUSH DX | ||
| 1486 | PUSH AX | ||
| 1487 | SHR DX,1 | ||
| 1488 | SHR DX,1 | ||
| 1489 | SHR DX,1 | ||
| 1490 | SHR DX,1 | ||
| 1491 | MOV AX,DS | ||
| 1492 | ADD AX,DX | ||
| 1493 | MOV DS,AX | ||
| 1494 | POP AX | ||
| 1495 | POP DX | ||
| 1496 | AND DX,0FH ; Clears carry | ||
| 1497 | RET | ||
| 1498 | |||
| 1499 | |||
| 1500 | ROOTSTR DB ? | ||
| 1501 | DB ":" | ||
| 1502 | SWTCH DB "/",0 | ||
| 1503 | DBLFLG DB 0 ;Initialize flags to zero | ||
| 1504 | CLEARFLG DB 0 | ||
| 1505 | DRIVE DB 0 | ||
| 1506 | DEFALT DB 0 ;Default drive | ||
| 1507 | IOCNT DD ? | ||
| 1508 | MSTART DW ? ; Start of sys file buffer (para#) | ||
| 1509 | MSIZE DW ? ; Size of above in paragraphs | ||
| 1510 | TempHandle DW ? | ||
| 1511 | FILSTAT DB ? ; In memory status of files | ||
| 1512 | ; XXXXXX00B BIOS not in | ||
| 1513 | ; XXXXXX01B BIOS partly in | ||
| 1514 | ; XXXXXX10B BIOS all in | ||
| 1515 | ; XXXX00XXB DOS not in | ||
| 1516 | ; XXXX01XXB DOS partly in | ||
| 1517 | ; XXXX10XXB DOS all in | ||
| 1518 | ; XX00XXXXB COMMAND not in | ||
| 1519 | ; XX01XXXXB COMMAND partly in | ||
| 1520 | ; XX10XXXXB COMMAND all in | ||
| 1521 | |||
| 1522 | USERDIRS DB DIRSTRLEN+3 DUP(?) ; Storage for users current directory | ||
| 1523 | |||
| 1524 | BIOSData LABEL BYTE | ||
| 1525 | BIOSHandle DW 0 | ||
| 1526 | BIOSSIZP DW 0 | ||
| 1527 | BIOSSIZB DD ? | ||
| 1528 | BIOSOFFS DD ? | ||
| 1529 | BIOSSTRT DW ? | ||
| 1530 | BDATE DW 0 ;IO system date stored here | ||
| 1531 | BTIME DW 0 ;IO system time stored here | ||
| 1532 | |||
| 1533 | BIOSATT EQU attr_hidden + attr_system + attr_read_only | ||
| 1534 | BIOSFIL LABEL BYTE | ||
| 1535 | BIODRV LABEL BYTE | ||
| 1536 | DB "X:\" | ||
| 1537 | IF IBMVER OR IBMJAPVER | ||
| 1538 | DB "IBMBIO.COM" | ||
| 1539 | ENDIF | ||
| 1540 | IF MSVER | ||
| 1541 | DB "IO.SYS" | ||
| 1542 | ENDIF | ||
| 1543 | DB 0 | ||
| 1544 | |||
| 1545 | DOSData LABEL BYTE | ||
| 1546 | DOSHandle DW 0 | ||
| 1547 | DOSSIZP DW 0 | ||
| 1548 | DOSSIZB DD ? | ||
| 1549 | DOSOFFS DD ? | ||
| 1550 | DOSSTRT DW ? | ||
| 1551 | DDATE DW 0 ;DOS date stored here | ||
| 1552 | DTIME DW 0 ;DOS time | ||
| 1553 | |||
| 1554 | DOSATT EQU attr_hidden + attr_system + attr_read_only | ||
| 1555 | DOSFIL LABEL BYTE | ||
| 1556 | DOSDRV LABEL BYTE | ||
| 1557 | DB "X:\" | ||
| 1558 | IF IBMVER OR IBMJAPVER | ||
| 1559 | DB "IBMDOS.COM" | ||
| 1560 | ENDIF | ||
| 1561 | IF MSVER | ||
| 1562 | DB "MSDOS.SYS" | ||
| 1563 | ENDIF | ||
| 1564 | DB 0 | ||
| 1565 | |||
| 1566 | COMData LABEL BYTE | ||
| 1567 | COMHandle DW 0 | ||
| 1568 | COMSIZP DW 0 | ||
| 1569 | COMSIZB DD ? | ||
| 1570 | COMOFFS DD ? | ||
| 1571 | COMSTRT DW ? | ||
| 1572 | CDATE DW 0 ;Date of COMMAND | ||
| 1573 | CTIME DW 0 ;Time of COMMAND | ||
| 1574 | |||
| 1575 | COMATT EQU 0 | ||
| 1576 | COMFIL LABEL BYTE | ||
| 1577 | COMDRV LABEL BYTE | ||
| 1578 | DB "X:\COMMAND.COM",0 | ||
| 1579 | |||
| 1580 | VOLFCB DB -1,0,0,0,0,0,8 | ||
| 1581 | DB 0 | ||
| 1582 | VOLNAM DB " " | ||
| 1583 | DB 8 | ||
| 1584 | DB 26 DUP(?) | ||
| 1585 | |||
| 1586 | ALLFILE DB -1,0,0,0,0,0,0FFH | ||
| 1587 | ALLDRV DB 0,"???????????" | ||
| 1588 | DB 26 DUP(?) | ||
| 1589 | |||
| 1590 | CLEANFILE DB 0 | ||
| 1591 | CLNNAM DB "AAAFFFFFFOR" | ||
| 1592 | DB 26 DUP(?) | ||
| 1593 | |||
| 1594 | SWITCHMAP DW ? | ||
| 1595 | SWITCHCOPY DW ? | ||
| 1596 | FAT DW ? | ||
| 1597 | DW ? | ||
| 1598 | CLUSSIZ DW ? | ||
| 1599 | SECSIZ DW ? | ||
| 1600 | SYSSIZ DD ? | ||
| 1601 | FDSKSIZ DD ? | ||
| 1602 | BADSIZ DD ? | ||
| 1603 | SYSTRKS DW ? | ||
| 1604 | SECTORS DW ? | ||
| 1605 | INBUFF DB 80,0 | ||
| 1606 | DB 80 DUP(?) | ||
| 1607 | |||
| 1608 | DB 100H DUP(?) | ||
| 1609 | |||
| 1610 | STACK LABEL BYTE | ||
| 1611 | |||
| 1612 | ;For FORMES module | ||
| 1613 | |||
| 1614 | EXTRN BADVER:BYTE,SNGMSG:BYTE,SNGDRV:BYTE,HRDMSG:BYTE,HRDDRV:BYTE | ||
| 1615 | EXTRN LABPRMT:BYTE,TARGMSG:BYTE,TARGDRV:BYTE | ||
| 1616 | EXTRN SYSTRAN:BYTE,CRLFMSG:BYTE,INVCHR:BYTE,INVDRV:BYTE | ||
| 1617 | EXTRN SYSMSG:BYTE,SYSDRV:BYTE,FRMTERR:BYTE,NOTSYS:BYTE | ||
| 1618 | EXTRN NOUSE:BYTE,MEMEX:BYTE,INVPAR:BYTE | ||
| 1619 | |||
| 1620 | IF IBMVER | ||
| 1621 | EXTRN ASGERR:BYTE | ||
| 1622 | ENDIF | ||
| 1623 | |||
| 1624 | CODE ENDS | ||
| 1625 | |||
| 1626 | END START | ||
| 1627 | \ No newline at end of file | ||