1 ;-----------------------------------------------------------------------;
2 ; This section contains the prescence test and diagnostic ;
3 ; routines for the XMA 1 card. ;
5 ;-----------------------------------------------------------------------;
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 ;-----------------------------------------------------------------------;
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
19 ACTIVE_PAGE DB ? ;ACTIVE DISPLAY PAGE
20 TESTABLE_SEGMENTS DW ?
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
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
66 ;-------------------------------------------------------------------------
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).
74 ; FUNCTION/ : See description
77 ; ENTRY POINT : PRESTST
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.
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.
91 ; AX,BX,CX,DX ARE DESTROYED
92 ;-------------------------------------------------------------------------
99 ;SAVE CONTENTS OF MODE REG
104 ; TRANSLATE TABLE ADDRESS AND DATA REGISTERS
106 MOV AX,0AA55H ;DATA PATTERN (IN REAL MODE)
107 ;BE CERTAIN MODE REG GETS
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
115 IN AL,DX ;READ BACK MODE REG
117 AND AL,0FH ;MASK OFF UNUSED BITS
118 ;ZERO FLAG = 0 IF ERROR
123 OUT DX,AL ;RESTORE MODE REG TO INITIAL STATE
131 ;------------------------------------------------------------------------;
132 ; Diagnostics...on exit if ZF=0 then error ;
133 ;------------------------------------------------------------------------;
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
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
151 CALL CAPTST ;TEST DMA CAPTURE
152 JNE FOUND_ERROR ;JUMP IF ERROR
160 ;-------------------------------------------------------------------------
161 ;-------------------------------------------------------------------------
163 ; SAVES CURSOR POSITION
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.
170 ; FUNCTION/ : See description
174 ; ENTRY POINT : CUR_POS
180 ; EXIT : new cursor position is saved in CS:CUR_SAVE
182 ; All registers are preserved
184 ;-------------------------------------------------------------------------
194 PUSH DS ;SAVE REGISTERS
197 POP DS ;GET DS TO THIS CODE SEGMENT
198 ;MOVE CURSOR TO NEXT AVAILABLE LINE
200 ; MOV AH,9 ;DOS PRINT STRING
201 ; MOV DX,OFFSET NEXT_LINE + 1 ;OFFSET OF NEXT LINE MSG
202 ; INT 21H ;DISPLAY MESSAGE
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
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
213 MOV ACTIVE_PAGE,BH ;SAVE ACTIVE PAGE
215 ;READ CURRENT CURSOR POSITION
216 MOV AH,3 ;READ CURRENT CURSOR POS
218 MOV CUR_SAVE,DX ;SAVE CURSOR POSITION
220 ;RESTORE ALL REGISTERS
227 POP AX ;RESTORE ALL REGISTERS
229 RET ;RETURN TO CALLER
238 ;-------------------------------------------------------------------------
239 ;-------------------------------------------------------------------------
241 ; TEST FOR PRESENCE OF MORE THAN 1 MEGABYTE OF MEMORY
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
252 ; FUNCTION/ : See description
255 ; ENTRY POINT : TRY4MEG
262 ; AX,BX,CX,DX ARE DESTROYED
263 ;-------------------------------------------------------------------------
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)
273 MOV DX,IDREG ;I/O TO ID REGISTER
275 OUT DX,AL ;SWITCH TO ID = 0
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
289 MOV DX,AT_CHCHK_EN_REG ;AT's I/O CH CHK REG
291 OR AL,AT_CHCHK_DIS ;MASK OFF I/O CH CHK ENABLE
293 AND AL,AT_CHCHK_EN ;MASK ON I/O CH CHK ENABLE
294 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
296 ;USE PC1, XT, AQUARIUS REGISTERS
298 MOV DX,XT_NMI_REG ;XT's NMI REGISTER
299 MOV AL,XT_NMI_OFF ;MASK OFF NMI
301 MOV DX,XT_CHCHK_EN_REG ;XT's I/O CH CHK REG
303 OR AL,XT_CHCHK_DIS ;MASK OFF I/O CH CHK ENABLE
305 AND AL,XT_CHCHK_EN ;MASK ON I/O CH CHK ENABLE
306 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
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
322 ;***jnw MOV CX,16 ;16 * 4K = 64K BLOCK
323 MOV CX,1 ;***jnw ;1 * 4K = 4K BLOCK
324 CALL SETXLAT ;SET TRANSLATE TABLE
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
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
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
352 ;AT THIS POINT THERE ARE NO GOOD BITS SO END SEARCH FOR NEXT MB
353 POP DX ;RECOVER THESES REGISTERS
358 ;AT THIS POINT WE KNOW THERE IS MEMORY IN THIS MEG THAT WAS JUST TESTED
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
371 ;***jnw ADD DX,256 ;TRY NEXT MB
372 ADD DX,4 ;TRY NEXT 16k ***jnw
373 LOOP TR2M1A ;REPEAT LOOP
375 ;BEFORE NMI IS ENABLED, CLEAR PARITY CHECK LATCH ON XMA
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
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...
395 MOV DX,AT_CHCHK_EN_REG ;AT's I/O CH CHK REG
397 OR AL,AT_CHCHK_DIS ;MASK OFF I/O CH CHK ENABLE
399 AND AL,AT_CHCHK_EN ;MASK ON I/O CH CHK ENABLE
400 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
402 MOV DX,AT_NMI_REG ;AT's NMI REGISTER
403 MOV AL,AT_NMI_ON ;MASK ON NMI
405 ;USE XT/AQUARIUS NMI REGISTER
407 MOV DX,XT_CHCHK_EN_REG ;XT's I/O CH CHK REG
409 OR AL,XT_CHCHK_DIS ;MASK OFF I/O CH CHK ENABLE
411 AND AL,XT_CHCHK_EN ;MASK ON I/O CH CHK ENABLE
412 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
414 MOV DX,XT_NMI_REG ;XT's NMI REGISTER
415 MOV AL,XT_NMI_ON ;MASK ON NMI
418 RET ;RETURN TO CALLER
424 ;-------------------------------------------------------------------------
425 ;-------------------------------------------------------------------------
429 ; DESCRIPTION : This routine will test the following subset
434 ; 31A7...4 bits (BIT 1 IS HELD LOW TO DISABLE
437 ; The test is performed by writing and reading
438 ; AA, 55, FF, 00 from each of the above locations.
440 ; NOTE: Regs 31A6 and 31A7 should always return 0 in
443 ; The remainding registers will be tested in
444 ; subsequent routines.
447 ; FUNCTION/ : To ensure integrity of XMA registers that will be used
448 ; PURPOSE in subsequent routines.
450 ; ENTRY POINT : REGTST
455 ; EXIT : XMA registers are set to zero
457 ; (zero flag) = 0 indicates an error
458 ; (DX) failing register
459 ; (AL) expected data XOR'ed with actual data
461 ;-------------------------------------------------------------------------
468 ;SAVE CONTENTS OF MODE REG
473 ; TRANSLATE TABLE ADDRESS AND DATA REGISTERS
475 MOV BX,0AA55H ;SET UP INITIAL DATA PATTERN
480 MOV DX,TTPOINTER ;FIRST REGISTER PAIR TO WRITE
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
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
501 CMP CH,CL ;LAST PASS ?
502 JE R_EXIT ;YES - THEN EXIT REG TEST
504 CMP CX,055AAH ;END OF AA55,55AA PATTERNS?
506 MOV CX,000FFH ;SET UP NEXT VALUE TO WRITE
509 CMP CX,00FFH ;END OF FF00,00FF PATTERNS?
511 MOV CX,0 ;YES, THEN SET UP FOR LAST PASS
513 XCHG CL,CH ;SET UP INVERSE PATTERN
517 JMP R1 ;CONTINUE TILL ZERO PATTERN
523 OUT DX,AL ;restore mode reg
532 ;-------------------------------------------------------------------------
533 ;-------------------------------------------------------------------------
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.
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
548 ; (iv) repeat 'till all XMA memory is tested
550 ; FUNCTION/ : See description
554 ; ENTRY POINT : MEMARRAY
559 ; EXIT : All SMAS memory is set to zero.
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
567 ; AX,BX,CX,DX,DS,ES,SI,DI ARE DESTROYED
569 ;-------------------------------------------------------------------------
576 ;MEMORY TEST MUST RUN IN PAGE MODE
581 MOV DX,(640-16)/4 ;CODE FOR 640 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
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;
595 MOV CS:PAGE_UNDER_TEST,DX ;INDICATE WHICH 64K BLOCK
596 PUSH AX ;IS UNDER TEST
599 PUSH DX ;SAVE ALL REGISTERS
601 MOV CX,4 ;test 16k at one time ;an000; dms;
603 CALL SETXLAT ;SET UP XLAT TABLE
604 CALL STGTST ;TEST 64K OF STORAGE
605 JNZ MA2 ;WAS THERE AN ERROR
609 POP AX ;RESTORE REGISTERS
611 PUSHF ;SAVE FLAGS FOR ADDITION
613 CALL KB_OK ;INDICATE HOW MUCH
614 ;MEMORY HAS BEEN TESTED
617 ADD DX,4 ;POINT TO NEXT 64K BLOCK
619 LOOP MA1 ;LOOP FOR NEXT 64K
620 JMP MA3 ;EXIT WHEN COMPLETE
624 POP BX ;BX IS POPPED TWICE
625 POP BX ;TO RESTORE STACK WHILE
630 PUSHF ;SAVE THESE REGS...THEY CONTAIN
632 ;PUT THE SMAS CARD INTO REAL MODE
633 MOV DX,MODE_REG ;READY FOR I/O TO MODE REG
635 AND AL,REAL_MODE ;TURN OFF VIRTUAL BIT
636 OUT DX,AL ;WRITE IT TO MODE REG
639 POP AX ;RESTORE THESE REGS
648 ;---------------------------------------------------------------------
649 ;---------------------------------------------------------------------
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.
660 ; FUNCTION/ : See description
663 ; ENTRY POINT : LOMEMTST
668 ; EXIT : All tested memory is set to zero
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
676 ; AX,BX,CX,DX,DI,SI,ES,DS ARE DESTROYED
678 ;-----------------------------------------------------------------------
684 ;MEMORY TEST MUST RUN IN PAGE MODE
687 ;INDICATE 0 KB OK AT START OF TEST
688 MOV DX,03ffcH ;code for initial 0 kb ;an000; dms;
691 ;DETERMINE HOW MUCH MEMORY TO TEST
692 MOV AX,CS:START_BACMEM_SEG ;get starting fill segment
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
699 ;SET UP FOR TEST OF XMA MEMORY
700 MOV AX,CS:PAGE_FRAME_STA ;test through page frame
703 MOV BL,01H ;enable this block of memory
705 XOR DX,DX ;start at block 0 in xma
706 MOV CX,640/16 ;loop counter is # 16k blocks in
709 MOV CS:PAGE_UNDER_TEST,DX ;save page under test
713 PUSH DX ;save these registers
715 MOV CX,4 ;test 16k at one time ;an000; dms;
717 CALL SETXLAT ;set translate table
718 CMP CS:TESTABLE_SEGMENTS,0 ;if this segment under test is used for
720 JG LM2 ;else do storage test
726 JNZ LM4 ;jump if there was an error
730 POP AX ;recover registers
732 PUSHF ;save flags for addition
735 ADD DX,4 ;next 16k block ;an000; dms;
736 DEC CS:TESTABLE_SEGMENTS ;dec testable pages
738 LOOP LM1 ;repeat for next 64k block
739 JMP LM5 ;exit when complete
741 POP DX ;recover these registers
743 POP BX ;bx is popped twice to restore
744 POP BX ;satck while maintaining ax
746 PUSH AX ;save these ... they contain
747 PUSH DX ;useful error information
749 ;PUT CARD BACK TO REAL MODE
750 MOV DX,MODE_REG ;read mode reg
752 AND AL,REAL_MODE ;turn off virtual bit
753 OUT DX,AL ;write it to mode reg
756 POP AX ;restore these registers
760 READ_ONLY PROC ;INTERNAL PROC TO READ MEMORY WITHOUT DESTROYING CONTENTS
761 XOR SI,SI ;start of segment
764 LODSW ;just read each byte
765 XOR AX,AX ;and set zf=1 for return
774 ;-------------------------------------------------------------------------
775 ;-------------------------------------------------------------------------
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
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.
798 ; ENTRY POINT : PAGETST
803 ; EXIT : (zero flag) = 0 indicates an error
804 ; (AL) expected data XOR'ed with actual data
806 ; AX,BX,CX,DX,ES,DS,SI,DI ARE DESTROYED
807 ;-------------------------------------------------------------------------
813 ;MEMORY TEST MUST RUN IN PAGE MODE
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
827 PUSH DX ;SAVE ALL REGISTERS
829 MOV CX,4 ;4 -4K BLOCKS IN 16K ;an000; dms;
830 CALL SETXLAT ;SET TRANSLATE TABLE
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
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;
853 POP CX ;RECOVER ID COUNT
854 POP AX ;RECOVER CURRENT ID
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
861 MOV AL,AH ;GET TASK ID IN AL
863 PUSH CX ;SAVE ID COUNT
864 OUT DX,AL ;SWITCH TASK ID
865 MOV BX,CS:PAGE_FRAME_STA
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
873 XOR AL,AH ;DATA AS EXPECTED ?
874 JNE PT4X ;NO - THEN EXIT
875 STOSB ;AL SHOULD CONTAIN 0...WRITE IT
878 POP CX ;RECOVER ID COUNT
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
888 PUSHF ;SAVE THESE REGS...THEY CONTAIN
890 ;PUT THE SMAS CARD INTO REAL MODE
891 MOV DX,MODE_REG ;READY FOR I/O TO MODE REG
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
902 POP AX ;RESTORE THESE REGS
903 RET ;RETURN TO CALLER
905 POP CX ;ALTERNATE RETURN PATH
907 JMP PT4 ;TO ADJUST STACK
913 ;-------------------------------------------------------------------------
914 ;-------------------------------------------------------------------------
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
930 ; FUNCTION/ : To verify the functionality of the DMA capture logic.
933 ; ENTRY POINT : CAPTST
938 ; EXIT : Each entry in the DMA capture register file is set to 0.
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
944 ; AX,BX,CX,DX,SI,DI ARE DESTROYED
945 ;-------------------------------------------------------------------------
953 ;ROLL A BIT THROUGH THE SECOND ENTRY IN THE DMA CAPTURE REGISTER FILE
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
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
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
970 XOR AL,BL ;DATA READ AS EXPECTED ?
971 JNE CAPT_ERROR ;NO - THEN ERROR
972 SHL BL,1 ;SHIFT BIT TO NEXT POSITION
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
979 MOV AH,05H ;SETUP INITIAL PATTERN
980 MOV BX,0F0AH ;OTHER PATTERNS TO USE
983 JNZ CAPT_ERROR ;ERROR - THEN EXIT
984 CMP AH,BL ;ZERO PATTERN ?
985 JE CAPT_EXIT ;EXIT IF YES
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
997 MOV AH,05H ;SETUP INITIAL PATTERN
998 MOV BX,0F0AH ;OTHER PATTERNS TO USE
1001 JNZ CAPT_ERROR ;ERROR - THEN EXIT
1002 CMP AH,BL ;ZERO PATTERN ?
1003 JE CAPT_EXIT ;EXIT IF YES
1018 ;-------------------------------------------------------------------------
1019 ;-------------------------------------------------------------------------
1021 ; FILL DMA CAPTURE REG
1023 ; DESCRIPTION : This routine will fill the entire DMA capture register
1024 ; file with the pattern that is passed in AL
1026 ; FUNCTION/ : See Description.
1029 ; ENTRY POINT : CAPT_FILL
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
1036 ; EXIT : Each entry in the DMA capture register file is set to
1037 ; the value specified in AL.
1038 ;-------------------------------------------------------------------------
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
1047 MOV AL,CL ;CL CONTAINS WHICH DMA CHANNEL
1048 OUT DX,AL ;SETUP & CAPTURE DMA CHANNEL
1051 MOV DX,SI ;GET ADDRESS OF CTRL 1
1052 MOV CX,3 ;REP FOR CHANNELS 3,2,1
1054 MOV AL,CL ;CL CONTAINS WHICH DMA CHANNEL
1055 OUT DX,AL ;SETUP & CAPTURE DMA CHANNEL
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
1067 RET ;RETURN TO CALLER
1075 ;-------------------------------------------------------------------------
1076 ;-------------------------------------------------------------------------
1078 ; READ-MODIFY-WRITE DMA CAPTURE REG
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.
1085 ; FUNCTION/ : See Description.
1088 ; ENTRY POINT : CAPT_RMW
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
1095 ; EXIT : Each entry in the DMA capture register file is set to
1096 ; the value specified in BL.
1098 ; AL,CX,DX,ARE DESTROYED
1099 ;-------------------------------------------------------------------------
1103 MOV CX,3 ;REP FOR CHANNELS 7,6,5
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
1109 JNZ RMW4 ;EXIT IF ERROR
1110 LOOP RMW1 ;REPEAT FOR CHANNEL 6,5
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
1116 MOV DX,DMACAPT ;I/O ADDRESS OF DMA CAPTURE REG
1117 MOV AL,CL ;GET LOW BYTE OF COUNT
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
1133 POP DI ;RESTORE DI (ADDR OF DMA CTRL 2)
1135 RET ;RETURN TO CALLER
1141 OUT DX,AL ;SETUP TO READ FROM DMA CAPTURE REG
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
1153 RET ;RETURN TO CALLER
1161 ;-------------------------------------------------------------------------
1162 ;-------------------------------------------------------------------------
1164 ; INHIBIT A BLOCK OF MEMORY
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.
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...)
1179 ; ENTRY POINT : INHIBLK
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.
1185 ; (CX) number of 4K blocks to be protected
1190 ; EXIT : specified entries in Translate Table are enabled or
1191 ; inhibited for all posible task ID's.
1193 ; AX,BH,CX,DX ARE DESTROYED
1194 ;-------------------------------------------------------------------------
1198 ;ADJUST SI FOR TRANSLATE TABLE ENTRY
1199 XCHG AL,AH ;ROTATE RIGHT BY 8
1201 ;AX IS NOW ADJUSTED FOR ENTRY INTO
1202 ;XLAT TABLE FOR TASK ID=0
1204 PUSH CX ;SAVE COUNT OF 4K BLOCKS
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
1210 MOV DX,TTPOINTER ;ADDRESS OF TT POINTER
1211 POP CX ;RESTORE COUNT
1212 POP AX ;RESTORE TT ENTRY
1215 MOV AH,BH ;APPEND TASK ID TO TT POINTER
1216 OUT DX,AX ;SET TT POINTER TO STARTING ENTRY
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
1227 OR AH,BLK_OFF ;MASK ON INHIBIT BIT
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
1245 ;-------------------------------------------------------------------------
1246 ;-------------------------------------------------------------------------
1250 ; DESCRIPTION : This routine performs a bit and address test on a
1251 ; 64K block of storage.
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
1261 ; FUNCTION/ : See description
1264 ; ENTRY POINT : STGTST
1266 ; ENTRY : (ES) storage segment to be tested
1267 ; CONDITIONS (DS) storage segment to be tested
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
1274 ; AX,BX,CX,DX,DI,SI ARE DESTROYED
1276 ;-------------------------------------------------------------------------
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
1287 ;DISABLE NMI AND ENABLE I/O CHANNEL CHECK
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
1302 OR AL,AT_CHCHK_DIS ;MASK OFF I/O CH CHK ENABLE
1304 AND AL,AT_CHCHK_EN ;MASK ON I/O CH CHK ENABLE
1305 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
1307 ;USE PC1, XT, AQUARIUS REGISTERS
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
1314 OR AL,XT_CHCHK_DIS ;MASK OFF I/O CH CHK ENABLE
1316 AND AL,XT_CHCHK_EN ;MASK ON I/O CH CHK ENABLE
1317 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
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
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
1334 MOV AX,BX ;GET IT INTO AX
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
1343 MOV BX,55AAH ;PATTERN TO LOOK FOR
1344 MOV DX,0AA55H ;NEXT PATTERN TO WRITE
1346 JNZ STG_EXIT ;EXIT IF ERROR
1348 MOV BX,0AA55H ;PATTERN TO LOOK FOR
1349 MOV DX,0101H ;NEXT PATTERN TO WRITE
1351 JNZ STG_EXIT ;EXIT IF ERROR
1353 MOV BX,0101H ;PATTERN TO LOOK FOR
1354 MOV DX,0000H ;NEXT PATTERN TO WRITE
1356 JNZ STG_EXIT ;EXIT IF ERROR
1358 ; MOV BX,0000H ;PATTERN TO LOOK FOR
1359 ; MOV DX,0000H ;NEXT PATTERN TO WRITE
1361 ; JNZ STG_EXIT ;EXIT IF ERROR
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
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
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
1383 ;USE XT/AQUARIUS NMI REGISTER
1385 MOV DX,XT_CHCHK_REG ;XT's I/O CH CHK REG
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
1393 PUSH AX ;SAVE THESE REGS
1394 PUSH DX ;THEY CONTAIN
1396 PUSHF ;USEFUL ERROR INFORMATION
1397 ;BEFORE NMI IS ENABLED, CLEAR PARITY CHECK LATCH ON XMA
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
1414 OR AL,AT_CHCHK_DIS ;MASK OFF I/O CH CHK ENABLE
1416 AND AL,AT_CHCHK_EN ;MASK ON I/O CH CHK ENABLE
1417 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
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
1424 MOV DX,XT_CHCHK_EN_REG ;XT's I/O CH CHK REG
1426 OR AL,XT_CHCHK_DIS ;MASK OFF I/O CH CHK ENABLE
1428 AND AL,XT_CHCHK_EN ;MASK ON I/O CH CHK ENABLE
1429 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
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
1438 POP AX ;RESTORE REGS
1440 RET ;RETURN TO CALLER
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
1458 ;-------------------------------------------------------------------------
1459 ;-------------------------------------------------------------------------
1461 ; STORAGE TEST SUBROUTINE
1463 ; DESCRIPTION : This routine performs a bit and address test on a
1464 ; 64K block of storage.
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)
1471 ; FUNCTION/ : See description
1474 ; ENTRY POINT : STG_CNT
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
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 ;-------------------------------------------------------------------------
1489 MOV CX,2000H ;8K WORDS ;an000; dms;
1490 SUB DI,DI ;FIRST LOCATION
1491 MOV SI,DI ;FIRST LOCATION
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
1508 ;-------------------------------------------------------------------------
1509 ;-------------------------------------------------------------------------
1513 ; DESCRIPTION : This routine will print to the screen how much memory
1516 ; The format will be: xxxx KB TESTED
1518 ; FUNCTION/ : See description
1522 ; ENTRY POINT : KB_OK
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
1528 ; NOTE: if (DX) = FFF0 then 0 KB is OK
1531 ; EXIT : Message is displayed
1533 ; All registers are preserved
1535 ;-------------------------------------------------------------------------
1545 PUSH DS ;SAVE REGISTERS
1548 POP DS ;GET DS TO THIS CODE SEGMENT
1549 ;CONVERT DX TO KILO BYTES
1551 SHL DX,1 ;MULTIPLY BY 4
1552 ADD DX,16 ;ADJUST BY 16 ;an000; dms;
1554 MOV AX,DX ;GET NUMBER INTO AX
1555 MOV BX,10 ;READY FOR DECIMAL CONVERT
1556 MOV CX,4 ;OF 4 DIGITS
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
1563 LOOP K1 ;REPEAT FOR ALL DIGITS
1568 POP AX ;ASCII DIGIT GOES INTO AL
1569 MOV BX,OFFSET MEM_OK
1570 MOV CS:[BX+SI],AL ;BUILD ASCII MESSAGE
1573 ;MOVE THE CURSOR AND PRINT MESSAGE
1576 MOV AH,2 ;SET CURSOR
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
1589 POP AX ;RESTORE ALL REGISTERS
1591 RET ;RETURN TO CALLER
1597 ;-------------------------------------------------------------------------
1598 ;-------------------------------------------------------------------------
1600 ; SET TRANSLATE TABLE
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).
1610 ; EXAMPLE: segment 4000 can be mapped to block 5
1611 ; segment 4100 can be mapped to block 6
1613 ; FUNCTION/ : To map PC 'real' addresses into SMAS physical memory.
1617 ; ENTRY POINT : SETXLAT
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.
1623 ; (CX) number of 4K blocks translated.
1625 ; (BH) task ID for this memory allocation
1630 ; (DX) starting block number in SMAS memory
1633 ; EXIT : specified entries in Translate Table are enabled or
1634 ; inhibited for all posible task ID's.
1637 ; AX,CX,DX ARE DESTROYED
1639 ;-------------------------------------------------------------------------
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
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
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
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
1669 ;-------------------------------------------------------------------------
1670 ;-------------------------------------------------------------------------
1672 ; AUTO-INCREMENT TEST
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
1684 ; FUNCTION/ : To ensure that the Translate Table pointer can auto
1685 ; PURPOSE increment when 31A5 is written or read.
1687 ; ENTRY POINT : INCTST
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 ;-------------------------------------------------------------------------
1704 ;PERFORM SIMPLE TEST OF TTPOINTER REG
1706 MOV BX,0AA55H ;SET UP PATTERN TO WRITE
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
1720 ;CONTINUE WITH AUTO-INC TEST
1722 MOV DI,2 ;2 PASSES...1 WRITE , 1 READ
1724 MOV SI,AIDATA ;SAVE FOR I/O TO TTDATA WITH AUTO-INC
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
1731 XCHG DX,SI ;I/O TO TTDATA WITH AUTO-INC
1733 ;DETERMINE IF WRITE OR READ TEST
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
1740 IN AX,DX ;READ FROM AUTO-INC DATA REG
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
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
1761 ;-------------------------------------------------------------------------
1762 ;-------------------------------------------------------------------------
1764 ; TRANSLATE TABLE TEST
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.
1772 ; FUNCTION/ : To verify the integrity of the Translate Table.
1775 ; ENTRY POINT : XLATST
1780 ; EXIT : Entire Translate Table is left with FFF (passover code)
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 ;-------------------------------------------------------------------------
1790 MOV AL,XLAT_TABLE_TEST
1793 ;ROLL A BIT THROUGH THE FIRST BYTE
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
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
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
1816 ;CONTINUE REMAINDER OF TRANSLATE TABLE
1820 XCHG DX,SI ;READY FOR I/O TO TTPOINTER
1822 OUT DX,AX ;TTPOINTER AT 1st LOCATION
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
1828 OUT DX,AX ;SETUP INVERSE PATTERN
1829 LOOP X2 ;FILL ENTIRE XLATE TABLE
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
1835 MOV CX,TABLEN ;NUMBER OF TT ENTRIES
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
1849 CMP DI,0FFFFH ;LAST PASS ?
1850 JE XLA_EXIT ;YES - THEN EXIT REG TEST
1852 XCHG BX,DI ;BX GETS NEXT PATTERN TO TEST
1854 CMP BX,055AAH ;LAST PASS FOR AA55,55AA PATTERN?
1856 MOV DI,0FF00H ;YES- PREPARE TO WRITE NEW PATTERN
1859 CMP BX,0FF00H ;READY TO READ 0FF00 PATTERN
1861 MOV DI,00FFH ;YES- PREPARE TO WRITE NEW PATTERN
1864 MOV DI,0FFFFH ;PREPARE TO SET ALL OF TT INACTIVE