]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/DEV/XMA2EMS/XMA1DIAG.INC

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / DEV / XMA2EMS / XMA1DIAG.INC
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
13 MEM_INST DB '1'
14 TEST_ID DB ? ;SAVE AREA FOR CURRENT TEST ID
15 CTRLPARM DW ? ;SAVE AREA FOR CONTROL PARM
16 PAGE_UNDER_TEST DW 0 ;SAVE AREA FOR PAGE UNDER TEST
17 CUR_SAVE DW ? ;SAVE AREA FOR NEXT AVAILABLE LINE
18 ;FOR MESSAGES
19 ACTIVE_PAGE DB ? ;ACTIVE DISPLAY PAGE
20 TESTABLE_SEGMENTS DW ?
21
22
23 PAGE
24 ;-----------------------------------------------------------------------;
25 ; EQUATES THAT ARE UNIQUE TO THE DIAGNOSTICS PORTION OF ;
26 ; THE DEVICE DRIVER. ;
27 ;-----------------------------------------------------------------------;
28 BLK_ON EQU 11110111B ;MASK FOR ENABLING A BLOCK
29 BLK_OFF EQU 00001000B ;MASK FOR INHIBITING A BLOCK
30 VIRT_MODE EQU 00000010B ;MASK FOR VIRTUAL MODE
31 REAL_MODE EQU 11111101B ;MASK FOR REAL MODE
32 MAX_TASK_ID EQU 15 ;MAXIMIM TASK ID
33 ENABLE EQU 01H ;INDICATES THAT BLOCK SHOULD BE ENABLED
34 TABLEN EQU 1000H ;NUMBER OF ENTRIES IN XLAT TABLE
35 DMAREQ1 EQU 0009H ;I/O ADDRESS OF DMA CTRL 1 REQ REG
36 DMAREQ2 EQU 00D2H ;I/O ADDRESS OF DMA CTRL 2 REQ REG
37 DMAMODE1 EQU 000BH ;I/O ADDRESS OF DMA CTRL 1 MODE REG
38 DMAMODE2 EQU 00D6H ;I/O ADDRESS OF DMA CTRL 2 MODE REG
39 AT_NMI_REG EQU 70H ;AT NMI REG
40 AT_NMI_OFF EQU 80H ;AT NMI OFF MASK
41 AT_NMI_ON EQU 00H ;AT NMI ON MASK
42 AT_CHCHK_EN_REG EQU 61H ;AT CH CHK ENABLE REG
43 AT_CHCHK_REG EQU 61H ;AT CH CHK REG
44 AT_CHCHK_EN EQU 0F7H ;AT CH CHK ENABLE MASK
45 AT_CHCHK_DIS EQU 08H ;AT CH CHK DISABLE MASK
46 AT_CHCHK EQU 40H ;AT CH CHK MASK
47 XT_NMI_REG EQU 0A0H ;XT NMI REG
48 XT_NMI_OFF EQU 00H ;XT NMI OFF MASK
49 XT_NMI_ON EQU 80H ;XT NMI ON MASK
50 XT_CHCHK_EN_REG EQU 61H ;XT CH CHK ENABLE REG
51 XT_CHCHK_REG EQU 62H ;XT CH CHK REG
52 XT_CHCHK_EN EQU 0DFH ;XT CH CHK ENABLE MASK
53 XT_CHCHK_DIS EQU 20H ;XT CH CHK DISABLE MASK
54 XT_CHCHK EQU 40H ;XT CH CHK MASK
55 CR EQU 0DH ;CARRIAGE RETURN
56 LF EQU 0AH ;LINE FEED
57 PRES_TEST EQU 01 ;PRESENCE TEST ID
58 REG_TEST EQU 02 ;REG TEST ID
59 AUTO_INC EQU 03 ;AUTO INC TEST ID
60 XLAT_TABLE_TEST EQU 04 ;TT TEST ID
61 LOMEM_TEST EQU 05 ;ABOVE 640K TEST ID
62 DMA_CAPTURE EQU 06 ;DMA CAPTURE TEST ID
63 PAGE_TEST EQU 07 ;PAGE TEST ID
64 MEM_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 ;
94 PRESTST 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
119 END_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 ;
127 PRESTST ENDP
128
129 PAGE
130
131 ;------------------------------------------------------------------------;
132 ; Diagnostics...on exit if ZF=0 then error ;
133 ;------------------------------------------------------------------------;
134 XMA1DIAGS 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
153 FOUND_ERROR:
154 RET
155 XMA1DIAGS ENDP
156
157
158
159 PAGE
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 ;
186 CUR_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
231 CUR_POS ENDP
232
233
234
235
236
237 PAGE
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 ;
265 TRY4MEG 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
297 TR2M1:
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
317 TR2M1A:
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
332 TR2M2:
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
346 TR2M3:
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
351 quit: ;***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
359 TR2M4:
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
374 TR2M5:
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
406 TR2M6:
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
420 TRY4MEG ENDP
421
422
423 PAGE
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 ;
463 REGTST 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
479 R1:
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
487 R2:
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
508 R3:
509 CMP CX,00FFH ;END OF FF00,00FF PATTERNS?
510 JNE R4 ;
511 MOV CX,0 ;YES, THEN SET UP FOR LAST PASS
512 R4:
513 XCHG CL,CH ;SET UP INVERSE PATTERN
514 MOV AX,CX ;SAVE IT
515 MOV BX,CX ;SAVE IT
516 R5:
517 JMP R1 ;CONTINUE TILL ZERO PATTERN
518
519 R_ERROR:
520 R_EXIT:
521 POP AX
522 MOV DX,MODE_REG
523 OUT DX,AL ;restore mode reg
524 RET
525 ;
526 REGTST ENDP
527
528
529
530
531 PAGE
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
571 MEMARRAY 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
594 MA1:
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
621 MA2:
622 POP DX
623 POP CX
624 POP BX ;BX IS POPPED TWICE
625 POP BX ;TO RESTORE STACK WHILE
626 ;MAINTAINING AX
627 MA3:
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 ;
642 MEMARRAY ENDP
643
644
645
646
647 PAGE
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 ;-----------------------------------------------------------------------
679 LOMEMTST 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
708 LM1:
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
723 LM2:
724 CALL STGTST
725 LM3:
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
740 LM4:
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
745 LM5:
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
760 READ_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
767 READ_ONLY ENDP
768
769 LOMEMTST ENDP
770
771
772
773 PAGE
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 ;
809 PAGETST 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
823 PT1:
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
842 PT2:
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;
850 PT2X:
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
860 PT3:
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
871 PT3X:
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
885 PT4:
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
904 PT4X:
905 POP CX ;ALTERNATE RETURN PATH
906 POP AX
907 JMP PT4 ;TO ADJUST STACK
908 ;
909 PAGETST ENDP
910
911
912 PAGE
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 ;
948 CAPTST 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
960 C1:
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
981 C2:
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
999 C3:
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
1008 CAPT_ERROR:
1009 CAPT_EXIT:
1010 RET
1011
1012 CAPTST ENDP
1013
1014
1015
1016 PAGE
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 ;
1040 CAPT_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
1046 CF1:
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
1053 CF2:
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
1066 CF3:
1067 RET ;RETURN TO CALLER
1068 ;
1069 CAPT_FILL ENDP
1070
1071
1072
1073
1074 PAGE
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 ;
1101 CAPT_RMW PROC NEAR
1102 ;
1103 MOV CX,3 ;REP FOR CHANNELS 7,6,5
1104 RMW1:
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
1115 RMW2:
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
1132 RMW3:
1133 POP DI ;RESTORE DI (ADDR OF DMA CTRL 2)
1134 RMW4:
1135 RET ;RETURN TO CALLER
1136 ;
1137 CAPT_RMW ENDP
1138 ;
1139 RMW 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
1152 RMW5:
1153 RET ;RETURN TO CALLER
1154 ;
1155 RMW ENDP
1156
1157
1158
1159
1160 PAGE
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 ;
1196 INHIBLK 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
1209 INH1:
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
1217 INH2:
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
1226 INH3:
1227 OR AH,BLK_OFF ;MASK ON INHIBIT BIT
1228 INH4:
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
1234 INHIBLK_EXIT:
1235 POP CX
1236 POP AX
1237 RET
1238 ;
1239 INHIBLK ENDP
1240
1241
1242
1243
1244 PAGE
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 ;
1278 STGTST 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
1288 STG1A:
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
1308 STG1:
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
1327 STG2:
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
1384 STG3:
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
1391 STG4:
1392 STG_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
1423 STG5:
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
1439 STG6:
1440 RET ;RETURN TO CALLER
1441
1442
1443
1444 CLEAR_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
1451 CLEAR_MEM ENDP
1452
1453
1454 STGTST ENDP
1455
1456
1457 PAGE
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 ;
1487 STG_CNT PROC
1488 ;
1489 MOV CX,2000H ;8K WORDS ;an000; dms;
1490 SUB DI,DI ;FIRST LOCATION
1491 MOV SI,DI ;FIRST LOCATION
1492 SC1:
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
1499 SC2:
1500 RET
1501
1502 STG_CNT ENDP
1503
1504
1505
1506
1507 PAGE
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 ;
1537 KB_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
1557 K1:
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
1567 K2:
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
1593 KB_OK ENDP
1594
1595
1596 PAGE
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 ;
1641 SETXLAT 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
1659 SETX1:
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
1663 SETXLAT_EXIT:
1664 RET
1665 ;
1666 SETXLAT 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 ;
1699 INCTST 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
1723 AI1:
1724 MOV SI,AIDATA ;SAVE FOR I/O TO TTDATA WITH AUTO-INC
1725 AI2:
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
1730 AI2X:
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
1739 AI3:
1740 IN AX,DX ;READ FROM AUTO-INC DATA REG
1741 AI4:
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 ;
1755 INC_ERROR:
1756 INC_EXIT: RET
1757 ;
1758 INCTST ENDP
1759
1760 PAGE
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 ;
1788 XLATST 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
1802 X1:
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
1827 X2:
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
1834 X3:
1835 MOV CX,TABLEN ;NUMBER OF TT ENTRIES
1836 X4:
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
1858 X5:
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
1863 X6:
1864 MOV DI,0FFFFH ;PREPARE TO SET ALL OF TT INACTIVE
1865 JMP X3 ;DO IT
1866 ;
1867 XLA_ERROR:
1868 XLA_EXIT: RET
1869 ;
1870 XLATST ENDP