summaryrefslogtreecommitdiff
path: root/v4.0/src/BIOS/MSBIO1.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/BIOS/MSBIO1.ASM')
-rw-r--r--v4.0/src/BIOS/MSBIO1.ASM645
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;==============================================================================
10COMMENT *
11THE LINK STEP IS PERFORMED BY USING THE FOLLOWING "NEW.ARF" FILE:
12msbio1+
13msSTACK+
14MsCON+
15msAUX+
16msLPT+
17msCLOCK+
18msdISK+
19msBIO2+
20C:\BIO2\OLDOBJ\disk+
21C:\BIO2\OLDOBJ\msinit+
22C:\BIO2\OLDOBJ\sysinit1+
23C:\BIO2\OLDOBJ\sysinit2+
24C:\BIO2\OLDOBJ\sysimes,msbio,/M;
25
26THE FOLLOWING IS A BATCH FILE THAT CAN BE USED TO CREATE THE IBMBIO.COM
27WHERE "LOCSCR" IS A FILE THAT JUST HAS THE NUMBER, 70:
28
29link @NEW.ARF
30exe2bin ibmbio ibmbio.com <C:\BIO2\Locscr
31del ibmbio.exe
32(END OF COMMENT)*
33
34;***For testing purposes, set the TEST flag to 1. Otherwise reset it.
35
36iTEST=0
37
38PATHGEN = 1
39
40.SALL
41 %OUT ...MSBIO1.ASM
42
43; THIS IS A DOSMAC MACRO WHICH IS USED IN DEVSYM WHICH IS INCLUDED LATER
44BREAK MACRO SUBTITLE
45 SUBTTL SUBTITLE
46 PAGE
47 ENDM
48
49POPFF MACRO
50 JMP $+3
51 IRET
52 PUSH CS
53 CALL $-2
54 ENDM
55
56 INCLUDE MSGROUP.INC ;DEFINE CODE SEGMENT
57
58SYSINITSEG SEGMENT PUBLIC 'SYSTEM_INIT'
59SYSINITSEG ENDS
60
61
62 INCLUDE JUMPMAC.INC
63PATHSTART 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
70PATHEND 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
124LF = 10 ;LINE FEED
125CR = 13 ;CARRIAGE RETURN
126BACKSP = 8 ;BACKSPACE
127BRKADR = 1BH * 4 ;006C 1BH BREAK VECTOR ADDRESS
128TIMADR = 1CH * 4 ;0070 1CH TIMER INTERRUPT
129DSKADR = 1EH * 4 ;ADDRESS OF PTR TO DISK PARAMETERS
130SEC9 = 522H ;ADDRESS OF DISK PARAMETERS
131HEADSETTLE = SEC9+9 ; ARR 2.20 ADDRESS OF HEAD SETTLE TIME
132NORMSETTLE = 15 ; ARR 2.20 NORMAL HEAD SETTLE
133SPEEDSETTLE = 0 ; ARR 2.20 SPEED UP SETTLE TIME
134INITSPOT = 534H ; ARR IBM WANTS 4 ZEROS HERE
135AKPORT = 20H
136EOI = 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
178MSGNUM:
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
191NUMLOOP:
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
213MSGOUT:
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
226MRET:
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;
236DUMPBYTES proc near
237 pushf
238 push ax
239dumploops:
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
264DUMPBYTES endp
265
266 PUBLIC Hex_to_ascii
267Hex_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
273hta_$1:
274 add al, 30h
275 cmp al, 3ah
276 jb hta_$2
277 add al, 7
278hta_$2:
279 ret
280Hex_to_ascii endp
281
282 PUBLIC outchar
283Outchar 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
300Outchar endp
301
302 ENDIF
303 INCLUDE MSMACRO.INC
304
305;---------------------------------------------------
306;
307; DEVICE ENTRY POINT
308;
309CMDLEN = 0 ;LENGTH OF THIS COMMAND
310UNIT = 1 ;SUB UNIT SPECIFIER
311CMD = 2 ;COMMAND CODE
312STATUS = 3 ;STATUS
313MEDIA = 13 ;MEDIA DESCRIPTOR
314TRANS = 14 ;TRANSFER ADDRESS
315COUNT = 18 ;COUNT OF BLOCKS OR CHARACTERS
316START = 20 ;FIRST BLOCK TO TRANSFER
317EXTRA = 22 ;USUALLY A POINTER TO VOL ID FOR ERROR 15
318START_L = 26 ;AN000; Extended start sector (Low)
319START_H = 28 ;AN000; Extended start sector (High)
320
321 PUBLIC STRATEGY
322STRATEGY PROC FAR
323 MOV WORD PTR CS:[PTRSAV],BX
324 MOV WORD PTR CS:[PTRSAV+2],ES
325 RET
326STRATEGY ENDP
327
328 PUBLIC CON$IN
329CON$IN PROC FAR
330 PUSH SI
331 MOV SI,OFFSET CONTBL
332 JMP SHORT ENTRY
333CON$IN ENDP
334
335 PUBLIC AUX0$IN
336AUX0$IN PROC FAR
337 PUSH SI
338 PUSH AX
339 XOR AL,AL
340 JMP SHORT AUXENT
341AUX0$IN ENDP
342
343 PUBLIC AUX1$IN
344AUX1$IN PROC FAR
345 PUSH SI
346 PUSH AX
347 MOV AL,1
348 JMP short AUXENT ;J.K. 4/15/86
349AUX1$IN ENDP
350
351;SB33102****************************************************************
352;SB Add code to handle two more COM Ports
353;boban
354
355 PUBLIC AUX2$IN
356AUX2$IN proc far
357 push si
358 push ax
359 mov al,2
360 jmp short AUXENT
361AUX2$IN endp
362
363 PUBLIC AUX3$IN
364AUX3$IN proc far
365 push si
366 push ax
367 mov al,3
368 jmp short AUXENT
369
370;SB33102****************************************************************
371
372AUXENT:
373 MOV SI,OFFSET AUXTBL
374 JMP SHORT ENTRY1
375AUX3$IN ENDP
376
377PRN0$IN PROC FAR
378 PUBLIC PRN0$IN
379
380 PUSH SI
381 PUSH AX
382 XOR AX,AX
383 JMP SHORT PRNENT
384PRN0$IN ENDP
385
386 PUBLIC PRN1$IN
387PRN1$IN PROC FAR
388 PUSH SI
389 PUSH AX
390 XOR AL,AL
391 MOV AH,1
392 JMP SHORT PRNENT
393PRN1$IN ENDP
394
395 PUBLIC PRN2$IN
396PRN2$IN PROC FAR
397 PUSH SI
398 PUSH AX
399 MOV AL,1
400 MOV AH,2
401 JMP SHORT PRNENT
402PRN2$IN ENDP
403
404 PUBLIC PRN3$IN
405PRN3$IN PROC FAR
406 PUSH SI
407 PUSH AX
408 MOV AL,2
409 MOV AH,3
410PRNENT:
411 MOV SI,OFFSET PRNTBL
412 MOV CS:[PRINTDEV],AH ;SAVE INDEX INTO ARRAY OF RETRY COUNTS
413 JMP SHORT ENTRY1
414PRN3$IN ENDP
415
416 PUBLIC TIM$IN
417TIM$IN PROC FAR
418 PUSH SI
419 MOV SI,OFFSET TIMTBL
420 JMP SHORT ENTRY
421TIM$IN ENDP
422
423 PUBLIC DSK$IN
424DSK$IN PROC FAR
425 PUSH SI
426 MOV SI,OFFSET DSKTBL
427
428ENTRY:
429 PUSH AX
430ENTRY1:
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
487DSK_REQ_16:
488 MOV CS:START_SEC_H,0
489DSK_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
513DSK$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
525BUS$EXIT PROC FAR
526 ASSUME DS:NOTHING
527 MOV AH,00000011B
528 JMP SHORT ERR1
529
530 PUBLIC CMDERR
531CMDERR:
532 MOV AL,3 ;UNKNOWN COMMAND ERROR
533
534 PUBLIC ERR$CNT
535ERR$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
541ERR$EXIT:
542 MOV AH,10000001B ;MARK ERROR RETURN
543 JMP SHORT ERR1
544BUS$EXIT ENDP
545
546EXITP PROC FAR
547 ASSUME DS:CODE ; WE ARE NOT SURE THIS IS CORRECT 3/18/86
548EXIT$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
555EXIT:
556 ASSUME DS:NOTHING
557 MOV AH,00000001B
558ERR1:
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
573EXITP ENDP
574
575;-------------------------------------------------------------
576;
577; CHROUT - WRITE OUT CHAR IN AL USING CURRENT ATTRIBUTE
578;
579; CALLED VIA INT 29H
580;
581 PUBLIC CHROUT
582CHROUT = 29H
583
584 PUBLIC OUTCHR
585OUTCHR 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
602OUTCHR ENDP
603;----------------------------------------------
604;
605; SET DX TO AUXNUM
606;
607 PUBLIC GETDX
608GETDX PROC NEAR
609 MOV DX,WORD PTR CS:[AUXNUM]
610 RET
611GETDX 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
644CODE ENDS
645 END