-
Notifications
You must be signed in to change notification settings - Fork 31
/
test1.asm
2321 lines (1973 loc) · 66 KB
/
test1.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
TITLE TEST1 ---- 06/10/85 POWER ON SELF TEST (POST)
CODE SEGMENT WORD PUBLIC
PUBLIC C8042
PUBLIC OBF_42
PUBLIC POST1
PUBLIC START_1
EXTRN CMOS_READ:NEAR
EXTRN CMOS_WRITE:NEAR
EXTRN CONFIG_BAD:NEAR
EXTRN D11:NEAR
EXTRN DDS:NEAR
EXTRN DUMMY_RETURN:NEAR
EXTRN ERR_BEEP:NEAR
EXTRN GATE_A20:NEAR
EXTRN KBD_RESET:NEAR
EXTAN NMI_INT:NEAR
EXTRN POST2:NEAR
EXTRN PRINT_SCREEN:NEAR
EXTRN PROC_SHUTDOWN:NEAR
EXTRN ROM_CHECK:NEAR
EXTRN SHUT2:NEAR
EXTRN SHUT3:NEAR
EXTRN SHUT4:NEAR
EXTRN SHUT6:NEAR
EXTRN SHUT7:NEAR
EXTRN SHUT9:NEAR
EXTRN SLAVE_VECTOR_TABLE:NEAR
EXTRN STGTST_CNT:NEAR
EXTRN SYSINIT1:NEAR
EXTRN VECTOR_TABLE:NEAR
EXTRN VIDEO_PARMS:BYTE
ASSUME CS:CODE,DS:NOTHING,ES:NOTHING,SS:NOTHING
POST1 PROC NEAR
BEGIN EQU $
DB '6480090COPR. IBM CORP. 1981,1985 ' ;COPYRIGHT NOTICE
EVEN ;EVEN BOUNDARY
; 6 4 8 0 0 9 0 C O P R . I B M 1 9 8 5 ;EVEN MODULE
; 6 4 8 0 0 9 1 C O P R . I B M 1 9 8 5 ;ODD MODULE
DB '66448800009901 CCOOPPRR.. IIBBMM 11998855' ;COPYRIGHT NOTICE
DB ' ' ;PAD
;-------------------------------------------------
; INITIAL RELIABILITY TESTS -- (POST1) :
;-------------------------------------------------
;------------------------------------------
; TEST.01 :
; 80286 PROCESSOR TEST (REAL MODE) :
; DESCRIPTION :
; VERIFY FLAGS, REGISTERS :
; AND CONDITIONAL JUMPS. :
;------------------------------------------
ASSUME DS:DATA
START_1: CLI ; DISABLE INTERRUPTS
MOV AX,0D500H+CMOS_REG_D+NMI ; FLAG MASK IN (AH) AND NMI MASK IN (AL)
OUT CMOS_PORT,AL ; DISABLE NMI INTERRUPTS
SAHF ; SET "SF" "ZF" "AF" "PF" "CF" FLAGS ON
JNC ERR02 ; GO TO ERROR ROUTINE IF "CF" NOT SET
JNZ ERR02 ; GO TO ERROR ROUTINE IF "ZF" NOT SET
JNP ERR02 ; GO TO ERROR ROUTINE IF "PF" NOT SET
JNS ERR02 ; GO TO ERROR ROUTINE IF "SF" NOT SET
LAHF ; LOAD FLAG IMAGE TO (AH)
MOV CL,5 ; LOAD COUNT REGISTER WITH SHIFT COUNT
SHR AH,CL ; SHIFT *AF" INTO CARRY BIT POSITION
JNC ERR02 ; GO TO ERROR ROUTINE IF *AF" NOT SET
MOV AL,40H ; SET THE *OF" FLAG ON
SHL AL,1 ; SETUP FOR TESTING
JNO ERR02 ; GO TO ERROR ROUTINE IF *OF" NOT SET
XOR AH,AH ; SET (AH) = 0
SAHF ; CLEAR "SF*, "CF", "ZF", AND "PF"
JBE EM02 ; GO TO ERROR ROUTINE IF *CF* ON
; GO TO ERROR ROUTINE IF "ZF" ON
JS ERR02 ; GO TO ERROR ROUTINE IF *SF* ON
JP ERR02 ; GO TO ERROR ROUTINE IF "PF" ON
LAHF ; LOAD FLAG IMAGE TO (AH)
SHR AH,CL ; SHIFT *AF" INTO CARRY BIT POSITION
JC ERR02 ; GO TO ERROR ROUTINE IF ON
SHL AH,1 ; CHECK THAT "OF" IS CLEAR
JO ERR02 ; GO TO ERROR ROUTINE IF ON
JZ VA ; CONTINUE CONFIDENCE TESTS IF *ZF" SET
ERR02:
HLT ; ERROR HALT
JMP ERR02 ; ERROR LOOP TRAP
C7A:
MOV AX,DATA ; SET DATA SEGMENT
MOV DS,AX ; INTO THE (DS) SEGMENT REGISTER
;----- CHECK FOR PROCESSOR SHUTDOWN
IN AL,STATUS_PORT ; READ CURRENT KEYBOARD PROCESSOR STATUS
TEST AL,SYS_FLAG ; CHECK FOR SHUTDOWN IN PROCESS FLAG
JNZ C7B ; GO IF YES
JMP SHUT0 ; USE CONTINUE NORMAL POWER ON CODE
;----- CHECK FOR SHUTDOWN 09
C7B:
MOV AL,CMOS_SHUT_DOWN+NNI ; CMOS ADDRESS FOR SHUTDOWN BYTE
OUT CMOS_PORT,AL
JMP $+2 ; I/O DELAY
IN AL,CMCS_DATA ; GET REQUEST NUMBER
CMP AL,09H ; WAS IT SHUTDOWN REQUEST 9?
XCHG AL,AH ; SAVE THE SHUTDOWN REQUEST
JE C7C ; BYPASS INITIALIZING INTERRUPT CHIPS
;----- CHECK FOR SHUTDOWN 0A
CMP AH,0AH ; WAS IT SHUTDOWN REQUEST A?
JE C7C ; BYPASS INITIALIZING INTERRUPT CHIPS
SUB AL,AL ; INSURE MATH PROCESSOR RESET
OUT X287+1,AL
;---------------------------------------------------------
; RE-INITIALIZE THE 8259 INTERRUPT #1 CONTROLLER CHIP :
;---------------------------------------------------------
MOV AL,11H ; ICW1 - EDGE, MASTER, ICW4
OUT INTA00,AL
JMP $+2 ; WAIT STATE FOR I/O
MOV AL,08H ; SETUP ICW2 - INTERRUPT TYPE 8H (8-F)
OUT INTA01,AL
JMP $+2 ; WAIT STATE FOR I/O
MOV AL,04H ; SETUP ICW3 - MASTER LEVEL 2
OUT INTA01,AL
JMP $+2 ; I/O WAIT STATE
MOV AL,01H ; SETUP ICW4 - MASTER,8086 MODE
OUT INTA01,AL
JMP $+2 ; WAIT STATE FOR I/O
MOV AL,0FFH ; MASK ALL INTERRUPTS OFF
OUT INTA01,AL ; (VIDEO ROUTINE ENABLES INTERRUPTS)
;---------------------------------------------------------
; RE-INITIALIZE THE 8259 INTERRUPT #2 CONTROLLER CHIP :
;---------------------------------------------------------
MOV AL,11H ; ICW1 - EDGE, SLAVE ICW4
OUT INTB00,AL
JMP $+2 ; WAIT STATE FOR I/O
MOV AL,INT_TYPE ; SETUP ICW2 - INTERRUPT TYPE 70 (70-7F)
OUT INTB01,AL
MOV AL,02H ; SETUP ICW3 - SLAVE LEVEL 2
JMP $+2
OUT INTB01,AL
JMP $+2 ; I/O DELAY
MOV AL,01H ; SETUP ICW4 - 8086 MODE, SLAVE
OUT INTB01,AL
JMP $+2 ; WAIT STATE FOR I/O
MOV AL,0FFH ; MASK ALL INTERRUPTS OFF
OUT INTB01,AL
;--------------------------------------------------------------------------------
; SHUTDOWN - RESTART :
; RETURN CONTROL AFTER A SHUTDOWN COMMAND IS ISSUED :
; DESCRIPTION :
; A TEST IS MADE FOR THE SYSTEM FLAG BEING SET. IF THE SYSTEM FLAG IS :
; SET, THE SHUTDOWN BYTE IN CMOS IS USED TO DETERMINE WHERE CONTROL IS :
; RETURNED. :
; :
; CMOS = 0 SOFT RESET OR UNEXPECTED SHUTDOWN :
; CMOS = 1 SHUT DOWN AFTER MEMORY SIZE :
; CMOS = 2 SHUT DOWN AFTER MEMORY TEST :
; CMOS = 3 SHUT DOWN WITH MEMORY ERROR :
; CMOS = 4 SHUT DOWN WITH BOOT LOADER REQUEST :
; CMOS = 5 JMP DWORD REQUEST - (INTERRUPT CHIPS & 287 ARE INITIALIZED) :
; CMOS = 6 PROTECTED MODE TEST3 PASSED :
; CMOS = 7 PROTECTED MODE TEST3 FAILED :
; CMOS = 8 PROTECTED MODE TEST1 FAILED :
; CMOS = 9 BLOCK MOVE SHUTDOWN REQUEST :
; CMOS = A JMP DWORD REQUEST - (W/O INTERRUPT CHIPS INITIALIZED) :
; :
; NOTES: RETURNS ARE MADE WITH INTERRUPTS AND NMI DISABLED. :
; USER MUST RESTORE SS:SP (POST DEFAULT SET = 0000:0400), :
; ENABLE NON-MASKABLE INTERRUPTS (NMI) WITH AN OUT TO :
; PORT 70H WITH HIGH ORDER BIT OFF, AND THEN ISSUE A :
; STI TO ENABLE INTERRUPTS. FOR SHUTDOWN (5) THE USER :
; MUST ALSO RESTORE THE INTERRUPT MASK REGISTERS. :
;--------------------------------------------------------------------------------
;----- CHECK FROM WHERE
C7C:
MOV AL,CMOS_SHUT_DOWN+NMI ; CLEAR CMOS BYTE
OUT CMOS_PORT,AL
NOP ; I/0 DELAY
SUB AL,AL ; SET BYTE TO 0
OUT CMOS_DATA,AL
XCHG AH,AL
CMP AL,0AH ; COMPARE WITH MAXIMUM TABLE ENTRIES
JA SHUT0 ; SKIP TO POST IF GREATER THAN MAXIMUM
MOV SI,OFFSET BRANCH ; POINT TO THE START OF THE BRANCH T
ADD SI,AX
ADD SI,AX ; POINT TO BRANCH ADDRESS
MOV BX,CS:[SI] ; MOVE BRANCH TO ADDRESS TO BX REGISTER
;----- SET TEMPORARY STACK FOR POST
MOV AX,ABS0 ; SET STACK SEGMENT TO ABS0 SEGMENT
MOV SS,AX
MOV SP,OFFSET @TOS ; SET STACK POINTER TO END OF VECTORS
JMP BX ; JUMP BACK TO RETURN ROUTINE
BRANCH: DW SHUT0 ; NORMAL POWER UP/UNEXPECTED SHUTDOWN
DW SHUT1 ; SHUT DOWN AFTER MEMORY SIZE
DW SHUT2 ; SHUT DOWN AFTER MEMORY TEST
DW SHUT3 ; SHUT DOWN WITH MEMORY ERROR
DW SHUT4 ; SHUT DOWN WITH BOOT LOADER REQUEST
DW SHUT5 ; JMP DWORD REQUEST WTTH INTERRUPT INIT
DW SHUT6 ; PROTECTED MODE TEST7 PASSED
DW SHUT7 ; PROTECTED MODE TEST7 FAILED
DW SHUT8 ; PROTECTED MODE TEST1 FAILED
DW SHUT9 ; BLOCK MOVE SHUTDOWN REQUEST
DW SHUTA ; JMP DWORD REQUEST (W/O INTERRUPT INIT)
;----- @IO_ROM_INIT MUST BE INITIALIZED BY THE USER FOR VECTORED REQUESTS
SHUT5:
IN AL,PORT_A ; FLUSH THE KEYBOARD BUFFER
MOV AL,EOI ; FLUSH LAST TIMER REQUEST IF PENDING
OUT INTA00,AL ; TO ALLOW TIMER INTERRUPTS
SHUTA:
JMP DWORD PTR @IO_ROM_INIT ; FAR JUMP TO USER DEFINED LOCATION
; AFTER SHUTDOWN TO REAL MODE CODE
; WITH INTERRUPTS AND NMI DISABLED
;----- CHECKPOINT 01
SHUT0:
MOV AL,01H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 01 <><>
;----- READ/WRITE/TEST THE 80286 REGISTERS WITH ONE'S AND ZERO'S
MOV AX,0FFFFH ; SETUP ONE*S PATTERN IN (AX)
STC ; SET CARRY FLAG
JNC ERR01 ; GO IF NO CARRY
C8:
MOV DS,AX ; WRITE PATTERN TO ALL REGISTERS
MOV BX,DS
MOV ES,BX
MOV CX,ES
MOV SS,CX
MOV DX,SS
MOV SP,DX
MOV BP,SP
MOV SI,BP
MOV DI,SI
JNC C9
XOR AX,DI ; PATTERN MAKE IT THROUGH ALL REGISTERS
JNZ ERR01 ; NO - GO TO ERROR ROUTINE
CLC ; CLEAR CARRY FLAG
C9: ; TST1A
OR AX,01 ; ZERO PATTERN MAKE IT THROUGH ?
JZ C10A ; YES - GO TO NEXT TEST
ERR01:
HLT ; HALT SYSTEM
;----- INSURE THAT CMOS CLOCK INTERRUPTS ARE DISABLED
C10A:
MOV AX,X*(CMOS_REG_B+NMI) ; ADDRESS TO BOTH (AH) AND (AL)
OUT CMOS_PORT,AL ; ADDRESS CMOS ALARM BYTE WITH NMI=OFF
NOP ; I/O DELAY
IN AL,CMOS_DATA ; GET THE CURRENT CONTROL REGISTER
AND AL,00000111B ; CLEAR SET,PIE,AIE, AND SQWE BITS
XCHG AL,AH ; SAVE IT
OUT CMOS_PORT,AL
XCHG AL,AH
OUT CMOS_DATA,AL
MOV AL,CMOS_REG_C+NMI ; ADDRESS CMOS FLAGS BYTE WITH NMI=OFF
NOP ; I/O DELAY
OUT CMOS_PORT,AL
NOP ; I/O DELAY
IN AL,CMOS_DATA ; READ STATUS TO CLEAR PENDING INTERRUPT
;----- RESET VIDEO
MOV AL,0 ; CLEAR DATA BYTE TO DISABLE VIDEO
MOV DX,03D8H ; GET COLOR MODE CONTROL PORT ADDRESS
OUT DX,AL ; DISABLE COLOR VIDEO
INC AL ; MONOCHROME MODE RESET MASK
MOV DL,0B8H ; GET ADDRESS OF MONOCHROME MODE CONTROL
OUT DX,AL ; DISABLE B/W VIDEO, ENABLE HIGH RES
MOV DL,0BAH ; ADDRESS OF MONOCHROME STATUS REGISTER
IN AL,DX ; READ STATUS TO DISABLE EGA VIDEO
MOV DL,0DAH ; ADDRESS OF COLOR MODE STATUS REGISTER
IN AL,DX ; READ STATUS TO DISABLE EGA VIDEO
MOV AL,0 ; SELECT ATTRIBUTE PALETTE REGISTER 0
MOV DL,0C0H ; WRITE 0 TO ATTRIBUTE ADDRESS REGISTER
OUT DX,AL ; TO DISABLE EGA VIDEO
MOV AL,11111100B ; DISABLE PARITY CHECKERS
OUT PORT_B,AL
;------------------------------------------
; TEST.02 :
; ROM CHECKSUM TEST 1 :
; DESCRIPTION :
; A CHECKSUM IS DONE FOR THE 32K :
; READ ONLY MEMORY MODULES (TWO) :
; CONTAINING POST, BASIC AND BIOS. :
;------------------------------------------
;----- CHECKPOINT 02
MOV AL,02H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 02 <><>
ASSUME SS:CODE
MOV AX,CS ; SETUP SS SEGMENT REGISTER
MOV SS,AX
MOV DS,AX ; SET UP DATA SEGMENT TO POINT TO
XOR SI,SI ; ROM ADDRESS START
XOR BX,BX ; CLEAR CHECK REGISTER
MOV CH,080H ; COUNT FOR 32K WORDS
C11:
LODSW ; MOVE TWO BYTES INTO AX - SI=SI+2
ADD BL,AH ; ADD ODD BYTE AT DS:SI+1 TO CHECKSUM
ADD BL,AL ; ADD EVEN BYTE AT DS:SI TO CHECKSUM
LOOP C11 ; LOOP COUNT FOR 65K BYTES (32K WORDS)
JC C11E ; EXIT IF "LOOP* RESET THE CARRY FLAG
; (NOTE: MODEL BYTE MUST NOT = ZERO)
JZ C11A ; CONTINUE IF CHECKSUM VALID (ZERO)
C11E:
HLT ; ELSE HALT IF CHECKSUM PROBLEM
;------------------------------------------
; TEST.03 :
; VERIFY CMOS SHUTDOWN BYTE :
; DESCRIPTION :
; ROLLING BIT WRITTEN AND :
; VERIFIED AT SHUTDOWN ADDRESS. :
;------------------------------------------
;----- VERIFY AND CLEAR SHUTDOWN FLAG
C11A:
MOV AL,03H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 03 <><>
MOV CX,09H ; LOOP COUNT
MOV AH,1 ; START WITH BIT 0
C11B:
MOV AL,CMOS_SHUT_DOWN+NMI
OUT CMOS_PORT,AL
MOV AL,AH ; OUTPUT ROLLING BIT
OUT CMOS_DATA,AL
MOV AL,CMOS_SHUT_DOWN+NMI ; READ CMOS
NOP ; I/O DELAY
OUT CMOS_PORT,AL
NOP ; I/O DELAY
IN AL,CMOS_DATA
CMP AL,AH ; MUST BE THE SAME
JNZ ERR01 ; ERROR IF NOT
RCL AH,1 ; ROLL A BIT THROUGH SHUTDOWN BYTE
LOOP C11B ; LOOP TILL DONE
;------------------------------------------
; TEST.04 :
; 8254 CHECK TIMER 1 ALL BITS ON :
; DESCRIPTION :
; SET TIMER COUNT :
; CHECK THAT TIMER 1 ALL BITS ON :
;------------------------------------------
ASSUME DS:DATA
MOV AX,DATA ; SET DATA SEGMENT
MOV DS,AX
MOV AL,04H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 04 <><>
;----- DISABLE DMA CONTROLLER
; (AL) ALREADY = 04H
OUT DMA08,AL ; DISABLE DMA CONTROLLER 1
OUT DMA18,AL ; DISABLE DMA CONTROLLER 2
;----- VERIFY THAT TIMER 1 FUNCTIONS OK
MOV DX,@RESET_FLAG ; SAVE RESET FLAG WHILE REFRESH IS OFF
MOV AL,54H ; SELECT TIMER 1,LSB,MODE 2
OUT TIMER+3,AL
JMP $+2 ; I/O DELAY
MOV AL,CL ; SET INITIAL TIMER COUNT TO 0
OUT TIMER+1,AL
MOV BH,05H ; LOOP COUNT
C12: ; TIMER1_BITS_ON
MOV AL,40H ; LATCH TIMER 1 COUNT
JMP $+2 ; I/O DELAY
OUT TIMER+3,AL
CMP BL,0FFH ; YES - SEE IF ALL BITS GO OFF
JE C13 ; TIMER1_BITS_OFF
IN AL,TIMER+1 ; READ TTMER 1 COUNT
OR BL,AL ; ALL BITS ON IN TIMER
LOOP C12 ; TIMER1_BITS_ON
DEC BH
JNZ C12 ; TRY AGAIN
HLT ; TIMER 1 FAILURE, HALT SYSTEM
; TIMER1_BITS_OFF
;------------------------------------------
; TEST.05 :
; 8254 CHECK TIMER 1 ALL BIT OFF :
; DESCRIPTION :
; SET TIMER COUNT :
; CHECK THAT TIMER 1 ALL BITS OFF :
;------------------------------------------
;----- CHECKPOINT 05
C13: MOV AL,05H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 05 <><>
MOV AL,BL ; SET TIMER 1 COUNT
SUB CX,CX
OUT TIMER+1,AL
MOV BH,05H ; SET TRY AGAIN COUNT
C14: ; TIMER_LOOP
MOV AL,40H ; LATCH TIMER 1 COUNT
OUT TIMER+3,AL
JMP $+2 ; DELAY FOR TIMER
JMP $+2 ; ADDED DELAY FOR TIMER
IN AL,TIMER+1 ; READ TIMER 1 COUNT
AND BL,AL
JZ C15 ; GO TO WRAP DMA REGISTER TESTS
LOOP C14 ; TIMER_LOOP
DEC BH
JNZ C14
HLT ; HALT SYSTEM
;------------------------------------------
; TEST.06 :
; 8237 DMA 0 INITIALIZATION :
; CHANNEL REGISTER TEST :
; DESCRIPTION :
; DISABLE THE 8237 DMA CONTROLLER. :
; WRITE/READ THE CURRENT ADDRESS :
; AND WORD COUNT REGISTERS FOR :
; ALL CHANNELS. :
;------------------------------------------
;----- CHECKPOINT 06
C15:
MOV AX,DATA ; SET DATA SEGMENT
MOV DS,AX
MOV AL,06H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 06 <><>
MOV @RESET_FLAG,DX ; RESTORE SOFT RESET FLAG
OUT DMA+0DH,AL ; SEND MASTER CLEAR TO DMA
;----- WRAP DMA 0 CHANNEL ADDRESS AND COUNT REGISTERS
MOV AL,0FFH ; WRITE PATTERN *FF* TO ALL REGISTERS
C16: MOV BL,AL ; SAVE PATTERN FOR COMPARE
MOV BH,AL
MOV CX,8 ; SETUP LOOP COUNT
MOV DX,DMA ; SETUP I/O PORT ADDRESS OF REGISTER
C17: OUT DX,AL ; WRITE PATTERN TO REGISTER, LSB
JMP $+2 ; I/O DELAY
OUT DX,AL ; MSB OF 16 BIT REGISTER
MOV AL,01H ; AL TO ANOTHER PATTERN BEFORE READ
JMP $+2 ; I/O DELAY
IN AL,DX ; READ 16-BIT DMA CH REG, LSB 2ST DMA
JMP $+2 ; I/O DELAY
MOV AH,AL ; SAVE LSB OF 16-BIT REGISTER
IN AL,DX ; READ MSB OF DMA CHANNEL REGISTER
CMP AX,AX ; PATTERN READ AS WRITTEN?
JE C18 ; YES - CHECK NEXT REGISTER
HLT ; NO - HALT THE SYSTEM
C18: ; NXT_DMA_CH
INC DX ; SET I/O PORT TO NEXT CHANNEL REGISTER
LOOP C17 ; WRITE PATTERN TO NEXT REGISTER
INC AL ; SET PATTERN TO 0
JZ C16 ; YES CONTINUE
;----- WRITE DMA WITH 55 PATTERN
CMP BL,055H ; CHECK IF "55" PATTERN DONE
JZ C19 ; GO IF YES
CMP BL,0AAH ; CHECK IF "AA" PATTERN DONE
JZ C20 ; GO IF YES
MOV AL,055H
JMP C16
;----- WRITE DWA WITH AA PATTERN
C19: MOV AL,0AAH
JMP C16
;------------------------------------------
; TEST.07 :
; 8237 DMA 1 INITIALIZATION :
; CHANNEL REGISTER TEST :
; DESCRIPTION :
; DISABLE 8237 DMA CONTROLLER 1. :
; WRITE/READ THE CURRENT DMA 1 :
; ADDRESS AND WORD COUNT :
; REGISTERS FOR ALL CHANNELS. :
;------------------------------------------
;----- CHECKPOINT 07 - DMA 1
C20: MOV AL,07H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 07 <><>
OUT DMA1+0D*2,AL ; SEND MASTER CLEAR TO 2ND DMA
;----- WRAP DMA 1 CHANNEL ADDRESS AND COUNT REGISTERS
MOV AL,OFFH ; WRITE PATTERN FF TO ALL REGISTERS
C16A: MOV BL,AL ; SAVE PATTERN FOR COMPARE
MOV SH,AL
MOV CX,8 ; SETUP LOOP COUNT
MOV DX,OMAL ; SETUP I/O PORT ADDRESS OF REGISTER
C17A: OUT DX,AL ; WRITE PATTERN TO REGISTER, LSB
JMP $+2 ; I/O DELAY
OUT DX,AL ; MSB OF 16 BIT REGISTER
MOV AL,OIH ; AL TO ANOTHER PAT BEFORE RD
JMP $+2 ; I/O DELAY
IN AL,DX ; READ 16-BIT DMA CH REG, LSB 2ST DMA
JMP $+2 ; I/O DELAY
MOV AH,AL ; SAVE LSB OF 16-BIT REGISTER
IN AL,DX ; READ MSB OF DMA CH REGISTER
CMP SX,AX ; PATTERN READ AS WRITTEN?
JE C18A ; YES - CHECK NEXT REGISTER
HLT ; NO - HALT THE SYSTEM
C18A: ; NXT DMA CH
ADD DX,2 ; SET I/O PORT TO NEXT CHANNEL REGISTER
LOOP C17A ; WRITE PATTERN TO NEXT REGISTER
INC AL ; SET PATTERN TO 0
JZ C16A ; YES CONTINUE
;----- WRITE DMA WITH 55 PATTERN
CMP BL,55H ; CHECK IF 55 PATTERN DONE
JZ C20A ; GO IF YES
CMP BL,0AAH ; CHECK IF AA PATTERN DONE
JZ C21 ; GO IF YES
MOV AL,55H
JMP C16A
;----- WRITE DMA WITH AA PATTERN
C20A: MOV AL,0AAH
JMP C16A
;----- INITIALIZE AND START MEMORY REFRESH
C21:
MOV BX,@RESET_FLAG ; GET THE RESET FLAG
MOV @EQUIP FLAG,AX ; DO A DUMMY MEMORY WRITE BEFORE REFRESH
MOV AL,18 ; START REFRESH TIMER
OUT TIMER+1,AL
;----- SET DMA COMMAND
SUB AL,AL ; DACK SENSE LOW,DREQ SENSE HIGH
OUT DMA+8,AL ; LATE WRITE, FIXED PRIORITY, NORMAL
; TIMING, CONTROLLER ENABLE, CH0 ADDRESS
; HOLD DISABLE, MEMORY TO MEMORY DISABLE
OUT DMA18,AL ; SAME TO SECOND CONTROLLER
;----- MODE SET ALL DMA CHANNELS
MOV AL,40H ; SET MODE FOR CHANNEL 0
OUT DMA+0BH,AL
MOV AL,0C0H ; SET CASCADE MODE ON CHANNEL 4
OUT DMA18+06H,AL
JMP $+2 ; I/O DELAY
MOV AL,41H ; SET MODE FOR CHANNEL 1
OUT DMA+0BH,AL
OUT DMA18+06H,AL ; SET MODE FOR CHANNEL 5
JMP $+2 ; I/O DELAY
MOV AL,42H ; SET MODE FOR CHANNEL 2
OUT DMA+0BH,AL
OUT DMA18+06H,AL ; SET MODE FOR CHANNEL 6
JMP $+2 ; I/O DELAY
MOV AL,43H ; SET MODE FOR CHANNEL 3
OUT DMA+0BH,AL
OUT DMA18+06H,AL ; SET MODE FOR CHANNEL 7
;----- RESTORE RESET FLAG
MOV @RESET_FLAG,BX
;------------------------------------------
; TEST.08 :
; DMA PAGE REGISTER TEST :
; DESCRIPTION :
; WRITE/READ ALL PAGE REGISTERS :
;------------------------------------------
;----- CHECKPOINT 08
MOV AL,08H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 08 <><>
SUB AL,AL
MOV DX,DMA_ PAGE
MOV CX,0FFA ; DO ALL DATA PATTERNS
C22A: OUT DX,AL
INC DX
INC AL
CMP DX,8FH ; TEST DMA PAGES 81 THROUGH 8EH
JNZ C22A
XCHG AH,AL ; SAVE CURRENT DATA PATTERN
DEC AH ; CHECK LAST WRITTEN
DEC DX
C22B: SUB AL,AL ; CHANGE DATA BEFORE READ
IN AL,DX
CMP AL,AH ; DATA AS WRITTEN?
JNZ C26 ; GO ERROR HALT IF NOT
DEC AH
DEC DX
CMP DX,MFG_PORT ; CONTINUE TILL PORT 80
JNZ C22B
INC AH ; NEXT PATTERN TO RIPPLE
MOV AL,AH
LOOP C22A
;----- TEST LAST DMA PAGE REGISTER (USED FOR ADDRESS LINES DURING REFRESH)
MOV AL,0CCH ; WRITE AN CC TO PAGE REGISTERS
C22: MOV DX,LAST_DMA_PAGE
MOV AH,AL ; SAVE THE DATA PATTERN
OUT DX,AL ; OUTPUT PAGE REGISTER
;----- VERIFY PAGE REGISTER 8F
SUB AL,AL ; CHANGE DATA PATTERN BEFORE READ
IN AL,DX ; GET THE DATA FROM PAGE REGISTER
CMP AL,AH
JNZ C26 ; GO IF ERROR
CMP AH,0CCM
JNZ C25 ; GO IF ERROR
MOV AL,033H ; SET UP DATA PATTERN OF 33
JMP C22 ; DO DATA 33
C25:
CMP AH,0 ; CHECK DONE
JZ C27 ; GO IF YES
SUB AL,AL ; SET UP FOR DATA PATTERN 00
JMP C22 ; DO DATA 0
;----- ERROR HALT
C26:
HLT ; HALT SYSTEM
;------------------------------------------
; TEST.09 :
; STORAGE REFRESH TEST :
; DESCRIPTION :
; VERIFY REFRESH IS OCCURRING :
;------------------------------------------
;----- CHECKPOINT 09 - TEST MEMORY REFRESH
C27:
MOV AL,09H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 09 <><>
SUB CX,CX
C28:
IN AL,PORT_B ; INSURE REFRESH BIT IS TOGGLING
TEST AL,REFRESH_BIT
LOOPZ C28 ; INSURE REFRESH IS OFF
JCXZ C26 ; ERROR HALT IF TIMEOUT
C29:
IN AL,PORT_B
TEST AL,REFRFSH_BIT ; INSURE REFRESH IS ON
LOOPNZ C29
JCXZ C26 ; ERROR HALT IF NO REFRESH BIT
;------------------------------------------
; TEST.10 :
; 8042 INTERFACE TEST :
; READ CONFIGURATION JUMPERS :
; DESCRIPTION :
; ISSUE A SELF TEST TO THE 8042. :
; INSURE A 55H IS RECEIVED. :
; READ MANUFACTURING AND DISPLAY :
; JUMPERS AND SAVE IN MFG_TEST. :
;------------------------------------------
;----- CHECKPOINT 0A
MOV AL,0AH ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 0A <><>
;----- SOFT RESET (HANDLE ALL POSSIBLE CONDITIONS)
SUB CX,CX ; 100 MILLISECONDS FOR THIS LOOP
TST1: IN AL,STATUS_PORT ; CHECK FOR INPUT BUFFER FULL
MOV AH,AL
TEST AH OUT_BUF_FULL
JZ TST2 ; GO IF NOT
IN AL,PORT_A ; FLUSH
TST2: TEST AH,INPT_BUF_FULL ; IS THE OUTPUT BUFFER ALSO FULL?
LOOPNZ TST1 ; TRY AGAIN
JZ TST4 ; CONTINUE IF OK
ERR0: HLT ; HALT SYSTEM IF BUFFER FULL
;----- ISSUE A RESET TO THE 8042
TST4: MOV AL,0BH ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 0B <><>
MOV AL,SELF_TEST ; SELF TEST COMMAND
MOV SP,OFFSET C8042A ; SET RETURN ADDRESS
JMP SHORT C8042
TST4_B: TEST AL,OUT_BUF_FULL ; IS THE OUTPUT BUFFER FULL?
JZ TST4_A ; GO IF NOT
IN AL,PORT_A ; FLUSH
TST4_A: MOV SP,OFFSET OBF_42A ; SET RETURN ADDRESS
JMP SHORT OBF_42 ; GO WAIT FOR BUFFER
TST4_C: IN AL,PORT_A ; GET THE ENDING RESPONSE
CMP AL,55H
MOV AL,0CH ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT OC <><>
JNZ ERR0 ; GO IF NOT OK
;----- GET THE SWITCH SETTINGS
MOV AL,READ_8042_INPUT ; READ INPUT COMMAND
MOV SP:OFFSET C8042C ; SET RETURN ADDRESS
JMP SHORT C8042 ; ISSUE COMMAND
E30B: MOV SP,OFFSET OBF_42B ; SET RETURN ADDRESS
JMP SHORT OBF_42 ; GO WAIT FOR RESPONSE
E30C: IN AL,PORT_A ; GET THE SWITCH
OUT DMA_PAGE+1,AL ; SAVE TEMPORARY
;----- WRITE BYTE 0 OF 8042 MEMORY
MOV AL,WRITE_8042_LOC ; WRITE BYTE COMMAND
MOV OFFSET C8042B ; SET RETURN ADDRESS
JMP SHORT C8042 ; ISSUE THE COMMAND
TST4_D: JZ TST4_D1 ; CONTINUE IF COMMAND ACCEPTED
MOV AL,ODH ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 0D <><>
HLT
TST4_D1:
MOV AL,5DH ; ENABLE OUTPUT BUFFER FULL INTERRUPT,
OUT PORT_A,AL ; DISABLE KEYBOARD, SET SYSTEM FLAG,
JMP SHORT E30A ; PC 1 COMPATIBILITY, INHIBIT OVERRIDE
;----- ISSUE THE COMMAND TO THE 8042
C8042: CLI ; NO INTERRUPTS ALLOWED
OUT STATUS_PORT,AL ; SEND COMMAND IN AL REGISTER
SUB CX,CX ; LOOP COUNT
C42_1: IN AL,STATUS_PORT ; WAIT FOR THE COMMAND ACCEPTED
TEST AL,INPT_BUF_FULL
LOOPNZ C42_1
RET
;----- WAIT FOR 8042 RESPONSE
OBF_42: SUB CX,CX
MOV BL,6 ; 200MS/PER LOOP * 6 =1200 MS +
C42_2: IN AL,STATUS_PORT ; CHECK FOR RESPONSE
TEST AL,OUT_BUP_FULL
JNZ C42_3 ; GO IF RESPONSE
LOOP C42_2 ; TRY AGAIN
DEC BL ; DECREMENT LOOP COUNT
JNZ C42_2
C42_3: RET ; RETURN TO CALLER
;------------------------------------------
; TEST.11 :
; BASE 64K READ/WRITE MEMORY TEST :
; DESCRIPTION :
; WRITE/READ/VERIFY DATA PATTERNS :
; AA,55,FF,01, AND 00 TO 1 ST 64K :
; OF STORAGE, VERIFY STORAGE :
; ADDRESSABILITY. ;
;------------------------------------------
;----- FILL MEMORY WITH DATA
E30A: MOV AL,0EH ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 0E <><>
MOV AX,DATA ; GET THE SYSTEM SEGMENT
MOV DS,AX ; OF DATA
MOV DX,@RESET_FLAG ; SAVE @RESET FLAG IN BX
CLD ; SET DIRECTION FLAG TO INCREMENT
MOV CX,2000H*4 ; SET FOR 32K WORDS
SUB DI,DI ; FIRST 16K
SUB SI,SI
SUB AX,AX
MOV DS,AX
MOV ES,AX
CMP BX,1234H ; WARM START?
JNZ E30A_0 ; GO IF NOT
JMP CLR_STG
;----- GET THE INPUT BUFFER (SWITCH SETTINGS)
E30A_0: MOV AL,0FH ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 0F <><>
MOV AL,PARITY_CHECK ; SET BASE MEMORY PARITY
OUT DMA_PAGE+6,AL ; USE AS TEMPORARY SAVE
MOV SP,OFFSET C2 ; SET RETURN ADDRESS
JMP STGTST_CNT
C30: MOV BX,AX ; SAVE FAILING BIT PATTERN
JNZ C31
JMP C33 ; STORAGE OK, CONTINUE
;----- TEMPORARY STACK FOR POST ROUTINES
C2 DW C30
C8042A DW TST4_B
OBF_42A DW TST4_C
C8042B DW TST4_D
C8042C DW E30B
OBF_42B DW E30C
;------------------------------------------
; BASE 64K STORAGE FAILURE
; DISPLAY THE CHECKPOINT IMFG CHECKPOINT)
; AND XOR EXPECTED WITH READ IN MFG_PORT
; DISPLAY CHECKPOINT IN MFG_PORT+3
; DISPLAY XOR'D DATA HIGH BYTE MFG_PORT+1
; LOW BYTE IN MFG_PORT+2
; A READ/WRITE SCOPE LOOP OF THE FIRST
; WORD FOR POSSIBLE ADDRESS LINE FAILURES
;-------------------------------------------
C31:
MOV AL,AH ; SAVE HIGH BYTE
OUT MFG_PORT-1,AL
MOV AL,81- ; SavE LOW BYTE
OUT MFC_PCRT-2,AL
;----- CHECK FOR VIDEO ROM
MOV CX,0C000H ; START OF I/O ROM
M1: MOV DS'CX ; POINT TO SEGMENT
SUB BX,BX ; GET THE FIRST 2 LOCATIONS
MOV AX'[BX]
JMP $+2 ; BUS SETTLE
CMP AX,0AA55H ; IS THE VIDEO ROM PRESENT?
POP
JZ Z5 ; GO IF YES
ADD CX,080H ; POINT TO NEXT 2K BLOCK
CMP CX,0C800H ; TOP OF VIDEO ROM AREA YET?
JL M1 ; TRY AGAIN
AND CX,CX ; SET NON ZERO FLAG
Z5:
JNZ C32 ; GO IF NOT
JMP C31_0 ; BYPASS ERROR DISPLAY IF VIDEO ROM
;-------------------------------------------------------
; SET VIDEO MODE TO DISPLAY MEMORY ERROR
; THIS ROUTINE INITIALIZES THE ATTACHMENT TO
; TO DISPLAY FIRST 64K STORAGE ERRORS.
; BOTH COLOR AND MONOCHROME ATTACHMENTS ARE INITIALIZED.
;-------------------------------------------------------
;----- INITIALIZE COLOR/MONOCHROME
C32: MOV DX,3D8H ; CONTROL REGISTER ADDRESS OF COLOR CARD
SUB AL,AL ; MODE SET
OUT DX,AL
MOV DX,03B8H ; CONTROL REGISTER ADDRESS OF B/W CARD
MOV AL,1 ; MODE SET FOR CARD
OUT DX,AL ; RESET VIDEO
SUB DX,4 ; BACK TO BASE REGISTER
M4 EQU 10H
MOV BX,OFFSET VIDEO_PARMS+M4*3 ; POINT TO VIDEO PARAMETERS
ASSUME DS:COOE
Z_2: MOV CX,M4 ; COUNT OF MONOCHROME VIDEO PARAMETERS
;----- BX POINTS TO CORRECT ROW OF INITIALIZATION TABLE
XOR AH,AH ; AH IS REGISTER NUMBER DURING LOOP
;----- LOOP THROUGH TABLE, OUTPUTTING REGISTER ADDRESS, THEN VALUE FROM TABLE
M10: MOV AL,AH ; GET 6845 REGISTER NUMBER
OUT DX,AL
INC DX ; POINT TO DATA PORT
INC AH ; NEXT REGISTER VALUE
MOV AL,CS:[BX] ; GET TABLE VALUE
OUT DX,AL ; OUT TO CHIP
INC BX ; NEXT IN TABLE
DEC DX ; BACK TO POINTER REGISTER
LOOP M10 ; DO THE WHOLE TABLE
MOV AH,DL ; CHECK IF COLOR CARD DONE
AND AH,0F0H ; STRIP UNWANTED BITS
CMP AH,0D0H ; IS IT THE COLOR CARD7
JZ Z_3 ; CONTINUE IF COLOR
MOV BX,OFFSET VIDEO_PARMS ; POINT TO VIDEO PARAMETERS
MOV DX,3D4H ; COLOR BASE
JMP Z_2 ; CONTINUE
;----- FILL REGEN AREA WITH BLANK
Z_3: XOR DI,DI ; SET UP POINTER FOR REGEN
MOV AX,0B000H ; SET UP ES TO VIDEO REGEN
MOV ES,AX
MOV CX,2048 ; NUMBER OF WORDS IN MONOCHROME CARD
MOV AX,' '+7*H ; FILL CHARACTER FOR ALPHA - ATTRIBUTE
REP STOSW ; FILL THE REGEN BUFFER WITH BLANKS
XOR DI,DI ; CLEAR COLOR VIDEO BUFFER MEMORY
MOV AX,0B800H ; SET LIP ES TO COLOR VIDEO MEMORY
MOV ES,BX
MOV CX,8192
REP STOSW ; FILL WITH BLANKS
;----- ENABLE VIDEO AND CORRECT PORT SETTING
MOV DX,3B8H
MOV AL,29H
OUT DX,AL ; SET VIDEO ENABLE PORT
;----- SET UP OVERSCAN REGISTER
INC DX ; SET OVERSCAN PORT TO A DEFAULT
MOV AL,30H ; VALUE 30H FOR ALL MODES EXCEPT 640X200
OUT DX,AL ; OUTPUT THE CORRECT VALUE TO 3D9 PORT
;----- ENABLE COLOR VIDEO AND CORRECT PORT SETTING
MOV DX,3D8H
MOV AL,28H
OUT DX,AL ; SET VIDEO ENABLE PORT
;----- SET UP OVERSCAN REGISTER
INC DX ; SET OYERSCAN PORT TO A DEFAULT
MOV AL,30H ; VALUE 30H FOR ALL MODES EXCEPT 640X200
OUT DX,AL ; OUTPUT THE CORRECT VALUE TO 3D9 PORT
;----- DISPLAY FAILING CHECKPOINT AND
MOV AX,CS ; SET STACK SEGMENT TO CODE SEGMENT
MOV SS,AX
MOV EX,0B000H
MOV DS,EX ; SET DS TO 8/W DISPLAY BUFFER
Z_0: MOV AL,'0' ; DISPLAY BANK 000000
MOV CX,6
SUB DI,DI ; START AT 0
Z: MOV [DI],AL ; WRITE TO DISPLAY REGEN BUFFER
INC DI ; POINT TO NEXT POSITION
INC DI
LOOP Z
CMP BH,0B8H ; CHECK THAT COLOR BUFFER WRITTEN
JZ Z_1
SUB DI,DI ; POINT TO START OF BUFFER
MOV BH,0B0H
MOV ES,BX ; ES = MONOCHROME
MOV SH,0B8H ; SET SEGMENT TO COLOR
MOV DS,BX ; DS = COLOR
JMP Z_0
;----- PRINT FAILING BIT PATTERN
Z_1: MOV AL,' ' ; DISPLAY A BLANK
MOV [DI], AL ; WRITE TO COLOR BUFFER
MOV ES:[DI],AL ; WRITE TO MONOCHROME REGEN BUFFER
INC DI ; POINT TO NEXT POSITION
INC DI
IN AL,MFG_PORT+1 ; GET THE HIGH BYTE OF FAILING PATTERN
MOV CL,4 ; SHIFT COUNT
SHR AL,CL ; NIBBLE SWAP
MOV SP,OFFSET Z1_O
JMP SHORT PR
Z1: IN AL,MFG_PORT+1
AND AL,OFH ; ISOLATE TO LOW NIBBLE
MOV SP,OFFSET Z2_O
JMP SHORT PR
Z2: IN AL,MFG_PORT+2 ; GET THE HIGH BYTE OF FAILING PATTERN
MOV CL,4 ; SHIFT COUNT
SHR AL,CL ; NIBBLE SWAP
MOV SP,OFFSET Z3_0
JMP SHORT PR
Z31 IN AL,MFG_PORT+2
AND AL,0FH ; ISOLATE TO LOW NIBBLE
MOV SP,OFFSET Z4_0 ; RETURN TO Z4:
; ----- CONVERT AND PRINT ; CONVERT 00-OF TO ASCII CHARACTER
PR: ADD AL,090M ; ADD FIRST CONVERSION FACTOR
DAA ; ADJUST FOR NUMERIC AND ALPHA RANGE
ADC AL,040H ; ADD CONVERSION AND ADJUST LOW NIBBLE
DAA ; ADJUST HIGH NIBBLE TO ASCII RANGE
MOV [DI],AL ; WRITE TO COLOR BUFFER
MOV ES:[DI],AL ; WRITE TO MONOCHROME BUFFER
INC DI ; POINT TO NEXT POSITION
INC DI
RET
;----- DISPLAY 201 ERROR
Z4: MOV AL,' ' ; DISPLAY A BLANK
MOV [DI],AL ; WRITE TO DISPLAY REGEN BUFFER
MOV ES:1011,AL ; WRITE TO MONOCHROME BUFFER
INC DI ; POINT TO NEXT POSITION
INC DI
MOV AL,'2' ; DISPLAY 201 ERROR
MOV [DI],AL ; WRITE TO DISPLAY REGEN BUFFER
MOV ES:[DI],AL ; WRITE TO MONOCHROME BUFFER
INC DI ; POINT TO NEXT POSITION
INC DI
MOV AL,'0'
MOV [DI],AL ; WRITE TO DISPLAY REGEN BUFFER
MOV ES:[DI],AL ; WRITE TO MONOCHROME BUFFER
INC DI ; POINT TO NEXT POSITION
INC DI
MOV AL,'1'