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