]>
wirehaze git hosting - MS-DOS.git/blob - 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 ;-----------------------------------------------------------------------;
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
16 ACTIVE_PAGE
DB ?
;ACTIVE DISPLAY PAGE
17 TESTABLE_SEGMENTS
DW ?
21 ;-----------------------------------------------------------------------;
22 ; EQUATES THAT ARE UNIQUE TO THE DIAGNOSTICS PORTION OF ;
23 ; THE DEVICE DRIVER. ;
24 ;-----------------------------------------------------------------------;
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
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
71 ;------------------------------------------------------------------------;
72 ; Diagnostics...on exit if ZF=0 then error ;
73 ;------------------------------------------------------------------------;
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
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
92 CALL CAPTST
;TEST DMA CAPTURE
93 JNE FOUND_ERROR
;JUMP IF ERROR
102 ;-------------------------------------------------------------------------
103 ;-------------------------------------------------------------------------
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).
111 ; FUNCTION/ : See description
114 ; ENTRY POINT : PRESTST
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.
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.
128 ; AX,BX,CX,DX ARE DESTROYED
129 ;-------------------------------------------------------------------------
136 ;SAVE CONTENTS OF MODE REG
141 ; TRANSLATE TABLE ADDRESS AND DATA REGISTERS
143 MOV AX,0AA55H ;DATA PATTERN (IN REAL MODE)
144 ;BE CERTAIN MODE REG GETS
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
152 IN AL,DX ;READ BACK MODE REG
154 AND AL,0FH ;MASK OFF UNUSED BITS
155 ;ZERO FLAG = 0 IF ERROR
160 OUT DX,AL ;RESTORE MODE REG TO INITIAL STATE
170 ;-------------------------------------------------------------------------
171 ;-------------------------------------------------------------------------
173 ; SAVES CURSOR POSITION
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.
180 ; FUNCTION/ : See description
184 ; ENTRY POINT : CUR_POS
190 ; EXIT : new cursor position is saved in CS:CUR_SAVE
192 ; All registers are preserved
194 ;-------------------------------------------------------------------------
204 PUSH DS ;SAVE REGISTERS
207 POP DS ;GET DS TO THIS CODE SEGMENT
208 ;MOVE CURSOR TO NEXT AVAILABLE LINE
210 ; MOV AH,9 ;DOS PRINT STRING
211 ; MOV DX,OFFSET NEXT_LINE + 1 ;OFFSET OF NEXT LINE MSG
212 ; INT 21H ;DISPLAY MESSAGE
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
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
223 MOV ACTIVE_PAGE
,BH ;SAVE ACTIVE PAGE
225 ;READ CURRENT CURSOR POSITION
226 MOV AH,3 ;READ CURRENT CURSOR POS
228 MOV CUR_SAVE
,DX ;SAVE CURSOR POSITION
230 ;RESTORE ALL REGISTERS
237 POP AX ;RESTORE ALL REGISTERS
239 RET ;RETURN TO CALLER
248 ;-------------------------------------------------------------------------
249 ;-------------------------------------------------------------------------
251 ; TEST FOR PRESENCE OF MORE THAN 1 MEGABYTE OF MEMORY
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
262 ; FUNCTION/ : See description
265 ; ENTRY POINT : TRY4MEG
272 ; AX,BX,CX,DX ARE DESTROYED
273 ;-------------------------------------------------------------------------
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)
283 MOV DX,IDREG
;I/O TO ID REGISTER
285 OUT DX,AL ;SWITCH TO ID = 0
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
299 MOV DX,AT_CHCHK_EN_REG
;AT's I/O CH CHK REG
301 OR AL,AT_CHCHK_DIS
;MASK OFF I/O CH CHK ENABLE
303 AND AL,AT_CHCHK_EN
;MASK ON I/O CH CHK ENABLE
304 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
306 ;USE PC1, XT, AQUARIUS REGISTERS
308 MOV DX,XT_NMI_REG
;XT's NMI REGISTER
309 MOV AL,XT_NMI_OFF
;MASK OFF NMI
311 MOV DX,XT_CHCHK_EN_REG
;XT's I/O CH CHK REG
313 OR AL,XT_CHCHK_DIS
;MASK OFF I/O CH CHK ENABLE
315 AND AL,XT_CHCHK_EN
;MASK ON I/O CH CHK ENABLE
316 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
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
332 ;***jnw MOV CX,16 ;16 * 4K = 64K BLOCK
333 MOV CX,1 ;***jnw ;1 * 4K = 4K BLOCK
334 CALL SETXLAT
;SET TRANSLATE TABLE
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
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
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
362 ;AT THIS POINT THERE ARE NO GOOD BITS SO END SEARCH FOR NEXT MB
363 POP DX ;RECOVER THESES REGISTERS
368 ;AT THIS POINT WE KNOW THERE IS MEMORY IN THIS MEG THAT WAS JUST TESTED
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
381 ;***jnw ADD DX,256 ;TRY NEXT MB
382 ADD DX,4 ;TRY NEXT 16k ***jnw
383 LOOP TR2M1A
;REPEAT LOOP
385 ;BEFORE NMI IS ENABLED, CLEAR PARITY CHECK LATCH ON XMA
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
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...
405 MOV DX,AT_CHCHK_EN_REG
;AT's I/O CH CHK REG
407 OR AL,AT_CHCHK_DIS
;MASK OFF I/O CH CHK ENABLE
409 AND AL,AT_CHCHK_EN
;MASK ON I/O CH CHK ENABLE
410 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
412 MOV DX,AT_NMI_REG
;AT's NMI REGISTER
413 MOV AL,AT_NMI_ON
;MASK ON NMI
415 ;USE XT/AQUARIUS NMI REGISTER
417 MOV DX,XT_CHCHK_EN_REG
;XT's I/O CH CHK REG
419 OR AL,XT_CHCHK_DIS
;MASK OFF I/O CH CHK ENABLE
421 AND AL,XT_CHCHK_EN
;MASK ON I/O CH CHK ENABLE
422 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
424 MOV DX,XT_NMI_REG
;XT's NMI REGISTER
425 MOV AL,XT_NMI_ON
;MASK ON NMI
428 RET ;RETURN TO CALLER
434 ;-------------------------------------------------------------------------
435 ;-------------------------------------------------------------------------
439 ; DESCRIPTION : This routine will test the following subset
444 ; 31A7...4 bits (BIT 1 IS HELD LOW TO DISABLE
447 ; The test is performed by writing and reading
448 ; AA, 55, FF, 00 from each of the above locations.
450 ; NOTE: Regs 31A6 and 31A7 should always return 0 in
453 ; The remainding registers will be tested in
454 ; subsequent routines.
457 ; FUNCTION/ : To ensure integrity of XMA registers that will be used
458 ; PURPOSE in subsequent routines.
460 ; ENTRY POINT : REGTST
465 ; EXIT : XMA registers are set to zero
467 ; (zero flag) = 0 indicates an error
468 ; (DX) failing register
469 ; (AL) expected data XOR'ed with actual data
471 ;-------------------------------------------------------------------------
478 ;SAVE CONTENTS OF MODE REG
483 ; TRANSLATE TABLE ADDRESS AND DATA REGISTERS
485 MOV BX,0AA55H ;SET UP INITIAL DATA PATTERN
490 MOV DX,BASE_REG
;FIRST REGISTER PAIR TO WRITE
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
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
511 CMP CH,CL ;LAST PASS ?
512 JE R_EXIT
;YES - THEN EXIT REG TEST
514 CMP CX,055AAH ;END OF AA55,55AA PATTERNS?
516 MOV CX,000FFH ;SET UP NEXT VALUE TO WRITE
519 CMP CX,00FFH ;END OF FF00,00FF PATTERNS?
521 MOV CX,0 ;YES, THEN SET UP FOR LAST PASS
523 XCHG CL,CH ;SET UP INVERSE PATTERN
527 JMP R1
;CONTINUE TILL ZERO PATTERN
533 OUT DX,AL ;restore mode reg
542 ;-------------------------------------------------------------------------
543 ;-------------------------------------------------------------------------
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.
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
558 ; (iv) repeat 'till all XMA memory is tested
560 ; FUNCTION/ : See description
564 ; ENTRY POINT : MEMARRAY
569 ; EXIT : All SMAS memory is set to zero.
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
577 ; AX,BX,CX,DX,DS,ES,SI,DI ARE DESTROYED
579 ;-------------------------------------------------------------------------
586 ;MEMORY TEST MUST RUN IN PAGE MODE
591 MOV DX,(640-64)/4 ;CODE FOR 640 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
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
607 MOV CS:PAGE_UNDER_TEST
,DX ;INDICATE WHICH 64K BLOCK
608 PUSH AX ;IS UNDER TEST
611 PUSH DX ;SAVE ALL REGISTERS
613 MOV CX,16 ;TEST 64K AT ONE TIME
615 CALL SETXLAT
;SET UP XLAT TABLE
616 CALL STGTST
;TEST 64K OF STORAGE
617 JNZ MA2
;WAS THERE AN ERROR
621 POP AX ;RESTORE REGISTERS
623 PUSHF ;SAVE FLAGS FOR ADDITION
625 CALL KB_OK
;INDICATE HOW MUCH
626 ;MEMORY HAS BEEN TESTED
629 ADD DX,16 ;POINT TO NEXT 64K BLOCK
631 LOOP MA1
;LOOP FOR NEXT 64K
632 JMP MA3
;EXIT WHEN COMPLETE
636 POP BX ;BX IS POPPED TWICE
637 POP BX ;TO RESTORE STACK WHILE
642 PUSHF ;SAVE THESE REGS...THEY CONTAIN
644 ;PUT THE SMAS CARD INTO REAL MODE
645 MOV DX,MODE_REG
;READY FOR I/O TO MODE REG
647 AND AL,REAL_MODE
;TURN OFF VIRTUAL BIT
648 OUT DX,AL ;WRITE IT TO MODE REG
651 POP AX ;RESTORE THESE REGS
660 ;---------------------------------------------------------------------
661 ;---------------------------------------------------------------------
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.
672 ; FUNCTION/ : See description
675 ; ENTRY POINT : LOMEMTST
680 ; EXIT : All tested memory is set to zero
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
688 ; AX,BX,CX,DX,DI,SI,ES,DS ARE DESTROYED
690 ;-----------------------------------------------------------------------
696 ;MEMORY TEST MUST RUN IN PAGE MODE
699 ;INDICATE 0 KB OK AT START OF TEST
700 MOV DX,0FFF0H ;code for initial 0 kb
703 ;DETERMINE HOW MUCH MEMORY TO TEST
704 MOV AX,CS:START_FILL
;get starting fill segment
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
711 ;SET UP FOR TEST OF XMA MEMORY
712 MOV AX,CS:PAGE_FRAME_STA
;test through page frame
715 MOV BL,01H ;enable this block of memory
717 XOR DX,DX ;start at block 0 in xma
718 MOV CX,640/64 ;loop counter is # 64k blocks in
721 MOV CS:PAGE_UNDER_TEST
,DX ;save page under test
725 PUSH DX ;save these registers
727 MOV CX,16 ;test 64k at one time
729 CALL SETXLAT
;set translate table
730 CMP CS:TESTABLE_SEGMENTS
,0 ;if this segment under test is used for
732 JG LM2
;else do storage test
738 JNZ LM4
;jump if there was an error
742 POP AX ;recover registers
744 PUSHF ;save flags for addition
747 ADD DX,16 ;next 64k block
748 DEC CS:TESTABLE_SEGMENTS
;dec testable pages
750 LOOP LM1
;repeat for next 64k block
751 JMP LM5
;exit when complete
753 POP DX ;recover these registers
755 POP BX ;bx is popped twice to restore
756 POP BX ;satck while maintaining ax
758 PUSH AX ;save these ... they contain
759 PUSH DX ;useful error information
761 ;PUT CARD BACK TO REAL MODE
762 MOV DX,MODE_REG
;read mode reg
764 AND AL,REAL_MODE
;turn off virtual bit
765 OUT DX,AL ;write it to mode reg
768 POP AX ;restore these registers
772 READ_ONLY PROC
;INTERNAL PROC TO READ MEMORY WITHOUT DESTROYING CONTENTS
773 XOR SI,SI ;start of segment
776 LODSW ;just read each byte
777 XOR AX,AX ;and set zf=1 for return
786 ;-------------------------------------------------------------------------
787 ;-------------------------------------------------------------------------
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
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.
810 ; ENTRY POINT : PAGETST
815 ; EXIT : (zero flag) = 0 indicates an error
816 ; (AL) expected data XOR'ed with actual data
818 ; AX,BX,CX,DX,ES,DS,SI,DI ARE DESTROYED
819 ;-------------------------------------------------------------------------
825 ;MEMORY TEST MUST RUN IN PAGE MODE
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
839 PUSH DX ;SAVE ALL REGISTERS
841 MOV CX,16 ;16-4K BLOCKS IN 64K
842 CALL SETXLAT
;SET TRANSLATE TABLE
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
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
865 POP CX ;RECOVER ID COUNT
866 POP AX ;RECOVER CURRENT ID
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
873 MOV AL,AH ;GET TASK ID IN AL
875 PUSH CX ;SAVE ID COUNT
876 OUT DX,AL ;SWITCH TASK ID
877 MOV BX,CS:PAGE_FRAME_STA
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
885 XOR AL,AH ;DATA AS EXPECTED ?
886 JNE PT4X
;NO - THEN EXIT
887 STOSB ;AL SHOULD CONTAIN 0...WRITE IT
890 POP CX ;RECOVER ID COUNT
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
900 PUSHF ;SAVE THESE REGS...THEY CONTAIN
902 ;PUT THE SMAS CARD INTO REAL MODE
903 MOV DX,MODE_REG
;READY FOR I/O TO MODE REG
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
914 POP AX ;RESTORE THESE REGS
915 RET ;RETURN TO CALLER
917 POP CX ;ALTERNATE RETURN PATH
919 JMP PT4
;TO ADJUST STACK
925 ;-------------------------------------------------------------------------
926 ;-------------------------------------------------------------------------
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
942 ; FUNCTION/ : To verify the functionality of the DMA capture logic.
945 ; ENTRY POINT : CAPTST
950 ; EXIT : Each entry in the DMA capture register file is set to 0.
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
956 ; AX,BX,CX,DX,SI,DI ARE DESTROYED
957 ;-------------------------------------------------------------------------
965 ;ROLL A BIT THROUGH THE SECOND ENTRY IN THE DMA CAPTURE REGISTER FILE
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
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
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
982 XOR AL,BL ;DATA READ AS EXPECTED ?
983 JNE CAPT_ERROR
;NO - THEN ERROR
984 SHL BL,1 ;SHIFT BIT TO NEXT POSITION
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
991 MOV AH,05H ;SETUP INITIAL PATTERN
992 MOV BX,0F0AH ;OTHER PATTERNS TO USE
995 JNZ CAPT_ERROR
;ERROR - THEN EXIT
996 CMP AH,BL ;ZERO PATTERN ?
997 JE CAPT_EXIT
;EXIT IF YES
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
1009 MOV AH,05H ;SETUP INITIAL PATTERN
1010 MOV BX,0F0AH ;OTHER PATTERNS TO USE
1013 JNZ CAPT_ERROR
;ERROR - THEN EXIT
1014 CMP AH,BL ;ZERO PATTERN ?
1015 JE CAPT_EXIT
;EXIT IF YES
1030 ;-------------------------------------------------------------------------
1031 ;-------------------------------------------------------------------------
1033 ; FILL DMA CAPTURE REG
1035 ; DESCRIPTION : This routine will fill the entire DMA capture register
1036 ; file with the pattern that is passed in AL
1038 ; FUNCTION/ : See Description.
1041 ; ENTRY POINT : CAPT_FILL
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
1048 ; EXIT : Each entry in the DMA capture register file is set to
1049 ; the value specified in AL.
1050 ;-------------------------------------------------------------------------
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
1059 MOV AL,CL ;CL CONTAINS WHICH DMA CHANNEL
1060 OUT DX,AL ;SETUP & CAPTURE DMA CHANNEL
1063 MOV DX,SI ;GET ADDRESS OF CTRL 1
1064 MOV CX,3 ;REP FOR CHANNELS 3,2,1
1066 MOV AL,CL ;CL CONTAINS WHICH DMA CHANNEL
1067 OUT DX,AL ;SETUP & CAPTURE DMA CHANNEL
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
1079 RET ;RETURN TO CALLER
1087 ;-------------------------------------------------------------------------
1088 ;-------------------------------------------------------------------------
1090 ; READ-MODIFY-WRITE DMA CAPTURE REG
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.
1097 ; FUNCTION/ : See Description.
1100 ; ENTRY POINT : CAPT_RMW
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
1107 ; EXIT : Each entry in the DMA capture register file is set to
1108 ; the value specified in BL.
1110 ; AL,CX,DX,ARE DESTROYED
1111 ;-------------------------------------------------------------------------
1115 MOV CX,3 ;REP FOR CHANNELS 7,6,5
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
1121 JNZ RMW4
;EXIT IF ERROR
1122 LOOP RMW1
;REPEAT FOR CHANNEL 6,5
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
1128 MOV DX,DMACAPT
;I/O ADDRESS OF DMA CAPTURE REG
1129 MOV AL,CL ;GET LOW BYTE OF COUNT
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
1145 POP DI ;RESTORE DI (ADDR OF DMA CTRL 2)
1147 RET ;RETURN TO CALLER
1153 OUT DX,AL ;SETUP TO READ FROM DMA CAPTURE REG
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
1165 RET ;RETURN TO CALLER
1173 ;-------------------------------------------------------------------------
1174 ;-------------------------------------------------------------------------
1176 ; INHIBIT A BLOCK OF MEMORY
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.
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...)
1191 ; ENTRY POINT : INHIBLK
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.
1197 ; (CX) number of 4K blocks to be protected
1202 ; EXIT : specified entries in Translate Table are enabled or
1203 ; inhibited for all posible task ID's.
1205 ; AX,BH,CX,DX ARE DESTROYED
1206 ;-------------------------------------------------------------------------
1210 ;ADJUST SI FOR TRANSLATE TABLE ENTRY
1211 XCHG AL,AH ;ROTATE RIGHT BY 8
1213 ;AX IS NOW ADJUSTED FOR ENTRY INTO
1214 ;XLAT TABLE FOR TASK ID=0
1216 PUSH CX ;SAVE COUNT OF 4K BLOCKS
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
1222 MOV DX,TTPOINTER
;ADDRESS OF TT POINTER
1223 POP CX ;RESTORE COUNT
1224 POP AX ;RESTORE TT ENTRY
1227 MOV AH,BH ;APPEND TASK ID TO TT POINTER
1228 OUT DX,AX ;SET TT POINTER TO STARTING ENTRY
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
1239 OR AH,BLK_OFF
;MASK ON INHIBIT BIT
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
1257 ;-------------------------------------------------------------------------
1258 ;-------------------------------------------------------------------------
1262 ; DESCRIPTION : This routine performs a bit and address test on a
1263 ; 64K block of storage.
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
1273 ; FUNCTION/ : See description
1276 ; ENTRY POINT : STGTST
1278 ; ENTRY : (ES) storage segment to be tested
1279 ; CONDITIONS (DS) storage segment to be tested
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
1286 ; AX,BX,CX,DX,DI,SI ARE DESTROYED
1288 ;-------------------------------------------------------------------------
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
1299 ;DISABLE NMI AND ENABLE I/O CHANNEL CHECK
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
1314 OR AL,AT_CHCHK_DIS
;MASK OFF I/O CH CHK ENABLE
1316 AND AL,AT_CHCHK_EN
;MASK ON I/O CH CHK ENABLE
1317 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
1319 ;USE PC1, XT, AQUARIUS REGISTERS
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
1326 OR AL,XT_CHCHK_DIS
;MASK OFF I/O CH CHK ENABLE
1328 AND AL,XT_CHCHK_EN
;MASK ON I/O CH CHK ENABLE
1329 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
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
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
1346 MOV AX,BX ;GET IT INTO AX
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
1355 MOV BX,55AAH
;PATTERN TO LOOK FOR
1356 MOV DX,0AA55H ;NEXT PATTERN TO WRITE
1358 JNZ STG_EXIT
;EXIT IF ERROR
1360 MOV BX,0AA55H ;PATTERN TO LOOK FOR
1361 MOV DX,0101H ;NEXT PATTERN TO WRITE
1363 JNZ STG_EXIT
;EXIT IF ERROR
1365 MOV BX,0101H ;PATTERN TO LOOK FOR
1366 MOV DX,0000H ;NEXT PATTERN TO WRITE
1368 JNZ STG_EXIT
;EXIT IF ERROR
1370 ; MOV BX,0000H ;PATTERN TO LOOK FOR
1371 ; MOV DX,0000H ;NEXT PATTERN TO WRITE
1373 ; JNZ STG_EXIT ;EXIT IF ERROR
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
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
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
1395 ;USE XT/AQUARIUS NMI REGISTER
1397 MOV DX,XT_CHCHK_REG
;XT's I/O CH CHK REG
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
1405 PUSH AX ;SAVE THESE REGS
1406 PUSH DX ;THEY CONTAIN
1408 PUSHF ;USEFUL ERROR INFORMATION
1409 ;BEFORE NMI IS ENABLED, CLEAR PARITY CHECK LATCH ON XMA
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
1426 OR AL,AT_CHCHK_DIS
;MASK OFF I/O CH CHK ENABLE
1428 AND AL,AT_CHCHK_EN
;MASK ON I/O CH CHK ENABLE
1429 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
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
1436 MOV DX,XT_CHCHK_EN_REG
;XT's I/O CH CHK REG
1438 OR AL,XT_CHCHK_DIS
;MASK OFF I/O CH CHK ENABLE
1440 AND AL,XT_CHCHK_EN
;MASK ON I/O CH CHK ENABLE
1441 OUT DX,AL ;TOGGLE CH CHK LTCH AND LEAVE
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
1450 POP AX ;RESTORE REGS
1452 RET ;RETURN TO CALLER
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
1470 ;-------------------------------------------------------------------------
1471 ;-------------------------------------------------------------------------
1473 ; STORAGE TEST SUBROUTINE
1475 ; DESCRIPTION : This routine performs a bit and address test on a
1476 ; 64K block of storage.
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)
1483 ; FUNCTION/ : See description
1486 ; ENTRY POINT : STG_CNT
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
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 ;-------------------------------------------------------------------------
1501 MOV CX,8000H
;32K WORDS
1502 SUB DI,DI ;FIRST LOCATION
1503 MOV SI,DI ;FIRST LOCATION
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
1520 ;-------------------------------------------------------------------------
1521 ;-------------------------------------------------------------------------
1525 ; DESCRIPTION : This routine will print to the screen how much memory
1528 ; The format will be: xxxx KB TESTED
1530 ; FUNCTION/ : See description
1534 ; ENTRY POINT : KB_OK
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
1540 ; NOTE: if (DX) = FFF0 then 0 KB is OK
1543 ; EXIT : Message is displayed
1545 ; All registers are preserved
1547 ;-------------------------------------------------------------------------
1557 PUSH DS ;SAVE REGISTERS
1560 POP DS ;GET DS TO THIS CODE SEGMENT
1561 ;CONVERT DX TO KILO BYTES
1563 SHL DX,1 ;MULTIPLY BY 4
1564 ADD DX,64 ;ADJUST BY 64
1566 MOV AX,DX ;GET NUMBER INTO AX
1567 MOV BX,10 ;READY FOR DECIMAL CONVERT
1568 MOV CX,4 ;OF 4 DIGITS
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
1575 LOOP K1 ;REPEAT FOR ALL DIGITS
1580 POP AX ;ASCII DIGIT GOES INTO AL
1581 MOV BX,OFFSET MEM_OK
1582 MOV CS:[BX+SI],AL ;BUILD ASCII MESSAGE
1585 ;MOVE THE CURSOR AND PRINT MESSAGE
1588 MOV AH,2 ;SET CURSOR
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
1595 INT 85H
;SET CURSOR POSITION
1597 MOV BX,OFFSET SIZE_MSG1
;GET OFFSET OF MEM_OK MSG
1598 MOV AX,0905H ;MAGENTA MESSAGE
1599 INT 82H
;DISPLAY MESSAGE
1608 POP AX ;RESTORE ALL REGISTERS
1610 RET ;RETURN TO CALLER
1616 ;--------------------------------------------------------------------
1617 ;--------------------------------------------------------------------
1621 ;GET COPY OF MODEL BYTE INTO THIS SEGMENT
1624 LDS SI,ADDR_MODEL_BYTE
1625 MOV AL,[SI] ;GET IT INTO AL
1626 MOV CS:MODEL
,AL ;SAVE IT IN THIS SEGMENT
1636 ;-------------------------------------------------------------------------
1637 ;-------------------------------------------------------------------------
1639 ; SET TRANSLATE TABLE
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).
1649 ; EXAMPLE: segment 4000 can be mapped to block 5
1650 ; segment 4100 can be mapped to block 6
1652 ; FUNCTION/ : To map PC 'real' addresses into SMAS physical memory.
1656 ; ENTRY POINT : SETXLAT
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.
1662 ; (CX) number of 4K blocks translated.
1664 ; (BH) task ID for this memory allocation
1669 ; (DX) starting block number in SMAS memory
1672 ; EXIT : specified entries in Translate Table are enabled or
1673 ; inhibited for all posible task ID's.
1676 ; AX,CX,DX ARE DESTROYED
1678 ;-------------------------------------------------------------------------
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
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
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
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
1708 ;-------------------------------------------------------------------------
1709 ;-------------------------------------------------------------------------
1711 ; AUTO-INCREMENT TEST
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
1723 ; FUNCTION/ : To ensure that the Translate Table pointer can auto
1724 ; PURPOSE increment when 31A5 is written or read.
1726 ; ENTRY POINT : INCTST
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 ;-------------------------------------------------------------------------
1743 ;PERFORM SIMPLE TEST OF TTPOINTER REG
1745 MOV BX,0AA55H ;SET UP PATTERN TO WRITE
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
1759 ;CONTINUE WITH AUTO-INC TEST
1761 MOV DI,2 ;2 PASSES...1 WRITE , 1 READ
1763 MOV SI,AIDATA
;SAVE FOR I/O TO TTDATA WITH AUTO-INC
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
1770 XCHG DX,SI ;I/O TO TTDATA WITH AUTO-INC
1772 ;DETERMINE IF WRITE OR READ TEST
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
1779 IN AX,DX ;READ FROM AUTO-INC DATA REG
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
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
1800 ;-------------------------------------------------------------------------
1801 ;-------------------------------------------------------------------------
1803 ; TRANSLATE TABLE TEST
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.
1811 ; FUNCTION/ : To verify the integrity of the Translate Table.
1814 ; ENTRY POINT : XLATST
1819 ; EXIT : Entire Translate Table is left with FFF (passover code)
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 ;-------------------------------------------------------------------------
1829 MOV AL,XLAT_TABLE_TEST
1832 ;ROLL A BIT THROUGH THE FIRST BYTE
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
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
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
1855 ;CONTINUE REMAINDER OF TRANSLATE TABLE
1859 XCHG DX,SI ;READY FOR I/O TO TTPOINTER
1861 OUT DX,AX ;TTPOINTER AT 1st LOCATION
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
1867 OUT DX,AX ;SETUP INVERSE PATTERN
1868 LOOP X2
;FILL ENTIRE XLATE TABLE
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
1874 MOV CX,TABLEN
;NUMBER OF TT ENTRIES
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
1888 CMP DI,0FFFFH ;LAST PASS ?
1889 JE XLA_EXIT
;YES - THEN EXIT REG TEST
1891 XCHG BX,DI ;BX GETS NEXT PATTERN TO TEST
1893 CMP BX,055AAH ;LAST PASS FOR AA55,55AA PATTERN?
1895 MOV DI,0FF00H ;YES- PREPARE TO WRITE NEW PATTERN
1898 CMP BX,0FF00H ;READY TO READ 0FF00 PATTERN
1900 MOV DI,00FFH ;YES- PREPARE TO WRITE NEW PATTERN
1903 MOV DI,0FFFFH ;PREPARE TO SET ALL OF TT INACTIVE