summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/XMA2EMS/XMA1DIAG.INC
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/DEV/XMA2EMS/XMA1DIAG.INC')
-rw-r--r--v4.0/src/DEV/XMA2EMS/XMA1DIAG.INC1870
1 files changed, 1870 insertions, 0 deletions
diff --git a/v4.0/src/DEV/XMA2EMS/XMA1DIAG.INC b/v4.0/src/DEV/XMA2EMS/XMA1DIAG.INC
new file mode 100644
index 0000000..bbf3875
--- /dev/null
+++ b/v4.0/src/DEV/XMA2EMS/XMA1DIAG.INC
@@ -0,0 +1,1870 @@
1;-----------------------------------------------------------------------;
2; This section contains the prescence test and diagnostic ;
3; routines for the XMA 1 card. ;
4; ;
5;-----------------------------------------------------------------------;
6
7;-----------------------------------------------------------------------;
8; DATA THAT IS UNIQUE TO THE DIAGNOSTICS PORTION OF ;
9; THE DEVICE DRIVER. THIS AREA WILL NOT REMAIN PRESENT ;
10; AFTER INITIALIZATION. ;
11;-----------------------------------------------------------------------;
12
13MEM_INST DB '1'
14TEST_ID DB ? ;SAVE AREA FOR CURRENT TEST ID
15CTRLPARM DW ? ;SAVE AREA FOR CONTROL PARM
16PAGE_UNDER_TEST DW 0 ;SAVE AREA FOR PAGE UNDER TEST
17CUR_SAVE DW ? ;SAVE AREA FOR NEXT AVAILABLE LINE
18 ;FOR MESSAGES
19ACTIVE_PAGE DB ? ;ACTIVE DISPLAY PAGE
20TESTABLE_SEGMENTS DW ?
21
22
23PAGE
24;-----------------------------------------------------------------------;
25; EQUATES THAT ARE UNIQUE TO THE DIAGNOSTICS PORTION OF ;
26; THE DEVICE DRIVER. ;
27;-----------------------------------------------------------------------;
28BLK_ON EQU 11110111B ;MASK FOR ENABLING A BLOCK
29BLK_OFF EQU 00001000B ;MASK FOR INHIBITING A BLOCK
30VIRT_MODE EQU 00000010B ;MASK FOR VIRTUAL MODE
31REAL_MODE EQU 11111101B ;MASK FOR REAL MODE
32MAX_TASK_ID EQU 15 ;MAXIMIM TASK ID
33ENABLE EQU 01H ;INDICATES THAT BLOCK SHOULD BE ENABLED
34TABLEN EQU 1000H ;NUMBER OF ENTRIES IN XLAT TABLE
35DMAREQ1 EQU 0009H ;I/O ADDRESS OF DMA CTRL 1 REQ REG
36DMAREQ2 EQU 00D2H ;I/O ADDRESS OF DMA CTRL 2 REQ REG
37DMAMODE1 EQU 000BH ;I/O ADDRESS OF DMA CTRL 1 MODE REG
38DMAMODE2 EQU 00D6H ;I/O ADDRESS OF DMA CTRL 2 MODE REG
39AT_NMI_REG EQU 70H ;AT NMI REG
40AT_NMI_OFF EQU 80H ;AT NMI OFF MASK
41AT_NMI_ON EQU 00H ;AT NMI ON MASK
42AT_CHCHK_EN_REG EQU 61H ;AT CH CHK ENABLE REG
43AT_CHCHK_REG EQU 61H ;AT CH CHK REG
44AT_CHCHK_EN EQU 0F7H ;AT CH CHK ENABLE MASK
45AT_CHCHK_DIS EQU 08H ;AT CH CHK DISABLE MASK
46AT_CHCHK EQU 40H ;AT CH CHK MASK
47XT_NMI_REG EQU 0A0H ;XT NMI REG
48XT_NMI_OFF EQU 00H ;XT NMI OFF MASK
49XT_NMI_ON EQU 80H ;XT NMI ON MASK
50XT_CHCHK_EN_REG EQU 61H ;XT CH CHK ENABLE REG
51XT_CHCHK_REG EQU 62H ;XT CH CHK REG
52XT_CHCHK_EN EQU 0DFH ;XT CH CHK ENABLE MASK
53XT_CHCHK_DIS EQU 20H ;XT CH CHK DISABLE MASK
54XT_CHCHK EQU 40H ;XT CH CHK MASK
55CR EQU 0DH ;CARRIAGE RETURN
56LF EQU 0AH ;LINE FEED
57PRES_TEST EQU 01 ;PRESENCE TEST ID
58REG_TEST EQU 02 ;REG TEST ID
59AUTO_INC EQU 03 ;AUTO INC TEST ID
60XLAT_TABLE_TEST EQU 04 ;TT TEST ID
61LOMEM_TEST EQU 05 ;ABOVE 640K TEST ID
62DMA_CAPTURE EQU 06 ;DMA CAPTURE TEST ID
63PAGE_TEST EQU 07 ;PAGE TEST ID
64MEM_TEST EQU 10 ;MEMORY TEST ID
65
66;-------------------------------------------------------------------------
67;
68; PRESENCE TEST
69;
70; DESCRIPTION : This routine will determine if the XMA is in the system.
71; It will also determine the amount of memory installed
72; on the card in 1Meg increments (up to 4Meg).
73;
74; FUNCTION/ : See description
75; PURPOSE
76;
77; ENTRY POINT : PRESTST
78;
79; ENTRY : The assumption is that at least 1MB of memory is installed.
80; CONDITIONS If the 2nd, 3rd or 4th MB of memory is installed then the
81; TOTAL_SYS_PAGES, TOTAL_EMS_PAGES, FREE_PAGES and
82; MEM_INST words are Revised accordingly.
83;
84;
85;
86; EXIT : (zero flag) = 0 indicates that the XMA is not installed.
87; if (zero flag) <> 0 then
88; TOTAL_SYS_PAGES, TOTAL_EMS_PAGES, FREE_PAGES and
89; MEM_INST words are Revised accordingly.
90;
91; AX,BX,CX,DX ARE DESTROYED
92;-------------------------------------------------------------------------
93;
94PRESTST PROC
95;
96 MOV AL,PRES_TEST
97 MOV CS:TEST_ID,AL
98
99;SAVE CONTENTS OF MODE REG
100 MOV DX,MODE_REG
101 IN AL,DX
102 PUSH AX
103
104; TRANSLATE TABLE ADDRESS AND DATA REGISTERS
105;
106 MOV AX,0AA55H ;DATA PATTERN (IN REAL MODE)
107 ;BE CERTAIN MODE REG GETS
108 ;REAL MODE
109 MOV DX,MODE_REG ;I/O TO MODE REG
110 OUT DX,AL ;WRITE PATTERN
111 MOV DX,TTPOINTER + 1 ;I/O TO TT POINTER (ODD ADDR)
112 XCHG AL,AH ;CHRG BUS WITH INVERSE PATTERN
113 OUT DX,AL ;WRITE IT
114 MOV DX,MODE_REG
115 IN AL,DX ;READ BACK MODE REG
116 XOR AL,AH
117 AND AL,0FH ;MASK OFF UNUSED BITS
118 ;ZERO FLAG = 0 IF ERROR
119END_PRES:
120 POP AX
121 PUSHF ;SAVE FLAGS
122 MOV DX,MODE_REG
123 OUT DX,AL ;RESTORE MODE REG TO INITIAL STATE
124 POPF ;RESTORE FLAGS
125 RET ;BACK TO CALLER
126;
127PRESTST ENDP
128
129PAGE
130
131;------------------------------------------------------------------------;
132; Diagnostics...on exit if ZF=0 then error ;
133;------------------------------------------------------------------------;
134XMA1DIAGS PROC
135
136 MOV CS:TEST_ID,00H ;CLEAR TEST ID BYTE
137 MOV CS:CTRLPARM,0100H ;SAVE CONTROL PARM
138 CALL CUR_POS ;GET CURSOR READY FOR MESSAGES
139 CALL REGTST ;TEST XMA REGISTERS
140 JNE FOUND_ERROR ;JUMP IF ERROR
141 CALL INCTST
142 JNE FOUND_ERROR
143 CALL XLATST
144 JNE FOUND_ERROR
145 CALL LOMEMTST ;TEST FOR BELOW 640K
146 JNE FOUND_ERROR ;JUMP IF ERROR
147 CALL MEMARRAY ;TEST MEMORY ABOVE 640K
148 JNE FOUND_ERROR ;JUMP IF ERROR
149 CALL PAGETST
150 JNE FOUND_ERROR
151 CALL CAPTST ;TEST DMA CAPTURE
152 JNE FOUND_ERROR ;JUMP IF ERROR
153FOUND_ERROR:
154 RET
155XMA1DIAGS ENDP
156
157
158
159PAGE
160;-------------------------------------------------------------------------
161;-------------------------------------------------------------------------
162;
163; SAVES CURSOR POSITION
164;
165; DESCRIPTION : This routine simply saves the cursor location
166; in CS:CUR_SAVE. This cursor position
167; should be used by the KB_OK routine to insure proper
168; format of the screen.
169;
170; FUNCTION/ : See description
171; PURPOSE
172;
173;
174; ENTRY POINT : CUR_POS
175;
176; ENTRY :
177; CONDITIONS
178;
179;
180; EXIT : new cursor position is saved in CS:CUR_SAVE
181;
182; All registers are preserved
183;
184;-------------------------------------------------------------------------
185;
186CUR_POS PROC
187;
188 PUSH AX
189 PUSH BX
190 PUSH CX
191 PUSH DX
192 PUSH SI
193 PUSH DI
194 PUSH DS ;SAVE REGISTERS
195;
196 PUSH CS
197 POP DS ;GET DS TO THIS CODE SEGMENT
198 ;MOVE CURSOR TO NEXT AVAILABLE LINE
199;IF DOS
200; MOV AH,9 ;DOS PRINT STRING
201; MOV DX,OFFSET NEXT_LINE + 1 ;OFFSET OF NEXT LINE MSG
202; INT 21H ;DISPLAY MESSAGE
203;ELSE
204; MOV BX,OFFSET NEXT_LINE ;GET OFFSET OF NEXT LINE MSG
205; MOV AH,0 ;TELL DCP TO DISPLAY
206; INT 82H ;DISPLAY MESSAGE
207;ENDIF
208 ; rsh001 fix scroll problem
209 ; and remove IF DOS crap
210 ;READ CURRENT VIDEO PAGE ; rsh001
211 MOV AH,15 ;READ CURRENT Video Page
212 INT 10H ;VIDEO CALL
213 MOV ACTIVE_PAGE,BH ;SAVE ACTIVE PAGE
214
215 ;READ CURRENT CURSOR POSITION
216 MOV AH,3 ;READ CURRENT CURSOR POS
217 INT 10H ;VIDEO CALL
218 MOV CUR_SAVE,DX ;SAVE CURSOR POSITION
219
220 ;RESTORE ALL REGISTERS
221 POP DS
222 POP DI
223 POP SI
224 POP DX
225 POP CX
226 POP BX
227 POP AX ;RESTORE ALL REGISTERS
228
229 RET ;RETURN TO CALLER
230
231CUR_POS ENDP
232
233
234
235
236
237PAGE
238;-------------------------------------------------------------------------
239;-------------------------------------------------------------------------
240;
241; TEST FOR PRESENCE OF MORE THAN 1 MEGABYTE OF MEMORY
242;
243; DESCRIPTION : This routine will determine if the 2nd, 3rd or 4th MB is
244; installed. Since there are no switches or other indicators
245; to be tested, this test will make a "best guess" as to
246; the presence of this memory. This test will roll a 0
247; and a 1 through the 1st word of the next Meg and if
248; at least 1 bit is consistently good then it is assumed
249; that the optional memory is installed. If successful
250; then try next Meg.
251;
252; FUNCTION/ : See description
253; PURPOSE
254;
255; ENTRY POINT : TRY4MEG
256;
257; ENTRY : none
258; CONDITIONS
259;
260; EXIT :
261;
262; AX,BX,CX,DX ARE DESTROYED
263;-------------------------------------------------------------------------
264;
265TRY4MEG PROC
266
267;MEMORY TEST MUST RUN IN PAGE MODE
268;BEFORE CARD IS PUT INTO PAGE MODE...MUST SET UP XLAT TABLE TO PASSOVER
269;RESERVED MEMORY SPACES (IE.,BIOS, DISPLAY, DISTRIBUTED ROS, ETC)
270;
271 CALL VIRT2REAL
272
273 MOV DX,IDREG ;I/O TO ID REGISTER
274 MOV AL,0 ;ID = 0
275 OUT DX,AL ;SWITCH TO ID = 0
276;
277 ;DISABLE NMI AND ENABLE I/O CHANNEL CHECK
278 MOV AL,CS:MODEL_BYTE ;GET SAVED MODEL BYTE
279 CMP AL,PC1 ;IS IT A PC1?
280 JE TR2M1 ;IF NO THEN TRY FOR PC_XT
281 CMP AL,PC_XT ;IS IT AN XT?
282 JE TR2M1 ;IF NO THEN TRY FOR AQUARIUS
283 CMP AL,XT_AQUARIUS ;IS IT AN AQUARIUS?
284 JE TR2M1 ;IF NO THEN USE AT NMI REGS
285 ;USE PC-AT NMI REGISTER
286 MOV DX,AT_NMI_REG ;AT's NMI REGISTER
287 MOV AL,AT_NMI_OFF ;MASK OFF NMI
288 OUT DX,AL ;OUTPUT IT
289 MOV DX,AT_CHCHK_EN_REG ;AT's I/O CH CHK REG
290 IN AL,DX ;READ IT
291 OR AL,AT_CHCHK_DIS ;MASK OFF I/O CH CHK ENABLE
292 OUT DX,AL ;WRITE IT
293 AND AL,AT_CHCHK_EN ;MASK ON I/O CH CHK ENABLE
294 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
295 ;ENABLED
296 ;USE PC1, XT, AQUARIUS REGISTERS
297TR2M1:
298 MOV DX,XT_NMI_REG ;XT's NMI REGISTER
299 MOV AL,XT_NMI_OFF ;MASK OFF NMI
300 OUT DX,AL ;OUTPUT IT
301 MOV DX,XT_CHCHK_EN_REG ;XT's I/O CH CHK REG
302 IN AL,DX ;READ IT
303 OR AL,XT_CHCHK_DIS ;MASK OFF I/O CH CHK ENABLE
304 OUT DX,AL ;WRITE IT
305 AND AL,XT_CHCHK_EN ;MASK ON I/O CH CHK ENABLE
306 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
307 ;ENABLED
308;
309 ;MAP FIRST 64K OF 2ND MEG INTO PC SPACE BEGINNING AT 512K
310;***jnw MOV CX,3 ;LOOK FOR PRESENCE OF NEXT 3 MB IN 1MB STEPS
311 MOV CX,99*1024/16 ;***jnw ;LOOK FOR PRESENCE OF NEXT n MB IN 1MB STEPS
312 MOV AX,CS:PAGE_FRAME_STA ;SEGMENT AT PAGE FRAME
313;***jnw MOV DX,256 ;BEGINNING AT 2ND MEG OF XMA
314 MOV DX,256+3 ;***jnw ;AT end of 16k
315 MOV BH,0 ;ASSIGNED TO TASK ID 0
316 MOV BL,01H ;ENABLE THIS MEMORY
317TR2M1A:
318 PUSH AX
319 PUSH BX
320 PUSH CX
321 PUSH DX
322;***jnw MOV CX,16 ;16 * 4K = 64K BLOCK
323 MOV CX,1 ;***jnw ;1 * 4K = 4K BLOCK
324 CALL SETXLAT ;SET TRANSLATE TABLE
325;
326 MOV AX,CS:PAGE_FRAME_STA
327 MOV DS,AX ;SET SEGMENT AND
328 MOV SI,0 ;OFFSET TO TEST
329 MOV BX,0000000000000001B ;ROLL 1 THROUGH WORD
330 MOV DX,1111111111111110B ;ROLL 0 THROUGH WORD
331 MOV CX,16 ;16 BITS TO TEST
332TR2M2:
333 MOV [SI],BX ;WRITE ROLLING 1 PATTERN
334 LOCK MOV [SI+2],DX ;CHARGE BUS INVERSE PATTERN
335 LOCK MOV AX,[SI] ;READ BACK INITIAL PATTERN
336 AND AX,BX ;ISOLATE BIT UNDER TEST
337;***jnw JZ TR2M3 ;IF ZERO TRY ANOTHER BIT
338 JZ quit ;IF ZERO quit ***jnw
339 MOV [SI],DX ;WRITE ROLLING 0 PATTERN
340 LOCK MOV [SI+2],BX ;CHARGE BUS INVERSE PATTERN
341 LOCK MOV AX,[SI] ;READ BACK INITIAL PATTERN
342 AND AX,BX ;ISOLATE BIT UNDER TEST
343 AND AX,BX ;ISOLATE BIT UNDER TEST
344;***jnw JZ TR2M4 ;IF ZERO THEN FOUND GOOD BIT
345 Jnz quit ;IF nonzero then quit ***jnw
346TR2M3:
347 ROL BX,1 ;ROLL 1 TO NEXT POSITION
348 ROL DX,1 ;ROLL 0 TO NEXT POSITION
349 LOOP TR2M2 ;REPEAT FOR 16 BITS
350 jmp tr2m4 ;all 16 bits passed test ***jnw
351quit: ;***jnw
352;AT THIS POINT THERE ARE NO GOOD BITS SO END SEARCH FOR NEXT MB
353 POP DX ;RECOVER THESES REGISTERS
354 POP CX
355 POP BX
356 POP AX
357 JMP TR2M5 ;EXIT
358;AT THIS POINT WE KNOW THERE IS MEMORY IN THIS MEG THAT WAS JUST TESTED
359TR2M4:
360;***jnw ADD CS:MEM_INST,1 ;ADD 1 MB TO THIS FLAG
361;***jnw ADD CS:TOTAL_XMA_PAGES,1024/16 ;ADD 1 MB TO THIS FLAG
362;***jnw ADD CS:TOTAL_PAGES,1024/16 ;ADD 1 MB TO THIS FLAG
363;***jnw ADD CS:FREE_PAGES,1024/16 ;ADD 1 MB TO THIS FLAG
364 ADD CS:TOTAL_SYS_PAGES,1 ;Add 16k ***jnw
365 ADD CS:TOTAL_EMS_PAGES,1 ;Add 16k ***jnw
366 ADD CS:FREE_PAGES,1 ;Add 16k ***jnw
367 POP DX ;RECOVER THESE REGISTERS
368 POP CX
369 POP BX
370 POP AX
371;***jnw ADD DX,256 ;TRY NEXT MB
372 ADD DX,4 ;TRY NEXT 16k ***jnw
373 LOOP TR2M1A ;REPEAT LOOP
374TR2M5:
375;BEFORE NMI IS ENABLED, CLEAR PARITY CHECK LATCH ON XMA
376 MOV SI,0
377 MOV AX,[SI] ;READ 1ST WORD OF THIS SEG
378 MOV [SI],AX ;WRITE BACK SAME WORD
379 ;THE WRITE WILL CLEAR PCHK LTCH
380;PUT THE XMA CARD BACK INTO REAL MODE
381 MOV DX,MODE_REG ;READY FOR I/O TO MODE REG
382 IN AL,DX ;READ IT
383 AND AL,REAL_MODE ;TURN OFF VIRTUAL BIT
384 OUT DX,AL ;WRITE IT TO MODE REG
385;CLEAR I/O CHANNEL CHECK LATCHES AND ENABLE NMI
386 MOV AL,CS:MODEL_BYTE ;GET SAVED MODEL BYTE
387 CMP AL,PC1 ;IS IT A PC1?
388 JE TR2M6 ;USE XT REGISTERS
389 CMP AL,PC_XT ;IS IT AN XT?
390 JE TR2M6 ;USE XT REGISTERS
391 CMP AL,XT_AQUARIUS ;IS IT AN AQUARIUS?
392 JE TR2M6 ;USE XT REGISTERS
393;IF NONE OF THE ABOVE THEN...
394;USE AT NMI REGISTER
395 MOV DX,AT_CHCHK_EN_REG ;AT's I/O CH CHK REG
396 IN AL,DX ;READ IT
397 OR AL,AT_CHCHK_DIS ;MASK OFF I/O CH CHK ENABLE
398 OUT DX,AL ;WRITE IT
399 AND AL,AT_CHCHK_EN ;MASK ON I/O CH CHK ENABLE
400 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
401 ;ENABLED
402 MOV DX,AT_NMI_REG ;AT's NMI REGISTER
403 MOV AL,AT_NMI_ON ;MASK ON NMI
404 OUT DX,AL ;OUTPUT IT
405;USE XT/AQUARIUS NMI REGISTER
406TR2M6:
407 MOV DX,XT_CHCHK_EN_REG ;XT's I/O CH CHK REG
408 IN AL,DX ;READ IT
409 OR AL,XT_CHCHK_DIS ;MASK OFF I/O CH CHK ENABLE
410 OUT DX,AL ;WRITE IT
411 AND AL,XT_CHCHK_EN ;MASK ON I/O CH CHK ENABLE
412 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
413 ;ENABLED
414 MOV DX,XT_NMI_REG ;XT's NMI REGISTER
415 MOV AL,XT_NMI_ON ;MASK ON NMI
416 OUT DX,AL ;OUTPUT IT
417;
418 RET ;RETURN TO CALLER
419
420TRY4MEG ENDP
421
422
423PAGE
424;-------------------------------------------------------------------------
425;-------------------------------------------------------------------------
426;
427; REGISTER TESTS
428;
429; DESCRIPTION : This routine will test the following subset
430; of XMA registers:
431; 31A0...8 bits
432; 31A1...4 bits
433; 31A6...4 bits
434; 31A7...4 bits (BIT 1 IS HELD LOW TO DISABLE
435; THE VIRTUAL MODE)
436;
437; The test is performed by writing and reading
438; AA, 55, FF, 00 from each of the above locations.
439;
440; NOTE: Regs 31A6 and 31A7 should always return 0 in
441; the high nibble.
442;
443; The remainding registers will be tested in
444; subsequent routines.
445;
446;
447; FUNCTION/ : To ensure integrity of XMA registers that will be used
448; PURPOSE in subsequent routines.
449;
450; ENTRY POINT : REGTST
451;
452; ENTRY : none
453; CONDITIONS
454;
455; EXIT : XMA registers are set to zero
456;
457; (zero flag) = 0 indicates an error
458; (DX) failing register
459; (AL) expected data XOR'ed with actual data
460;
461;-------------------------------------------------------------------------
462;
463REGTST PROC
464;
465 MOV AL,REG_TEST
466 MOV CS:TEST_ID,AL
467
468;SAVE CONTENTS OF MODE REG
469 MOV DX,MODE_REG
470 IN AL,DX
471 PUSH AX
472
473; TRANSLATE TABLE ADDRESS AND DATA REGISTERS
474;
475 MOV BX,0AA55H ;SET UP INITIAL DATA PATTERN
476 MOV AX,BX
477 MOV CX,BX
478
479R1:
480 MOV DX,TTPOINTER ;FIRST REGISTER PAIR TO WRITE
481
482 OUT DX,AX ;WRITE PATTERN TO REGS
483 ADD DX,6 ;POINT TO NEXT REG PAIR
484 XCHG AL,AH ;SETUP INVERSE PATTERN
485 AND AH,11111101B ;MASK OFF BIT 1
486 OUT DX,AX ;BECAUSE AH -> 21B7
487R2:
488 SUB DX,6 ;POINT TO FIRST REGISTER PAIR
489 IN AX,DX ;READ REGISTER (21B1 -> AH)
490 XOR AX,BX ;DATA READ AS EXPECTED ?
491 AND AX,0FFFH ;MASK OFF UPPER NIBBLE OF 21B1
492 JNE R_ERROR ;MISMATCH - GO TO ERROR ROUTINE
493 XCHG BH,BL ;NEXT PATTERN TO TEST
494 AND BX,0F0FH ;REGS RETURN 0 IN HI NIBBLE
495 ADD DX,6 ;POINT TO NEXT REGISTER PAIR
496 IN AX,DX ;READ IT (21B7 -> AH)
497 XOR AX,BX ;DATA READ AS EXPECTED ?
498 AND AX,0DFFH ;MASK OFF BIT 1 IN REG 21B7
499 JNE R_ERROR ;MISMATCH - GO TO ERROR ROUTINE
500;
501 CMP CH,CL ;LAST PASS ?
502 JE R_EXIT ;YES - THEN EXIT REG TEST
503;
504 CMP CX,055AAH ;END OF AA55,55AA PATTERNS?
505 JNE R3 ;
506 MOV CX,000FFH ;SET UP NEXT VALUE TO WRITE
507 JMP R4
508R3:
509 CMP CX,00FFH ;END OF FF00,00FF PATTERNS?
510 JNE R4 ;
511 MOV CX,0 ;YES, THEN SET UP FOR LAST PASS
512R4:
513 XCHG CL,CH ;SET UP INVERSE PATTERN
514 MOV AX,CX ;SAVE IT
515 MOV BX,CX ;SAVE IT
516R5:
517 JMP R1 ;CONTINUE TILL ZERO PATTERN
518
519R_ERROR:
520R_EXIT:
521 POP AX
522 MOV DX,MODE_REG
523 OUT DX,AL ;restore mode reg
524 RET
525;
526REGTST ENDP
527
528
529
530
531PAGE
532;-------------------------------------------------------------------------
533;-------------------------------------------------------------------------
534;
535; MEMORY ARRAY TEST
536;
537; DESCRIPTION : This routine test all 1Meg (or 2Meg) of XMA memory
538; through a 64K window in PC space beginning at PF:0
539; (where PF is the Page Frame Segment)
540; This module looks at TOTAL_SYS_PAGES
541; to determine the memory size to be tested.
542;
543; (i) write the Translate Table for the 1st 64K block
544; of XMA memory to be mapped into PF:0 in PC space
545; (ii) test PF:0 to PF:FFFF
546; (iii) if good...write Translate Table to map next 64K block
547; into PF:0
548; (iv) repeat 'till all XMA memory is tested
549;
550; FUNCTION/ : See description
551; PURPOSE
552;
553;
554; ENTRY POINT : MEMARRAY
555;
556; ENTRY :
557; CONDITIONS
558;
559; EXIT : All SMAS memory is set to zero.
560;
561; (zero flag) = 0 if storage error
562; (AX) expected data XOR'ed with actual data
563; if AX = 0 and ZF = 0 then parity error
564; DS:SI point to failing location
565; CS:PAGE_UNDER_TEST point failing 64k block
566;
567; AX,BX,CX,DX,DS,ES,SI,DI ARE DESTROYED
568;
569;-------------------------------------------------------------------------
570
571MEMARRAY PROC
572
573 MOV AL,MEM_TEST
574 MOV CS:TEST_ID,AL
575
576;MEMORY TEST MUST RUN IN PAGE MODE
577
578 CALL VIRT2REAL
579
580;INDICATE 0 KB OK
581 MOV DX,(640-16)/4 ;CODE FOR 640 KB OK
582 CALL KB_OK
583;SETUP FOR TEST OF SMAS MEMORY ARRAY
584 MOV AX,CS:PAGE_FRAME_STA ;PAGE MEMORY FROM THIS SEGMENT
585 MOV ES,AX ;SET UP DEST SEG
586 MOV DS,AX ;SET UP SOURCE SEG
587 MOV BL,01H ;ENABLE THIS BLOCK OF MEMORY
588 MOV BH,0 ;USING ID 0
589 MOV DX,(640)/4 ;STARTING BLK IN SMAS ARRAY
590 ;DETERMINE HOW MUCH MEMORY TO TEST
591 MOV CX,CS:TOTAL_SYS_PAGES ;GET NUMBER OF 16K PAGES
592 SUB CX,640/16 ;SUBTRACT OFF 1ST 640K MEMORY ;an000; dms;
593;BEGIN TEST
594MA1:
595 MOV CS:PAGE_UNDER_TEST,DX ;INDICATE WHICH 64K BLOCK
596 PUSH AX ;IS UNDER TEST
597 PUSH BX
598 PUSH CX
599 PUSH DX ;SAVE ALL REGISTERS
600;
601 MOV CX,4 ;test 16k at one time ;an000; dms;
602 ;4 x 4K = 16K
603 CALL SETXLAT ;SET UP XLAT TABLE
604 CALL STGTST ;TEST 64K OF STORAGE
605 JNZ MA2 ;WAS THERE AN ERROR
606 POP DX
607 POP CX
608 POP BX
609 POP AX ;RESTORE REGISTERS
610;
611 PUSHF ;SAVE FLAGS FOR ADDITION
612
613 CALL KB_OK ;INDICATE HOW MUCH
614 ;MEMORY HAS BEEN TESTED
615
616
617 ADD DX,4 ;POINT TO NEXT 64K BLOCK
618 POPF ;RESTORE FLAGS
619 LOOP MA1 ;LOOP FOR NEXT 64K
620 JMP MA3 ;EXIT WHEN COMPLETE
621MA2:
622 POP DX
623 POP CX
624 POP BX ;BX IS POPPED TWICE
625 POP BX ;TO RESTORE STACK WHILE
626 ;MAINTAINING AX
627MA3:
628 PUSH AX
629 PUSH DX
630 PUSHF ;SAVE THESE REGS...THEY CONTAIN
631 ;USEFULL ERROR INFO
632;PUT THE SMAS CARD INTO REAL MODE
633 MOV DX,MODE_REG ;READY FOR I/O TO MODE REG
634 IN AL,DX ;READ IT
635 AND AL,REAL_MODE ;TURN OFF VIRTUAL BIT
636 OUT DX,AL ;WRITE IT TO MODE REG
637 POPF
638 POP DX
639 POP AX ;RESTORE THESE REGS
640 RET
641;
642MEMARRAY ENDP
643
644
645
646
647PAGE
648;---------------------------------------------------------------------
649;---------------------------------------------------------------------
650; LO MEMORY TEST
651;
652; DESCRIPTION : This routine tests the first 256K or 512K
653; of XMA memory depending on the starting
654; position of the starting address jumper on
655; the card. The memory that is used to
656; fill conventional memory space is not tested
657; it is tested during POST and may now contain
658; parts of COMMAND.COM.
659;
660; FUNCTION/ : See description
661; PURPOSE
662;
663; ENTRY POINT : LOMEMTST
664;
665; ENTRY :
666; CONDITIONS
667;
668; EXIT : All tested memory is set to zero
669;
670; (zero flag) = 0 if storage error
671; (AX) = expected data XOR'ed with actual data
672; if (AX)=0 and ZF=0 then parity error
673; DS:SI point to failing location
674; CS:PAGE_UNDER_TEST point to failing 64K block
675;
676; AX,BX,CX,DX,DI,SI,ES,DS ARE DESTROYED
677;
678;-----------------------------------------------------------------------
679LOMEMTST PROC
680
681 MOV AL,LOMEM_TEST
682 MOV CS:TEST_ID,AL
683
684;MEMORY TEST MUST RUN IN PAGE MODE
685 CALL VIRT2REAL
686
687;INDICATE 0 KB OK AT START OF TEST
688 MOV DX,03ffcH ;code for initial 0 kb ;an000; dms;
689 CALL KB_OK
690
691;DETERMINE HOW MUCH MEMORY TO TEST
692 MOV AX,CS:START_BACMEM_SEG ;get starting fill segment
693 XCHG AH,AL
694 MOV CL,2 ; ;an000; dms;
695 SHR AX,CL ;convert to 16k block number
696 MOV CS:TESTABLE_SEGMENTS,AX ;save...this is number of 64k blocks
697 ;that can be tested without
698 ;destroying DOS
699;SET UP FOR TEST OF XMA MEMORY
700 MOV AX,CS:PAGE_FRAME_STA ;test through page frame
701 MOV DS,AX ;set up ds
702 MOV ES,AX ;and es
703 MOV BL,01H ;enable this block of memory
704 MOV BH,0 ;using id=0
705 XOR DX,DX ;start at block 0 in xma
706 MOV CX,640/16 ;loop counter is # 16k blocks in
707 ;conventional memory
708LM1:
709 MOV CS:PAGE_UNDER_TEST,DX ;save page under test
710 PUSH AX
711 PUSH BX
712 PUSH CX
713 PUSH DX ;save these registers
714
715 MOV CX,4 ;test 16k at one time ;an000; dms;
716 ;4 * 4k = 16k
717 CALL SETXLAT ;set translate table
718 CMP CS:TESTABLE_SEGMENTS,0 ;if this segment under test is used for
719 ;fill then read only
720 JG LM2 ;else do storage test
721 CALL READ_ONLY
722 JMP LM3
723LM2:
724 CALL STGTST
725LM3:
726 JNZ LM4 ;jump if there was an error
727 POP DX
728 POP CX
729 POP BX
730 POP AX ;recover registers
731
732 PUSHF ;save flags for addition
733 CALL KB_OK
734 ;indicate kb ok
735 ADD DX,4 ;next 16k block ;an000; dms;
736 DEC CS:TESTABLE_SEGMENTS ;dec testable pages
737 POPF ;recover flags
738 LOOP LM1 ;repeat for next 64k block
739 JMP LM5 ;exit when complete
740LM4:
741 POP DX ;recover these registers
742 POP CX
743 POP BX ;bx is popped twice to restore
744 POP BX ;satck while maintaining ax
745LM5:
746 PUSH AX ;save these ... they contain
747 PUSH DX ;useful error information
748 PUSHF
749;PUT CARD BACK TO REAL MODE
750 MOV DX,MODE_REG ;read mode reg
751 IN AL,DX
752 AND AL,REAL_MODE ;turn off virtual bit
753 OUT DX,AL ;write it to mode reg
754 POPF
755 POP DX
756 POP AX ;restore these registers
757 RET
758
759
760READ_ONLY PROC ;INTERNAL PROC TO READ MEMORY WITHOUT DESTROYING CONTENTS
761 XOR SI,SI ;start of segment
762 XOR CX,CX ;test 64k
763
764 LODSW ;just read each byte
765 XOR AX,AX ;and set zf=1 for return
766 RET ;back to caller
767READ_ONLY ENDP
768
769LOMEMTST ENDP
770
771
772
773PAGE
774;-------------------------------------------------------------------------
775;-------------------------------------------------------------------------
776;
777; PAGE TEST
778;
779; DESCRIPTION : This routine tests that the TASK ID register is
780; actually paging in unique segments of memory.
781; The test is performed through the page frame segment.
782; The test assumes that the memory test has already
783; completed successfully. The page test procedes as
784; follows:
785; (i) 6-64K blocks of XMA memory are mapped into a
786; 64K segment of PC space (the page frame)
787; These XMA blocks are from 640k to 1024k of XMA memory.
788; (ii) Each of these blocks is assigned to a unique
789; task ID ranging from 0 to 5.
790; (iii) For each task ID, the page frame is filled with
791; a pattern that is the same as the task ID.
792; (iv) The page frame is then read for each task ID
793; and compared with the expected data.
794;
795; FUNCTION/ :
796; PURPOSE
797;
798; ENTRY POINT : PAGETST
799;
800; ENTRY : NONE
801; CONDITIONS
802;
803; EXIT : (zero flag) = 0 indicates an error
804; (AL) expected data XOR'ed with actual data
805;
806; AX,BX,CX,DX,ES,DS,SI,DI ARE DESTROYED
807;-------------------------------------------------------------------------
808;
809PAGETST PROC
810;
811 MOV AL,PAGE_TEST
812 MOV CS:TEST_ID,AL
813;MEMORY TEST MUST RUN IN PAGE MODE
814 CALL VIRT2REAL
815;INITIALIZE TRANSLATE TABLE FOR THIS TEST
816 MOV AX,CS:PAGE_FRAME_STA ;SEMENT OF PAGE FRAME
817 MOV BL,01H ;ENABLE CODE
818 MOV BH,0 ;START WITH TASK ID = 0
819 MOV DX,640/4 ;START WITH XMA BLOCK 160
820 MOV CX,6 ;LOOP COUNT...6 TASK ID's
821 ;EACH TASK ID IS ASSIGNED 16K
822 ;FROM 640K TO 1024K
823PT1:
824 PUSH AX
825 PUSH BX
826 PUSH CX
827 PUSH DX ;SAVE ALL REGISTERS
828;
829 MOV CX,4 ;4 -4K BLOCKS IN 16K ;an000; dms;
830 CALL SETXLAT ;SET TRANSLATE TABLE
831 POP DX
832 POP CX
833 POP BX
834 POP AX ;RECOVER ALL
835 INC BH ;POINT TO NEXT TASK ID
836 ADD DX,4 ;NEXT 64K IN XMA MEMORY ;an000; dms;
837 LOOP PT1 ;REPEAT FOR ALL TASK ID's
838;FILL MEMORY WITH A UNIQUE PATTERN FOR EACH TASK ID
839 MOV CX,6 ;6 TASK ID's
840 MOV DX,IDREG ;READY FOR I/O TO TASK ID REG
841 MOV AL,0 ;START WITH ID = 0
842PT2:
843 PUSH AX ;SAVE ID NUMBER
844 PUSH CX ;SAVE ID COUNT
845 OUT DX,AL ;SWITCH TASK ID
846 MOV BX,CS:PAGE_FRAME_STA
847 MOV ES,BX ;SEGMENT TO 1ST 64K 0F ID
848 SUB DI,DI ;POINT TO 1ST LOCATION
849 mov cx,4000h ;WRITE ALL 16K LOCATIONS ;an000; dms;
850PT2X:
851 STOSB
852 LOOP PT2X
853 POP CX ;RECOVER ID COUNT
854 POP AX ;RECOVER CURRENT ID
855 INC AL
856 LOOP PT2 ;REPEAT FOR ALL TASK ID's
857;NOW CHECK THAT THERE ARE 16 UNIQUE PATTERNS IN MEMORY
858 MOV CX,6 ;USE 6 TASK ID's
859 MOV AH,0 ;START WITH ID = 0
860PT3:
861 MOV AL,AH ;GET TASK ID IN AL
862 PUSH AX
863 PUSH CX ;SAVE ID COUNT
864 OUT DX,AL ;SWITCH TASK ID
865 MOV BX,CS:PAGE_FRAME_STA
866 MOV DS,BX
867 MOV ES,BX ;SEGMENT AT 1ST 64K
868 SUB DI,DI ;POINT TO 1ST LOCATION
869 SUB SI,SI ;POINT TO 1ST LOCATION
870 mov cx,4000h ;READ ALL 16K LOCATIONS
871PT3X:
872 LODSB
873 XOR AL,AH ;DATA AS EXPECTED ?
874 JNE PT4X ;NO - THEN EXIT
875 STOSB ;AL SHOULD CONTAIN 0...WRITE IT
876 LOOP PT3X
877
878 POP CX ;RECOVER ID COUNT
879 POP AX
880 INC AH ;NEXT TASK ID
881 LOOP PT3 ;REPEAT FOR ALL TASK ID's
882 XOR AL,AL ;IF WE GOT THIS FAR THEN
883 ;NO ERRORS...SET ZF TO
884 ;INDICATE SUCCESS
885PT4:
886 PUSH AX
887 PUSH DX
888 PUSHF ;SAVE THESE REGS...THEY CONTAIN
889 ;USEFULL ERROR INFO
890;PUT THE SMAS CARD INTO REAL MODE
891 MOV DX,MODE_REG ;READY FOR I/O TO MODE REG
892 IN AL,DX ;READ IT
893 AND AL,REAL_MODE ;TURN OFF VIRTUAL BIT
894 OUT DX,AL ;WRITE IT TO MODE REG
895;MAKE SURE WE EXIT WHILE IN TASK ID=0
896 MOV DX,IDREG
897 XOR AL,AL
898 OUT DX,AL
899
900 POPF
901 POP DX
902 POP AX ;RESTORE THESE REGS
903 RET ;RETURN TO CALLER
904PT4X:
905 POP CX ;ALTERNATE RETURN PATH
906 POP AX
907 JMP PT4 ;TO ADJUST STACK
908;
909PAGETST ENDP
910
911
912PAGE
913;-------------------------------------------------------------------------
914;-------------------------------------------------------------------------
915;
916; DMA CAPTURE TEST
917;
918; DESCRIPTION : This routine is a test of the DMA capture logic.
919; The test is as follows:
920; (i) A bit is rolled through the second entry in the
921; DMA cature register file. (The first entry is used
922; for refresh on a PC-XT).
923; (ii) A bit and address test is performed on the
924; remainder of the register file(s).
925; (iii) A test is made for the capture of both REQUEST and
926; MODE registers of the DMA controller.
927; (iv) DMA channel 0 is tested only on the PC-AT
928;
929;
930; FUNCTION/ : To verify the functionality of the DMA capture logic.
931; PURPOSE
932;
933; ENTRY POINT : CAPTST
934;
935; ENTRY : NONE
936; CONDITIONS
937;
938; EXIT : Each entry in the DMA capture register file is set to 0.
939;
940; (zero flag) = 0 indicates an error
941; '31A8'X points to failing DMA capture reg
942; (AL) expected data XOR'ed with actual data
943;
944; AX,BX,CX,DX,SI,DI ARE DESTROYED
945;-------------------------------------------------------------------------
946;
947;
948CAPTST PROC
949;
950 MOV AL,DMA_CAPTURE
951 MOV CS:TEST_ID,AL
952;
953;ROLL A BIT THROUGH THE SECOND ENTRY IN THE DMA CAPTURE REGISTER FILE
954;
955 MOV BL,01H ;SET UP INITIAL PATTERN
956 MOV BH,01H ;SET UP DMA CHANNEL 1
957 MOV DI,DMACAPT ;SAVE FOR I/O TO DMA CAPTURE REG
958 MOV SI,DMAREQ1 ;SAVE FOR I/O TO DMA CTRL 1 REQ REG
959 MOV CX,4 ;ROLL 4 BIT POSITIONS
960C1:
961 MOV DX,IDREG ;I/O TO ID REG
962 MOV AL,BL ;PATTERN TO WRITE
963 OUT DX,AX ;SETUP ID REG WITH DATA PATTERN
964 MOV DX,SI ;DMA CTRL 1
965 MOV AL,BH ;CHANNEL 1
966 OUT DX,AL ;SETUP DMA CH 1...CAPT ID IN 2nd ENTRY
967 MOV DX,DI ;DMA CAPTURE REG
968 OUT DX,AL ;POINT TO 2nd ENTRY
969 IN AL,DX ;READ IT
970 XOR AL,BL ;DATA READ AS EXPECTED ?
971 JNE CAPT_ERROR ;NO - THEN ERROR
972 SHL BL,1 ;SHIFT BIT TO NEXT POSITION
973 LOOP C1 ;REPEAT
974;
975 MOV DI,DMAREQ2 ;SETUP FOR I/O TO DMA CTRL 2 REQ REG
976 MOV AL,05H ;DATA PATTERN TO CAPTURE
977 CALL CAPT_FILL ;FILL CAPTURE REGS WITH VALUE
978;
979 MOV AH,05H ;SETUP INITIAL PATTERN
980 MOV BX,0F0AH ;OTHER PATTERNS TO USE
981C2:
982 CALL CAPT_RMW
983 JNZ CAPT_ERROR ;ERROR - THEN EXIT
984 CMP AH,BL ;ZERO PATTERN ?
985 JE CAPT_EXIT ;EXIT IF YES
986 MOV AH,BL ;SET UP
987 MOV BL,BH ; NEXT
988 MOV BH,0 ; PATTERN
989 JMP C2 ;REPEAT
990
991;NOW REPEAT TEST FOR CATPURE OF DMA MODE REGISTERS
992 MOV SI,DMAMODE1 ;SETUP FOR I/O TO DMA CTRL 1 MODE REG
993 MOV DI,DMAMODE2 ;SETUP FOR I/O TO DMA CTRL 2 MODE REG
994 MOV AL,05H ;DATA PATTERN TO CAPTURE
995 CALL CAPT_FILL ;FILL CAPTURE REGS WITH VALUE
996;
997 MOV AH,05H ;SETUP INITIAL PATTERN
998 MOV BX,0F0AH ;OTHER PATTERNS TO USE
999C3:
1000 CALL CAPT_RMW
1001 JNZ CAPT_ERROR ;ERROR - THEN EXIT
1002 CMP AH,BL ;ZERO PATTERN ?
1003 JE CAPT_EXIT ;EXIT IF YES
1004 MOV AH,BL ;SET UP
1005 MOV BL,BH ; NEXT
1006 MOV BH,0 ; PATTERN
1007 JMP C3 ;REPEAT
1008CAPT_ERROR:
1009CAPT_EXIT:
1010 RET
1011
1012CAPTST ENDP
1013
1014
1015
1016PAGE
1017
1018;-------------------------------------------------------------------------
1019;-------------------------------------------------------------------------
1020;
1021; FILL DMA CAPTURE REG
1022;
1023; DESCRIPTION : This routine will fill the entire DMA capture register
1024; file with the pattern that is passed in AL
1025;
1026; FUNCTION/ : See Description.
1027; PURPOSE
1028;
1029; ENTRY POINT : CAPT_FILL
1030;
1031; ENTRY : AL contains the value to be captured into
1032; CONDITIONS the register file.
1033; SI contains the address of DMA controller 1
1034; DI contains the address of DMA controller 2
1035;
1036; EXIT : Each entry in the DMA capture register file is set to
1037; the value specified in AL.
1038;-------------------------------------------------------------------------
1039;
1040CAPT_FILL PROC NEAR
1041;
1042 MOV DX,IDREG
1043 OUT DX,AL ;LOAD ID REG WITH PAT TO BE CAPTURED
1044 MOV DX,DI ;GET ADDRESS OF CTRL 2
1045 MOV CX,3 ;REP FOR CHANNELS 7,6,5
1046CF1:
1047 MOV AL,CL ;CL CONTAINS WHICH DMA CHANNEL
1048 OUT DX,AL ;SETUP & CAPTURE DMA CHANNEL
1049 LOOP CF1 ;REPEAT
1050;
1051 MOV DX,SI ;GET ADDRESS OF CTRL 1
1052 MOV CX,3 ;REP FOR CHANNELS 3,2,1
1053CF2:
1054 MOV AL,CL ;CL CONTAINS WHICH DMA CHANNEL
1055 OUT DX,AL ;SETUP & CAPTURE DMA CHANNEL
1056 LOOP CF2 ;REPEAT
1057 ;DO CHANNEL 0 IF NOT PC1, XT, AQUARIUS
1058 CMP CS:MODEL_BYTE,PC1 ;IS THIS A PC1 ?
1059 JE CF3 ;YES - THEN EXIT ELSE TRY PC_XT
1060 CMP CS:MODEL_BYTE,PC_XT ;IS THIS AN XT ?
1061 JE CF3 ;YES - THEN EXIT ELSE TRY AQUARIUS
1062 CMP CS:MODEL_BYTE,XT_AQUARIUS ;IS THIS AN AQUARIUS?
1063 JE CF3 ;YES - THEN EXIT ELSE FILL CH 0 CAPT
1064 MOV AL,0 ;INDICATE CHANNEL 0
1065 OUT DX,AL ;SETUP & CAPTURE DMA CHANNEL
1066CF3:
1067 RET ;RETURN TO CALLER
1068;
1069CAPT_FILL ENDP
1070
1071
1072
1073
1074PAGE
1075;-------------------------------------------------------------------------
1076;-------------------------------------------------------------------------
1077;
1078; READ-MODIFY-WRITE DMA CAPTURE REG
1079;
1080; DESCRIPTION : This routine will read the a DMA capture register
1081; and if the correct value is found will cause a capture
1082; of a new value. The next DMA capture reg is read and
1083; the process repeated.
1084;
1085; FUNCTION/ : See Description.
1086; PURPOSE
1087;
1088; ENTRY POINT : CAPT_RMW
1089;
1090; ENTRY : AH contains the value to be compared
1091; CONDITIONS BL contains the new value to be written
1092; SI contains the address of DMA controller 1
1093; DI contains the address of DMA controller 2
1094;
1095; EXIT : Each entry in the DMA capture register file is set to
1096; the value specified in BL.
1097;
1098; AL,CX,DX,ARE DESTROYED
1099;-------------------------------------------------------------------------
1100;
1101CAPT_RMW PROC NEAR
1102;
1103 MOV CX,3 ;REP FOR CHANNELS 7,6,5
1104RMW1:
1105 MOV DX,DMACAPT ;I/O ADDRESS OF DMA CAPTURE REG
1106 MOV AL,CL ;GET LOW BYTE OF COUNT
1107 ADD AL,4 ;ADD 4 TO POINT TO DMA CAPTURE
1108 CALL RMW
1109 JNZ RMW4 ;EXIT IF ERROR
1110 LOOP RMW1 ;REPEAT FOR CHANNEL 6,5
1111;
1112 MOV CX,3 ;REP FOR CHANNELS 3,2,1
1113 PUSH DI ;SAVE DMA CTRL 2
1114 MOV DI,SI ;GET DMA CTRL 1 INTO DI FOR PROC RMW
1115RMW2:
1116 MOV DX,DMACAPT ;I/O ADDRESS OF DMA CAPTURE REG
1117 MOV AL,CL ;GET LOW BYTE OF COUNT
1118 CALL RMW
1119 JNZ RMW3 ;EXIT IF ERROR
1120 LOOP RMW2 ;REPEAT FOR DMA CHANNELS 2,1
1121 ;DO CHANNEL 0 IF NOT PC1, XT, AQUARIUS
1122 CMP CS:MODEL_BYTE,PC1 ;IS THIS A PC1 ?
1123 JE RMW3 ;YES - THEN EXIT ELSE TEST FOR PC_XT
1124 CMP CS:MODEL_BYTE,PC_XT ;IS THIS AN XT ?
1125 JE RMW3 ;YES - THEN EXIT ELSE TEST FOR AQUARIUS
1126 CMP CS:MODEL_BYTE,XT_AQUARIUS ;IS THIS AN AQUARIUS?
1127 JE RMW3 ;YES - THEN EXIT ELSE TEST CH 0
1128 MOV DX,DMACAPT ;I/O ADDRESS OF DMA CAPTURE REG
1129 MOV CL,0 ;INDICATE CHANNEL 0
1130 MOV AL,CL ;ALSO INTO AL
1131 CALL RMW
1132RMW3:
1133 POP DI ;RESTORE DI (ADDR OF DMA CTRL 2)
1134RMW4:
1135 RET ;RETURN TO CALLER
1136;
1137CAPT_RMW ENDP
1138;
1139RMW PROC
1140;
1141 OUT DX,AL ;SETUP TO READ FROM DMA CAPTURE REG
1142 IN AL,DX ;READ IT
1143 XOR AL,AH ;DATA AS EXPECTED ?
1144 JNE RMW5 ;NO THEN EXIT
1145 ;DATA WAS GOOD---NOW GET NEXT PATTERN INTO THIS CAPTURE REG
1146 MOV DX,IDREG ;ADDRESS OF ID REG
1147 MOV AL,BL ;NEW PATTERN TO WRITE
1148 OUT DX,AL ;WRITE IT TO ID REG
1149 MOV DX,DI ;ADDRESS OF DMA CTRL 2
1150 MOV AL,CL ;DMA CHANNEL TO SET UP
1151 OUT DX,AL ;SET UP DMA---THIS CAUSES CAPTURE OF ID
1152RMW5:
1153 RET ;RETURN TO CALLER
1154;
1155RMW ENDP
1156
1157
1158
1159
1160PAGE
1161;-------------------------------------------------------------------------
1162;-------------------------------------------------------------------------
1163;
1164; INHIBIT A BLOCK OF MEMORY
1165;
1166; DESCRIPTION : This routine will set a block of SMAS memory with
1167; the code to enable or inhibit it. The user simply
1168; specifies the starting segment and length of the block in
1169; PC 'real' address space that is to be enabled/inhibited.
1170; The appropriate entries in the Translate Table are
1171; written so that this specified block in 'real' address
1172; is enabled or protected in all 16 possible TASK ID's.
1173;
1174;
1175; FUNCTION/ : To enable or inhibit SMAS memory in specified areas of
1176; PURPOSE PC 'real'address space (ie.,diplay buffer, BIOS,
1177; distributed ROS...)
1178;
1179; ENTRY POINT : INHIBLK
1180;
1181; ENTRY : (AX) starting segment in PC address space to be
1182; CONDITIONS protected/enabled. Must be on 4K boundary else
1183; this routine will round UP to next 4K block.
1184;
1185; (CX) number of 4K blocks to be protected
1186;
1187; (BL) 01 = ENABLE
1188; 00 = INHIBIT
1189;
1190; EXIT : specified entries in Translate Table are enabled or
1191; inhibited for all posible task ID's.
1192;
1193; AX,BH,CX,DX ARE DESTROYED
1194;-------------------------------------------------------------------------
1195;
1196INHIBLK PROC
1197;
1198 ;ADJUST SI FOR TRANSLATE TABLE ENTRY
1199 XCHG AL,AH ;ROTATE RIGHT BY 8
1200 XOR AH,AH ;CLEAR AH
1201 ;AX IS NOW ADJUSTED FOR ENTRY INTO
1202 ;XLAT TABLE FOR TASK ID=0
1203 PUSH AX ;SAVE IT
1204 PUSH CX ;SAVE COUNT OF 4K BLOCKS
1205;
1206 MOV SI,TTDATA ;ADDRESS OF TT DATA REG
1207 MOV DI,AIDATA ;ADDRESS OF TT DATA WITH AUTO INC
1208 XOR BH,BH ;BH IS TASK ID
1209INH1:
1210 MOV DX,TTPOINTER ;ADDRESS OF TT POINTER
1211 POP CX ;RESTORE COUNT
1212 POP AX ;RESTORE TT ENTRY
1213 PUSH AX ;SAVE BOTH
1214 PUSH CX ; OF THEM
1215 MOV AH,BH ;APPEND TASK ID TO TT POINTER
1216 OUT DX,AX ;SET TT POINTER TO STARTING ENTRY
1217INH2:
1218 MOV DX,SI ;TT DATA REG
1219 IN AX,DX ;READ CURRENT ENTRY
1220 MOV DX,DI ;ADDRESS OF TT DATA WITH AUTO INC
1221 ;DETERMINE IF ENABLE OR INHIBIT BLOCK
1222 CMP BL,ENABLE ;WANT TO ENABLE THIS BLOCK ?
1223 JNE INH3 ;NO - THEN DISABLE IT
1224 AND AH,BLK_ON ;MASK OFF INHIBIT BIT
1225 JMP INH4
1226INH3:
1227 OR AH,BLK_OFF ;MASK ON INHIBIT BIT
1228INH4:
1229 OUT DX,AX ;WRITE IT THEN INC TO NEXT TT ENTRY
1230 LOOP INH2 ;REPEAT FOR EACH BLOCK OF 4K
1231 INC BH ;NEXT TASK ID
1232 CMP BH,MAX_TASK_ID ;COMPLETED FOR ALL TASK ID's ?
1233 JBE INH1 ;NO - THEN LOOP TILL DONE
1234INHIBLK_EXIT:
1235 POP CX
1236 POP AX
1237 RET
1238;
1239INHIBLK ENDP
1240
1241
1242
1243
1244PAGE
1245;-------------------------------------------------------------------------
1246;-------------------------------------------------------------------------
1247;
1248; STORAGE TEST
1249;
1250; DESCRIPTION : This routine performs a bit and address test on a
1251; 64K block of storage.
1252;
1253; (i) 55AA is written to each location.
1254; (ii) 55AA is read back
1255; (iii) if good, write AA55 and point to next location
1256; (iv) repeat step (iii) for all 64K locations
1257; (v) repeat steps (ii) to (iv) for AA55, FF00, 0101, 0000
1258; (vi) check parity bits
1259;
1260;
1261; FUNCTION/ : See description
1262; PURPOSE
1263;
1264; ENTRY POINT : STGTST
1265;
1266; ENTRY : (ES) storage segment to be tested
1267; CONDITIONS (DS) storage segment to be tested
1268;
1269; EXIT : (zero flag) = 0 if storage error
1270; (AX) expected data XOR'ed with actual data
1271; if ax = 0 and zf = 0 then parity error
1272; DS:SI point to failing location
1273;
1274; AX,BX,CX,DX,DI,SI ARE DESTROYED
1275;
1276;-------------------------------------------------------------------------
1277;
1278STGTST PROC
1279;
1280 CMP CS:WARM_START,'Y' ;is this a warm start?
1281 JNE STG1A ;if no then do mem test
1282 CALL CLEAR_MEM ;if yes then just clear memory
1283 XOR AX,AX ;set zero flag
1284 JMP STG6 ;exit
1285
1286
1287 ;DISABLE NMI AND ENABLE I/O CHANNEL CHECK
1288STG1A:
1289 MOV AL,CS:MODEL_BYTE ;GET SAVED MODEL BYTE
1290 CMP AL,PC1 ;IS IT A PC1?
1291 JE STG1 ;IF NO THEN TRY FOR PC_XT
1292 CMP AL,PC_XT ;IS IT AN XT?
1293 JE STG1 ;IF NO THEN TRY FOR AQUARIUS
1294 CMP AL,XT_AQUARIUS ;IS IT AN AQUARIUS?
1295 JE STG1 ;IF NO THEN USE AT NMI REGS
1296 ;USE PC-AT NMI REGISTER
1297 MOV DX,AT_NMI_REG ;AT's NMI REGISTER
1298 MOV AL,AT_NMI_OFF ;MASK OFF NMI
1299 OUT DX,AL ;OUTPUT IT
1300 MOV DX,AT_CHCHK_EN_REG ;AT's I/O CH CHK REG
1301 IN AL,DX ;READ IT
1302 OR AL,AT_CHCHK_DIS ;MASK OFF I/O CH CHK ENABLE
1303 OUT DX,AL ;WRITE IT
1304 AND AL,AT_CHCHK_EN ;MASK ON I/O CH CHK ENABLE
1305 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
1306 ;ENABLED
1307 ;USE PC1, XT, AQUARIUS REGISTERS
1308STG1:
1309 MOV DX,XT_NMI_REG ;XT's NMI REGISTER
1310 MOV AL,XT_NMI_OFF ;MASK OFF NMI
1311 OUT DX,AL ;OUTPUT IT
1312 MOV DX,XT_CHCHK_EN_REG ;XT's I/O CH CHK REG
1313 IN AL,DX ;READ IT
1314 OR AL,XT_CHCHK_DIS ;MASK OFF I/O CH CHK ENABLE
1315 OUT DX,AL ;WRITE IT
1316 AND AL,XT_CHCHK_EN ;MASK ON I/O CH CHK ENABLE
1317 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
1318 ;ENABLED
1319
1320
1321
1322 ;ROLL A BIT THROUGH THE FIRST WORD
1323 SUB DI,DI ;FIRST LOCATION
1324 MOV CX,16 ;ROLL 16 BITS
1325 MOV AX,0001H ;FIRST PATTERN TO WRITE
1326 MOV BX,AX ;SAVE IT
1327STG2:
1328 MOV [DI],AX ;WRITE PATTERN
1329 MOV [DI+2],0FFFFH ;CHARGE BUS
1330 MOV AX,[DI] ;READ PATTERN
1331 XOR AX,BX ;IS IT CORRECT ?
1332 JNE STG_EXIT ;IF NO - THEN EXIT
1333 SHL BX,1 ;SHIFT BIT
1334 MOV AX,BX ;GET IT INTO AX
1335 LOOP STG2 ;REPEAT
1336;
1337 CLD ;FILL FORWARD
1338 SUB DI,DI ;POINT TO FIRST LOCATION
1339 MOV CX,2000H ;8K WORDS ;an000; dms;
1340 MOV AX,55AAH ;INITIAL PATTERN TO WRITE
1341 REP STOSW ;FILL ENTIRE SEGMENT
1342;
1343 MOV BX,55AAH ;PATTERN TO LOOK FOR
1344 MOV DX,0AA55H ;NEXT PATTERN TO WRITE
1345 CALL STG_CNT
1346 JNZ STG_EXIT ;EXIT IF ERROR
1347;
1348 MOV BX,0AA55H ;PATTERN TO LOOK FOR
1349 MOV DX,0101H ;NEXT PATTERN TO WRITE
1350 CALL STG_CNT
1351 JNZ STG_EXIT ;EXIT IF ERROR
1352;
1353 MOV BX,0101H ;PATTERN TO LOOK FOR
1354 MOV DX,0000H ;NEXT PATTERN TO WRITE
1355 CALL STG_CNT
1356 JNZ STG_EXIT ;EXIT IF ERROR
1357;
1358; MOV BX,0000H ;PATTERN TO LOOK FOR
1359; MOV DX,0000H ;NEXT PATTERN TO WRITE
1360; CALL STG_CNT
1361; JNZ STG_EXIT ;EXIT IF ERROR
1362;
1363 ;IF TEST REACHES THIS POINT THEN MEMORY IS GOOD
1364 ;NEED TO CHECK PARITY BITS...IF PARITY ERROR EXISTS THEN
1365 ;CAN ASSUME BAD PARITY BIT OR BAD PARITY GENERATOR
1366;
1367 MOV AL,CS:MODEL_BYTE ;GET SAVED MODEL BYTE
1368 CMP AL,PC1 ;IS IT A PC1?
1369 JE STG3 ;USE XT REGISTERS
1370 CMP AL,PC_XT ;IS IT AN XT?
1371 JE STG3 ;USE XT REGISTERS
1372 CMP AL,XT_AQUARIUS ;IS IT AN AQUARIUS?
1373 JE STG3 ;USE XT REGISTERS
1374 ;IF NONE OF THE ABOVE THEN...
1375 ;USE AT NMI REGISTER
1376 MOV DX,AT_CHCHK_REG ;AT's I/O CH CHK REG
1377 IN AL,DX ;READ IT
1378 AND AL,AT_CHCHK ;IS CH CHK BIT ON ?
1379 JZ STG4 ;IF NO - THEN EXIT
1380 MOV AX,0 ;ELSE - CLEAR AX TO INDICATE
1381 ;PARITY ERROR
1382 JMP STG4 ;EXIT
1383 ;USE XT/AQUARIUS NMI REGISTER
1384STG3:
1385 MOV DX,XT_CHCHK_REG ;XT's I/O CH CHK REG
1386 IN AL,DX ;READ IT
1387 AND AL,XT_CHCHK ;IS CH CHK BIT ON ?
1388 JZ STG4 ;IF NO - THEN EXIT
1389 MOV AX,0 ;ELSE - CLEAR AX TO INDICATE
1390 ;PARITY ERROR
1391STG4:
1392STG_EXIT:
1393 PUSH AX ;SAVE THESE REGS
1394 PUSH DX ;THEY CONTAIN
1395 PUSH SI
1396 PUSHF ;USEFUL ERROR INFORMATION
1397 ;BEFORE NMI IS ENABLED, CLEAR PARITY CHECK LATCH ON XMA
1398 MOV SI,0
1399 MOV AX,[SI] ;READ 1ST WORD OF THIS SEG
1400 MOV [SI],AX ;WRITE BACK SAME WORD
1401 ;THE WRITE WILL CLEAR PCHK LTCH
1402 ;CLEAR I/O CHANNEL CHECK LATCHES AND ENABLE NMI
1403 MOV AL,CS:MODEL_BYTE ;GET SAVED MODEL BYTE
1404 CMP AL,PC1 ;IS IT A PC1?
1405 JE STG5 ;USE XT REGISTERS
1406 CMP AL,PC_XT ;IS IT AN XT?
1407 JE STG5 ;USE XT REGISTERS
1408 CMP AL,XT_AQUARIUS ;IS IT AN AQUARIUS?
1409 JE STG5 ;USE XT REGISTERS
1410 ;IF NONE OF THE ABOVE THEN...
1411 ;USE AT NMI REGISTER
1412 MOV DX,AT_CHCHK_EN_REG ;AT's I/O CH CHK REG
1413 IN AL,DX ;READ IT
1414 OR AL,AT_CHCHK_DIS ;MASK OFF I/O CH CHK ENABLE
1415 OUT DX,AL ;WRITE IT
1416 AND AL,AT_CHCHK_EN ;MASK ON I/O CH CHK ENABLE
1417 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
1418 ;ENABLED
1419 MOV DX,AT_NMI_REG ;AT's NMI REGISTER
1420 MOV AL,AT_NMI_ON ;MASK ON NMI
1421 OUT DX,AL ;OUTPUT IT
1422 ;USE XT/AQUARIUS NMI REGISTER
1423STG5:
1424 MOV DX,XT_CHCHK_EN_REG ;XT's I/O CH CHK REG
1425 IN AL,DX ;READ IT
1426 OR AL,XT_CHCHK_DIS ;MASK OFF I/O CH CHK ENABLE
1427 OUT DX,AL ;WRITE IT
1428 AND AL,XT_CHCHK_EN ;MASK ON I/O CH CHK ENABLE
1429 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
1430 ;ENABLED
1431 MOV DX,XT_NMI_REG ;XT's NMI REGISTER
1432 MOV AL,XT_NMI_ON ;MASK ON NMI
1433 OUT DX,AL ;OUTPUT IT
1434;
1435 POPF
1436 POP SI
1437 POP DX
1438 POP AX ;RESTORE REGS
1439STG6:
1440 RET ;RETURN TO CALLER
1441
1442
1443
1444CLEAR_MEM PROC ;INTERNAL PROC TO CLEAR MEMORY
1445 XOR DI,DI ;start of segment
1446 XOR CX,CX ;clear entire segment
1447 XOR AX,AX ;write zeroes
1448
1449 STOSB ;just write
1450 RET ;back to caller
1451CLEAR_MEM ENDP
1452
1453
1454STGTST ENDP
1455
1456
1457PAGE
1458;-------------------------------------------------------------------------
1459;-------------------------------------------------------------------------
1460;
1461; STORAGE TEST SUBROUTINE
1462;
1463; DESCRIPTION : This routine performs a bit and address test on a
1464; 64K block of storage.
1465;
1466; (i) a word is read and compared against the value in (BX)
1467; (ii) if good the value in (DX) is written into that location
1468; (iii) point to next location and repeat steps (i) to (ii)
1469;
1470;
1471; FUNCTION/ : See description
1472; PURPOSE
1473;
1474; ENTRY POINT : STG_CNT
1475;
1476; ENTRY : (ES) storage segment to be tested
1477; CONDITIONS (DS) storage segment to be tested
1478; (BX) value to be compared
1479; (DX) new value to be written
1480;
1481; EXIT : (zero flag) = 0 if storage error
1482; (AX) expected data XOR'ed with actual data
1483; if ax = 0 and zf = 0 then parity error
1484; DS:SI point to failing location
1485;-------------------------------------------------------------------------
1486;
1487STG_CNT PROC
1488;
1489 MOV CX,2000H ;8K WORDS ;an000; dms;
1490 SUB DI,DI ;FIRST LOCATION
1491 MOV SI,DI ;FIRST LOCATION
1492SC1:
1493 LODSW ;READ OLD WORD FROM STORAGE
1494 XOR AX,BX ;DATA AS EXPECTED ?
1495 JNE SC2 ;IF NO - THEN EXIT
1496 MOV AX,DX ;GET NEW PATTERN
1497 STOSW ;WRITE IT
1498 LOOP SC1 ;REPEAT
1499SC2:
1500 RET
1501
1502STG_CNT ENDP
1503
1504
1505
1506
1507PAGE
1508;-------------------------------------------------------------------------
1509;-------------------------------------------------------------------------
1510;
1511; PRINT MEMORY GOOD
1512;
1513; DESCRIPTION : This routine will print to the screen how much memory
1514; has been tested.
1515;
1516; The format will be: xxxx KB TESTED
1517;
1518; FUNCTION/ : See description
1519; PURPOSE
1520;
1521;
1522; ENTRY POINT : KB_OK
1523;
1524; ENTRY : (DX) = 1/4 OF GOOD MEMORY + 64K IN KB
1525; CONDITIONS ex: if (DX) = 16 then
1526; (16 * 4) + 64 = 128KB is OK
1527;
1528; NOTE: if (DX) = FFF0 then 0 KB is OK
1529;
1530;
1531; EXIT : Message is displayed
1532;
1533; All registers are preserved
1534;
1535;-------------------------------------------------------------------------
1536;
1537KB_OK PROC
1538;
1539 PUSH AX
1540 PUSH BX
1541 PUSH CX
1542 PUSH DX
1543 PUSH SI
1544 PUSH DI
1545 PUSH DS ;SAVE REGISTERS
1546;
1547 PUSH CS
1548 POP DS ;GET DS TO THIS CODE SEGMENT
1549 ;CONVERT DX TO KILO BYTES
1550 SHL DX,1
1551 SHL DX,1 ;MULTIPLY BY 4
1552 ADD DX,16 ;ADJUST BY 16 ;an000; dms;
1553;
1554 MOV AX,DX ;GET NUMBER INTO AX
1555 MOV BX,10 ;READY FOR DECIMAL CONVERT
1556 MOV CX,4 ;OF 4 DIGITS
1557K1:
1558 XOR DX,DX ;CLEAR HI WORD OF DIVIDEND
1559 ;AX IS LOW WORD OF DIVIDEND
1560 DIV BX ;DIVIDE BY 10
1561 OR DL,30H ;MAKE MODULO INTO ASCII
1562 PUSH DX ;SAVE IT
1563 LOOP K1 ;REPEAT FOR ALL DIGITS
1564;
1565 XOR SI,SI ;CLEAR SI
1566 MOV CX,4
1567K2:
1568 POP AX ;ASCII DIGIT GOES INTO AL
1569 MOV BX,OFFSET MEM_OK
1570 MOV CS:[BX+SI],AL ;BUILD ASCII MESSAGE
1571 INC SI
1572 LOOP K2
1573 ;MOVE THE CURSOR AND PRINT MESSAGE
1574 MOV DX,CUR_SAVE
1575 MOV BH,ACTIVE_PAGE
1576 MOV AH,2 ;SET CURSOR
1577
1578 INT 10H ;BIOS VIDEO CALL SET CURSOR
1579 MOV AH,9 ;DOS PRINT STRING
1580 MOV DX,OFFSET SIZE_MSG1 + 1 ;OFFSET OF MEM_OK MSG
1581 INT 21H ;DISPLAY MESSAGE
1582
1583 POP DS
1584 POP DI
1585 POP SI
1586 POP DX
1587 POP CX
1588 POP BX
1589 POP AX ;RESTORE ALL REGISTERS
1590
1591 RET ;RETURN TO CALLER
1592
1593KB_OK ENDP
1594
1595
1596PAGE
1597;-------------------------------------------------------------------------
1598;-------------------------------------------------------------------------
1599;
1600; SET TRANSLATE TABLE
1601;
1602; DESCRIPTION : This routine will write the Translate Table so that
1603; a specified block of PC 'real' address will be mapped
1604; to a specified block of SMAS physycal memory. Note that
1605; this routine will map only into CONTIGUOUS blocks of
1606; SMAS memory. PC memory is referenced by segments
1607; (must be on 4K boundaries) while SMAS memory is referenced
1608; by block number (each block is 4K).
1609;
1610; EXAMPLE: segment 4000 can be mapped to block 5
1611; segment 4100 can be mapped to block 6
1612;
1613; FUNCTION/ : To map PC 'real' addresses into SMAS physical memory.
1614; PURPOSE
1615;
1616;
1617; ENTRY POINT : SETXLAT
1618;
1619; ENTRY : (AX) starting segment in PC address space to be
1620; CONDITIONS mapped. Must be on 4K boundary else
1621; this routine will round UP to next 4K block.
1622;
1623; (CX) number of 4K blocks translated.
1624;
1625; (BH) task ID for this memory allocation
1626;
1627; (BL) 01 = ENABLE
1628; 00 = INHIBIT
1629;
1630; (DX) starting block number in SMAS memory
1631;
1632;
1633; EXIT : specified entries in Translate Table are enabled or
1634; inhibited for all posible task ID's.
1635;
1636;
1637; AX,CX,DX ARE DESTROYED
1638;
1639;-------------------------------------------------------------------------
1640;
1641SETXLAT PROC
1642;
1643 ;ADJUST AX FOR TRANSLATE TABLE ENTRY
1644 XCHG AL,AH ;ROTATE RIGHT BY 8
1645 MOV AH,BH ;TASK ID INTO BH
1646 ;AX IS NOW ADJUSTED FOR ENTRY INTO
1647 ;XLAT TABLE FOR TASK ID=(BH)
1648 PUSH DX ;SAVE STARTING SMAS BLOCK NUMBER
1649;
1650 MOV DX,TTPOINTER ;ADDRESS OF TT POINTER
1651 OUT DX,AX ;SET TT POINTER TO STARTING ENTRY
1652 POP AX ;GET STARTING BLOCK NUMBER INTO AX
1653;
1654 MOV DX,AIDATA ;TT DATA REG WITH AUTO INC
1655 ;DETERMINE IF ENABLE OR INHIBIT BLOCK
1656 CMP BL,ENABLE ;WANT TO ENABLE THIS BLOCK ?
1657 JE SETX1 ;YES - THEN SKIP THE DISABLE STEP
1658 OR AH,BLK_OFF ;MASK ON INHIBIT BIT
1659SETX1:
1660 OUT DX,AX ;WRITE IT THEN INC TO NEXT TT ENTRY
1661 INC AX ;NEXT BLOCK OF SMAS MEMORY
1662 LOOP SETX1 ;REPEAT FOR EACH BLOCK OF 4K
1663SETXLAT_EXIT:
1664 RET
1665;
1666SETXLAT ENDP
1667
1668 PAGE
1669;-------------------------------------------------------------------------
1670;-------------------------------------------------------------------------
1671;
1672; AUTO-INCREMENT TEST
1673;
1674; DESCRIPTION : This routine will test the auto-increment of
1675; the Translate Table pointer. The test will procede
1676; in the following manner:
1677; (i) A basic check of the TT pointer reg is performed
1678; (ii) The TT pointer is initialized to '00'H
1679; (iii) The auto increment data reg is written
1680; (iv) The TT pointer is read and checked for increment
1681; (v) Repeat until TT pointer wraps from 'FFF'H to '000'H
1682; (vi) Repeat test for auto-increment for read of data reg
1683;
1684; FUNCTION/ : To ensure that the Translate Table pointer can auto
1685; PURPOSE increment when 31A5 is written or read.
1686;
1687; ENTRY POINT : INCTST
1688;
1689; ENTRY : NONE
1690; CONDITIONS
1691;
1692; EXIT :
1693; (zero flag) = 0 indicates an error
1694; (DX) failing register (ie.,TT pointer reg)
1695; (AX) expected data XOR'ed with actual data
1696;-------------------------------------------------------------------------
1697;
1698;
1699INCTST PROC
1700;
1701 MOV AL,AUTO_INC
1702 MOV CS:TEST_ID,AL
1703;
1704;PERFORM SIMPLE TEST OF TTPOINTER REG
1705;
1706 MOV BX,0AA55H ;SET UP PATTERN TO WRITE
1707 MOV AX,BX
1708 MOV DX,TTPOINTER ;I/O TO TTPOINTER REG
1709 MOV SI,TTDATA ;SAVE FOR I/O TO TTDATA
1710 OUT DX,AX ;WRITE THE REGISTER
1711 XCHG DX,SI ;I/O TO TTDATA REG
1712 XCHG AH,AL ;INVERSE PATTERN
1713 OUT DX,AX ;CHARGE BUS WITH OPPOSITE PATTERN
1714 XCHG DX,SI ;I/O TO TTPOINTER REG
1715 IN AX,DX ;READ TTPOINTER REG
1716 XOR AX,BX ;READ AS EXPECTED
1717 AND AX,0FFFH ;MASK OFF HI NIBBLE (INVALID)
1718 JNE INC_ERROR ;NO - THEN EXIT
1719;
1720;CONTINUE WITH AUTO-INC TEST
1721;
1722 MOV DI,2 ;2 PASSES...1 WRITE , 1 READ
1723AI1:
1724 MOV SI,AIDATA ;SAVE FOR I/O TO TTDATA WITH AUTO-INC
1725AI2:
1726 MOV CX,1000H ;TTPOINTER RANGE 0 -> FFF
1727 MOV BX,0001H ;INITIAL COMPARE VALUE
1728 MOV AX,0 ;SET TTPONTER TO ZERO
1729 OUT DX,AX ;TTPOINTER IS INITIALIZED TO ZERO
1730AI2X:
1731 XCHG DX,SI ;I/O TO TTDATA WITH AUTO-INC
1732;
1733;DETERMINE IF WRITE OR READ TEST
1734;
1735 CMP DI,2 ;DOING A AUTO-INC WRITE TEST ?
1736 JNE AI3 ;NO - THEN MUST BE AUTO-INC READ TEST
1737 OUT DX,AX ;WRITE TO AUTO-INC DATA REG
1738 JMP AI4 ;CONTINUE WITH TEST
1739AI3:
1740 IN AX,DX ;READ FROM AUTO-INC DATA REG
1741AI4:
1742 XCHG DX,SI ;I/O TO TTPOINTER REG
1743 IN AX,DX ;READ TTPOINTER (31A1 -> AH)
1744 XOR AX,BX ;DATA AS EXPECTED ?
1745 AND AX,0FFFH ;MASK OFF UPPER NIBBLE (INVALID)
1746 JNE INC_ERROR ;NO - GO TO ERROR
1747 INC BX ;NEXT VALUE TO LOOK FOR
1748 LOOP AI2X ;CONTINUE TIL ALL VALUES ARE TESTED
1749;
1750 DEC DI
1751 CMP DI,0 ;COMPLETE WITH WRITE AND READ TEST ?
1752 JE INC_EXIT ;YES - THEN EXIT
1753 JMP AI1 ;NO - THEN CONTINUE WITH READ TEST
1754;
1755INC_ERROR:
1756INC_EXIT: RET
1757;
1758INCTST ENDP
1759
1760PAGE
1761;-------------------------------------------------------------------------
1762;-------------------------------------------------------------------------
1763;
1764; TRANSLATE TABLE TEST
1765;
1766; DESCRIPTION : This routine performs a write/read storage test
1767; on the Translate Table. The test is as follows:
1768; (i) A bit is rolled through the first word of the TT
1769; (ii) A bit and address test is performed on the
1770; remainder of the TT.
1771;
1772; FUNCTION/ : To verify the integrity of the Translate Table.
1773; PURPOSE
1774;
1775; ENTRY POINT : XLATST
1776;
1777; ENTRY : NONE
1778; CONDITIONS
1779;
1780; EXIT : Entire Translate Table is left with FFF (passover code)
1781;
1782; (zero flag) = 0 indicates an error
1783; (DX) failing register (TT data register)
1784; (AX) expected data XOR'ed with actual data
1785; (31A0) address in TT of failure
1786;-------------------------------------------------------------------------
1787;
1788XLATST PROC
1789;
1790 MOV AL,XLAT_TABLE_TEST
1791 MOV CS:TEST_ID,AL
1792;
1793;ROLL A BIT THROUGH THE FIRST BYTE
1794;
1795 MOV BX,0001H ;SET UP INITIAL PATTERN
1796 MOV SI,TTDATA ;SAVE FOR I/O TO DATA REG
1797 MOV DX,TTPOINTER ;I/O TO TTPOINTER REG
1798 MOV CX,12 ;ROLL 12 BIT POSITIONS
1799 XOR AX,AX ;CLEAR AX (WRITE TO 1st TT LOCATION)
1800 OUT DX,AX ;SET TT POINTER
1801 XCHG DX,SI ;READY FOR I/O TO TTDATA REG
1802X1:
1803 MOV AX,BX ;GET BIT PATTERN
1804 OUT DX,AX ;WRITE BIT PATTERN TO TT
1805 XCHG DX,SI ;READY FOR I/O TO TTPOINTER REG
1806 XOR AX,AX ;CLEAR AX
1807 OUT DX,AX ;CHARGE BUS WITH 0000 PATTERN
1808 XCHG DX,SI ;READY FOR I/O TO TTDATA REG
1809 IN AX,DX ;READ TT (31A1 -> AH)
1810 XOR AX,BX ;DATA READ AS EXPECTED ?
1811 AND AX,0FFFH ;MASK OFF UPPER NIBBLE (INVALID)
1812 JNE XLA_ERROR ;NO - THEN EXIT
1813 SHL BX,1 ;SHIFT BIT TO NEXT POSITION
1814 LOOP X1
1815;
1816;CONTINUE REMAINDER OF TRANSLATE TABLE
1817;
1818 MOV DX,AIDATA
1819;
1820 XCHG DX,SI ;READY FOR I/O TO TTPOINTER
1821 XOR AX,AX ;CLEAR AX
1822 OUT DX,AX ;TTPOINTER AT 1st LOCATION
1823;
1824 XCHG DX,SI ;READY FOR I/O TO TT DATA W/AUTO-INC
1825 MOV AX,0AA55H ;INITIAL DATA PATTERN
1826 MOV CX,TABLEN ;NUMBER OF TT ENTRIES
1827X2:
1828 OUT DX,AX ;SETUP INVERSE PATTERN
1829 LOOP X2 ;FILL ENTIRE XLATE TABLE
1830;
1831 MOV SI,TTDATA ;ADDRESS OF TTDATA WITHOUT INC.
1832 MOV BX,AX ;SAVE VALUE FOR COMPARE
1833 MOV DI,055AAH ;NEXT PATTERN TO WRITE
1834X3:
1835 MOV CX,TABLEN ;NUMBER OF TT ENTRIES
1836X4:
1837 XCHG DX,SI ;GET IT INTO DX...SI GETS AUTO-INC
1838 IN AX,DX ;READ TABLE ENTRY (HI BYTE -> AH)
1839 XOR AX,BX ;DATA READ AS EXPECTED ?
1840 AND AX,0FFFH ;MASK OFF HI NIBBLE (INVALID)
1841 JNE XLA_ERROR ;NO - THE EXIT
1842 XCHG DX,SI ;GET TTDATA WITH AUTO-INC
1843 MOV AX,DI ;RECOVER NEXT PATTERN TO WRITE
1844 OUT DX,AX ;WRITE IT THEN INCREMENT
1845 LOOP X4 ;REPEAT TILL TABLE FILLED
1846
1847
1848;
1849 CMP DI,0FFFFH ;LAST PASS ?
1850 JE XLA_EXIT ;YES - THEN EXIT REG TEST
1851;
1852 XCHG BX,DI ;BX GETS NEXT PATTERN TO TEST
1853;
1854 CMP BX,055AAH ;LAST PASS FOR AA55,55AA PATTERN?
1855 JNE X5 ;NO
1856 MOV DI,0FF00H ;YES- PREPARE TO WRITE NEW PATTERN
1857 JMP X3 ;DO IT
1858X5:
1859 CMP BX,0FF00H ;READY TO READ 0FF00 PATTERN
1860 JNE X6 ;NO
1861 MOV DI,00FFH ;YES- PREPARE TO WRITE NEW PATTERN
1862 JMP X3 ;DO IT
1863X6:
1864 MOV DI,0FFFFH ;PREPARE TO SET ALL OF TT INACTIVE
1865 JMP X3 ;DO IT
1866;
1867XLA_ERROR:
1868XLA_EXIT: RET
1869;
1870XLATST ENDP