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