-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest2.asm
More file actions
1851 lines (1512 loc) · 54.4 KB
/
test2.asm
File metadata and controls
1851 lines (1512 loc) · 54.4 KB
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 TEST2 ---- 06/10/85 POST TESTS AND INITIALIZATION ROUTINES
.286C
.287
.LIST
CODE SEGMENT BYTE PUBLIC
PUBLIC C21
PUBLIC POST2
PUBLIC SHUT2
PUBLIC SHUT3
PUBLIC SHUT4
PUBLIC SHUT6
PUBLIC SHUT7
EXTRN BLINK_INT:NEAR
EXTRN C8042:NEAR
EXTRN CMOS_READ:NEAR
EXTRN CMOS_WRITE:NEAR
EXTRN CONFIG_BAD:NEAR
EXTRN D1:NEAR
EXTRN D2:NEAR
EXTRN DDS:NEAR
EXTRN DISK_SETUP:NEAR
EXTRN DSKETTE_SETUP:NEAR
EXTRN ERR_BEEP:NEAR
EXTRN E_MSG:NEAR
EXTRN F3D:NEAR
EXTRN F3D1:NEAR
EXTRN GATE_A20:NEAR
EXTRN HD_INT:NEAR
EXTRN KBD_RESET:NEAR
EXTRN NMI_INT:NEAR
EXTRN OBF_42:NEAR
EXTRN POST3:NEAR
EXTRN PRINT_SCREEN:NEAR
EXTRN PROC_SHUTDOWN:NEAR
EXTRN PROT_PRT_HEX:NEAR
EXTRN PRT_HEX:NEAR
EXTRN P_MSG:NEAR
EXTRN ROM_CHECK:NEAR
EXTRN ROM_CHECKSUM:NEAR
EXTRN SEEK:NEAR
EXTRN SET_TOD:NEAR
EXTRN SLAVE_VECTOR_TABLE:NEAR
EXTRN SND_DATA:NEAR
EXTRN START_1:NEAR
EXTRN STGTST_CNT:NEAR
EXTRN SYSINIT1:NEAR
EXTRN VECTOR_TABLE:NEAR
EXTRN WAITF:NEAR
EXTRN XPC_BYTE:NEAR
EXTRN E101:NEAR ; 101 ERROR CODE - INTERRUPT FAILURE
EXTRN E102:NEAR ; 102 ERROR CODE - TIMER FAILURE
EXTRN E103:NEAR ; 103 ERROR CODE - TIMER INTERRUPT
EXTRN E104:NEAR ; 104 ERROR CODE - PROTECTED MODE ERROR
EXTRN E105:NEAR ; 105 ERROR CODE - 8042 COMMAND FAILURE
EXTRN E106:NEAR ; 106 ERROR CODE - CONVERTING LOGIC
EXTRN E107:NEAR ; 107 ERROR CODE - NMI ERROR
EXTRN E108:NEAR ; 108 ERROR CODE - TIMER BUS ERROR
EXTRN E109:NEAR ; 109 ERROR CODE - MEMORY SELECT ERROR
EXTRN E161:NEAR ; 161 ERROR CODE - BAD BATTERY
EXTRN E162:NEAR ; 162 ERROR CODE - CMOS CHECKSUM/CONFIG
EXTRN E163:NEAR ; 163 ERROR CODE - BAD REAL TIME CLOCK
EXTRN E164:NEAR ; 164 ERROR CODE - MEMORY SIZE WRONG
EXTRN E201:NEAR ; 201 ERROR CODE - MEMORY DATA ERROR
EXTRN E202:NEAR ; 202 ERROR CODE - MEMORY ADDRESS ERROR
EXTRN E203:NEAR ; 203 ERROR CODE - SEGMENT ADDRESS ERROR
EXTRN E301:NEAR ; 301 ERROR CODE - KEYBOARD ERROR
EXTRN E302:NEAR ; 302 ERROR CODE - LOCK IS ON
EXTRN E303:NEAR ; 303 ERROR CODE - KEYBOARD/PLANAR ERROR
EXTRN E304:NEAR ; 304 ERROR CODE - KEYBOARD/PLANAR ERROR
EXTRN E401:NEAR ; 401 ERROR CODE - MONOCHROME ADAPTER
EXTRN E501:NEAR ; 501 ERROR CODE - COLOR ADAPTER
EXTRN E601:NEAR ; 601 ERROR CODE - DISKETTE ADAPTER
;----------------------------------------------------------
; TEST.17 :
; 8259 INTERRUPT CONTROLLER TEST :
; DESCRIPTION :
; READ/WRITE THE INTERRUPT MASK REGISTER (IMR) :
; WITH ALL ONES AND ZEROES, ENABLE SYSTEM :
; INTERRUPTS, MASK DEVICE INTERRUPTS OFF. CHECK :
; FOR HOT INTERRUPTS (UNEXPECTED). :
;----------------------------------------------------------
ASSUME CS:CODE,DS:DATA
POST2 PROC NEAR
C21: MOV AL,10 ; LINE FEED ON DISPLAY
CALL PRT_HEX
CALL DDS ; SET DATA SEGMENT
;----- CLEAR ERROR FLAG REGISTER (BP) <=> 0 FLAGS ERROR
SUB BP,BP ; CLEAR (BP) REGISTER AS ERROR FLAG REG
;------ TEST THE INTERRUPT MASK REGISTER REGISTERS
C21A: CLI ; TURN OFF INTERRUPTS
MOV AL,0 ; SET INTERRUPT MASK REGISTER TO ZERO
OUT INTA01,AL
OUT INTB01,AL ; SEND TO 2ND INTERRUPT CONTROLLER ALSO
JMP $+2
IN AL,INTA01 ; READ INTERRUPT MASK REGISTER
MOV AH,AL ; SAVE RESULTS
IN AL,INTB01 ; READ 2ND INTERRUPT MASK REGISTER
OR AH,AL ; BOTH IMR = 0?
JNZ D6 ; GO TO ERR ROUTINE IF NOT 0
MOV AL,25H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 25 <><>
MOV AL,0FFH ; DISABLE DEVICE INTERRUPTS
OUT INTA01,AL ; WRITE TO INTERRUPT MASK REGISTER
OUT INTB01,AL ; WRITE TO 2ND INTERRUPT MASK REGISTER
JMP $+2 ; I/O DELAY
IN AL,INTA01 ; READ INTERRUPT MASK REGISTER
MOV AH,AL ; SAVE RESULTS
IN AL,INTB01 ; READ 2ND INTERRUPT MASK REGISTER
ADD AX,I ; ALL IMR BITS ON?
JNZ D6 ; NO - GO TO ERR ROUTINE
;----- CHECK FOR HOT INTERRUPTS
;----- INTERRUPTS ARE MASKED OFF, CHECK THAT NO INTERRUPTS OCCUR.
MOV @INTR_FLAG,AL ; CLEAR INTERRUPT FLAG
MOV AL,26H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 26 <><>
STI ; ENABLE EXTERNAL INTERRUPTS
MOV CX,6628 ; WAIT 100 MILLISECONDS FOR ANY
CALL WAITF ; INTERRUPTS THAT OCCUR
CMP @INTR_FLAG,00H ; DID ANY INTERRUPTS OCCUR?
JZ D7 ; NO - GO TO NEXT TEST
D6: MOV @MFG_ERR_FLAG,05H ; <><><><><><><><><><><><>
; <><> CHECKPOINT 5 <><>
MOV SI,OFFSET E101 ; DISPLAY 101 ERROR
D6A: CALL E_MSG
CLI
HLT ; HALT THE SYSTEM
;----- CHECK THE CONVERTING LOGIC
D7: MOV AL,27H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 27 <><>
MOV AX,0AA55H
OUT MFG_PORT+2,AX ; WRITE A WORD
IN AL,MFG_PORT+2 ; GET THE FIRST BYTE
XCHG AL,AH ; SAVE IT
IN AL,MFG_PORT+3 ; GET THE SECOND BYTE
CMP AX,55AAH ; IS IT OK?
JZ D7_A ; GO IF YES
MOV SI,OFFSET E106 ; DISPLAY 106 ERROR
JMP D6A
;----- CHECK FOR HOT NMI INTERRUPTS WITHOUT I/O-MEMORY PARITY ENABLED
D7_A:
MOV AL,CMOS_REG_D ; TURN ON NMI
OUT CMOS_PORT,AL ; ADDRESS DEFAULT READ ONLY REGISTER
MOV CX,7 ; DELAY COUNT FOR 100 MICROSECONDS
CALL WAITF ; WAIT FOR HOT NMI TO PROCESS
MOV AL,CMOS_REG_D+NMI ; TURN NMI ENABLE BACK OFF
OUT CMOS_PORT,AL
CMP @INTR_FLAG,00H ; DID ANY INTERRUPTS OCCUR?
JZ D7_C ; CONTINUE IF NOT
MOV AL,28H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 28 <><>
MOV SI,OFFSET E107 ; DISPLAY 107 ERROR
JMP D6A
;----- TEST THE DATA BUS TO TIMER 2
D7_C: MOV AL,29H ; <><><><><><><><><><><><>
OUT MFG PORT,AL ; <><> CHECKPOINT 29 <><>
IN AL,PORT_B ; GET CURRENT SETTING OF PORT
MOV AH,AL ; SAVE THAT SETTING
AND AL,0FCH ; INSURE SPEAKER OFF
OUT PORT_B,AL
MOV AL,10110000B ; SELECT TIM 2,LSB,MSB,BINARY,MODE 0
OUT TIMER+3,AL ; WRITE THE TIMER MODE REGISTER
JMP $+2 ; I/O DELAY
MOV AX,0AA55H ; WRITE AN AA55
OUT TIMER+2,AL ; WRITE TIMER 2 COUNT - LSB
JMP $+2 ; I/O DELAY
MOV AL,AH
OUT TIMER+2,AL ; WRITE TIMER 2 COUNT - MSB
JMP $+2 ; I/O DELAY
IN AL,TIMER+2 ; GET THE LSB
XCHG AH,AL ; SAVE IT
JMP $+2 ; I/O DELAY
IN AL,TIMER+2 ; GET THE MSB
CMP AX,055AAH ; BUS OK?
JZ D7_D ; GO IF OK
MOV SI,OFFSET E108 ; DISPLAY 108 ERROR
JMP D6A
;--------------------------------------------------------
; TEST.18 :
; 8254 TIMER CHECKOUT :
; DESCRIPTION :
; VERIFY THAT THE SYSTEM TIMER (0) DOESN'T COUNT :
; TOO FAST OR TOO SLOW. :
;--------------------------------------------------------
D7_D: MOV AL,2AH ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 2A <><>
CLI
MOV AL,0FEH ; MASK ALL INTERRUPTS EXCEPT LEVEL 0
OUT INTA01,AL ; WRITE THE 8259 IMR
MOV AL,00010000B ; SELECT TIM 0, LSB, MODE 0, BINARY
OUT TIMER+3,AL ; WRITE TIMER CONTROL MODE REGISTER
MOV CX,2CH ; SET PROGRAM LOOP COUNT
JMP $+2 ; I/O DELAY
MOV AL,CL ; SET TIMER 0 COUNT REGISTER
OUT TIMER+0,AL ; WRITE TIMER 0 COUNT REGISTER
STI
D8: TEST 9INTR_FLAG,01H ; DID TIMER 0 INTERRUPT OCCUR?
JNZ D9 ; CHECK TIMER OPERATION FOR SLOW TIME
LOOP D8 ; WAIT FOR INTERRUPT FOR SPECIFIED TIME
MOV @MFG_ERR_FLAG,02H ; <><><><><><><><><><><><><><><>
; <><> TIMER CHECKPOINT (2) <><>
D8_A: MOV SI,OFFSET E102 ; DISPLAY 102 ERROR
JMP D6A ; TIMER 0 INTERRUPT DID NOT OCCUR= ERROR
D9: MOV AL,28H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 2B <><>
CLI
MOV CL,12 ; SET PROGRAM LOOP COUNT
MOV AL,0FFH ; WRITE TIMER 0 COUNT REGISTER
OUT TIMER+0,AL
MOV @INTR_FLAG,0 ; RESET INTERRUPT RECEIVED FLAG
MOV AL,0FEH ; RE-ENABLE TIMER 0 INTERRUPTS
OUT INTA01,AL
STI
D10: TEST @INTR_FLAG,01H ; DID TIMER 0 INTERRUPT OCCUR?
JNZ D8_A ; YES - TIMER COUNTING TOO FAST, ERROR
LOOP D10 ; WAIT FOR INTERRUPT FOR SPECIFIED TIME
;----- WAIT FOR INTERRUPT
SUB CX,CX
MOV AL,2CH ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 2C <><>
D110:
TEST @INTR_FLAG,01H ; DID TIMER 0 INTERRUPT OCCUR?
JNZ D12 ; GO IF YES
LOOP D110 ; TRY AGAIN
MOV SI,OFFSET E103 ; DISPLAY 103 ERROR
JMP D6A ; ERROR IF NOT
;----- SETUP TIMER 0 TO MODE 3
D12: CLI
MOV AL,0FFH ; DISABLE ALL DEVICE INTERRUPTS
OUT INTA01,AL
MOV AL,36H ; SELECT TIMER 0,LSB,MSB,MODE 3
OUT TIMER+3,AL ; WRITE TIMER MODE REGISTER
JMP $+2 ; I/O DELAY
MOV AL,0
OUT TIMER+0,AL ; WRITE LSB TO TIMER 0 REGISTER
JMP $+2 ; I/O DELAY
OUT TIMER+0,AL ; WRITE MSB TO TIMER 0 REGISTER
;----- CHECK 8042 FOR LAST COMMAND ACCEPTED
SUB CX,CX ; SET WAIT TIME
MOV AL,2DH ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 2D <><>
D13: IN AL,STATUS_PORT ; GET THE 8042 STATUS
TEST AL,INPT_BUF_FULL ; HAS THE LAST COMMAND BEEN ACCEPTED?
JZ E19 ; GO IF YES
LOOP D13 ; TRY AGAIN
;----- ERROR EXIT (MESSAGE 105)
MOV SI,OFFSET E105 ; PRINT 105 ERROR
JMP D6A ; GO ERROR HALT
;-------------------------------------------------------------------------
; TEST.19 :
; ADDITIONAL READ/WRITE STORAGE TEST :
; ++++ MUST RUN IN PROTECTED MODE ++++ :
; DESCRIPTION :
; WRITE/READ DATA PATTERNS TO ANY READ/WRITE STORAGE AFTER THE :
; FIRST 64K. STORAGE ADDRESSABILITY IS CHECKED. :
;-------------------------------------------------------------------------
ASSUME DS:DATA
E19:
CALL DDS ; SET DATA SEGMENT
MOV AL,2FH ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 2F <><>
CMP @RESET_FLAG,1234H ; WARM START?
JNE E19A ; GO IF NOT
JMP SHUT2 ; GO TO NEXT TEST IF WARM START
;----- SET SHUTDOWN RETURN 2
E19A: MOV AL,30H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 30 <><>
MOV AX,2*H+CMOS_SHUT_DOWN+NMI ; ADDRESS FOR SHUTDOWN BYTE
CALL CMOS_WRITE ; SECOND ENTRY IN SHUTDOWN TABLE
;----- ENABLE PROTECTED MODE
MOV SP,POST_SS ; SET STACK FOR SYSINIT1
MOV SS,SP
MOV SP,POST_SP
CALL SYSINIT1 ; GO ENABLE PROTECTED MODE
MOV AL,31H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 31 <><>
;----- SET TEMPORARY STACK
PUSH BYTE PTR GDT_PTR
POP ES
MOV ES:SS_TEMP.BASE_LO_WORD,0
MOV BYTE PTR ES:(SS_TEMP.BASE_HI_BYTE),0
MOV SI,SS_TEMP
MOV SS,SI
MOV SP,MAX_SEG_LEN-2
;----- DATA SEGMENT TO SYSTEM DATA AREA
PUSH BYTE PTR RSDA_PTR ; POINT TO DATA AREA
POP DS
MOV AL,PARITY_CHECK ; SET CHECK PARITY
OUT DMA_PAGE+6,AL ; SAVE WHICH CHECK TO USE
;----- PRINT 64 K BYTES OK
MOV AX,64 ; STARTING AMOUNT OF MEMORY OK
CALL PRT_OK ; POST 64K OK MESSAGE
;----- GET THE MEMORY SIZE DETERMINED (PREPARE BX AND DX FOR BAD CMOS)
MOV AX,(CMOS_U_M_S_LO+NMI)*H+CMOS_U_M_S_HI+NMI
CALL CMOS_READ ; HIGH BYTE
XCHG AH,AL ; SAVE HIGH BYTE
CALL CMOS_READ ; LOW BYTE
MOV BX,@MEMORY_SIZE ; LOAD THE BASE MEMORY SIZE
MOV DX,BX ; SAVE BASE MEMORY SIZE
ADD BX,AX ; SET TOTAL MEMORY SIZE
;----- IS CMOS GOOD?
MOV AL,CMOS_DIAG+NMI ; DETERMINE THE CONDITION OF CMOS
CALL CMOS_READ ; GET THE CMOS STATUS
TEST AL,BAD_BAT+BAD_CKSUM ; CMOS OK?
JZ E20B0 ; GO IF YES
JMP SHORT E20C ; DEFAULT IF NOT
;----- GET THE BASE 0->640K MEMORY SIZE FROM CONFIGURATION IN CMOS
E20B0:
MOV AX,(CMOS_B_M_S_LO+NMI)*H-CMOS_B_M_S_HI+NMI
CALL CMOS_READ ; HIGH BYTE
AND AL,03FH ; MASK OFF THE MANUFACTURING TEST SITS
XCHG AH,AL ; SAVE HIGH BYTE
CALL CMOS_READ ; LOW BYTE OF BASE MEMORY SIZE
CMP DX,AX ; IS MEMORY SIZE GREATER THAN CONFIG7
JZ E20B1 ; GO IF EQUAL
;----- SET MEMORY SIZE DETERMINE NOT EQUAL TO CONFIGURATION
PUSH AX ; SAVE AX
MOV AX,X*(CMOS_DIAG+NMI) ; ADDRESS THE STATUS BYTE
CALL CMOS_READ ; GET THE STATUS
OR AL,W_MEM_SIZE ; SET CMOS FLAG
XCHG AL,AH ; SAVE AL AND GET ADDRESS
CALL CMOS_WRITE ; WRITE UPDATED STATUS
POP AX ; RESTORE AX
CMP DX,AX ; IS MEMORY SIZE GREATER THAN CONFIG ?
JA E20C ; DEFAULT TO MEMORY SIZE DETERMINED ?
E20B1:
MOV BX,AX ; SET BASE MEMORY SIZE IN TOTAL REGISTER
MOV DX,AX ; SAVE IN BASE SIZE REGISTER
;----- CHECK MEMORY SIZE ABOVE 640K FROM CONFIGURATION
MOV AX,(CMOS_E_M_S_LO+NMI)*H+(CMOS_E_M_S_HI+NMI)
CALL CMOS_READ ; HIGH BYTE
XCHG AH,AL ; SAVE HIGH BYTE
CALL CMOS_READ ; LOW BYTE
MOV CX,AX ; SAVE THE ABOVE 640K MEMORY SIZE
;----- ABOVE 640K SIZE FROM MEMORY SIZE DETERMINE
;----- CX=CONFIG AX=MEMORY SIZE DETERMINE
MOV AX,(CMOS_U_M_S_LO+NMI)*H+(CMOS_U_M_S_HI+NMI)
CALL CMOS_READ ; HIGH BYTE
XCHG AH,AL ; SAVE HIGH BYTE
CALL CMOS_READ ; LOW BYTE
;------ WHICH IS GREATER - AX = MEMORY SIZE DETERMINE
;------ CX = CONFIGURATION (ABOVE 640) BX = SIZE (BELOW 640)
CMP CX,AX ; IS CONFIGURATION EQUAL TO DETERMINED?
JZ SET_MEM1 ; GO IF EQUAL
;----- SET MEMORY SIZE DETERMINE NOT EQUAL TO CONFIGURATION
PUSH AX ; SAVE AX
MOV AX,X*(CMOS_DIAG+NMI) ; ADDRESS THE STATUS BYTE
CALL CMOS_READ ; GET THE STATUS
OR AL,W_MEM_SIZE ; SET CMOS FLAG
XCHG AL,AH ; SAVE AL
CALL CMOS_WRITE ; UPDATE STATUS BYTE
POP AX ; RESTORE AX
SET_MEM1:
CMP CX,AX ; IS CONFIG GREATER THAN DETERMINED?
JA SET_MEW ; GO IF YES
MOV CX,AX ; USE MEMORY SIZE DETERMINE IF NOT
SET_MEM:
ADD BX,CX ; SET TOTAL MEMORY SIZE
E20C:
CMP DX,513 ; CHECK IF BASE MEMORY LESS 512K
JB NO_640 ; GO IF YES
MOV AX,X*(CMOS_INFO128+NMI) ; SET 640K BASE MEMORY BIT
CALL CMOS_READ ; GET THE CURRENT STATUS
OR AL,M640K ; TURN ON 640K BIT IF NOT ALREADY ON
XCHG AL,AH ; SAVE THE CURRENT DIAGNOSTIC STATUS
CALL CMOS_WRITE ; RESTORE THE STATUS
NO_640:
MOVE WORD PTR @KB_FLAG,BX ; SAVE TOTAL SIZE FOR LATER TESTING
SHR BX,6 ; DIVIDE BY 64
DEC BX ; 1ST 64K ALREADY DONE
SHR DX,6 ; DIVIDE BY 64 FOR BASE
;----- SAVE COUNTS IN STACK FOR BOTH MEMORY AND ADDRESSING TESTS
PUSH DX ; SAVE BASE MEMORY SIZE COUNT
PUSH BYTE PTR 64 ; SAVE STARTING AMOUNT OF MEMORY OK
PUSH BX ; SAVE COUNT OF 64K BLOCKS TO BE TESTED
PUSH DX ; SAVE BASE MEMORY SIZE COUNT
PUSH BYTE PTR 64 ; SAVE STARTING AMOUNT OF MEMORY OK
PUSH BX ; SAVE COUNT OF 64K BLOCKS TO BE TESTED
;----- MODIFY DESCRIPTOR TABLES
PUSH BYTE PTR GDT_PTR ; MODIFY THE DESCRIPTOR TABLE
POP ES
;----- SET TEMPORARY ES DESCRIPTOR 64K SEGMENT LIMIT STARTING AT 000000
MOV ES:ES_TEMP.SEG_LIMIT,MAX_SEG_LEN
MOV ES:ES_TEMP,BASE_LO_WORD,0
MOV BYTE PTR ES:(ES_TEMP.BASE_HI_BYTE),0 ; FIRST 65K
MOV BYTE PTR ES:(ES_TEMP,DATA_ACC_RIGHTS),CPL0_DATA_ACCESS
;----- SET TEMPORARY DS DESCRIPTOR 64K SEGMENT LIMIT AT FIRST 65K BLOCK
MOV ES:DS_TEMP.SEG_LIMIT,MAX_SEG_LEN
MOV ES:DS_TEMP.BASE_LO_WORD,0
MOV BYTE PTR ES:(DS_TEMP.BASE_HI_BYTE),0
MOV BYTE PTR ES:(DS_TEMP,DATA_ACC_RIGHTS),CPL0_DATA_ACCESS
;----- TEMPORARY SEGMENT SAVE IN DMA PAGE REGISTER FOR SECOND 65K BLOCK
SUB AL,AL ; INITIALIZE VALUES TO 010000
OUT DMA_PAGE+4,AL ; HIGH BYTE OF LOW WORD OF SEGMENT
OUT DMA_PAGE+5,AL ; LOW BYTE OF LOW WORD OF SEGMENT
INC AL ; SET HIGH BYTE OF SEGMENT WORD
OUT DMA_PAGE+3,AL ; HIGH BYTE OF SEGMENT
;----- MEMORY TEST LOOP - POINT TO NEXT BLOCK OF 32K WORDS (64K)
E21: ; MEMORY TEST LOOP
PUSH BYTE PTR GDT_PTR ; POINT TO START OF DESCRIPTOR TABLE
POP DS
INC BYTE PTR DS:(DS_TEMP,BASE_HI_BYTE) ; POINT TO NEXT BLOCK
INC BYTE PTR DS:(ES_TEMP,BASE_HI_BYTE)
;----- CHECK FOR END OF 256K PLANAR MEMORY
CMP BYTE PTR DS:(DS_TEMP.BASE_HI_BYTE),04H
JB E21_0 ; GO IF STILL FIRST 256K OF BASE MEMORY'
MOV AL,PARITY_CHECK+IO_CHECK ; CHECK FOR ANY TYPE OF PARITY ERROR
OUT DMA_PAGE+6,AL ; AFTER FIRST 256K
;----- CHECK END OF FIRST 640K OR ABOVE (END OF MAXIMUM BASE MEMORY)
E21_0:
CMP BYTE PTR DS:(DS_TEMP.BASE_HI_BYTE),0AH
JA NEXT ; CONTINUE IF ABOVE 1 MEG
;----- CHECK FOR END OF BASE MEMORY TO BE TESTED
POP CX ; GET COUNT
POP BX ; GET COUNT TESTED
POP AX ; RECOVER COUNT OF BASE MEMORY BLOCKS
PUSH AX ; SAVE BASE COUNT
PUSH BX ; SAVE TESTED COUNT
PUSH CX ; SAVE TOTAL COUNT
CMP BYTE PTR DS:(DS_TEMP,BASE_HI_BYTE),AL ; MAX BASE COUNT
JS NEXT ; CONTINUE IF NOT DONE WITH BASE MEMORY
;----- DO ADDITIONAL STORAGE ABOVE 1 MEG
MOV BYTE PTR DS:(DS_TEMP.BASE_HI_BYTE),10H
MOV BYTE PTR DS:(ES_TEMP.BASE_HI_BYTE),10H
;----- SAVE BASE_HI_BYTE IN DMA PAGE REGISTERS 3
NEXT: MOV AL,BYTE PTR DS:(DS_TEMP.BASE_HI_BYTE)
OUT DMA_PAGE+3,AL ; SAVE THE HIGH BYTE OF SEGMENT
; FOR POSSIBLE ERROR
;----- CHECK FOR TOP OF MEMORY (FE0000) 16 MEG
CMP BYTE PTR DS:(ES_TEMP,BASE_HI_BYTE),0FEH ; TOP OF MEMORY?
JE KB_LOOP3 ; EXIT NEXT TEST IF DONE
;----- SET ES AND DS REGISTERS TO MEMORY BLOCK
PUSH BYTE PTR DS_TEMP
POP DS
PUSH BYTE PTR ES_TEMP
POP ES
MOV AL,31H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 31 <><>
MOV CX,8000H ; SET COUNT FOR 32K WORDS
CALL STGTST_CNT
JZ N1 ; SKIP IF OK
JMP E21A ; GO PRINT ERROR
N1:
POP CX ; POP CX TO GET AX
POP AX ; RECOVER TESTED MEMORY
;----- WRITE THE CURRENT SIZE FOR (ADDRESS LINES 23-17 TEST) USED LATER
SUB DI,DI ; POINT TO BEGINNING OR A BLOCK
STOSW ; WRITE THE CURRENT SIZE
; AT THE STARTING ADDRESS
ADD AX,64 ; ADVANCE COUNT TO NEXT BLOCK
PUSH AX ; SAVE TESTED MEMORY
PUSH CX ; SAVE LOOP COUNT
CALL PRT_OK ; DISPLAY "0XXXX OK" MESSAGE
POP CX ; RECOVER 64K BLOCK COUNT
DEC CX ; DECREMENT BLOCK COUNT FOR LOOP
JCXZ KB-LOOP3 ; CONTINUE TO NEXT TEST IF DONE
PUSH CX ; SAVE LOOP COUNT
JMP E21 ; LOOP TILL ALL MEMORY CHECKED
KB_LOOP3: ; END MAIN TEST LOOP
POP AX ; CLEAR MAXIMUM BLOCK COUNT
POP AX ; CLEAR BASE SIZE COUNT FROM STACK
; ADDRESS TEST VALUES ARE IN STACK
;----- ADDRESS LINE 16-23 TEST
; LET FIRST PASS BE SEEN
MOV CX,16571 ; COUNT FOR 250 MS FIXED TIME DELAY
CALL WAITF ; ALLOW SIX DISPLAY REFRESH CYCLES
;----- INITIALIZE DS DESCRIPTOR
PUSH BYTE PTR GDT_PRT
POP ES
MOV BYTE PTR ES:(DS_TEMP.BASE_HI_BYTE),0
MOV ES:DS_TEMP.BASE_LO_WORD,0
;----- TEMPORARY SEGMENT SAVE IN DMA PAGE REGISTER
SUB AL,AL
OUT DMA_PAGE+4,AL ; HIGH BYTE OF LOW WORD OF SEGMENT
OUT DMA_PAGE+5,AL ; LOW BYTE OF LOW WORD OF SEGMENT
MOV AL,01H ; SET HIGH BYTE OF SEGMENT WORD
OUT DMA_PAGE+3,AL ; HIGH BYTE OF SEGMENT
;----- POINT TO NEXT BLOCK OF 64K
E21_A: MOV AL,33H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 33 <><>
ADD BYTE PTR ES:(DS_TEMP.BASE_HI_BYTE),01
;----- CHECK FOR END OF BASE MEMORY TO BE TESTED
CMP BYTE PTR ES:(DS_TEMP.BASE_HI_BYTE),0AH
JA NEXT_A ; CONTINUE IF ABOVE 1 MEG
POP CX ; GET COUNT
POP BX ; GET COUNT TESTED
POP AX ; RECOVER COUNT OF BASE MEMORY BLOCKS
PUSH AX ; SAVE BASE COUNT
PUSH BX ; SAVE TESTED COUNT
PUSH CX ; SAVE TOTAL COUNT
CMP BYTE PTR ES:(DS_TEMP.BASE_HI_BYTE),AL ; MAX BASE COUNT
JS NEXT_A ; CONTINUE IF NOT DONE WITH BASE MEMORY
;----- DO ADDITIONAL STORAGE ABOVE 1 MEG
NEXT_A2:
MOV BYTE PTR ES:(DS_TEMP,BASE_HI_BYTEJ,10H
NEXT_A:
MOV AL,BYTE PTR ES:(DS_TEMP.BASE_HI_BYTE)
;----- DMA PAGE REGISTERS 3
; SAVE THE HIGH BYTE OF SEGMENT
OUT DMA_PAGE+3,AL ; FOR POSSIBLE ERROR
;----- CHECK FOR TOP OF MEMORY (FE0000) 16 MEG
CMP AL,0FEH ; TOP OF MEMORY7
JZ KB_LOOP_3 ; GO NEXT TEST IF IT IS
;----- SET DS REGISTER
PUSH BYTE PTR DS_TEMP
POP DS
SUB DI,DI ; POINT TO START OF BLOCK
MOV DX,DS:[DI] ; GET THE VALUE OF THIS BLOCK
MOV SI,DI ; SET SI FOR POSSIBLE ERROR
SUB AX,AX ; CLEAR MEMORY LOCATION
MOV [DI],AX
;----- ALLOW DISPLAY TIME TO DISPLAY MESSAGE AND REFRESH TO RUN
MOV CX,6761 ; COUNT FOR 102 MS FIXED TIME DELAY
CALL WAITF ; ALLOW FIVE DISPLAY REFRESH CYCLES
POP CX ; GET THE LOOP COUNT
POP AX ; RECOVER TESTED MEMORY
PUSH AX ; SAVE TESTED MEMORY
PUSH CX ; SAVE LOOP COUNT
CMP AX,DX ; DOES THE BLOCK ID MATCH
MOV AX,DX ; GET THE BLOCK ID FOR POSSIBLE ERROR
JNZ E21A ; GO PRINT ERROR
;----- CHECK FOR CHECK PARITY
IN AL,PORT_B ; CHECK FOR I/O OR PARITY CHECK
AND AL,PARITY_ERR ; STRIP UNWANTED BITS
JNZ E21A ; EXIT IF PARITY ERROR
POP CX ; POP CX TO GET AX
POP AX ; RECOVER TESTED MEMORY
ADD AX,64 ; 64K INCREMENTS
PUSH AX ; SAVE TESTED MEMORY
PUSH CX ; SAVE LOOP COUNT
CALL PRT_OK ; DISPLAY OK MESSAGE
POP CX ; RECOVER 64K BLOCK COUNT
DEC CX ; LOOP TILL ALL MEMORY CHECKED
JCXZ KB_LOOP_3 ; CONTINUE
PUSH CX ; SAVE LOOP COUNT
JMP E21_A ; CONTINUE TILL DONE
;----- BACK TO REAL MODE - MEMORY TESTS DONE
KB_LOOP_3:
MOV AL,34H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 34 <><>
; BACK TO REAL MODE
JMP PROC_SHUTDOWN ; NEXT TEST VIA JUMP TABLE (SHUT2)
;----- PRINT FAILING ADDRESS AND XOR'ED PATTERN IF DATA COMPARE ERROR
;----- USE DMA PAGE REGISTERS AS TEMPORARY SAVE AREA FOR ERROR
; SET SHUTDOWN 3
E21A: OUT DMA_PAGE+1,AL ; SAVE FAILING SIT PATTERN (LOW BYTE)
MOV AL,AH ; SAVE HIGH BYTE
OUT DMA_PAGE+2,AL
MOV AX,AI ; GET THE FAILING OFFSET
OUT DMA_PAGE+S,AL
XCHG AH,AL
OUT DMA_PAGE+4,AL
;----- CLEAR I/O CHANNEL CHECK OR R/W PARITY CHECK
SUB S1,SI ; WRITE TO FAILING BLOCK
STOSW
IN AL,PORT_B ; GET PARITY CHECK LATCHES
OUT DMA_PAGE+7,AL ; SAVE FOR ERROR HANDLER
OR AL,RAM_PAR_OFF ; TOGGLE I/O-PARITY CHECK ENABLE
OUT PORT_B,AL ; TO RESET CHECKS
AND AL,RAM_PAR_ON
OUT PORT_B,AL
;----- GET THE LAST OF GOOD MEMORY
POP AX ; CLEAR BLOCK COUNT
POP AX ; GET THE LAST OF GOOD MEMORY
POP BX ; GET BASE MEMORY COUNTER
SHL BX,6 ; CONVERT TO MEMORY SIZE COUNTS
SUB AX,BX ; COMPARE LAST GOOD MEMORY WITH BASE
JAE E211 ; IF ABOVE OR EQUAL, USE REMAINDER IN
; CMOS_U_M_S_(H/L)
;-----ELSE SET BASE MEMORY SIZE
PUSH BYTE PTR RSDA_PTR ; SET THE DATA SEGMENT
POP DS ; IN PROTECTED MODE
ADD AX,BX ; CONVERT BACK TO LAST WORKING MEMORY
MOV @MEMORY_SIZE,AX ; TO INDICATE HOW MUCH MEMORY WORKING
;----- RESET 512K --> 640K OPTION IF SET
MOV AX,X*(CMOS_INFO128+NMI) ; ADDRESS OPTIONS INFORMATION BYTE
CALL CMOS_READ ; READ THE MEMORY INFORMATION FLAG
AND AL,NOT M640K ; SET 640K OPTION OFF
XCHG AL,AH ; MOVE TO WORK REGISTER
CALL CMOS_WRITE ; UPDATE STATUS IF IT WAS ON
XOR AX,AX ; CLEAR VALUE FOR EXTENSION MEMORY
E211:
MOV CX,AX ; SAVE ADJUSTED MEMORY SIZE
MOV AL,CMOS_U_M_S_HI+NMI
CALL CMOS_WRITE ; SAVE THE HIGH BYTE MEMORY SIZE
MOV AH,CL ; GET THE LOW BYTE
MOV AL,CMOS_U_M_S_LO+NMI ; DO THE LOW BYTE
CALL CMOS_WRITE ; WRITE IT
;----- SET SHUTDOWN 3
MOV AX,3*H+CMOS_SHUT_DOWN+NMI ; ADDRESS FOR SHUTDOWN RETURN
CALL CMOS_WRITE ; SET RETURN 3
;----- SHUTDOWN
JMP PROC_SHUTDOWN
;---------------------------------------------------------------------
; MEMORY ERROR REPORTING (R/W/ MEMORY OR PARITY ERRORS) :
; :
;DESCRIPTION FOR ERRORS 201 (CMP ERROR OR PARITY) :
; OR 202 (ADDRESS LINE 0-15 ERROR) :
; :
; "AABBCC DDEE 201" (OR 202) :
; AA=HIGH BYTE OF 24 BIT ADDRESS :
; BB=MIDDLE BYTE OF 24 BIT ADDRESS :
; CC=LOW BYTE OF 24 BIT ADDRESS :
; DD=HIGH BYTE OF XOR FAILING BIT PATTERN :
; EE=LOW BYTE OF XOR FAILING BIT PATTERN :
; :
; DESCRIPTION FOR ERROR 202 (ADDRESS LINE 00-15) :
; A WORD OF FFFF IS WRITTEN AT THE FIRST WORD AND LAST WORD :
; OF EACH 64K BLOCK WITH ZEROS AT ALL OTHER LOCATIONS OF THE :
; BLOCK. A SCAN OF THE BLOCK IS MADE TO INSURE ADDRESS LINE :
; 0-15 ARE FUNCTIONING. :
; :
; DESCRIPTION FOR ERROR 203 (ADDRESS LINE 16-23) :
; AT THE LAST PASS OF THE STORAGE TEST, FOR EACH BLOCK OF :
; 64K, THE CURRENT STORAGE SIZE (ID) IS WRITTEN AT THE FIRST :
; WORD OF EACH BLOCK. IT IS USED TO FIND ADDRESSING FAILURES. :
; :
; "AABBCC DDEE 203" :
; SAME AS ABOVE EXCEPT FOR DDEE :
; :
; GENERAL DESCRIPTION FOR BLOCK ID (DDEE WILL NOW CONTAINED THE ID) :
; DD=HIGH BYTE OF BLOCK ID :
; EE=LOW BYTE OF BLOCK ID :
; :
; BLOCK ID ADDRESS RANGE :
; 0000 000000 --> 00FFFF :
; 0040 010000 --> 01FFFF :
; // :
; 0200 090000 --> 09FFFF (512->576K) IF 640K BASE :
; 100000 --> 10FFFF (1024->1088K) IF 512K BASE :
; :
; EXAMPLE (640K BASE MEMORY + 512K I/O MEMORY = 1152K TOTAL) :
; NOTE: THE CORRECT BLOCK ID FOR THID FAILURE IS 0280 HEX, :
; DUE TO AN ADDRESS FAILURE THE BLOCK ID+128K OVERLAYED :
; THE CORRECT BLOCK ID. :
; :
; 00640K OK <-- LAST OK MEMORY :
; 10000 0300 202 <-- ERROR DUE TO ADDRESS FAILURE :
; :
; IF A PARITY LATCH WAS SET, THE CORRESPONDING MESSAGE WILL DISPLAY. :
; :
; "PARITY CHECK 1" (OR 2) :
; :
; DMA PAGE REGISTERS ARE USED AS TEMPORARY SAVE AREAS FOR SEGMENT :
; DESCRIPTOR VALUES. :
;---------------------------------------------------------------------
SHUT3: ; ENTRY FROM PROCESSOR SHUTDOWN 3
CALL DDS ; SET REAL MODE DATA SEGMENT
; <><> MEMORY FAILED <><>
MOV @MFG_ERR_FLAG+1,MEM_FAIL ; CLEAR AND SET MANUFACTURING ERROR FLAG
MOV AL,CR ; CARRIAGE RETURN
CALL PRT_HEX
MOV AL,LF ; LINE FEED
CALL PRT_HEX
IN AL,DMA_PAGE+3 ; GET THE HIGH BYTE OF 24 BIT ADDRESS
CALL XPC_BYTE ; CONVERT AND PRINT CODE
IN AL,DMA_PAGE+4 ; GET THE MIDDLE BYTE OF 24 BIT ADORES
CALL XPC_BYTE
IN AL,DMA_PAGE+5 ; GET THE LOW BYTE OF 24 BIT ADDRESS
CALL XPC_BYTE
MOV AL,' ' ; SPACE TO MESSAGE
CALL PRT_HEX
IN AL,DMA_PAGE+2 ; GET HIGH BYTE FAILING BIT PATTERN
CALL XPC_BYTE ; CONVERT AND PRINT CODE
IN AL,DMA_PAGE+1 ; GET LOW BYTE FAILING BIT PATTERN
CALL XPC_BYTE ; CONVERT AND PRINT CODE
;----- CHECK FOR ADDRESS ERROR
IN AL,MFG_PORT ; GET THE CHECKPOINT
CMP AL,33H ; IS IT AN ADDRESS FAILURE?
MOV SI,OFFSET E203 ; LOAD ADDRESS ERROR 16->23
JZ ERR2 ; GO IF YES
MOV SI,OFFSET E202 ; LOAD ADDRESS ERROR 00->15
CMP AL,32H ; GO IF YES
JZ ERR2
MOV SI,OFFSET E201 ; SETUP ADDRESS OF ERROR MESSAGE
ERR2:
CALL E_MSG ; PRINT ERROR MESSAGE
IN AL,DMA_PAGE+7 ; GET THE PORT_B VALUE
;----- DISPLAY "PARITY CHECK ?* ERROR MESSAGES
TEST AL,PARITY_CHECK ; CHECK FOR PLANAR ERROR
JZ NMI-ML ; SKIP IF NOT
PUSH AX ; SAVE STATUS
CALL PACING ; INSERT BLANKS
WAY SI,OFFSET OF ; PLANAR ERROR, ADDRESS "PARITY CHECK"
CALL P MSG ; DISPLAY "PARITY CHECK 1" MESSAGE
POP AL ; AND RECOVER STATUS
NMI_M1:
TEST AL,IO_CHECK ; I/O PARITY CHECK?
JZ NMI_M2 ; SKIP IF CORRECT ERROR DISPLAYED
CALL PADDING ; INSERT BLANKS
MOV SI,OFFSET D2 ; ADDRESS OF "PARITY CHECK 2" MESSAGE
CALL P_MSG ; DISPLAY "PARITY CHECK 2" ERROR
NMI_M2:
; CONTINUE TESTING SYSTEM ....
;----- ENTRY FROM SHUTDOWN
SHUT2:
;---------------------------------------------------------
; TEST.20 :
; ADDITIONAL PROTECTED (VIRTUAL MODE) TEST :
; DESCRIPTION :
; THE PROCESSOR IS PUT IN PROTECTED MODE AND :
; THE FOLLOWING FUNCTIONS ARE VERIFIED :
; :
; 1. VERIFY PROTECTED MODE :
; THE MACHINE STATUS IS CHECK FOR VIRTUAL MODE :
; 2. PROGRAMMED INTERRUPT TEST :
; AN PROGRAMMED INTERRUPT 32 IS ISSUED AND :
; AND VERIFIED :
; 3. EXCEPTION INTERRUPT 13 TEST :
; A DESCRIPTOR SEGMENT LIMIT IS SET TO ZERO :
; AND A WRITE TO THAT SEGMENT IS ATTEMPTED :
; AN EXCEPTION 13 IS EXPECTED AND VERIFIED :
; 4. LDT/SDT LTR/STR TEST :
; LOAD LDT REGISTER AND VERIFY CORRECT :
; LOAD TASK REGISTER AND VERIFY CORRECT :
; THEY ARE VERIFIED VIA THE STORE INSTRUCTION :
; 5. THE CONTROL FLAGS OF THE 286 FOR DIRECTION :
; ARE VERIFIED VIA THE STD AND CLD COMMANDS :
; IN PROTECTED MODE :
; 6. BOUND INSTRUCTION TEST (EXCEPTION INT 5) :
; CREATE A SIGNED ARRAY INDEX WITHIN AND :
; OUTSIDE THE LIMITS. CHECK THAT NO EXC INT :
; IF WITHIN LIMIT AND THAT AN EXC INT 5 :
; OCCURS IF OUTSIDE THE LIMITS. :
; 7. PUSH ALL POP ALL TEST :
; SET GENERAL PURPOSE REGISTERS TO DIFFERENT :
; VALUES, ISSUE A PUSH ALL, CLEAR THE REGISTERS :
; THEN ISSUE A POP ALL AND VERIFY CORRECT. :
; 8. CHECK THE VERR/VERW INSTRUCTIONS :
; THE ACCESS BYTE IS SET TO READ ONLY THEN TO :
; A WRITE ONLY AND THE VERR/VERW INSTRUCTIONS :
; ARE VERIFIED. :
; 9. CAUSE AN INTERRUPT 13 VIA A WRITE TO A :
; READ ONLY SEGMENT :
; 10. VERIFY THE ARPL INSTRUCTION FUNCTIONS :
; SET THE RPL FIELD OF A SELECTOR AND :
; VERIFY THAT CURRENT SELECTOR RPL IS SET :
; CORRECTLY. :
; 11. VERIFY THE LAR INSTRUCTION FUNCTIONS :
; 12. VERIFY THE LSL INSTRUCTION FUNCTIONS :
; 13. LOW MEG CHIP SELECT TEST :
;---------------------------------------------------------
JMP POST3 ; GO TEST THE 286 PROTECTED MODE
;----- FAILURE ENTRY FROM A SHUTDOWN
SHUT7: CALL DDS ; ESTABLISH THE DATA SEGMENT
IN AL,MFG_PORT ; CHECK FOR CHIP SELECT ERROR
CMP AL,35H
MOV SI,OFFSET E109 ; PRINT ERROR 109
JZ SHUT7B ; GO IF NOT
SHUT7A: MOV SI,OFFSET E104 ; PROTECTED MODE FAILED
OR @MFG_ERR_FLAG+1,PRO_FAIL ; <><><><><><><><><><><><><><><>
; <><> VIRTUAL MODE FAILED <><>
CALL E_MSG ; PRINT MESSAGE
JMP SHORT SHUT6
SHUT7B: CALL E_MSG ; PRINT MESSAGE
OR @MFG_ERR_FLAG+1,LMCS_FAIL ; <><><><><><><><><><><><><><><>
; <><> LOW MEG CHIP SELECT <><>
;----- PROTECTED MODE TEST PASSED ENTRY FROM A SHUTDOWN
SHUT6: CALL DDS ; PROTECTED MODE TEST PASSED
SUB AX,AX ; CLEAR KEYBOARD STATE FLAGS
MOV WORD PTR @KB_FLAG,AX
MOV CX,0EH ; CLEAR PACE REGISTERS
MOV DX,DMA_PAGE+1
CLR_LOOP:
SUB AL,AL
OUT DX,AL
INC DX
LOOP CLR_LOOP
;------------------------------------------------
;TEST.21 :
; KEYBOARD TEST :
; DESCRIPTION :
; RESET THE KEYBOARD AND CHECK THAT SCAN :
; CODE *AA" IS RETURNED TO THE PROCESSOR. :
; CHECK FOR STUCK KEYS. :
;------------------------------------------------
MOV AL,35H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 35 <><>
TEST @MFG_TST,MFG_LOOP ; MANUFACTURING BURN IN TEST MODE?
JNZ F7_A
JMP F7 ; YES - SKIP KEYBOARD TEST
F7_A: CMP BYTE PTR @RESET_FLAG,064H ; MANUFACTURING RUN IN MODE?
JNZ F7_B
JMP F7 ; YES - SKIP KEYBOARD TEST
F7_B: MOV AL,36H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 36 <><>
CLI
CMP @RESET_FLAG,1234H ; SOFT RESET?
JZ G10
CMP BYTE PTR @RESET_FLAG,KB_OK ; CHECK FOR AA ALREADY RECEIVED
JZ G10 ; GO IF YES
MOV AL,ENA_KBD
CALL C8042 ; ENABLE KEYBOARD
MOV BH,4 ; TRY 4 TIMES
LOOP1: CALL OBF_42 ; CHECK FOR OUTPUT BUFFER FULL
JNZ G10 ; GO IF BUFFER FULL
DEC BH
JNZ LOOP1
G10: MOV AL,DIS_KBD ; DISABLE KEYBOARD
CALL C8042
IN AL,PORT_A ; FLUSH
MOV AL,KYBD_CLK_DATA ; GET THE CLOCK AND DATA LINES
CALL C8042
CALL OBF_42 ; WAIT FOR OUTPUT BUFFER FULL
IN AL,PORT_A ; GET THE RESULTS
TEST AL,KYBD_CLK ; KEYBOARD CLOCK MUST BE LOW
JZ G11
OR @MFG_ERR_FLAG+1,KYCLK_FAIL ; <><><><><><><><><><><><><><><>
; <><> KEYBOARD CLOCK HIGH <><>
MOV SI,OFFSET E304 ; DISPLAY 304 ERROR
JMP SHORT F6D ; REPORT ERROR
G11: CALL KBD_RESET ; ISSUE RESET TO KEYBOARD
JCXZ F6 ; PRINT ERROR MESSAGE IF NO INTERRUPT
MOV AL,37H ; <><><><><><><><><><><><>
OUT MFG_PORT,AL ; <><> CHECKPOINT 37 <><>
CMP BL,KB_OK ; SCAN CODE AS EXPECTED?