summaryrefslogtreecommitdiff
path: root/v4.0/src/BIOS/MS96TPI.INC
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/BIOS/MS96TPI.INC')
-rw-r--r--v4.0/src/BIOS/MS96TPI.INC536
1 files changed, 536 insertions, 0 deletions
diff --git a/v4.0/src/BIOS/MS96TPI.INC b/v4.0/src/BIOS/MS96TPI.INC
new file mode 100644
index 0000000..2760b00
--- /dev/null
+++ b/v4.0/src/BIOS/MS96TPI.INC
@@ -0,0 +1,536 @@
1%OUT MS96TPI.INC...
2;==============================================================================
3;REVISION HISTORY:
4;AN000 - New for DOS Version 4.00 - J.K.
5;AC000 - Changed for DOS Version 4.00 - J.K.
6;AN00x - PTM number for DOS Version 4.00 - J.K.
7;==============================================================================
8;AN001 - p2781 Changeline error behavior incompatibile with DOS 3.3 1/06/88 J.K.
9;==============================================================================
10;
11; DISK OPEN/CLOSE ROUTINES ARR 2.41
12;
13
14DSK$OPEN: ;ARR 2.41
15 PUBLIC DSK$OPEN
16
17 MESSAGE FTESTDISK,<"DISK OPEN ">
18 MNUM FTESTDISK,AX
19 MESSAGE FTESTDISK,<CR,LF>
20; AL IS LOGICAL DRIVE
21 CALL SETDRIVE ;GET BDS FOR DRIVE
22 INC WORD PTR DS:[DI].OPCNT
23 JMP EXIT ;ARR 2.41
24
25DSK$CLOSE: ;ARR 2.41
26 PUBLIC DSK$CLOSE
27
28 MESSAGE FTESTDISK,<"DISK CLOSE ">
29 MNUM FTESTDISK,AX
30 MESSAGE FTESTDISK,<CR,LF>
31; AL IS LOGICAL DRIVE
32 CALL SETDRIVE ;GET BDS FOR DRIVE
33 CMP WORD PTR DS:[DI].OPCNT,0
34 JZ EXITJX ; WATCH OUT FOR WRAP ARR 2.41
35 DEC WORD PTR DS:[DI].OPCNT
36EXITJX:
37 JMP EXIT
38
39; INPUT : DS:DI POINTS TO CURRENT BDS FOR DRIVE.
40; RETURN : ZERO SET IF NO OPEN FILES
41; ZERO RESET IF OPEN FILES
42CHKOPCNT:
43 MESSAGE FTEST96,<"CHECK OPEN COUNT ">
44 MNUM FTEST96,AX
45 MESSAGE FTEST96,<CR,LF>
46 CMP WORD PTR DS:[DI].OPCNT,0
47 RET
48
49;
50; AT MEDIA CHECK TIME, WE NEED TO REALLY GET DOWN AND CHECK WHAT THE CHANGE IS.
51; THIS IS GUARANTEED TO BE EXPENSIVE.
52;
53 PUBLIC MEDIACHECK
54MEDIACHECK:
55 CALL CHECKSINGLE ; MAKE SURE CORRECT DISK IS IN PLACE
56 XOR SI,SI
57 CALL HASCHANGE
58 JZ MEDIARET
59 CALL CHECKROMCHANGE
60 JNZ MEDIADOVOLID
61 PUSH AX
62 PUSH DX
63;SB33001****************************************************************
64 mov DL, DS:[DI.drivenum] ;SB ; set logical drive number ;3.30*
65 mov AH, 16h ;SB ; get changeline status ;3.30*
66 int 13h ;SB ; call rom diskette routine ;3.30*
67;SB33001****************************************************************
68 POP DX
69 POP AX
70 JC MEDIADOVOLID
71 MOV SI,1 ; SIGNAL NO CHANGE
72; THERE ARE SOME DRIVES WITH CHANGELINE THAT "LOSE" THE CHANGELINE INDICATION
73; IF A DIFFERENT DRIVE IS ACCESSED AFTER THE CURRENT ONE. IN ORDER TO AVOID
74; MISSING A MEDIA CHANGE, WE RETURN AN "I DON'T KNOW" TO DOS IF THE CHANGELINE
75; IS NOT ACTIVE AND WE ARE ACCESSING A DIFFERENT DRIVE FROM THE LAST ONE.
76; IF WE ARE ACCESSING THE SAME DRIVE, THEN WE CAN SAFELY RELY ON THE CHANGELINE
77; STATUS.
78 PUBLIC LOSECHNG
79LOSECHNG:
80 MOV BL,CS:[TIM_DRV] ; GET LAST DRIVE ACCESSED
81 CMP BYTE PTR [DI].DRIVENUM,BL
82 JZ MEDIARET
83; DO THE 2 SECOND TWIDDLE. IF TIME >= 2 SECONDS, DO A VOLID CHECK.
84; OTHERWISE RETURN "I DON'T KNOW" (STRICTLY SPEAKING, WE SHOULD RETURN A
85; "NOT CHANGED" HERE SINCE THE 2 SECOND TEST SAID NO CHANGE.) - RS.
86 SAVEREG <AX,CX,DX>
87 CALL CHECK_TIME_OF_ACCESS
88 RESTOREREG <DX,CX,AX>
89 OR SI,SI
90 JZ MEDIADOVOLID ; CHECK_TIME SAYS ">= 2 SECS PASSED"
91 XOR SI,SI ; RETURN "I DON'T KNOW"
92 PUBLIC MEDIARET
93MEDIARET:
94 RET
95;
96; SOMEHOW THE MEDIA WAS CHANGED. LOOK AT VID TO SEE. WE DO NOT LOOK AT FAT
97; BECAUSE THIS MAY BE DIFFERENT SINCE WE ONLY SET MEDBYT WHEN DOING A READ
98; OR WRITE.
99;
100MEDIADOVOLID:
101 CALL GETBP ; BUILD A NEW BPB IN CURRENT BDS
102 JC MEDIARET
103 CALL CHECK_VID
104 JNC MEDIARET
105 CALL MAPERROR ; FIX UP AL FOR RETURN TO DOS
106 RET
107;
108; SIMPLE, QUICK CHECK OF LATCHED CHANGE. IF NO INDICATION, THEN RETURN
109; OTHERWISE DO EXPENSIVE CHECK. IF THE EXPENSIVE TEST FAILS, POP OFF THE
110; RETURN AND SET AL = 15 (FOR INVALID MEDIA CHANGE) WHICH WILL BE RETURNED TO
111; DOS.
112;J.K. 9/16/86 For DOS 3.3, this will work only for the drive that has
113;J.K. 9/16/86 changeline.
114 PUBLIC CHECKLATCHIO
115CHECKLATCHIO:
116; IF RETURNING FAKE BPB THEN ASSUME THE DISK HAS NOT CHANGED
117; TEST WORD PTR DS:[DI].FLAGS, RETURN_FAKE_BPB
118; JNZ CHECKRET
119;J.K. 9/16/86
120; call HasChange ;change line supported?
121; jz CheckRet ;No. Just return
122 CALL CHKOPCNT
123 JNZ CHECKROM
124CHECKRET:
125 RET
126;
127; CHECK FOR PAST ROM INDICATIONS. IF NO ROM CHANGE INDICATED, THEN RETURN OK.
128;
129 PUBLIC CHECKROM
130CHECKROM:
131 CALL CHECKROMCHANGE
132 JZ CHECKRET ; NO CHANGE
133;
134; WE NOW SEE THAT A CHANGE LINE HAS BEEN SEEN IN THE PAST. LET'S DO THE
135; EXPENSIVE VERIFICATION.
136;
137 MESSAGE FTEST96,<"CHECKROMCHANGE SAYS YES...",CR,LF>
138 CALL GETBP ; BUILD BPB IN CURRENT BDS
139 JC RET_NO_ERROR_MAP ; GETBP HAS ALREADY CALLED MAPERROR
140 CALL CHECK_VID
141 JC CHECKLATCHRET ; DISK ERROR TRYING TO READ IN.
142 OR SI,SI ; IS CHANGED FOR SURE?
143 JNS CHECKRET
144 CALL RETURNVID
145CHECKLATCHRET:
146 CALL MAPERROR ; FIX UP AL FOR RETURN TO DOS
147RET_NO_ERROR_MAP:
148 STC
149 POP SI ; POP OFF RETURN ADDRESS
150 RET
151
152;
153; CHECK THE FAT AND THE VID. RETURN IN DI -1 OR 0. RETURN WITH CARRY SET
154; ONLY IF THERE WAS A DISK ERROR. RETURN THAT ERROR CODE IN AX.
155;
156 PUBLIC CHECKFATVID
157CHECKFATVID:
158 MESSAGE FTEST96,<"CHECK FAT",CR,LF>
159 CALL FAT_CHECK
160 OR SI,SI
161 JS CHANGED_DRV
162;
163; THE FAT WAS THE SAME. HOW ABOUT THE VOLUME ID?
164;
165CHECK_VID:
166;J.K. Now with the extended BOOT record, the logic should be enhanced.
167;If it is the extended BOOT record, then we check the volume serial
168;number instead of volume id. If it is different, then set SI to -1.
169;If it is same, then SI= 1 (No change).
170;If it is not the extended BOOT record, then just follows the old
171;logic. DOS 4.00 will check if the # of FAT in the boot record BPB
172;is not 0. If it is 0 then it must be Non_FAT based system and
173;should have already covered by extended boot structure checking.
174;So, we will return "I don't know" by setting SI to 0.
175;This routine assume the newest valid boot record is in CS:[DISKSECTOR].
176;(This will be gauranteed by a successful GETBP call right before this
177;routine.)
178 MESSAGE FTEST96,<"CHECK VID",CR,LF>
179;SB34MS96TPI001*********************************************************
180;SB check the EXT_Boot_Sig variable for the Extended boot signature
181;SB if it is set then go to do the extended ID check otherwise continue
182;SB with code below
183;SB 2 LOCS
184
185 cmp cs:[Ext_Boot_Sig],Ext_Boot_Signature
186 jz Do_Ext_Check_Id
187;SB34MS96TPI001*********************************************************
188 call HasChange ;AN000;
189 jz CheckRet ;AN000;
190
191 xor si,si ;AN000; assume I don't know.
192 cmp byte ptr cs:[SECPERCLUSINSECTOR]+3,0 ;AN000; Don't read vol id from
193 je CHECKFATRET ;AN000; the directory if not FAT system
194 CALL READ_VOLUME_ID
195 JC CHECKFATRET
196 CALL CHECK_VOLUME_ID
197 OR SI,SI
198 JNZ CHANGED_DRV
199 MESSAGE FTEST96,<"VID NOT CHANGED",CR,LF>
200
201VID_NO_Changed:
202 CALL RESETCHANGED
203 clc ;AN000;
204CHECKFATRET:
205 RET
206CHANGED_DRV:
207 MOV CS:[TIM_DRV],-1 ; ENSURE THAT WE ASK ROM FOR MEDIA
208 RET ; CHECK NEXT TIME ROUND
209 ;
210 ; extended ID check
211 ;
212Do_Ext_Check_ID: ;AN000;
213 push ax ;AN000;
214;SB34MS96TPI002**************************************************************
215;SB The code to check extended ID is basically a check to see if the
216;Sb volume serial number is still the same. The volume serial number
217;SB previously read is in cs:[Boot_Serial_H] and cs:[Boot_Serial_L]
218;SB high and low words respectively. DS:DI points to the BDS of the
219;SB drive under consideration. The BDS has fields containing the
220;SB high and low words of the volume serial number of the media in the
221;SB drive. Compare these fields to the fields mentioned above. If these
222;SB fields do not match the media has changed and so we should jump
223;SB to the code starting at Ext_Changed else return "I don't know" status
224;SB in the register used for the changeline status and continue executing
225;SB the code given below. For temporary storage use the register which
226;SB has been saved and restored around this block.
227;SB 7 LOCS
228;SB BDS fields in inc\msbds.inc
229
230 mov ax,cs:[Boot_Serial_L]
231 cmp ax,word ptr ds:[di+VOL_SERIAL]
232 jnz Ext_Changed
233 mov ax,cs:[Boot_Serial_H]
234 cmp ax,word ptr ds:[di+VOL_SERIAL+2]
235 jnz Ext_Changed
236 xor si,si ; don't know
237
238;SB34MS96TPI002**************************************************************
239 pop ax ;AN000;
240; jmp CheckFatRet ;AN000;
241 jmp VID_NO_Changed ;AN001;Reset the flag
242Ext_Changed: ;AN000; Serial number is different!
243 pop ax ;AN000;
244 mov si, -1 ;AN000; disk changed!
245 clc ;AN000; clear carry. Only SI is meaningful here.
246 jmp Changed_Drv ;AN000;
247
248;
249; AT I/O TIME, WE DETECTED THE ERROR. NOW WE NEED TO DETERMINE WHETHER THE
250; MEDIA WAS TRULY CHANGED OR NOT. WE RETURN NORMALLY IF MEDIA CHANGE UNKNOWN.
251; AND WE POP OFF THE CALL AND JMP TO HARDERR IF WE SEE AN ERROR.
252;
253 PUBLIC CHECKIO
254CHECKIO:
255 CMP AH,06
256 JNZ CHECKFATRET
257 CALL CHKOPCNT
258 JZ CHECKFATRET ; NO OPEN FILES
259; IF RETURNING FAKE BPB THEN IGNORE DISK CHANGES
260; TEST WORD PTR DS:[DI].FLAGS, RETURN_FAKE_BPB
261; JNZ IGNORECHANGE
262 CALL GETBP ; BUILD UP A NEW BPB IN CURRENT BDS
263 JC NO_ERROR_MAP ; GETBP HAS ALREADY CALLED MAPERROR
264 CALL CHECKFATVID
265 JC CHECKIORET ; DISK ERROR TRYING TO READ IN.
266 OR SI,SI ; IS CHANGED FOR SURE?
267 JS CHECKIOERR ; YES CHANGED
268IGNORECHANGE:
269 INC BP ; ALLOW A RETRY
270 RET
271CHECKIOERR:
272 CALL RETURNVID
273CHECKIORET:
274; POP SI ; POP OFF RETURN
275 STC ; MAKE SURE CARRY GETS PASSED THROUGH
276 JMP HARDERR
277
278NO_ERROR_MAP:
279 JMP HARDERR2
280;
281; RETURN VID SETS UP THE VID FOR A RETURN TO DOS.
282;
283 PUBLIC RETURNVID
284RETURNVID:
285 MESSAGE FTEST96,<"RETURN VID",CR,LF>
286 PUSH DS ; SAVE POINTER TO CURRENT BDS
287 PUSH DI
288 PUSH CX
289 CALL INIT_VID_LOOP ; SETS ES:DI -> VID
290 LDS BX,CS:[PTRSAV]
291 MOV [BX.EXTRA],DI
292 MOV [BX.EXTRA+2],ES
293 POP CX
294 POP DI ; RESTORE CURRENT BDS
295 POP DS
296 MOV AH,6 ; INVALID MEDIA CHANGE
297 STC
298 RET
299
300;
301; MUNGE THE TIME OF LAST SUCCESSFUL ACCESS FOR TWEEKED DRIVES
302;
303; DON'T NEED ANY MORE
304; TWEEKCHECK:
305; PUSH AX
306; MOV AX,WORD PTR DS:[DI].FLAGS
307; TEST AL,FCHANGED_BY_FORMAT
308; JZ TWEEKDONE
309; MOV CS:[TIM_DRV],-1
310; TWEEKDONE:
311; POP AX
312; RET
313
314;
315; DRIVE IS THE LOGICAL DRIVE TO USE
316;
317; FORMAT_MEDIA_CHECK: ;ARR 2.42
318; PUSH AX
319; MOV AX,WORD PTR DS:[DI].FLAGS
320; TEST AL,FCHANGED_BY_FORMAT
321; JZ RETF1 ; MEDIA NOT CHANGED VIA FORMAT
322; AND AL,NOT FCHANGED_BY_FORMAT
323; MOV WORD PTR [DI].FLAGS,AX ; RESET CHANGED_BY_FORMAT BIT
324; MOV SI,-1 ; MEDIA CHANGED VIA FORMAT
325; RETF1:
326; POP AX
327; RET
328
329;
330; MOVES THE POINTER TO THE VOLID FOR THE DRIVE INTO THE ORIGINAL REQUEST PACKET
331; ON ENTRY, DS:BX POINTS TO THE ORIGINAL PACKET.
332; NO ATTEMPT IS MADE TO PRESERVE REGISTERS.
333;
334MEDIA_SET_VID: ; ARR 2.42
335 PUBLIC MEDIA_SET_VID
336
337 CALL INIT_VID_LOOP ; SETS ES:DI -> VID
338 LDS BX,CS:[PTRSAV] ; GET POINTER TO PACKET
339 MOV WORD PTR [BX.TRANS+1],DI
340 MOV WORD PTR [BX.TRANS+3],ES
341 RET
342
343
344;
345; HIDENSITY - EXAMINE A DRIVE/MEDIA DESCRIPTOR TO SET THE MEDIA TYPE. IF
346; THE MEDIA DESCRIPTOR IS NOT F9 (NOT 96TPI OR 3 1/2), WE RETURN AND LET THE
347; CALLER DO THE REST. OTHERWISE, WE POP OFF THE RETURN AND JUMP TO THE TAIL
348; OF GETBP. FOR 3.5" MEDIA, WE JUST RETURN.
349;
350; INPUTS: DS:DI POINT TO CORRECT BDS FOR THIS DRIVE
351; AH HAS MEDIA BYTE
352;
353; OUTPUTS: CARRY CLEAR
354; NO REGISTERS MODIFIED
355; CARRY SET
356; AL = SECTORS/FAT
357; BH = NUMBER OF ROOT DIRECTORY ENTRIES
358; BL = SECTORS PER TRACK
359; CX = NUMBER OF SECTORS
360; DH = SECTORS PER ALLOCATION UNIT
361; DL = NUMBER OF HEADS
362;
363HIDENSITY:
364 PUBLIC HIDENSITY
365;
366; CHECK FOR CORRECT DRIVE
367;
368 TEST WORD PTR DS:[DI].FLAGS,FCHANGELINE ; IS IT SPECIAL?
369 JZ DOFLOPPY ; NO, DO NORMAL FLOPPY TEST
370;
371; WE HAVE A MEDIA BYTE THAT IS PRETTY COMPLEX. EXAMINE DRIVE INFORMATION
372; TABLE TO SEE WHAT KIND IT IS.
373;
374 CMP BYTE PTR DS:[DI].FORMFACTOR,FFSMALL; IS IT SINGLE-MEDIA?
375 JZ DOFLOPPY ; YES, USE FATID...
376;
377; 96 TPI DRIVE
378;
379 CMP AH,0F9H
380 JNZ DOFLOPPY
381 MOV AL,7 ; SEVEN SECTORS / FAT
382 MOV BX,224*256+0FH ; 224 ROOT DIR ENTRIES & 0F SECTOR MAX
383 MOV CX,80*15*2 ; 80 TRACKS, 15 SECTORS/TRACK, 2 SIDES
384 MOV DX,01*256+2 ; SECTORS/ALLOCATION UNIT & HEAD MAX
385POPR:
386 ADD SP,2 ; POP OFF RETURN ADDRESS
387 JMP HAS1 ; RETURN TO TAIL OF GETBP
388
389DOFLOPPY:
390 RET
391
392 PATHSTART 001,TPI96
393
394;
395; CERTAIN BOGUS PROGRAMS AVOID DOS ALTOGETHER AND USE INT 13 DIRECTLY. THESE
396; PROGRAMS EVEN RETRY OPERATIONS AND, THUS, WILL IGNORE THE DISK CHANGE LOGIC.
397;
398; WE HOOK INT 13 AND NOTE ALL ERRORS.
399;
400 ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING
401 PUBLIC REAL13
402REAL13 DD ?
403OLDINT DD ?
404DMY DW ?
405
406 PATHEND 001,TPI96
407
408 PUBLIC INT13
409INT13 PROC FAR
410 POP WORD PTR OLDINT
411 POP WORD PTR OLDINT+2
412 POP DMY
413 MESSAGE FTEST13,<"*">
414 PUSHF
415 CALL REAL13 ; SIMULATE ANOTHER INT 13
416 JC ERR13 ; DID AN ERROR OCCUR?
417 JMP OLDINT ; NO, RETURN AND POP OFF FLAGS
418ERR13:
419 MESSAGE FTEST13,<"INT 13 ERROR ">
420 MNUM FTEST13,AX
421 MESSAGE FTEST13,<CR,LF>
422 PUSHF ; SAVE STATE
423 CMP AH,06H ; DID I SEE A CHANGE EVENT?
424 JZ GOTERR ; YES
425B: POPF ; NO, SOME OTHER ERROR, IGNORE IT
426 JMP OLDINT ; RETURN AND POP OFF FLAGS
427GOTERR: OR DL,DL ; IS THIS FOR THE HARD DISK?
428 JS B ; YES, IGNORE
429 MOV WORD PTR CS:[FLAGBITS],FCHANGED
430 CALL SET_CHANGED_DL
431 JMP B
432INT13 ENDP
433
434;
435; SET_CHANGED_DL - SETS FLAG BITS ACCORDING TO BITS SET IN [FLAGBITS].
436; ESSENTIALLY USED TO INDICATE CHANGELINE, OR FORMAT.
437;
438; INPUTS: DL CONTAINS PHYSICAL DRIVE NUMBER
439; [FLAGBITS] CONTAINS BITS TO SET IN THE FLAG FIELD IN THE BDSS
440; OUTPUTS: NONE
441; REGISTERS MODIFIED: FLAGS
442;
443SET_CHANGED_DL:
444 PUBLIC SET_CHANGED_DL
445
446 MESSAGE FTEST96,<"SET CHANGED",CR,LF>
447 PUSH BX
448 PUSH DX
449 MOV BL,DL
450ALL_SET:
451 MOV DX,CS:[FLAGBITS] ; GET BITS TO SET IN FLAG FIELD
452 XOR BH,BH
453;
454; IN THE VIRTUAL DRIVE SYSTEM WE *MUST* FLAG THE OTHER DRIVES AS BEING CHANGED
455;
456; ASSUME FIRST BDS IS IN THIS SEGMENT
457 PUSH AX
458 PUSH DS ; SAVE CURRENT BDS
459 PUSH DI
460 LDS DI,DWORD PTR CS:[START_BDS]
461SCAN_BDS:
462 CMP DI,-1
463 JZ SKIPSET
464 CMP BYTE PTR [DI].DRIVENUM,BL
465 JNZ GET_NEXT_BDS
466;
467; SOMEONE MAY COMPLAIN, BUT THIS *ALWAYS* MUST BE DONE WHEN A DISK CHANGE IS
468; NOTED. THERE ARE *NO* OTHER COMPROMISING CIRCUMSTANCES.
469;
470SETCHANGED:
471 OR WORD PTR DS:[DI].FLAGS,DX ; SIGNAL CHANGE ON OTHER DRIVE
472GET_NEXT_BDS:
473 MOV AX,WORD PTR [DI].LINK+2 ; GO TO NEXT BDS
474 MOV DI,WORD PTR [DI].LINK
475 MOV DS,AX
476 JMP SHORT SCAN_BDS
477SKIPSET:
478 POP DI ; RESTORE CURRENT BDS
479 POP DS
480 POP AX
481 POP DX
482 POP BX
483 RET
484
485;
486; CHECKROMCHANGE - SEE IF EXTERNAL PROGRAM HAS DIDDLED ROM CHANGE LINE.
487;
488; INPUTS: DS:DI POINTS TO CURRENT BDS.
489; OUTPUTS: ZERO SET - NO CHANGE
490; ZERO RESET - CHANGE
491; REGISTERS MODIFIED: NONE
492
493CHECKROMCHANGE:
494 MESSAGE FTEST13,<"CHECKROM ">
495 MNUM FTEST13
496 MESSAGE FTEST13,<CR,LF>
497 TEST WORD PTR [DI].FLAGS,FCHANGED
498 RET
499
500;
501; RESETCHANGED - RESTORE VALUE OF CHANGE LINE
502;
503; INPUTS: DS:DI POINTS TO CURRENT BDS
504; OUTPUTS: NONE
505; REGISTERS MODIFIED: NONE
506
507 public ResetChanged
508RESETCHANGED:
509 MESSAGE FTEST13,<"RESETCHANGED ">
510 MNUM FTEST13
511 MESSAGE FTEST13,<CR,LF>
512 AND WORD PTR DS:[DI].FLAGS,NOT FCHANGED
513 RET
514
515;
516; HASCHANGE - SEE IF DRIVE CAN SUPPLY CHANGE LINE
517;
518; INPUTS: DS:DI POINTS TO CURRENT BDS
519; OUTPUTS: ZERO SET - NO CHANGE LINE AVAILABLE
520; ZERO RESET - CHANGE LINE AVAILABLE
521; REGISTERS MODIFIED: NONE
522
523 PUBLIC HASCHANGE
524HASCHANGE:
525 MESSAGE FTEST13,<"HASCHANGE ">
526 MNUM FTEST13
527 MESSAGE FTEST13,<CR,LF>
528 TEST WORD PTR [DI].FLAGS,FCHANGELINE
529 RET
530
531 ASSUME DS:CODE
532
533 INCLUDE MSVOLID.INC
534
535 PUBLIC END96TPI
536END96TPI LABEL BYTE