diff options
Diffstat (limited to 'v4.0/src/BIOS/MSBIO1.ASM')
| -rw-r--r-- | v4.0/src/BIOS/MSBIO1.ASM | 645 |
1 files changed, 645 insertions, 0 deletions
diff --git a/v4.0/src/BIOS/MSBIO1.ASM b/v4.0/src/BIOS/MSBIO1.ASM new file mode 100644 index 0000000..36dac91 --- /dev/null +++ b/v4.0/src/BIOS/MSBIO1.ASM | |||
| @@ -0,0 +1,645 @@ | |||
| 1 | |||
| 2 | PAGE ,132 ; | ||
| 3 | TITLE MSBIO1.asm - BIOS | ||
| 4 | ;============================================================================== | ||
| 5 | ;REVISION HISTORY: | ||
| 6 | ;AN000 - New for DOS Version 4.00 - J.K. | ||
| 7 | ;AC000 - Changed for DOS Version 4.00 - J.K. | ||
| 8 | ;AN00x - PTM number for DOS Version 4.00 - J.K. | ||
| 9 | ;============================================================================== | ||
| 10 | COMMENT * | ||
| 11 | THE LINK STEP IS PERFORMED BY USING THE FOLLOWING "NEW.ARF" FILE: | ||
| 12 | msbio1+ | ||
| 13 | msSTACK+ | ||
| 14 | MsCON+ | ||
| 15 | msAUX+ | ||
| 16 | msLPT+ | ||
| 17 | msCLOCK+ | ||
| 18 | msdISK+ | ||
| 19 | msBIO2+ | ||
| 20 | C:\BIO2\OLDOBJ\disk+ | ||
| 21 | C:\BIO2\OLDOBJ\msinit+ | ||
| 22 | C:\BIO2\OLDOBJ\sysinit1+ | ||
| 23 | C:\BIO2\OLDOBJ\sysinit2+ | ||
| 24 | C:\BIO2\OLDOBJ\sysimes,msbio,/M; | ||
| 25 | |||
| 26 | THE FOLLOWING IS A BATCH FILE THAT CAN BE USED TO CREATE THE IBMBIO.COM | ||
| 27 | WHERE "LOCSCR" IS A FILE THAT JUST HAS THE NUMBER, 70: | ||
| 28 | |||
| 29 | link @NEW.ARF | ||
| 30 | exe2bin ibmbio ibmbio.com <C:\BIO2\Locscr | ||
| 31 | del ibmbio.exe | ||
| 32 | (END OF COMMENT)* | ||
| 33 | |||
| 34 | ;***For testing purposes, set the TEST flag to 1. Otherwise reset it. | ||
| 35 | |||
| 36 | iTEST=0 | ||
| 37 | |||
| 38 | PATHGEN = 1 | ||
| 39 | |||
| 40 | .SALL | ||
| 41 | %OUT ...MSBIO1.ASM | ||
| 42 | |||
| 43 | ; THIS IS A DOSMAC MACRO WHICH IS USED IN DEVSYM WHICH IS INCLUDED LATER | ||
| 44 | BREAK MACRO SUBTITLE | ||
| 45 | SUBTTL SUBTITLE | ||
| 46 | PAGE | ||
| 47 | ENDM | ||
| 48 | |||
| 49 | POPFF MACRO | ||
| 50 | JMP $+3 | ||
| 51 | IRET | ||
| 52 | PUSH CS | ||
| 53 | CALL $-2 | ||
| 54 | ENDM | ||
| 55 | |||
| 56 | INCLUDE MSGROUP.INC ;DEFINE CODE SEGMENT | ||
| 57 | |||
| 58 | SYSINITSEG SEGMENT PUBLIC 'SYSTEM_INIT' | ||
| 59 | SYSINITSEG ENDS | ||
| 60 | |||
| 61 | |||
| 62 | INCLUDE JUMPMAC.INC | ||
| 63 | PATHSTART MACRO INDEX,ABBR | ||
| 64 | IFDEF PATHGEN | ||
| 65 | PUBLIC ABBR&INDEX&S,ABBR&INDEX&E | ||
| 66 | ABBR&INDEX&S LABEL BYTE | ||
| 67 | ENDIF | ||
| 68 | ENDM | ||
| 69 | |||
| 70 | PATHEND MACRO INDEX,ABBR | ||
| 71 | IFDEF PATHGEN | ||
| 72 | ABBR&INDEX&E LABEL BYTE | ||
| 73 | ENDIF | ||
| 74 | ENDM | ||
| 75 | |||
| 76 | INCLUDE PUSHPOP.INC | ||
| 77 | INCLUDE DEVSYM.INC ;MJB001 | ||
| 78 | |||
| 79 | ; REV 2.1 5/1/83 ARR ADDED TIMER INT HANDLER AND CHANGED ORDER OF AUX | ||
| 80 | ; PRN INIT FOR HAL0 | ||
| 81 | ; | ||
| 82 | ; REV 2.15 7/13/83 ARR BECAUSE IBM IS FUNDAMENTALY BRAIN DAMAGED, AND | ||
| 83 | ; BASCOM IS RUDE ABOUT THE 1CH TIMER INTERRUPT, THE TIMER | ||
| 84 | ; HANDLER HAS TO GO BACK OUT!!!!! IBM SEEMS UNWILLING TO | ||
| 85 | ; BELIEVE THE PROBLEM IS WITH THE BASCOM RUNTIME, NOT THE | ||
| 86 | ; DOS. THEY HAVE EVEN BEEN GIVEN A PATCH FOR BASCOM!!!!! | ||
| 87 | ; THE CORRECT CODE IS COMMENTED OUT AND HAS AN ARR 2.15 | ||
| 88 | ; ANNOTATION. THIS MEANS THE BIOS WILL GO BACK TO THE | ||
| 89 | ; MULTIPLE ROLL OVER BUG. | ||
| 90 | ; REV 2.20 8/5/83 ARR IBM MAKES HARDWARE CHANGE. NOW WANTS TO USE HALF | ||
| 91 | ; HIGHT DRIVES FOR HAL0, AND BACK FIT FOR PC/PC XT. PROBLEM | ||
| 92 | ; WITH HEAD SETTLE TIME. PREVIOUS DRIVES GOT BY ON A 0 | ||
| 93 | ; SETTLE TIME, 1/2 HIGHT DRIVES NEED 15 HEAD SETTLE WHEN | ||
| 94 | ; DOING WRITES (0 OK ON READ) IF THE HEAD IS BEING STEPPED. | ||
| 95 | ; THIS REQUIRES A LAST TRACK VALUE TO BE KEPT SO THAT BIOS | ||
| 96 | ; KNOWS WHEN HEAD IS BEING MOVED. TO HELP OUT STUPID | ||
| 97 | ; PROGRAMS THAT ISSUE INT 13H DIRECTLY, THE HEAD SETTLE WILL | ||
| 98 | ; NORMALLY BE SET TO 15. IT WILL BE CHANGED TO 0 ON READS, | ||
| 99 | ; OR ON WRITES WHICH DO NOT REQUIRE HEAD STEP. | ||
| 100 | ; REV 2.21 8/11/83 MZ IBM WANTS WRITE WITH VERIFY TO USE HEAD SETTLE 0. | ||
| 101 | ; USE SAME TRICK AS ABOVE. | ||
| 102 | ; REV 2.25 6/20/83 MJB001 ADDED SUPPORT FOR 96TPI AND SALMON | ||
| 103 | ; REV 2.30 6/27/83 MJB002 ADDED REAL-TIME CLOCK | ||
| 104 | ; REV 2.40 7/8/83 MJB003 ADDED VOLUME-ID CHECKING AND INT 2F MACRO | ||
| 105 | ; DEFINITIONS PUSH* AND POP* | ||
| 106 | ; REV 2.41 7/12/83 ARR MORE 2.X ENHANCEMENTS. OPEN/CLOSE MEDIA CHANGE | ||
| 107 | ; REV 2.42 11/3/83 ARR MORE 2.X ENHANCEMENTS. DISK OPEN/CLOSE, FORMAT | ||
| 108 | ; CODE AND OTHER MISC HOOKED OUT TO SHRINK BIOS. CODE FOR | ||
| 109 | ; DISK OPEN/CLOSE, FORMAT INCLUDED ONLY WITH 96TPI DISKS. | ||
| 110 | ; REV 2.43 12/6/83 MZ EXAMINE BOOT SECTORS ON HARD DISKS FOR 16-BIT FAT | ||
| 111 | ; CHECK. EXAMINE LARGE FAT BIT IN BPB FOR WALK OF MEDIA FOR | ||
| 112 | ; DOS | ||
| 113 | ; REV 2.44 12/9/83 ARR CHANGE TO ERROR REPORTING ON INT 17H | ||
| 114 | ; REV 2.45 12/22/83 MZ MAKE HEAD SETTLE CHANGE ONLY WHEN DISK PARM IS 0. | ||
| 115 | |||
| 116 | ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: | ||
| 117 | ; | ||
| 118 | ; IBM ADDRESSES FOR I/O | ||
| 119 | ; | ||
| 120 | ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: | ||
| 121 | |||
| 122 | INCLUDE MSDSKPR.INC | ||
| 123 | |||
| 124 | LF = 10 ;LINE FEED | ||
| 125 | CR = 13 ;CARRIAGE RETURN | ||
| 126 | BACKSP = 8 ;BACKSPACE | ||
| 127 | BRKADR = 1BH * 4 ;006C 1BH BREAK VECTOR ADDRESS | ||
| 128 | TIMADR = 1CH * 4 ;0070 1CH TIMER INTERRUPT | ||
| 129 | DSKADR = 1EH * 4 ;ADDRESS OF PTR TO DISK PARAMETERS | ||
| 130 | SEC9 = 522H ;ADDRESS OF DISK PARAMETERS | ||
| 131 | HEADSETTLE = SEC9+9 ; ARR 2.20 ADDRESS OF HEAD SETTLE TIME | ||
| 132 | NORMSETTLE = 15 ; ARR 2.20 NORMAL HEAD SETTLE | ||
| 133 | SPEEDSETTLE = 0 ; ARR 2.20 SPEED UP SETTLE TIME | ||
| 134 | INITSPOT = 534H ; ARR IBM WANTS 4 ZEROS HERE | ||
| 135 | AKPORT = 20H | ||
| 136 | EOI = 20H | ||
| 137 | |||
| 138 | ASSUME CS:CODE,DS:NOTHING,ES:NOTHING | ||
| 139 | |||
| 140 | EXTRN MEDIA$CHK:NEAR | ||
| 141 | EXTRN GET$BPB:NEAR | ||
| 142 | EXTRN DSK$INIT:NEAR | ||
| 143 | EXTRN DSK$READ:NEAR | ||
| 144 | EXTRN DSK$WRIT:NEAR | ||
| 145 | EXTRN DSK$WRITV:NEAR | ||
| 146 | EXTRN DSK$OPEN:NEAR | ||
| 147 | EXTRN DSK$CLOSE:NEAR | ||
| 148 | EXTRN DSK$REM:NEAR | ||
| 149 | EXTRN GENERIC$IOCTL:NEAR | ||
| 150 | EXTRN IOCTL$GETOWN:NEAR | ||
| 151 | EXTRN IOCTL$SETOWN:NEAR | ||
| 152 | EXTRN CON$READ:NEAR | ||
| 153 | EXTRN CON$RDND:NEAR | ||
| 154 | EXTRN CON$FLSH:NEAR | ||
| 155 | EXTRN CON$WRIT:NEAR | ||
| 156 | ; EXTRN CON$GENIOCTL:NEAR ;J.K. 4/29/86 | ||
| 157 | EXTRN AUX$READ:NEAR | ||
| 158 | EXTRN AUX$WRIT:NEAR | ||
| 159 | EXTRN AUX$FLSH:NEAR | ||
| 160 | EXTRN AUX$RDND:NEAR | ||
| 161 | EXTRN AUX$WRST:NEAR | ||
| 162 | EXTRN TIM$READ:NEAR | ||
| 163 | EXTRN TIM$WRIT:NEAR | ||
| 164 | EXTRN PRN$WRIT:NEAR | ||
| 165 | EXTRN PRN$STAT:NEAR | ||
| 166 | EXTRN PRN$TILBUSY:NEAR | ||
| 167 | EXTRN PRN$GENIOCTL:NEAR | ||
| 168 | EXTRN WRMSG:NEAR | ||
| 169 | |||
| 170 | ;DATA AREAS | ||
| 171 | extrn Start_Sec_H:word ;AN000; Starting sector high word for | ||
| 172 | ;disk I/O request. IBMDISK.ASM | ||
| 173 | |||
| 174 | INCLUDE MSBDATA.INC | ||
| 175 | |||
| 176 | IF iTEST | ||
| 177 | PUBLIC MSGNUM | ||
| 178 | MSGNUM: | ||
| 179 | PUSHF | ||
| 180 | TEST FTESTBITS,AX | ||
| 181 | JZ MRET | ||
| 182 | PUSH SI | ||
| 183 | PUSH BX | ||
| 184 | PUSH CX | ||
| 185 | PUSH ES | ||
| 186 | PUSH DI | ||
| 187 | MOV DI,OFFSET NUMBUF | ||
| 188 | PUSH CS | ||
| 189 | POP ES | ||
| 190 | MOV CX,4 | ||
| 191 | NUMLOOP: | ||
| 192 | PUSH CX | ||
| 193 | MOV CL,4 | ||
| 194 | ROL BX,CL | ||
| 195 | POP CX | ||
| 196 | PUSH BX | ||
| 197 | AND BX,0FH | ||
| 198 | MOV AL,DIGITS[BX] | ||
| 199 | STOSB | ||
| 200 | POP BX | ||
| 201 | LOOP NUMLOOP | ||
| 202 | POP DI | ||
| 203 | POP ES | ||
| 204 | POP CX | ||
| 205 | POP BX | ||
| 206 | MOV SI,OFFSET NUMBUF | ||
| 207 | CALL MSGOUT | ||
| 208 | POP SI | ||
| 209 | POPF | ||
| 210 | RET | ||
| 211 | |||
| 212 | PUBLIC MSGOUT | ||
| 213 | MSGOUT: | ||
| 214 | PUSHF | ||
| 215 | TEST FTESTBITS,AX | ||
| 216 | JZ MRET | ||
| 217 | PUSH DS | ||
| 218 | PUSH AX | ||
| 219 | PUSH BX | ||
| 220 | PUSH CS | ||
| 221 | POP DS | ||
| 222 | CALL WRMSG | ||
| 223 | POP BX | ||
| 224 | POP AX | ||
| 225 | POP DS | ||
| 226 | MRET: | ||
| 227 | POPF | ||
| 228 | RET | ||
| 229 | |||
| 230 | PUBLIC DUMPBYTES ;J.K. 4/9/86 | ||
| 231 | ;Dumpbytes will dump the bytes in memory in hex. Space will be put in between | ||
| 232 | ;the bytes and CR, LF will be put at the end. - J.K. | ||
| 233 | ;Input: DS:SI -> buffer to dump in Hex. | ||
| 234 | ; CX -> # of bytes (Length of the buffer) | ||
| 235 | ; | ||
| 236 | DUMPBYTES proc near | ||
| 237 | pushf | ||
| 238 | push ax | ||
| 239 | dumploops: | ||
| 240 | lodsb | ||
| 241 | mov ah, al | ||
| 242 | shr ah, 1 | ||
| 243 | shr ah, 1 | ||
| 244 | shr ah, 1 | ||
| 245 | shr ah, 1 | ||
| 246 | call hex_to_ascii | ||
| 247 | push ax | ||
| 248 | mov al, ah | ||
| 249 | call outchar | ||
| 250 | pop ax | ||
| 251 | call outchar | ||
| 252 | mov al, ' ' | ||
| 253 | call outchar | ||
| 254 | loop dumploops | ||
| 255 | |||
| 256 | mov al, 0dh | ||
| 257 | call outchar | ||
| 258 | mov al, 0ah | ||
| 259 | call outchar | ||
| 260 | |||
| 261 | pop ax | ||
| 262 | popf | ||
| 263 | ret | ||
| 264 | DUMPBYTES endp | ||
| 265 | |||
| 266 | PUBLIC Hex_to_ascii | ||
| 267 | Hex_to_ascii proc near ;J.K. - 4/9/86 | ||
| 268 | and ax, 0f0fh | ||
| 269 | add ah, 30h | ||
| 270 | cmp ah, 3ah | ||
| 271 | jb hta_$1 | ||
| 272 | add ah, 7 | ||
| 273 | hta_$1: | ||
| 274 | add al, 30h | ||
| 275 | cmp al, 3ah | ||
| 276 | jb hta_$2 | ||
| 277 | add al, 7 | ||
| 278 | hta_$2: | ||
| 279 | ret | ||
| 280 | Hex_to_ascii endp | ||
| 281 | |||
| 282 | PUBLIC outchar | ||
| 283 | Outchar proc near | ||
| 284 | PUSH AX | ||
| 285 | PUSH SI | ||
| 286 | PUSH DI | ||
| 287 | PUSH BP | ||
| 288 | PUSH BX | ||
| 289 | ;SB33002******************************************************* | ||
| 290 | MOV AH, 0Eh ;SET COMMAND TO WRITE A CHAR ;SB;3.30* | ||
| 291 | MOV BX, 7 ;SET FOREGROUND COLOR ;SB;3.30* | ||
| 292 | INT 10h ;CALL ROM-BIOS ;SB;3.30* | ||
| 293 | ;SB33002******************************************************* | ||
| 294 | POP BX | ||
| 295 | POP BP | ||
| 296 | POP DI | ||
| 297 | POP SI | ||
| 298 | POP AX | ||
| 299 | RET | ||
| 300 | Outchar endp | ||
| 301 | |||
| 302 | ENDIF | ||
| 303 | INCLUDE MSMACRO.INC | ||
| 304 | |||
| 305 | ;--------------------------------------------------- | ||
| 306 | ; | ||
| 307 | ; DEVICE ENTRY POINT | ||
| 308 | ; | ||
| 309 | CMDLEN = 0 ;LENGTH OF THIS COMMAND | ||
| 310 | UNIT = 1 ;SUB UNIT SPECIFIER | ||
| 311 | CMD = 2 ;COMMAND CODE | ||
| 312 | STATUS = 3 ;STATUS | ||
| 313 | MEDIA = 13 ;MEDIA DESCRIPTOR | ||
| 314 | TRANS = 14 ;TRANSFER ADDRESS | ||
| 315 | COUNT = 18 ;COUNT OF BLOCKS OR CHARACTERS | ||
| 316 | START = 20 ;FIRST BLOCK TO TRANSFER | ||
| 317 | EXTRA = 22 ;USUALLY A POINTER TO VOL ID FOR ERROR 15 | ||
| 318 | START_L = 26 ;AN000; Extended start sector (Low) | ||
| 319 | START_H = 28 ;AN000; Extended start sector (High) | ||
| 320 | |||
| 321 | PUBLIC STRATEGY | ||
| 322 | STRATEGY PROC FAR | ||
| 323 | MOV WORD PTR CS:[PTRSAV],BX | ||
| 324 | MOV WORD PTR CS:[PTRSAV+2],ES | ||
| 325 | RET | ||
| 326 | STRATEGY ENDP | ||
| 327 | |||
| 328 | PUBLIC CON$IN | ||
| 329 | CON$IN PROC FAR | ||
| 330 | PUSH SI | ||
| 331 | MOV SI,OFFSET CONTBL | ||
| 332 | JMP SHORT ENTRY | ||
| 333 | CON$IN ENDP | ||
| 334 | |||
| 335 | PUBLIC AUX0$IN | ||
| 336 | AUX0$IN PROC FAR | ||
| 337 | PUSH SI | ||
| 338 | PUSH AX | ||
| 339 | XOR AL,AL | ||
| 340 | JMP SHORT AUXENT | ||
| 341 | AUX0$IN ENDP | ||
| 342 | |||
| 343 | PUBLIC AUX1$IN | ||
| 344 | AUX1$IN PROC FAR | ||
| 345 | PUSH SI | ||
| 346 | PUSH AX | ||
| 347 | MOV AL,1 | ||
| 348 | JMP short AUXENT ;J.K. 4/15/86 | ||
| 349 | AUX1$IN ENDP | ||
| 350 | |||
| 351 | ;SB33102**************************************************************** | ||
| 352 | ;SB Add code to handle two more COM Ports | ||
| 353 | ;boban | ||
| 354 | |||
| 355 | PUBLIC AUX2$IN | ||
| 356 | AUX2$IN proc far | ||
| 357 | push si | ||
| 358 | push ax | ||
| 359 | mov al,2 | ||
| 360 | jmp short AUXENT | ||
| 361 | AUX2$IN endp | ||
| 362 | |||
| 363 | PUBLIC AUX3$IN | ||
| 364 | AUX3$IN proc far | ||
| 365 | push si | ||
| 366 | push ax | ||
| 367 | mov al,3 | ||
| 368 | jmp short AUXENT | ||
| 369 | |||
| 370 | ;SB33102**************************************************************** | ||
| 371 | |||
| 372 | AUXENT: | ||
| 373 | MOV SI,OFFSET AUXTBL | ||
| 374 | JMP SHORT ENTRY1 | ||
| 375 | AUX3$IN ENDP | ||
| 376 | |||
| 377 | PRN0$IN PROC FAR | ||
| 378 | PUBLIC PRN0$IN | ||
| 379 | |||
| 380 | PUSH SI | ||
| 381 | PUSH AX | ||
| 382 | XOR AX,AX | ||
| 383 | JMP SHORT PRNENT | ||
| 384 | PRN0$IN ENDP | ||
| 385 | |||
| 386 | PUBLIC PRN1$IN | ||
| 387 | PRN1$IN PROC FAR | ||
| 388 | PUSH SI | ||
| 389 | PUSH AX | ||
| 390 | XOR AL,AL | ||
| 391 | MOV AH,1 | ||
| 392 | JMP SHORT PRNENT | ||
| 393 | PRN1$IN ENDP | ||
| 394 | |||
| 395 | PUBLIC PRN2$IN | ||
| 396 | PRN2$IN PROC FAR | ||
| 397 | PUSH SI | ||
| 398 | PUSH AX | ||
| 399 | MOV AL,1 | ||
| 400 | MOV AH,2 | ||
| 401 | JMP SHORT PRNENT | ||
| 402 | PRN2$IN ENDP | ||
| 403 | |||
| 404 | PUBLIC PRN3$IN | ||
| 405 | PRN3$IN PROC FAR | ||
| 406 | PUSH SI | ||
| 407 | PUSH AX | ||
| 408 | MOV AL,2 | ||
| 409 | MOV AH,3 | ||
| 410 | PRNENT: | ||
| 411 | MOV SI,OFFSET PRNTBL | ||
| 412 | MOV CS:[PRINTDEV],AH ;SAVE INDEX INTO ARRAY OF RETRY COUNTS | ||
| 413 | JMP SHORT ENTRY1 | ||
| 414 | PRN3$IN ENDP | ||
| 415 | |||
| 416 | PUBLIC TIM$IN | ||
| 417 | TIM$IN PROC FAR | ||
| 418 | PUSH SI | ||
| 419 | MOV SI,OFFSET TIMTBL | ||
| 420 | JMP SHORT ENTRY | ||
| 421 | TIM$IN ENDP | ||
| 422 | |||
| 423 | PUBLIC DSK$IN | ||
| 424 | DSK$IN PROC FAR | ||
| 425 | PUSH SI | ||
| 426 | MOV SI,OFFSET DSKTBL | ||
| 427 | |||
| 428 | ENTRY: | ||
| 429 | PUSH AX | ||
| 430 | ENTRY1: | ||
| 431 | PUSH CX | ||
| 432 | PUSH DX | ||
| 433 | PUSH DI | ||
| 434 | PUSH BP | ||
| 435 | PUSH DS | ||
| 436 | PUSH ES | ||
| 437 | PUSH BX | ||
| 438 | |||
| 439 | MOV CS:[AUXNUM],AL ;SAVE CHOICE OF AUX/PRN DEVICE | ||
| 440 | |||
| 441 | LDS BX,CS:[PTRSAV] ;GET POINTER TO I/O PACKET | ||
| 442 | ASSUME DS:NOTHING | ||
| 443 | |||
| 444 | MOV AL,BYTE PTR DS:[BX].UNIT ;AL = UNIT CODE | ||
| 445 | MOV AH,BYTE PTR DS:[BX].MEDIA ;AH = MEDIA DESCRIP | ||
| 446 | MOV CX,WORD PTR DS:[BX].COUNT ;CX = COUNT | ||
| 447 | MOV DX,WORD PTR DS:[BX].START ;DX = START SECTOR | ||
| 448 | |||
| 449 | ;SB34MSB100********************************************************************* | ||
| 450 | ;SB | ||
| 451 | ;SB The disk device driver can now handle 32 bit start sector number. | ||
| 452 | ;SB So we should check to see if a 32 bit sector number has been specified | ||
| 453 | ;SB and if so get it. Whether a 32 bit sector has been specified or not | ||
| 454 | ;SB the disk driver expects a 32 bit sector number with the high word | ||
| 455 | ;SB in cs:Start_Sec_H and the low word in dx. | ||
| 456 | ;SB | ||
| 457 | ;SB Algorithm: | ||
| 458 | ;SB 1. Check to see if the request is for the disk driver by | ||
| 459 | ;SB checking to see if SI points to DSKTBL. | ||
| 460 | ;SB | ||
| 461 | ;SB 2. If request not for the disk nothing special needs to be done. | ||
| 462 | ;SB | ||
| 463 | ;SB 3. If request for the disk then check to see if a 32 bit | ||
| 464 | ;SB sector number has been specified by seeing whether the | ||
| 465 | ;SB the conventional sector number specified is -1. If so | ||
| 466 | ;SB we need to pick the 32 bit sector number from the new | ||
| 467 | ;SB fields in the request packet. See the request header | ||
| 468 | ;SB struc for the fields you need. If the conventional | ||
| 469 | ;SB sector field is not -1 then a 16 bit sector number | ||
| 470 | ;SB has been specified and we just need to initalise the | ||
| 471 | ;SB high word in cs:Start_Sec_H to 0 | ||
| 472 | ;SB | ||
| 473 | ;SB NOTE: START_L and START_H are the offsets withing the IO_REQUEST packet | ||
| 474 | ;SB which contain the low and hi words of the 32 bit start sector if | ||
| 475 | ;SB it has been used. | ||
| 476 | ;SB | ||
| 477 | ;SB NOTE:Remember not to destroy the registers which have been set up before | ||
| 478 | |||
| 479 | CMP SI,OFFSET DSKTBL | ||
| 480 | JNZ DSK_REQ_CONT ; Not Disk Req | ||
| 481 | CMP DX,-1 | ||
| 482 | JNZ DSK_REQ_16 | ||
| 483 | MOV DX,DS:[BX].START_H ; 32 bits DSK REQ | ||
| 484 | MOV CS:START_SEC_H,DX ; CS:Start_sec_H = Packet.Start_H | ||
| 485 | MOV DX,DS:[BX].START_L ; DX = Packet.Start_L | ||
| 486 | JMP SHORT DSK_REQ_CONT | ||
| 487 | DSK_REQ_16: | ||
| 488 | MOV CS:START_SEC_H,0 | ||
| 489 | DSK_REQ_CONT: | ||
| 490 | |||
| 491 | ;SB34MSB100********************************************************************* | ||
| 492 | |||
| 493 | XCHG DI,AX | ||
| 494 | MOV AL,BYTE PTR DS:[BX].CMD | ||
| 495 | CMP AL,CS:[SI] ;ARR 2.41 | ||
| 496 | JA CMDERR | ||
| 497 | |||
| 498 | CBW ; NOTE THAT AL <= 15 MEANS OK | ||
| 499 | SHL AX,1 | ||
| 500 | |||
| 501 | ADD SI,AX | ||
| 502 | XCHG AX,DI | ||
| 503 | |||
| 504 | LES DI,DWORD PTR DS:[BX].TRANS | ||
| 505 | |||
| 506 | PUSH CS | ||
| 507 | POP DS | ||
| 508 | |||
| 509 | ASSUME DS:CODE | ||
| 510 | |||
| 511 | CLD | ||
| 512 | JMP WORD PTR [SI+1] ;GO DO COMMAND | ||
| 513 | DSK$IN ENDP | ||
| 514 | PAGE | ||
| 515 | ;===================================================== | ||
| 516 | ;= | ||
| 517 | ;= SUBROUTINES SHARED BY MULTIPLE DEVICES | ||
| 518 | ;= | ||
| 519 | ;===================================================== | ||
| 520 | ;---------------------------------------------------------- | ||
| 521 | ; | ||
| 522 | ; EXIT - ALL ROUTINES RETURN THROUGH THIS PATH | ||
| 523 | ; | ||
| 524 | PUBLIC BUS$EXIT | ||
| 525 | BUS$EXIT PROC FAR | ||
| 526 | ASSUME DS:NOTHING | ||
| 527 | MOV AH,00000011B | ||
| 528 | JMP SHORT ERR1 | ||
| 529 | |||
| 530 | PUBLIC CMDERR | ||
| 531 | CMDERR: | ||
| 532 | MOV AL,3 ;UNKNOWN COMMAND ERROR | ||
| 533 | |||
| 534 | PUBLIC ERR$CNT | ||
| 535 | ERR$CNT: | ||
| 536 | LDS BX,CS:[PTRSAV] | ||
| 537 | ASSUME DS:NOTHING | ||
| 538 | SUB WORD PTR [BX].COUNT,CX ;# OF SUCCESSFUL I/O'S | ||
| 539 | |||
| 540 | PUBLIC ERR$EXIT | ||
| 541 | ERR$EXIT: | ||
| 542 | MOV AH,10000001B ;MARK ERROR RETURN | ||
| 543 | JMP SHORT ERR1 | ||
| 544 | BUS$EXIT ENDP | ||
| 545 | |||
| 546 | EXITP PROC FAR | ||
| 547 | ASSUME DS:CODE ; WE ARE NOT SURE THIS IS CORRECT 3/18/86 | ||
| 548 | EXIT$ZER: | ||
| 549 | LDS BX,[PTRSAV] | ||
| 550 | ASSUME DS:NOTHING | ||
| 551 | XOR AX,AX | ||
| 552 | MOV WORD PTR [BX].COUNT,AX ;INDICATE NO CHARS READ | ||
| 553 | |||
| 554 | PUBLIC EXIT | ||
| 555 | EXIT: | ||
| 556 | ASSUME DS:NOTHING | ||
| 557 | MOV AH,00000001B | ||
| 558 | ERR1: | ||
| 559 | ASSUME DS:NOTHING | ||
| 560 | LDS BX,CS:[PTRSAV] | ||
| 561 | MOV WORD PTR [BX].STATUS,AX ;MARK OPERATION COMPLETE | ||
| 562 | |||
| 563 | POP BX | ||
| 564 | POP ES | ||
| 565 | POP DS | ||
| 566 | POP BP | ||
| 567 | POP DI | ||
| 568 | POP DX | ||
| 569 | POP CX | ||
| 570 | POP AX | ||
| 571 | POP SI | ||
| 572 | RET ;RESTORE REGS AND RETURN | ||
| 573 | EXITP ENDP | ||
| 574 | |||
| 575 | ;------------------------------------------------------------- | ||
| 576 | ; | ||
| 577 | ; CHROUT - WRITE OUT CHAR IN AL USING CURRENT ATTRIBUTE | ||
| 578 | ; | ||
| 579 | ; CALLED VIA INT 29H | ||
| 580 | ; | ||
| 581 | PUBLIC CHROUT | ||
| 582 | CHROUT = 29H | ||
| 583 | |||
| 584 | PUBLIC OUTCHR | ||
| 585 | OUTCHR PROC FAR | ||
| 586 | PUSH AX | ||
| 587 | PUSH SI | ||
| 588 | PUSH DI | ||
| 589 | PUSH BP | ||
| 590 | ;SB33002a******************************************************* | ||
| 591 | push bx ; ;SB ;3.30 | ||
| 592 | mov AH, 0Eh ; set command to write a character;SB;3.30 | ||
| 593 | mov BX, 7 ; set foreground color ;SB ;3.30 | ||
| 594 | int 10h ; call rom-bios ;SB ;3.30 | ||
| 595 | pop bx ; ;SB ;3.30 | ||
| 596 | ;SB33002a******************************************************* | ||
| 597 | POP BP | ||
| 598 | POP DI | ||
| 599 | POP SI | ||
| 600 | POP AX | ||
| 601 | IRET | ||
| 602 | OUTCHR ENDP | ||
| 603 | ;---------------------------------------------- | ||
| 604 | ; | ||
| 605 | ; SET DX TO AUXNUM | ||
| 606 | ; | ||
| 607 | PUBLIC GETDX | ||
| 608 | GETDX PROC NEAR | ||
| 609 | MOV DX,WORD PTR CS:[AUXNUM] | ||
| 610 | RET | ||
| 611 | GETDX ENDP | ||
| 612 | PAGE | ||
| 613 | ;************************************************** ARR 2.15 | ||
| 614 | |||
| 615 | ;----------------------------------------------- | ||
| 616 | ; | ||
| 617 | ; TIMER INTERRUPT HANDLER | ||
| 618 | ; | ||
| 619 | ;TIMER_LOW DW 0 | ||
| 620 | ;TIMER_HIGH DW 0 | ||
| 621 | ; | ||
| 622 | ;TIMER: | ||
| 623 | ; STI | ||
| 624 | ; PUSH AX | ||
| 625 | ; PUSH CX | ||
| 626 | ; PUSH DX | ||
| 627 | ; PUSH DS | ||
| 628 | ; PUSH CS | ||
| 629 | ; POP DS | ||
| 630 | ; XOR AX,AX | ||
| 631 | ; INT 1AH ; GET ROM TIME AND ZAP ROLL OVER | ||
| 632 | ; MOV [TIMER_HIGH],CX | ||
| 633 | ; MOV [TIMER_LOW],DX | ||
| 634 | ; OR AL,AL | ||
| 635 | ; JZ T5 | ||
| 636 | ; INC WORD PTR [DAYCNT] ; ONE DAY GONE BY | ||
| 637 | ;T5: | ||
| 638 | ; POP DS | ||
| 639 | ; POP DX | ||
| 640 | ; POP CX | ||
| 641 | ; POP AX | ||
| 642 | ; IRET | ||
| 643 | ;************************************************** ARR 2.15 | ||
| 644 | CODE ENDS | ||
| 645 | END | ||