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