|
|
1.1 ! root 1: page ,132 ! 2: ;*************************************************************************** ! 3: ; * ! 4: ; Copyright (C) 1987 by Microsoft Inc. * ! 5: ; * ! 6: ;*************************************************************************** ! 7: title SetScan - Set An EGA Scan to the Given Colors ! 8: ! 9: ! 10: ! 11: ! 12: .286c ;Allow iAPX80286 instructions ! 13: ! 14: memM equ 1 ;define middle model program ! 15: ?PLM=1 ! 16: ?WIN=0 ! 17: ! 18: ! 19: ! 20: .xlist ! 21: include cmacros.inc ! 22: include ega.inc ! 23: .list ! 24: ! 25: ! 26: ScreenWidthB equ 80 ;Width of screen in bytes ! 27: ScreenSize equ 14000 ;Size of screen plane in words ! 28: ! 29: ;** define segment for ring 2 IOPL code ! 30: ! 31: createSeg _SCRIO, SCRIO, byte, public, CODE ! 32: scrioOFFSET equ OFFSET _SCRIO: ! 33: ! 34: sBegin data ! 35: ! 36: ;** These routines assume that the following two external values are ! 37: ; initialized before any routine is called. ! 38: ! 39: ! 40: extrn _dpoffset:word ;EGA display page offset ! 41: extrn _psel:word ;selector array for EGA memory ! 42: ! 43: sEnd data ! 44: ! 45: sBegin scrio ! 46: assumes cs,_scrio ! 47: assumes ds,data ! 48: ! 49: ! 50: ! 51: ! 52: ;** SetDVideo - disable video ! 53: ; ! 54: ; SetDVideo disable video to prevent snow and flicker during state ! 55: ; changes of the EGA. A call to SetEVideo must be made to reenable ! 56: ; the video. ! 57: ; ! 58: ; SetDVideo (); ! 59: ; ! 60: ; Entry none ! 61: ; Exit EGA video blanked ! 62: ; Returns none ! 63: ; Calls dvideo ! 64: ! 65: ! 66: cProc SetDvideo,<FAR,PUBLIC>,<> ! 67: ! 68: cBegin ! 69: call bvd ;blank video display ! 70: cEnd ! 71: ! 72: ! 73: ! 74: ! 75: ;** SetEVideo - enable video ! 76: ; ! 77: ; SetEVideo renables video ! 78: ; ! 79: ; SetEVideo (); ! 80: ; ! 81: ; Entry none ! 82: ; Exit EGA video restored ! 83: ; Returns none ! 84: ; Calls evideo ! 85: ! 86: ! 87: cProc SetEvideo,<FAR,PUBLIC>,<> ! 88: ! 89: cBegin ! 90: call evd ;enable video display ! 91: cEnd ! 92: ! 93: ! 94: ! 95: ! 96: ;** SetScan - Set One Scan to Given Colors ! 97: ; ! 98: ; The given scan line is set to the colors passed in. ! 99: ; ! 100: ; SetScan (row, count, values); ! 101: ; ! 102: ; Entry row = row to write ! 103: ; count = number of bytes of display data ! 104: ; values = pointer to character array of bit values ! 105: ; Exit display page forced to 0 ! 106: ; display row updated ! 107: ; Returns none ! 108: ; The display adapter must be initialized before invoking this ! 109: ; routine. ! 110: ! 111: ! 112: ! 113: cProc SetScan,<FAR,PUBLIC>,<si,di,es> ! 114: parmW Y ! 115: parmW count ! 116: parmW pMapped ! 117: ! 118: cBegin ! 119: cld ! 120: xor bx,bx ;force display to page 0 ! 121: call sdp ;set display page ! 122: mov ax,Y ;Compute start of scan that will ! 123: mov di,ScreenWidthB ; be set to the passed colors ! 124: mul di ! 125: mov di,ax ! 126: mov si,_psel ;es:di --> scan on the EGA ! 127: mov es,word ptr [si] ! 128: mov dx,rGraphics ;Set the Graphics Controller's ! 129: mov al,rBitmask ; address register to point to ! 130: out dx,al ; the bitmask register ! 131: inc dx ;--> Graphics Controller's data register ! 132: mov ah,10000000b ;Set mask for initial pixel ! 133: mov cx,count ;Set count of pixels ! 134: jcxz ssr2 ;None, exit now ! 135: mov si,offset pMapped ;ds:si --> pixel colors ! 136: xor bx,bx ;Zero is always handy! ! 137: ! 138: ssr1: mov al,ah ;Set BitMask register to only alter ! 139: out dx,al ; pixel of interest ! 140: ror ah,1 ;Set up for next pixel ! 141: lodsb ;Get color for this pixel ! 142: ! 143: ! 144: ; The BitMask register allows bits to be protected from changes. ! 145: ; It works in conjunction with some internal EGA latches. Every ! 146: ; time a read operation from EGA memory is performed, the latches ! 147: ; are loaded with the data read from each plane (one 8-bit latch ! 148: ; per plane). Wherever the BitMask register is a "0", the EGA ! 149: ; writes data from the latches. Wherever the BitMask register is ! 150: ; a "1", the data from the host is written. This is not implemented ! 151: ; in the hardware as a read/modify/write operation, so the user ! 152: ; must load the latches explicitly. ! 153: ! 154: ! 155: xchg es:[di],al ;Load latches, write color to the pixel ! 156: adc di,bx ;Possibly --> next destination byte ! 157: loop ssr1 ;Until all pixels drawn. ! 158: ! 159: ssr2: mov al,0ffh ;Set mask for all pixel ! 160: out dx,al ! 161: cEnd ! 162: ! 163: ! 164: ! 165: ! 166: ;** SetScanClear - clear video display memory ! 167: ; ! 168: ; SetScanClear clears the 28000 bytes of video memory starting at ! 169: ; the page offset specified in _dpoffset. ! 170: ; ! 171: ; SetScanClear (); ! 172: ; ! 173: ; Entry none ! 174: ; Exit EGA video memory cleared ! 175: ; Returns none ! 176: ; Calls cdm ! 177: ! 178: ! 179: cProc SetScanClear,<FAR,PUBLIC>,<> ! 180: ! 181: cBegin ! 182: call bvd ;blank video display ! 183: mov cx,_dpoffset ! 184: call cdm ;clear display memory ! 185: call evd ;enable video display ! 186: cEnd ! 187: ! 188: ! 189: ! 190: ! 191: ;** SetScanRestore - restore graphics display ! 192: ; ! 193: ; Restore active EGA display page from saved image ! 194: ; SetScanRestore (ressel); ! 195: ; ! 196: ; Entry ressel = far pointer to array of selectors to segments ! 197: ; containing graphics image to be restored ! 198: ; _dpoffset = offset of active display page ! 199: ; Exit graphics image restored ! 200: ; Returns none ! 201: ! 202: ! 203: cProc SetScanRestore,<FAR,PUBLIC>,<si,di,es,ds> ! 204: parmD ressel ! 205: ! 206: cBegin ! 207: mov cx,_dpoffset ;(cx) = display page to clear ! 208: call cdm ;clear display memory ! 209: mov bx,_psel ;(es) = display selector ! 210: mov es,word ptr [bx] ! 211: ! 212: ; Restore graphics memory. ! 213: ; This is done by enabling each 32k bank of graphics memory ! 214: ; and copying memory from the restore segments. ! 215: ! 216: mov dx,rGraphics ;Set the Graphics Controller's ! 217: mov ax,0*256+rMode ! 218: out dx,ax ! 219: mov al,rBitmask ; address register to point to ! 220: mov ah,0ffh ;Set mask for initial pixel ! 221: out dx,ax ; the bitmask register ! 222: mov dx,rSequencer ;(dx) = sequencer register address ! 223: mov al,rMapMask ;write to sequencer map mask register ! 224: mov ah,C0 ;select plane C0 ! 225: out dx,ax ! 226: push ds ;save (ds) for later ! 227: mov bx,_dpoffset ;move display offset to stack ! 228: push bx ! 229: lds bx,ressel ;(ds:bx) = address of restore selector ! 230: mov ds,[bx] ;(ds) = first selector ! 231: xor si,si ;(si) = offset into restore segment ! 232: pop di ;(di) = offset into display memory ! 233: push di ! 234: mov cx,ScreenSize ;copy image to plane C0 ! 235: rep movsw ! 236: mov ah,C1 ;select plane C1 ! 237: out dx,ax ! 238: pop di ;(di) = offset into display memory ! 239: push di ! 240: mov cx,ScreenSize ;copy image to plane C1 ! 241: rep movsw ! 242: lds bx,ressel ;(ds:bx) = address of restore selector ! 243: mov ds,[bx+2] ;(ds) = second selector ! 244: xor si,si ;(si) = offset into restore segment ! 245: mov ah,C2 ;select plane C2 ! 246: out dx,ax ! 247: pop di ;(di) = offset into display memory ! 248: push di ! 249: mov cx,ScreenSize ;copy image to plane C2 ! 250: rep movsw ! 251: mov ah,C3 ;select plane C3 ! 252: out dx,ax ! 253: pop di ;(di) = offset into display memory ! 254: mov cx,ScreenSize ;copy image to C3 ! 255: rep movsw ! 256: pop ds ! 257: ! 258: ; set start address register ! 259: ! 260: mov bx,_dpoffset ! 261: call sdp ;set display page ! 262: cEnd ! 263: ! 264: ! 265: ! 266: ! 267: ;** SetScanRFont - restore EGA font table ! 268: ; ! 269: ; SetScanRFont restores the EGA font tables saved by SetScanSFont. ! 270: ; ! 271: ; SetScanRFont (fontsel); ! 272: ; ! 273: ; Entry fontsel = selector for font save memory ! 274: ; Exit EGA font table restored from font save segment ! 275: ; Returns none ! 276: ; Calls ifa, tfa ! 277: ! 278: ! 279: cProc SetScanRFont,<FAR,PUBLIC>,<si,di,es> ! 280: parmW frsel ! 281: ! 282: cBegin ! 283: mov si,_psel ;(es) = display selector ! 284: mov es,word ptr [si] ! 285: push ds ! 286: call ifa ;initialize font addressing ! 287: mov bx,frsel ;(bx) = font restore selector ! 288: mov ds,bx ;(ds) = font selector ! 289: xor si,si ;(si) = offset into restore segment ! 290: xor di,di ;(di) = offset into display ! 291: mov cx,08000h ;copy 32k words to plane C2 ! 292: rep movsw ;copy memory ! 293: pop ds ! 294: call tfa ;terminate font table addressing ! 295: cEnd ! 296: ! 297: ! 298: ! 299: ;** SetScanSave - Save graphics display ! 300: ; ! 301: ; Copy active page of display memory to RAM save buffer. ! 302: ; ! 303: ; SetScanSave (savesel); ! 304: ; ! 305: ; Entry savsel = far pointer to array of selectors for segments ! 306: ; used to save graphics image ! 307: ; _dpoffset = offset of active EGA display page ! 308: ; Exit graphics image saved ! 309: ; Returns none ! 310: ! 311: ! 312: cProc SetScanSave,<FAR,PUBLIC>,<si,di,ds,es> ! 313: parmD savesel ;far pointer to array of save selectors ! 314: ! 315: cBegin ! 316: les bx,savesel ;(es:bx) = address of save selector ! 317: mov es,es:[bx] ;(es) = first selector ! 318: mov bx,_dpoffset ;(bx) = offset into display memory ! 319: push bx ! 320: mov dx,rGraphics ;(dx) = address of graphics controller ! 321: mov al,rReadMap ! 322: mov ah,rmC0 ;set read map select to plane 0 ! 323: out dx,ax ; ! 324: mov si,_psel ;(ds) = display selector ! 325: mov ds,word ptr [si] ! 326: mov si,bx ;(si) = offset into display ! 327: xor di,di ;offset into save memory ! 328: mov cx,ScreenSize ;copy image from plane C0 ! 329: rep movsw ;copy memory ! 330: mov ah,rmC1 ;select plane 1 ! 331: out dx,ax ! 332: mov si,bx ;(si) = offset into display ! 333: mov cx,ScreenSize ;copy image from plane C1 ! 334: rep movsw ! 335: les bx,savesel ;(es:bx) = address of save selector ! 336: mov es,es:[bx+2] ;(es) = second selector ! 337: pop bx ;(bx) = offset into display memory ! 338: mov ah,rmC2 ;select plane 2 ! 339: out dx,ax ! 340: mov si,bx ;(si) = offset into display ! 341: xor di,di ;offset into save memory ! 342: mov cx,ScreenSize ;copy image from plane C2 ! 343: rep movsw ;copy memory ! 344: mov ah,rmC3 ;select plane 3 ! 345: out dx,ax ! 346: mov si,bx ;(si) = offset into display ! 347: mov cx,ScreenSize ;copy image from C3 ! 348: rep movsw ! 349: mov ah,rmC0 ;set read map select to plane 0 ! 350: out dx,ax ; ! 351: cEnd ! 352: ! 353: ! 354: ! 355: ! 356: ;** SetScanSFont - save font tables ! 357: ; ! 358: ; SetScanSFont (fontsel); ! 359: ; ! 360: ; Entry fontsel = selector for font save memory ! 361: ; Exit EGA font table saved in font save segment ! 362: ; Returns none ! 363: ; Calls ifa, tfa ! 364: ! 365: ! 366: cProc SetScanSFont,<FAR,PUBLIC>,<si,di,es> ! 367: parmW fssel ! 368: ! 369: cBegin ! 370: call ifa ;initialize font addressing ! 371: push ds ! 372: mov bx,fssel ;(bx) = font save selector ! 373: mov es,bx ;(es) = font save selector ! 374: mov si,_psel ;(ds) = display selector ! 375: mov ds,word ptr [si] ! 376: xor si,si ;(si) = offset into display ! 377: xor di,di ;offset into save memory ! 378: mov cx,8000h ;copy 32k words from plane C0 ! 379: rep movsw ;copy memory ! 380: pop ds ;(ds) = data segment selector ! 381: cEnd ! 382: ! 383: ! 384: ! 385: ! 386: ;* bvd - blank video display ! 387: ; ! 388: ; bvd blanks the video display by preventing access to the ! 389: ; palette registers. ! 390: ; ! 391: ; Entry none ! 392: ; Exit display blanked ! 393: ; Returns none ! 394: ; Calls wvs ! 395: ; Uses al, dx ! 396: ! 397: cProc bvd,<NEAR>,<> ! 398: ! 399: cBegin ! 400: call wvs ;wait for vertical resynch ! 401: mov dx,rAttread ;read feature control to reset ! 402: in al,dx ;internal flipflop to force address ! 403: mov dx,rAttwrite ! 404: mov al,000H ;disable access to palette ! 405: out dx,al ! 406: cEnd ! 407: ! 408: ! 409: ! 410: ! 411: ;* cdm - clear display memory ! 412: ; ! 413: ; cdm clears the 28000 bytes of memory starting at the address ! 414: ; pointed to by (cx) ! 415: ; ! 416: ; Entry cx = offset of page to clear ! 417: ; Exit display memory cleared ! 418: ; Returns none ! 419: ; Calls sdm ! 420: ; Uses ax, bx, cx, dx ! 421: ! 422: ! 423: cProc cdm,<NEAR,PUBLIC>,<di, es> ! 424: ! 425: cBegin ! 426: mov bx,_psel ;(es) = display selector ! 427: mov es,word ptr [bx] ! 428: mov bx,cx ;(bx) = display offset ! 429: ! 430: ! 431: ; Clear graphics memory. ! 432: ; This is done by enabling each 32k bank of graphics memory ! 433: ; and storing zeroes. ! 434: ! 435: mov dx,rGraphics ;Set the Graphics Controller's ! 436: mov al,rBitmask ; address register to point to ! 437: mov ah,0ffh ;Set mask for initial pixel ! 438: out dx,ax ; the bitmask register ! 439: mov dx,rSequencer ;(dx) = sequencer register address ! 440: mov al,rMapMask ;write to sequencer map mask register ! 441: mov ah,C0 ;select plane C0 ! 442: out dx,ax ! 443: mov di,bx ;(di) = offset into display memory ! 444: mov cx,ScreenSize ;copy image to plane C0 ! 445: xor ax,ax ! 446: rep stosw ! 447: mov al,rMapMask ;write to sequencer map mask register ! 448: mov ah,C1 ;select plane C1 ! 449: out dx,ax ! 450: mov di,bx ;(di) = offset into display memory ! 451: mov cx,ScreenSize ;copy image to plane C1 ! 452: xor ax,ax ! 453: rep stosw ! 454: mov al,rMapMask ;write to sequencer map mask register ! 455: mov ah,C2 ;select plane C2 ! 456: out dx,ax ! 457: mov di,bx ;(di) = offset into display memory ! 458: mov cx,ScreenSize ;copy image to plane C2 ! 459: xor ax,ax ! 460: rep stosw ! 461: mov al,rMapMask ;write to sequencer map mask register ! 462: mov ah,C3 ;select plane C3 ! 463: out dx,ax ! 464: mov di,bx ;(di) = offset into display memory ! 465: mov cx,ScreenSize ;copy image to C3 ! 466: xor ax,ax ! 467: rep stosw ! 468: call sdm ;set display mode ! 469: cEnd ! 470: ! 471: ! 472: ! 473: ! 474: ;* evd - enable video display ! 475: ; ! 476: ; evd enables the video display by reenabling access to the ! 477: ; palette registers ! 478: ; ! 479: ; Entry none ! 480: ; Exit video display restored ! 481: ; Returns none ! 482: ; Calls none ! 483: ; Uses al, dx ! 484: ! 485: ! 486: cProc evd,<NEAR>,<> ! 487: ! 488: cBegin ! 489: mov dx,rAttread ;read feature control to reset ! 490: in al,dx ;internal flipflop to force address ! 491: mov dx,rAttwrite ! 492: mov al,020H ;allow access to palette ! 493: out dx,al ! 494: cEnd ! 495: ! 496: ! 497: ! 498: ! 499: ;** ifa - initialize font addressing ! 500: ; ! 501: ; initialize EGA to allow read of font tables ! 502: ; ! 503: ; Entry none ! 504: ; Exit EGA addressing set up ! 505: ; Returns none ! 506: ! 507: ! 508: cProc ifa,<NEAR>,<> ! 509: ! 510: cBegin ! 511: mov dx,rGraphics ! 512: mov ax,0204h ! 513: cli ! 514: out dx,ax ;Read Map Select register ! 515: mov ax,0005h ! 516: out dx,ax ;Graphics Mode register ! 517: mov ax,0406h ! 518: out dx,ax ;Graphics Misc register ! 519: mov dx,rSequencer ! 520: mov ax,0C02h ! 521: out dx,ax ;Write Map Select ! 522: mov ax,0404h ! 523: out dx,ax ;Turn on odd/even ! 524: sti ! 525: cEnd ! 526: ! 527: ! 528: ! 529: ! 530: ;* sdm - set display mode ! 531: ; ! 532: ; sdm restores the EGA to the default graphics mode ! 533: ; ! 534: ; Entry none ! 535: ; Exit default graphics display mode reestablished ! 536: ; Returns none ! 537: ; Calls none ! 538: ; Uses ax, dx ! 539: ! 540: ! 541: cProc sdm,<NEAR>,<si,di,es> ! 542: ! 543: cBegin ! 544: mov dx,rSequencer ;Enable all planes for writing ! 545: mov ah,C0+C1+C2+C3 ! 546: mov al,rMapMask ! 547: out dx,ax ! 548: mov dx,rGraphics ;-->Graphics Controller ! 549: mov ax,0*256+rEnableSR ;Clear any set/reset enable ! 550: out dx,ax ! 551: ! 552: ! 553: ; Color Write Mode takes data from the host as a color. D0 of ! 554: ; the host data is taken as the color for plane C0, D1 for plane ! 555: ; C1, etc. The color for each plane is written to all bits of ! 556: ; the destination byte which are enabled in the BitMask Register. ! 557: ! 558: ! 559: mov ax,(mColorWrite+mDataRead)*256+rMode ! 560: out dx,ax ! 561: ! 562: ! 563: ; The Data Rotate register allows a boolean function between ! 564: ; the data from the host and the data in the EGA's latches ! 565: ; to occur. It also allows the data from the host to be ! 566: ; rotated by some count before the operation occurs. ! 567: ! 568: ! 569: mov ax,(drSet*256)+rDataRotate ! 570: out dx,ax ! 571: cEnd ! 572: ! 573: ! 574: ! 575: ! 576: ;* sdp - set display page ! 577: ; ! 578: ; sdp sets the current display page by setting the display offset ! 579: ; to the value in bx ! 580: ; ! 581: ; Entry bx = page offset ! 582: ; Exit disply page address set ! 583: ; Returns none ! 584: ; Calls wvs ! 585: ; Uses ax,dx ! 586: ! 587: ! 588: cProc sdp,<NEAR>,<> ! 589: ! 590: cBegin ! 591: call wvs ;wait for vertical synch ! 592: mov dx,rCRTC ;(dx) = CRT controller ! 593: mov al,rSahr ;(al) = high address register ! 594: mov ah,bh ;(ah) = upper byte of address ! 595: out dx,ax ! 596: mov al,rSalr ! 597: mov ah,bl ;(ah) = low byte of address ! 598: out dx,ax ! 599: cEnd ! 600: ! 601: ! 602: ! 603: ! 604: ;** tfa - terminate font addressing ! 605: ; ! 606: ; terminate font table addressing mode ! 607: ; ! 608: ; Entry none ! 609: ; Exit EGA returned to normal addressing mode ! 610: ; Returns none ! 611: ! 612: ! 613: cProc tfa,<NEAR>,<> ! 614: ! 615: cBegin ! 616: mov cx,0e06h ;Setup color buffer with chaining ! 617: mov dx,rGraphics ! 618: mov ax,0004h ! 619: cli ! 620: out dx,ax ;Read Map Select register ! 621: mov ax,1005h ! 622: out dx,ax ;Graphics Mode register ! 623: mov ax,0e06h ;Setup color buffer with chaining ! 624: out dx,ax ;Graphics Misc register ! 625: mov dx,rSequencer ! 626: mov ax,0302h ! 627: out dx,ax ;Write Map Select ! 628: mov ax,0004h ! 629: out dx,ax ;Turn off odd/even ! 630: sti ! 631: cEnd ! 632: ! 633: ! 634: ! 635: ! 636: ;* wvs - wait for vertical synch ! 637: ; ! 638: ; wvs waits for the leading edge of the vertical synch pulse ! 639: ; ! 640: ; Entry none ! 641: ; Exit leading edge of vertical synch encountered ! 642: ; Returns none ! 643: ; Calls none ! 644: ; Uses al, dx ! 645: ! 646: ! 647: cProc wvs,<NEAR>,<> ! 648: ! 649: cBegin ! 650: mov dx,rAttread ;read feature control to reset ! 651: ! 652: ; wait until not in vertical retrace ! 653: ! 654: wvs1: in al,dx ;internal flipflop to force address ! 655: test al,mVRetrace ;check for vertical retrace ! 656: jnz wvs1 ;if vertical retrace set ! 657: ! 658: ; wait for start of vertical retrace ! 659: ! 660: wvs2: in al,dx ;internal flipflop to force address ! 661: test al,mVRetrace ;check for vertical retrace ! 662: jz wvs2 ;if vertical retrace not set ! 663: cEnd ! 664: ! 665: ! 666: sEnd scrio ! 667: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.