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

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / DEV / XMA2EMS / DIAGS.ASM
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 ;-----------------------------------------------------------------------;
6 INCLUDE EMS_US.MSG
7
8 MEM_INST DB '1'
9 ADDR_MODEL_BYTE DD 0F000FFFEH ;ADDRESS IN BIOS OF MODEL BYTE
10 MODEL DB ? ;SAVE AREA FOR MODEL
11 TEST_ID DB ? ;SAVE AREA FOR CURRENT TEST ID
12 CTRLPARM DW ? ;SAVE AREA FOR CONTROL PARM
13 PAGE_UNDER_TEST DW 0 ;SAVE AREA FOR PAGE UNDER TEST
14 CUR_SAVE DW ? ;SAVE AREA FOR NEXT AVAILABLE LINE
15 ;FOR MESSAGES
16 ACTIVE_PAGE DB ? ;ACTIVE DISPLAY PAGE
17 TESTABLE_SEGMENTS DW ?
18
19
20 PAGE
21 ;-----------------------------------------------------------------------;
22 ; EQUATES THAT ARE UNIQUE TO THE DIAGNOSTICS PORTION OF ;
23 ; THE DEVICE DRIVER. ;
24 ;-----------------------------------------------------------------------;
25 BASE_REG EQU 31A0H
26 DMACAPT EQU 31A8H ;I/O ADDRESS OF DMA CAPTURE REG
27 BLK_ON EQU 11110111B ;MASK FOR ENABLING A BLOCK
28 BLK_OFF EQU 00001000B ;MASK FOR INHIBITING A BLOCK
29 VIRT_MODE EQU 00000010B ;MASK FOR VIRTUAL MODE
30 REAL_MODE EQU 11111101B ;MASK FOR REAL MODE
31 MAX_TASK_ID EQU 15 ;MAXIMIM TASK ID
32 ENABLE EQU 01H ;INDICATES THAT BLOCK SHOULD BE ENABLED
33 TABLEN EQU 1000H ;NUMBER OF ENTRIES IN XLAT TABLE
34 DMAREQ1 EQU 0009H ;I/O ADDRESS OF DMA CTRL 1 REQ REG
35 DMAREQ2 EQU 00D2H ;I/O ADDRESS OF DMA CTRL 2 REQ REG
36 DMAMODE1 EQU 000BH ;I/O ADDRESS OF DMA CTRL 1 MODE REG
37 DMAMODE2 EQU 00D6H ;I/O ADDRESS OF DMA CTRL 2 MODE REG
38 PC1 EQU 0FFH ;RESERVED BYTE FOR PC1
39 PC_XT EQU 0FEH ;RESERVED BYTE FOR XT
40 XT_AQUARIUS EQU 0FBH ;RESERVED BYTE FOR XT-AQUARIUS
41 AT_NMI_REG EQU 70H ;AT NMI REG
42 AT_NMI_OFF EQU 80H ;AT NMI OFF MASK
43 AT_NMI_ON EQU 00H ;AT NMI ON MASK
44 AT_CHCHK_EN_REG EQU 61H ;AT CH CHK ENABLE REG
45 AT_CHCHK_REG EQU 61H ;AT CH CHK REG
46 AT_CHCHK_EN EQU 0F7H ;AT CH CHK ENABLE MASK
47 AT_CHCHK_DIS EQU 08H ;AT CH CHK DISABLE MASK
48 AT_CHCHK EQU 40H ;AT CH CHK MASK
49 XT_NMI_REG EQU 0A0H ;XT NMI REG
50 XT_NMI_OFF EQU 00H ;XT NMI OFF MASK
51 XT_NMI_ON EQU 80H ;XT NMI ON MASK
52 XT_CHCHK_EN_REG EQU 61H ;XT CH CHK ENABLE REG
53 XT_CHCHK_REG EQU 62H ;XT CH CHK REG
54 XT_CHCHK_EN EQU 0DFH ;XT CH CHK ENABLE MASK
55 XT_CHCHK_DIS EQU 20H ;XT CH CHK DISABLE MASK
56 XT_CHCHK EQU 40H ;XT CH CHK MASK
57 ONE_MEG EQU 16 ;CONSTANT FOR ONE MEG MEMORY CARD
58 TWO_MEG EQU 32 ;CONSTANT FOR TWO MEG MEMORY CARD
59 CR EQU 0DH ;CARRIAGE RETURN
60 LF EQU 0AH ;LINE FEED
61 PRES_TEST EQU 01 ;PRESENCE TEST ID
62 REG_TEST EQU 02 ;REG TEST ID
63 AUTO_INC EQU 03 ;AUTO INC TEST ID
64 XLAT_TABLE_TEST EQU 04 ;TT TEST ID
65 LOMEM_TEST EQU 05 ;ABOVE 640K TEST ID
66 DMA_CAPTURE EQU 06 ;DMA CAPTURE TEST ID
67 PAGE_TEST EQU 07 ;PAGE TEST ID
68 MEM_TEST EQU 10 ;MEMORY TEST ID
69
70
71 ;------------------------------------------------------------------------;
72 ; Diagnostics...on exit if ZF=0 then error ;
73 ;------------------------------------------------------------------------;
74 DIAGS 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
94 FOUND_ERROR:
95 RET
96 DIAGS ENDP
97
98
99
100
101 PAGE
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 ;
131 PRESTST 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
156 END_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 ;
164 PRESTST ENDP
165
166
167
168
169 PAGE
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 ;
196 CUR_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
241 CUR_POS ENDP
242
243
244
245
246
247 PAGE
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 ;
275 TRY4MEG 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
307 TR2M1:
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
327 TR2M1A:
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
342 TR2M2:
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
356 TR2M3:
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
361 quit: ;***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
369 TR2M4:
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
384 TR2M5:
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
416 TR2M6:
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
430 TRY4MEG ENDP
431
432
433 PAGE
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 ;
473 REGTST 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
489 R1:
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
497 R2:
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
518 R3:
519 CMP CX,00FFH ;END OF FF00,00FF PATTERNS?
520 JNE R4 ;
521 MOV CX,0 ;YES, THEN SET UP FOR LAST PASS
522 R4:
523 XCHG CL,CH ;SET UP INVERSE PATTERN
524 MOV AX,CX ;SAVE IT
525 MOV BX,CX ;SAVE IT
526 R5:
527 JMP R1 ;CONTINUE TILL ZERO PATTERN
528
529 R_ERROR:
530 R_EXIT:
531 POP AX
532 MOV DX,MODE_REG
533 OUT DX,AL ;restore mode reg
534 RET
535 ;
536 REGTST ENDP
537
538
539
540
541 PAGE
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
581 MEMARRAY 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
606 MA1:
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
633 MA2:
634 POP DX
635 POP CX
636 POP BX ;BX IS POPPED TWICE
637 POP BX ;TO RESTORE STACK WHILE
638 ;MAINTAINING AX
639 MA3:
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 ;
654 MEMARRAY ENDP
655
656
657
658
659 PAGE
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 ;-----------------------------------------------------------------------
691 LOMEMTST 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
720 LM1:
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
735 LM2:
736 CALL STGTST
737 LM3:
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
752 LM4:
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
757 LM5:
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
772 READ_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
779 READ_ONLY ENDP
780
781 LOMEMTST ENDP
782
783
784
785 PAGE
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 ;
821 PAGETST 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
835 PT1:
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
854 PT2:
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
862 PT2X:
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
872 PT3:
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
883 PT3X:
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
897 PT4:
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
916 PT4X:
917 POP CX ;ALTERNATE RETURN PATH
918 POP AX
919 JMP PT4 ;TO ADJUST STACK
920 ;
921 PAGETST ENDP
922
923
924 PAGE
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 ;
960 CAPTST 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
972 C1:
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
993 C2:
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
1011 C3:
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
1020 CAPT_ERROR:
1021 CAPT_EXIT:
1022 RET
1023
1024 CAPTST ENDP
1025
1026
1027
1028 PAGE
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 ;
1052 CAPT_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
1058 CF1:
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
1065 CF2:
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
1078 CF3:
1079 RET ;RETURN TO CALLER
1080 ;
1081 CAPT_FILL ENDP
1082
1083
1084
1085
1086 PAGE
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 ;
1113 CAPT_RMW PROC NEAR
1114 ;
1115 MOV CX,3 ;REP FOR CHANNELS 7,6,5
1116 RMW1:
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
1127 RMW2:
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
1144 RMW3:
1145 POP DI ;RESTORE DI (ADDR OF DMA CTRL 2)
1146 RMW4:
1147 RET ;RETURN TO CALLER
1148 ;
1149 CAPT_RMW ENDP
1150 ;
1151 RMW 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
1164 RMW5:
1165 RET ;RETURN TO CALLER
1166 ;
1167 RMW ENDP
1168
1169
1170
1171
1172 PAGE
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 ;
1208 INHIBLK 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
1221 INH1:
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
1229 INH2:
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
1238 INH3:
1239 OR AH,BLK_OFF ;MASK ON INHIBIT BIT
1240 INH4:
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
1246 INHIBLK_EXIT:
1247 POP CX
1248 POP AX
1249 RET
1250 ;
1251 INHIBLK ENDP
1252
1253
1254
1255
1256 PAGE
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 ;
1290 STGTST 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
1300 STG1A:
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
1320 STG1:
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
1339 STG2:
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
1396 STG3:
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
1403 STG4:
1404 STG_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
1435 STG5:
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
1451 STG6:
1452 RET ;RETURN TO CALLER
1453
1454
1455
1456 CLEAR_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
1463 CLEAR_MEM ENDP
1464
1465
1466 STGTST ENDP
1467
1468
1469 PAGE
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 ;
1499 STG_CNT PROC
1500 ;
1501 MOV CX,8000H ;32K WORDS
1502 SUB DI,DI ;FIRST LOCATION
1503 MOV SI,DI ;FIRST LOCATION
1504 SC1:
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
1511 SC2:
1512 RET
1513
1514 STG_CNT ENDP
1515
1516
1517
1518
1519 PAGE
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 ;
1549 KB_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
1569 K1:
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
1579 K2:
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
1589 IF 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
1594 ELSE
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
1600 ENDIF
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
1612 KB_OK ENDP
1613
1614
1615 PAGE
1616 ;--------------------------------------------------------------------
1617 ;--------------------------------------------------------------------
1618 ; GET MODEL BYTE
1619 ;
1620 GETMOD 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 ;
1630 GETMOD ENDP
1631
1632
1633
1634
1635 PAGE
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 ;
1680 SETXLAT 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
1698 SETX1:
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
1702 SETXLAT_EXIT:
1703 RET
1704 ;
1705 SETXLAT 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 ;
1738 INCTST 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
1762 AI1:
1763 MOV SI,AIDATA ;SAVE FOR I/O TO TTDATA WITH AUTO-INC
1764 AI2:
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
1769 AI2X:
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
1778 AI3:
1779 IN AX,DX ;READ FROM AUTO-INC DATA REG
1780 AI4:
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 ;
1794 INC_ERROR:
1795 INC_EXIT: RET
1796 ;
1797 INCTST ENDP
1798
1799 PAGE
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 ;
1827 XLATST 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
1841 X1:
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
1866 X2:
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
1873 X3:
1874 MOV CX,TABLEN ;NUMBER OF TT ENTRIES
1875 X4:
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
1897 X5:
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
1902 X6:
1903 MOV DI,0FFFFH ;PREPARE TO SET ALL OF TT INACTIVE
1904 JMP X3 ;DO IT
1905 ;
1906 XLA_ERROR:
1907 XLA_EXIT: RET
1908 ;
1909 XLATST ENDP