|
|
1.1 ! root 1: / (lgl- ! 2: / COHERENT Driver Kit Version 1.1.0 ! 3: / Copyright (c) 1982, 1990 by Mark Williams Company. ! 4: / All rights reserved. May not be copied without permission. ! 5: / -lgl) ! 6: //////// ! 7: / ! 8: / Memory mapped video driver assembler assist. ! 9: / ! 10: //////// ! 11: / ! 12: / virtual terminal additions Copyright 1991, 1992 Todd Fleming ! 13: / 6/91, 1/92 ! 14: / ! 15: / Todd Fleming ! 16: / 1991 Mountainside Drive ! 17: / Blacksburg, VA 24060 ! 18: / ! 19: //////// ! 20: / ! 21: / State driven code ! 22: / ! 23: / Input: DS:SI - input string ! 24: / ES:DI - current screen location ! 25: / SS:BP - terminal information ! 26: / CX - input count ! 27: / BP - references terminal information ! 28: / AH - character attributes ! 29: / AL - character ! 30: / BH - (usually) kept zeroed for efficiency ! 31: / DH - current row ! 32: / DL - current column ! 33: / ! 34: //////// ! 35: ! 36: NCOL = 80 / number of columns ! 37: NCB = 2 / number of horizontal bytes per char ! 38: NCR = 1 / number of horizontal lines per char ! 39: NHB = 160 / number of horizontal bytes per line ! 40: NRB = NCR*NHB / number of bytes per character row ! 41: ! 42: hBUFSIZE = NCOL*25 / 1/2 buffer size for 25 row screen (TBF) ! 43: ! 44: ATTR = ah / attribute byte ! 45: ZERO = bh / (almost) always zero ! 46: ROW = dh / currently active vertical position ! 47: COL = dl / currently active horizontal position ! 48: POS = di / currently active display address ! 49: ! 50: INTENSE = 0x08 / high intensity attribute bit ! 51: BLINK = 0x80 / blinking attribute bit ! 52: REVERSE = 0x70 / reverse video ! 53: ! 54: //////// ! 55: / ! 56: / Magic constants from <sys/io.h> ! 57: / ! 58: //////// ! 59: ! 60: IO_SEG = 0 ! 61: IO_IOC = 2 ! 62: IO_BASE = 8 ! 63: ! 64: IOSYS = 0 ! 65: IOUSR = 1 ! 66: ! 67: //////// ! 68: / ! 69: / Data ! 70: / ! 71: //////// ! 72: / Characters ! 73: AZERO = 0x30 ! 74: CLOWER = 0x63 ! 75: HLOWER = 0x68 ! 76: LLOWER = 0x6C ! 77: SEMIC = 0x3B ! 78: SPACE = 0x20 ! 79: ! 80: MM_FUNC = 0 / current state ! 81: MM_PORT = 2 / adapter base i/o port ! 82: MM_BASE = 4 / adapter base memory address ! 83: MM_ROW = 6 / screen row ! 84: MM_COL = 7 / screen column ! 85: MM_POS = 8 / screen position ! 86: MM_ATTR = 10 / attributes ! 87: MM_N1 = 11 / numeric argument 1 ! 88: MM_N2 = 12 / numeric argument 2 ! 89: MM_BROW = 13 / base row ! 90: MM_EROW = 14 / end row ! 91: MM_LROW = 15 / legal row limit ! 92: MM_SROW = 16 / saved cursor row ! 93: MM_SCOL = 17 / saved cursor column ! 94: MM_IBROW = 18 / initial base row ! 95: MM_IEROW = 19 / initial end row ! 96: MM_INVIS = 20 / cursor invisible mask ! 97: MM_SLOW = 22 / slow [no flicker] video update ! 98: MM_WRAP = 23 / wrap to start of next line ! 99: MM_CURTERM = 24 / flag:1=current virterm (TBF) ! 100: MM_UNUSED = 25 / not used, preseve even byte ordering (TBF) ! 101: MM_DATASIZE = 26 / size of data structure (TBF) ! 102: ! 103: NVIRTERMS = 4 / # of virtual terminals (TBF) ! 104: ! 105: .globl VIDSLOW_ / Patchable kernel variable. ! 106: .globl mmspecspace_ ! 107: .prvd ! 108: mmspecspace_: ! 109: mmdata: .word mminit ! 110: .word 0x03B4 ! 111: .word 0xB000 ! 112: .byte 0, 0 ! 113: .word 0 ! 114: .byte 0x7, 0, 0, 0, 23, 24, 0, 0, 0, 23 ! 115: .word 0 ! 116: VIDSLOW_:.byte 0 ! 117: .byte 1 ! 118: .byte 1,0 ! 119: ! 120: .blkb MM_DATASIZE*[NVIRTERMS-1] / allocate NVIRTERMS-1 more data spaces ! 121: ! 122: MMDATAADDR: / address of structs (TBF) ! 123: mmdata2 = mmdata + MM_DATASIZE ! 124: mmdata3 = mmdata2 + MM_DATASIZE ! 125: mmdata4 = mmdata3 + MM_DATASIZE ! 126: / mmdata5 = mmdata4 + MM_DATASIZE ! 127: / mmdata6 = mmdata5 + MM_DATASIZE ! 128: / mmdata7 = mmdata6 + MM_DATASIZE ! 129: / mmdata8 = mmdata7 + MM_DATASIZE ! 130: / mmdata9 = mmdata8 + MM_DATASIZE ! 131: / mmdata10 = mmdata9 + MM_DATASIZE ! 132: ! 133: .word mmdata, mmdata2, mmdata3, mmdata4 ! 134: / .word mmdata, mmdata2, mmdata3, mmdata4, mmdata5 ! 135: / .word mmdata6, mmdata7, mmdata8, mmdata9, mmdata10 ! 136: ! 137: .shri ! 138: ! 139: ////////////// ! 140: / ! 141: / mmblankbuf(dest) blank screen buffer (TBF) ! 142: / unsigned dest; ! 143: / ! 144: / dest is selector ! 145: / ! 146: ////////////// ! 147: ! 148: .globl mmblankbuf_ ! 149: mmblankbuf_: ! 150: push si ! 151: push di ! 152: push es ! 153: push bp ! 154: mov bp,sp ! 155: ! 156: mov ax, 10(bp) / es=dest ! 157: mov es, ax ! 158: ! 159: mov di, $0 / buffer start ! 160: ! 161: mov ax, $0x0700 / blank value ! 162: mov cx, $hBUFSIZE / size of buffer in words ! 163: ! 164: rep ! 165: stosw / blank out buffer ! 166: ! 167: pop bp ! 168: pop es ! 169: pop di ! 170: pop si ! 171: ret ! 172: ! 173: ////////// ! 174: / ! 175: / mmbufcopy(dest,src) (TBF) ! 176: / unsigned dest,src ! 177: / ! 178: / copies screen buffer from src to dest. dest,src are selectors ! 179: / ! 180: ////////// ! 181: ! 182: .globl mmbufcopy_ ! 183: mmbufcopy_: ! 184: push si ! 185: push di ! 186: push ds ! 187: push es ! 188: push bp ! 189: mov bp, sp ! 190: ! 191: mov ax, 12(bp) / es=dest ! 192: mov es, ax ! 193: ! 194: mov ax, 14(bp) / ds=src ! 195: mov ds, ax ! 196: ! 197: mov si,$0 ! 198: mov di,$0 ! 199: mov cx,$hBUFSIZE ! 200: rep ! 201: movsw / copy buffer ! 202: ! 203: pop bp ! 204: pop es ! 205: pop ds ! 206: pop di ! 207: pop si ! 208: ret ! 209: ! 210: //////// ! 211: / ! 212: / mmgo ( iop, dev ) ! 213: / IO *iop; dev_t dev ! 214: / ! 215: //////// ! 216: ! 217: .globl mmgo_ ! 218: ! 219: mmgo_: ! 220: push si ! 221: push di ! 222: push bp ! 223: mov bp, sp ! 224: push ds ! 225: push es ! 226: cld ! 227: mov bx, 8(bp) / iop ! 228: cmp bx, $0 / skip if(iop==NULL) ! 229: je 0f ! 230: mov si, IO_BASE(bx) / iop->io_base ! 231: mov cx, IO_IOC(bx) / iop->io_ioc ! 232: ! 233: cmp IO_SEG(bx), $IOSYS / user address space ! 234: je 0f ! 235: mov bx, uds_ ! 236: mov ds, bx ! 237: 0: ! 238: mov bx, 10(bp) / bx=dev (TBF) ! 239: movb bh, $0 / bx=minor(dev) (TBF) ! 240: sub bx, $1 / bx=minor(dev)-1 (TBF) ! 241: shl bx, $1 / bx=2*(minor(dev)-1) (TBF) ! 242: mov bp, ss:MMDATAADDR(bx) / bp=&mmspecspace[minor(dev)-1]; (TBF) ! 243: ! 244: mov dx, MM_PORT(bp) / turn video off if color board ! 245: cmp dx, $0x3B4 ! 246: je 3f ! 247: cmpb MM_SLOW(bp), $0 / check for slow [flicker-free] ! 248: je 2f ! 249: ! 250: mov dx, $0x3DA ! 251: 1: inb al, dx / wait for vertical retrace ! 252: testb al, $8 ! 253: je 1b ! 254: 2: ! 255: mov dx, $0x3D8 / disable video ! 256: movb al, $0x25 ! 257: outb dx, al ! 258: 3: ! 259: movb ROW, MM_ROW(bp) ! 260: movb COL, MM_COL(bp) ! 261: mov es, MM_BASE(bp) ! 262: mov POS, MM_POS(bp) ! 263: sub bx, bx ! 264: movb ATTR, MM_ATTR(bp) ! 265: ijmp MM_FUNC(bp) ! 266: ! 267: exit: pop bx ! 268: pop es ! 269: pop ds ! 270: movb MM_ATTR(bp), ATTR ! 271: mov MM_FUNC(bp), bx ! 272: movb MM_ROW(bp), ROW / save row,column ! 273: movb MM_COL(bp), COL ! 274: mov MM_POS(bp), POS / save position ! 275: je 4f ! 276: mov dx, MM_PORT(bp) / adjust cursor location ! 277: mov bx, POS ! 278: or bx, MM_INVIS(bp) ! 279: shr bx, $1 ! 280: ! 281: movb al, $14 ! 282: outb dx, al ! 283: inc dx ! 284: movb al, bh ! 285: outb dx, al ! 286: dec dx ! 287: movb al, $15 ! 288: outb dx, al ! 289: inc dx ! 290: movb al, bl ! 291: outb dx, al ! 292: ! 293: 4: ! 294: mov dx, MM_PORT(bp) / turn video on ! 295: add dx, $4 ! 296: movb al, $0x29 ! 297: outb dx, al ! 298: mov mmvcnt_, $600 / 600 seconds before video disabled ! 299: ! 300: mov bp, sp ! 301: mov bx, 8(bp) ! 302: mov ax, cx ! 303: xchg cx, IO_IOC(bx) ! 304: sub cx, IO_IOC(bx) ! 305: add IO_BASE(bx), cx ! 306: pop bp ! 307: pop di ! 308: pop si ! 309: ret ! 310: ! 311: //////// ! 312: / ! 313: / mmcursor - cursor update entry point (TBF) ! 314: / ! 315: //////// ! 316: ! 317: .globl mmcursor_ ! 318: ! 319: mmcursor_: ! 320: call exit / exit takes care of rest ! 321: jmp eval ! 322: ! 323: //////// ! 324: / ! 325: / mminit - initialize screen ! 326: / ! 327: //////// ! 328: ! 329: mminit: movb ss:mmesc_, $CLOWER / schedule keyboard initialization ! 330: ! 331: call int11_ / read equipment status ! 332: and ax, $0x30 / isolate video bits ! 333: cmp ax, $0x30 / if not monochrome ! 334: je 0f ! 335: mov MM_PORT(bp), $0x3D4 / set color port ! 336: mov MM_BASE(bp), $0xB800 / set color base ! 337: mov es, MM_BASE(bp) / ! 338: 0: / ! 339: mov dx, MM_PORT(bp) / turn video off ! 340: add dx, $4 ! 341: movb al, $0x21 ! 342: outb dx, al ! 343: ! 344: mov dx, MM_PORT(bp) / zero display offset ! 345: movb al, $12 ! 346: outb dx, al ! 347: inc dx ! 348: subb al, al ! 349: outb dx, al ! 350: dec dx ! 351: movb al, $13 ! 352: outb dx, al ! 353: inc dx ! 354: subb al, al ! 355: outb dx, al ! 356: ! 357: mov dx, MM_PORT(bp) / reset border to black ! 358: add dx, $5 ! 359: subb al, al ! 360: outb dx, al ! 361: ! 362: inc dx / reset TECMAR XMSR register ! 363: outb dx, al ! 364: ! 365: mminit2:movb ss:mmesc_, $CLOWER ! 366: mov MM_INVIS(bp), $0 ! 367: movb ATTR, $0x07 ! 368: movb MM_ATTR(bp), ATTR ! 369: movb MM_WRAP(bp), $1 ! 370: movb ROW, MM_IBROW(bp) ! 371: movb MM_BROW(bp), ROW ! 372: movb bl, MM_IEROW(bp) ! 373: movb MM_EROW(bp), bl ! 374: sub bx, bx ! 375: movb MM_N1(bp), $2 ! 376: jmp mm_ed ! 377: ! 378: //////// ! 379: / ! 380: / mmspec - schedule special keyboard function ! 381: / ! 382: //////// ! 383: ! 384: mmspec: movb ss:mmesc_, al ! 385: jmp eval ! 386: ! 387: //////// ! 388: / ! 389: / mmbell - schedule beep ! 390: / ! 391: //////// ! 392: ! 393: mmbell: ! 394: cmp MM_CURTERM(bp), $0 / only if not current virterm (TBF) ! 395: je 1f ! 396: movb ss:mmbeeps_, $-1 ! 397: 1: jmp eval ! 398: ! 399: //////// ! 400: / ! 401: / mm_cnl - cursor next line ! 402: / ! 403: / Moves the active position to the first column of the next display line. ! 404: / Scrolls the active display if necessary. ! 405: / ! 406: //////// ! 407: ! 408: mm_cnl: subb COL, COL ! 409: incb ROW ! 410: cmpb ROW, MM_EROW(bp) ! 411: jna repos ! 412: movb ROW, MM_EROW(bp) ! 413: / jmp scrollup ! 414: ! 415: //////// ! 416: / ! 417: / scrollup - scroll display upwards ! 418: / ! 419: //////// ! 420: ! 421: scrollup: ! 422: push ds ! 423: push si ! 424: push cx ! 425: mov ds, MM_BASE(bp) ! 426: movb bl, MM_BROW(bp) ! 427: shlb bl, $1 ! 428: mov di, cs:rowtab(bx) ! 429: mov si, cs:rowtab+2(bx) ! 430: movb bl, ROW ! 431: shlb bl, $1 ! 432: mov cx, cs:rowtab(bx) ! 433: push cx ! 434: sub cx, di ! 435: shr cx, $1 ! 436: cld ! 437: rep ! 438: movsw ! 439: movb al, $SPACE ! 440: pop di ! 441: mov cx, $NCOL ! 442: rep ! 443: stosw ! 444: pop cx ! 445: pop si ! 446: pop ds ! 447: movb bl, COL / reposition to ROW and COL ! 448: shlb bl, $1 ! 449: mov POS, cs:coltab(bx) ! 450: movb bl, ROW ! 451: shlb bl, $1 ! 452: add POS, cs:rowtab(bx) ! 453: call exit ! 454: jmp eval ! 455: ! 456: //////// ! 457: / ! 458: / repos - reposition cursor ! 459: / ! 460: //////// ! 461: ! 462: repos: movb bl, COL / reposition to ROW and COL ! 463: shlb bl, $1 ! 464: mov POS, cs:coltab(bx) ! 465: movb bl, ROW ! 466: shlb bl, $1 ! 467: add POS, cs:rowtab(bx) ! 468: / jmp eval ! 469: ! 470: //////// ! 471: / ! 472: / eval - evaluate input character ! 473: / ! 474: //////// ! 475: ! 476: eval: jcxz ewait ! 477: dec cx / evaluate next char ! 478: lodsb ! 479: movb bl, al ! 480: shlb bl, $1 ! 481: jc mmputc ! 482: ijmp cs:asctab(bx) ! 483: ! 484: //////// ! 485: / ! 486: / mmputc - put character on screen ! 487: / ! 488: //////// ! 489: ! 490: mmputc: stosw / Update display memory. ! 491: incb COL ! 492: cmpb COL, $NCOL / Past end of line? ! 493: jge 0f ! 494: jcxz ewait / Not past, evaluate next character. ! 495: dec cx ! 496: lodsb ! 497: movb bl, al ! 498: shlb bl, $1 ! 499: jc mmputc ! 500: ijmp cs:asctab(bx) ! 501: ! 502: 0: cmpb MM_WRAP(bp), $0 / Yes past, Wrap around? ! 503: jne 0f ! 504: sub di, $2 / No wrap, adjust back to end of line. ! 505: decb COL ! 506: jcxz ewait / Not past, evaluate next character. ! 507: dec cx ! 508: lodsb ! 509: movb bl, al ! 510: shlb bl, $1 ! 511: jc mmputc ! 512: ijmp cs:asctab(bx) ! 513: ! 514: 0: subb COL, COL / Wrap to next line. ! 515: incb ROW ! 516: cmpb ROW, MM_EROW(bp) / Past scrolling region? ! 517: jg 0f ! 518: jcxz ewait / Not past, evaluate next character. ! 519: dec cx ! 520: lodsb ! 521: movb bl, al ! 522: shlb bl, $1 ! 523: jc mmputc ! 524: ijmp cs:asctab(bx) ! 525: ! 526: 0: movb ROW, MM_EROW(bp) / Yes past, scroll up 1 line. ! 527: jmp scrollup ! 528: ! 529: //////// ! 530: / ! 531: / Ewait - wait for next input char to evaluate ! 532: / ! 533: //////// ! 534: ! 535: ewait: call exit ! 536: jcxz ewait ! 537: dec cx ! 538: lodsb ! 539: movb bl, al ! 540: shlb bl, $1 ! 541: jc mmputc ! 542: ijmp cs:asctab(bx) ! 543: ! 544: //////// ! 545: / ! 546: / mm_cr - carriage return ! 547: / ! 548: / Moves the active position to first position of current display line. ! 549: / ! 550: //////// ! 551: ! 552: mm_cr: subb COL, COL ! 553: movb bl, ROW ! 554: shlb bl, $1 ! 555: mov POS, cs:rowtab(bx) ! 556: jcxz ewait ! 557: dec cx ! 558: lodsb ! 559: movb bl, al ! 560: shlb bl, $1 ! 561: jc mmputc ! 562: ijmp cs:asctab(bx) ! 563: ! 564: //////// ! 565: / ! 566: / mm_cub - cursor backwards ! 567: / ! 568: //////// ! 569: ! 570: mm_cub: sub POS, $2 ! 571: decb COL ! 572: jge 0f ! 573: movb COL, $NCOL-1 ! 574: decb ROW ! 575: cmpb ROW, MM_BROW(bp) ! 576: jge 0f ! 577: subb COL, COL ! 578: movb ROW, MM_BROW(bp) ! 579: movb bl, ROW ! 580: shlb bl, $1 ! 581: mov POS, cs:rowtab(bx) ! 582: 0: jcxz ewait ! 583: dec cx ! 584: lodsb ! 585: movb bl, al ! 586: shlb bl, $1 ! 587: jc mmputc ! 588: ijmp cs:asctab(bx) ! 589: ! 590: //////// ! 591: / ! 592: / Esc state - entered when last char was ESC - transient state. ! 593: / ! 594: //////// ! 595: ! 596: 0: call exit ! 597: mm_esc: jcxz 0b ! 598: dec cx ! 599: lodsb ! 600: movb MM_N1(bp), ZERO ! 601: movb MM_N2(bp), ZERO ! 602: movb bl, al ! 603: shlb bl, $1 ! 604: jc mmputc ! 605: ijmp cs:esctab(bx) ! 606: ! 607: //////// ! 608: / ! 609: / Csi_n1 state - entered when last two chars were ESC [ ! 610: / ! 611: / Action: Evaluates numeric chars as numeric parameter 1. ! 612: / ! 613: //////// ! 614: ! 615: 0: call exit ! 616: csi_n1: jcxz 0b ! 617: dec cx ! 618: lodsb ! 619: cmpb al, $SEMIC ! 620: je csi_n2 ! 621: movb bl, al ! 622: subb bl, $AZERO ! 623: cmpb bl, $9 ! 624: ja csival ! 625: shlb MM_N1(bp), $1 / n1 * 2 ! 626: movb al, MM_N1(bp) / n1 * 2 ! 627: shlb al, $1 / n1 * 4 ! 628: shlb al, $1 / n1 * 8 ! 629: addb al, MM_N1(bp) / n1 * 10 ! 630: addb al, bl / n1 * 10 + digit ! 631: movb MM_N1(bp), al / n1 = (n1 * 10) + digit ! 632: jmp csi_n1 ! 633: ! 634: //////// ! 635: / ! 636: / Csi_n2 state - entered after input sequence ESC [ n ; ! 637: / ! 638: //////// ! 639: ! 640: 0: call exit ! 641: csi_n2: jcxz 0b ! 642: dec cx ! 643: lodsb ! 644: movb bl, al ! 645: subb bl, $AZERO ! 646: cmpb bl, $9 ! 647: ja csival ! 648: shlb MM_N2(bp), $1 / n2 * 2 ! 649: movb al, MM_N2(bp) / n2 * 2 ! 650: shlb al, $1 / n2 * 4 ! 651: shlb al, $1 / n2 * 8 ! 652: addb al, MM_N2(bp) / n2 * 10 ! 653: addb al, bl / n2 * 10 + digit ! 654: movb MM_N2(bp), al / n2 = (n2 * 10) + digit ! 655: jmp csi_n2 ! 656: ! 657: csival: movb bl, al ! 658: shlb bl, $1 ! 659: jc mmputc ! 660: ijmp cs:csitab(bx) ! 661: ! 662: //////// ! 663: / ! 664: / Csi_gt state - entered after input sequence ESC [ > ! 665: / ! 666: //////// ! 667: ! 668: 0: call exit ! 669: csi_gt: jcxz 0b ! 670: dec cx ! 671: lodsb ! 672: movb bl, al ! 673: subb bl, $AZERO ! 674: cmpb bl, $9 ! 675: ja 0f ! 676: shlb MM_N1(bp), $1 / n1 * 2 ! 677: movb al, MM_N1(bp) / n1 * 2 ! 678: shlb al, $1 / n1 * 4 ! 679: shlb al, $1 / n1 * 8 ! 680: addb al, MM_N1(bp) / n1 * 10 ! 681: addb al, bl / n1 * 10 + digit ! 682: movb MM_N1(bp), al / n1 = (n1 * 10) + digit ! 683: jmp csi_gt ! 684: ! 685: 0: cmpb al, $HLOWER ! 686: je mm_cgh ! 687: cmpb al, $LLOWER ! 688: je mm_cgl ! 689: jmp eval ! 690: ! 691: //////// ! 692: / ! 693: / Csi_q state - entered after input sequence ESC [ ? ! 694: / ! 695: //////// ! 696: ! 697: 0: call exit ! 698: csi_q: jcxz 0b ! 699: dec cx ! 700: lodsb ! 701: movb bl, al ! 702: subb bl, $AZERO ! 703: cmpb bl, $9 ! 704: ja 0f ! 705: shlb MM_N1(bp), $1 / n1 * 2 ! 706: movb al, MM_N1(bp) / n1 * 2 ! 707: shlb al, $1 / n1 * 4 ! 708: shlb al, $1 / n1 * 8 ! 709: addb al, MM_N1(bp) / n1 * 10 ! 710: addb al, bl / n1 * 10 + digit ! 711: movb MM_N1(bp), al / n1 = (n1 * 10) + digit ! 712: jmp csi_q ! 713: ! 714: 0: cmpb al, $HLOWER ! 715: je mm_cqh ! 716: cmpb al, $LLOWER ! 717: je mm_cql ! 718: jmp eval ! 719: ! 720: //////// ! 721: / ! 722: / mm_cbt - cursor backward tabulation ! 723: / ! 724: / Moves the active position horizontally in the backward direction ! 725: / to the preceding in a series of predetermined positions. ! 726: / ! 727: //////// ! 728: ! 729: mm_cbt: orb COL, $7 / calculate next tab stop ! 730: incb COL ! 731: subb COL, $16 / step back two tab positions ! 732: jg 0f ! 733: subb COL, COL / cannot step past column 0 ! 734: 0: jmp repos / reposition cursor ! 735: ! 736: //////// ! 737: / ! 738: / mm_cgh - process ESC [ > N1 h escape sequence ! 739: / ! 740: / Recognized sequences: ESC [ > 13 h -- Set CRT saver enabled. ! 741: / ! 742: //////// ! 743: ! 744: mm_cgh: cmpb MM_N1(bp), $13 ! 745: jne 0f ! 746: mov ss:mmcrtsav_, $1 ! 747: 0: jmp eval ! 748: ! 749: //////// ! 750: / ! 751: / mm_cgl - process ESC [ > N1 l escape sequence ! 752: / ! 753: / Recognized sequences: ESC [ > 13 l -- Reset CRT saver. ! 754: / ! 755: //////// ! 756: ! 757: mm_cgl: cmpb MM_N1(bp), $13 ! 758: jne 0f ! 759: mov ss:mmcrtsav_, $0 ! 760: 0: jmp eval ! 761: ! 762: //////// ! 763: / ! 764: / mm_cha - cursor horizontal absolute ! 765: / ! 766: / Advances the active position forward or backward along the active line ! 767: / to the character position specified by the parameter. ! 768: / A parameter value of zero or one moves the active position to the ! 769: / first character position of the active line. ! 770: / A parameter value of N moves the active position to character position ! 771: / N of the active line. ! 772: / ! 773: //////// ! 774: ! 775: mm_cha: movb COL, MM_N1(bp) ! 776: decb COL ! 777: jge 0f ! 778: subb COL, COL ! 779: 0: cmpb COL, $NCOL ! 780: jb 0f ! 781: movb COL, $NCOL-1 ! 782: 0: jmp repos / reposition cursor ! 783: ! 784: ! 785: //////// ! 786: / ! 787: / mm_cht - cursor horizontal tabulation ! 788: / ! 789: / Advances the active position horizontally to the next or following ! 790: / in a series of predetermined positions. ! 791: / ! 792: //////// ! 793: ! 794: mm_cht: push cx ! 795: sub cx, cx ! 796: movb cl, COL ! 797: orb cl, $7 ! 798: incb cl ! 799: subb cl, COL ! 800: addb COL, cl ! 801: movb al, $SPACE ! 802: rep ! 803: stosw ! 804: pop cx ! 805: cmpb COL, $NCOL ! 806: jb 0f ! 807: subb COL, $NCOL ! 808: incb ROW ! 809: cmpb ROW, MM_EROW(bp) ! 810: jna 0f ! 811: movb ROW, MM_EROW(bp) ! 812: jmp scrollup ! 813: 0: jmp eval ! 814: ! 815: //////// ! 816: / ! 817: / mm_cpl - cursor preceding line ! 818: / ! 819: / Moves the active position to the first position of the preceding ! 820: / display line. ! 821: / ! 822: //////// ! 823: ! 824: mm_cpl: subb COL, COL ! 825: decb ROW ! 826: cmpb ROW, MM_BROW(bp) ! 827: jnb 0f ! 828: movb ROW, MM_BROW(bp) ! 829: jmp scrolldown ! 830: 0: jmp repos / reposition cursor ! 831: ! 832: //////// ! 833: / ! 834: / mm_cqh - process ESC [ ? N1 h escape sequence ! 835: / ! 836: / Recognized sequences: ESC [ ? 4 h -- Set smooth scroll. ! 837: / ESC [ ? 7 h -- Set wraparound. ! 838: / ! 839: //////// ! 840: ! 841: mm_cqh: cmpb MM_N1(bp), $4 / Smooth scroll. ! 842: jne 0f ! 843: movb MM_SLOW(bp), $1 ! 844: 0: cmpb MM_N1(bp), $7 / Wraparound. ! 845: jne 0f ! 846: movb MM_WRAP(bp), $1 ! 847: 0: jmp eval ! 848: ! 849: //////// ! 850: / ! 851: / mm_cql - process ESC [ ? N1 l escape sequence ! 852: / ! 853: / Recognized sequences: ESC [ ? 4 l -- Set jump scroll. ! 854: / ESC [ ? 7 l -- Reset wraparound. ! 855: / ! 856: //////// ! 857: ! 858: mm_cql: cmpb MM_N1(bp), $4 / Jump scroll. ! 859: jne 0f ! 860: movb MM_SLOW(bp), $0 ! 861: 0: cmpb MM_N1(bp), $7 / No wraparound. ! 862: jne 0f ! 863: movb MM_WRAP(bp), $0 ! 864: 0: jmp eval ! 865: ! 866: //////// ! 867: / ! 868: / mm_cud - cursor down ! 869: / ! 870: / Moves the active position downward without altering the ! 871: / horizontal position. ! 872: / ! 873: //////// ! 874: ! 875: mm_cud: incb ROW ! 876: cmpb ROW, MM_EROW(bp) ! 877: jna 0f ! 878: movb ROW, MM_EROW(bp) ! 879: 0: jmp repos / reposition cursor ! 880: ! 881: //////// ! 882: / ! 883: / mm_cuf - cursor forward ! 884: / ! 885: / Moves the active position in the forward direction. ! 886: / ! 887: //////// ! 888: ! 889: mm_cuf: incb COL ! 890: cmpb COL, $NCOL ! 891: jb 0f ! 892: subb COL, $NCOL ! 893: incb ROW ! 894: cmpb ROW, MM_EROW(bp) ! 895: jna 0f ! 896: movb ROW, MM_EROW(bp) ! 897: movb COL, $NCOL-1 ! 898: 0: jmp repos ! 899: ! 900: //////// ! 901: / ! 902: / mm_cup - cursor position ! 903: / ! 904: / Moves the active position to the position specified by two parameters. ! 905: / The first parameter (mm_n1) specifies the vertical position (MM_ROW(bp)). ! 906: / The second parameter (mm_n2) specifies the horizontal position (MM_COL(bp)). ! 907: / A parameter value of 0 or 1 for the first or second parameter ! 908: / moves the active position to the first line or column in the ! 909: / display respectively. ! 910: / ! 911: //////// ! 912: ! 913: mm_cup: movb ROW, MM_N1(bp) ! 914: decb ROW ! 915: jg 0f ! 916: subb ROW, ROW ! 917: 0: addb ROW, MM_BROW(bp) ! 918: cmpb ROW, MM_EROW(bp) ! 919: jb 0f ! 920: movb ROW, MM_EROW(bp) ! 921: 0: movb COL, MM_N2(bp) ! 922: decb COL ! 923: jg 0f ! 924: subb COL, COL ! 925: 0: cmpb COL, $NCOL ! 926: jb 0f ! 927: movb COL, $NCOL-1 ! 928: 0: jmp repos / reposition cursor ! 929: ! 930: //////// ! 931: / ! 932: / mm_cuu - cursor up ! 933: / ! 934: / Moves the active position upward without altering the horizontal ! 935: / position. ! 936: / ! 937: //////// ! 938: ! 939: mm_cuu: decb ROW ! 940: cmpb ROW, MM_BROW(bp) ! 941: jge 0f ! 942: movb ROW, MM_BROW(bp) ! 943: 0: jmp repos / reposition cursor ! 944: ! 945: //////// ! 946: / ! 947: / mm_dl - delete line ! 948: / ! 949: / Removes the contents of the active line. ! 950: / The contents of all following lines are shifted in a block ! 951: / toward the active line. ! 952: / ! 953: //////// ! 954: ! 955: mm_dl: push ds ! 956: push si ! 957: push cx ! 958: mov ds, MM_BASE(bp) ! 959: movb bl, ROW ! 960: shlb bl, $1 ! 961: mov di, cs:rowtab(bx) ! 962: mov si, cs:rowtab+2(bx) ! 963: movb bl, MM_EROW(bp) ! 964: shlb bl, $1 ! 965: mov cx, cs:rowtab(bx) ! 966: sub cx, di ! 967: jle 0f ! 968: shr cx, $1 ! 969: rep ! 970: movsw ! 971: mov di, cs:rowtab(bx) ! 972: mov cx, $NCOL ! 973: movb al, $SPACE ! 974: rep ! 975: stosw ! 976: subb COL, COL ! 977: movb bl, ROW ! 978: shlb bl, $1 ! 979: mov di, cs:rowtab(bx) ! 980: 0: pop cx ! 981: pop si ! 982: pop ds ! 983: call exit ! 984: jmp eval ! 985: ! 986: //////// ! 987: / ! 988: / mm_dmi - disable manual input ! 989: / ! 990: / Set flag preventing keyboard input, and causing cursor to vanish. ! 991: / ! 992: //////// ! 993: ! 994: mm_dmi: ! 995: mov ss:islock_, $1 ! 996: jmp eval ! 997: ! 998: //////// ! 999: / ! 1000: / mm_ea - erase in area ! 1001: / ! 1002: / Erase some or all of the characters in the currently active area ! 1003: / according to the parameter: ! 1004: / 0 - erase from active position to end inclusive (default) ! 1005: / 1 - erase from start to active position inclusive ! 1006: / 2 - erase all of active area ! 1007: / ! 1008: //////// ! 1009: ! 1010: mm_ea: movb al, MM_N1(bp) ! 1011: cmpb al, $0 ! 1012: jne 0f ! 1013: movb bl, MM_EROW(bp) ! 1014: jmp mm_e0 ! 1015: 0: cmpb al, $1 ! 1016: jne 0f ! 1017: movb bl, MM_BROW(bp) ! 1018: jmp mm_e1 ! 1019: 0: subb COL, COL ! 1020: movb ROW, MM_BROW(bp) ! 1021: movb bl, ROW ! 1022: shlb bl, $1 ! 1023: mov POS, cs:rowtab(bx) ! 1024: movb bl, MM_EROW(bp) ! 1025: subb bl, ROW ! 1026: jmp mm_e2 ! 1027: ! 1028: ! 1029: //////// ! 1030: / ! 1031: / mm_ed - erase in display ! 1032: / ! 1033: / Erase some or all of the characters in the display according to the ! 1034: / parameter ! 1035: / 0 - erase from active position to end inclusive (default) ! 1036: / 1 - erase from start to active position inclusive ! 1037: / 2 - erase all of display ! 1038: / ! 1039: //////// ! 1040: ! 1041: mm_ed: movb al, MM_N1(bp) ! 1042: cmpb al, $0 ! 1043: jne 0f ! 1044: movb bl, MM_LROW(bp) ! 1045: jmp mm_e0 ! 1046: 0: cmpb al, $1 ! 1047: jne 0f ! 1048: subb bl, bl ! 1049: jmp mm_e1 ! 1050: 0: subb COL, COL ! 1051: movb ROW, MM_BROW(bp) ! 1052: sub POS, POS ! 1053: movb bl, MM_LROW(bp) ! 1054: jmp mm_e2 ! 1055: ! 1056: //////// ! 1057: / ! 1058: / mm_el - erase in line ! 1059: / ! 1060: / Erase some or all of the characters in the line according to the ! 1061: / parameter: ! 1062: / 0 - erase from active position to end inclusive (default) ! 1063: / 1 - erase from start to active position inclusive ! 1064: / 2 - erase entire line ! 1065: / ! 1066: //////// ! 1067: ! 1068: mm_el: movb al, MM_N1(bp) ! 1069: movb bl, ROW ! 1070: cmpb al, $0 ! 1071: je mm_e0 ! 1072: cmpb al, $1 ! 1073: je mm_e1 ! 1074: shlb bl, $1 ! 1075: mov POS, cs:rowtab(bx) ! 1076: subb COL, COL ! 1077: subb bl, bl ! 1078: / jmp mm_e2 ! 1079: ! 1080: mm_e2: push cx ! 1081: movb al, $SPACE ! 1082: 0: mov cx, $NCOL ! 1083: rep ! 1084: stosw ! 1085: decb bl ! 1086: jge 0b ! 1087: pop cx ! 1088: jmp repos ! 1089: ! 1090: mm_e1: push cx ! 1091: mov cx, POS ! 1092: shlb bl, $1 ! 1093: mov POS, cs:rowtab(bx) ! 1094: sub cx, POS ! 1095: jl 0f ! 1096: movb al, $SPACE ! 1097: shr cx, $1 ! 1098: rep ! 1099: stosw ! 1100: 0: pop cx ! 1101: jmp repos ! 1102: ! 1103: mm_e0: push cx ! 1104: shlb bl, $1 ! 1105: mov cx, cs:rowtab+2(bx) ! 1106: sub cx, POS ! 1107: jl 0f ! 1108: movb al, $SPACE ! 1109: shr cx, $1 ! 1110: rep ! 1111: stosw ! 1112: 0: pop cx ! 1113: jmp repos ! 1114: ! 1115: //////// ! 1116: / ! 1117: / mm_emi - enable manual input ! 1118: / ! 1119: / Clear flag preventing keyboard input. ! 1120: / ! 1121: //////// ! 1122: ! 1123: mm_emi: ! 1124: mov ss:islock_, $0 ! 1125: jmp eval ! 1126: ! 1127: //////// ! 1128: / ! 1129: / mm_il - insert line ! 1130: / ! 1131: / Insert a erased line at the active line by shifting the contents ! 1132: / of the active line and all following lines away from the active line. ! 1133: / The contents of the last line in the scrolling region are removed. ! 1134: / ! 1135: //////// ! 1136: ! 1137: scrolldown: ! 1138: mm_il: push ds ! 1139: push si ! 1140: push cx ! 1141: mov ds, MM_BASE(bp) ! 1142: movb bl, MM_EROW(bp) ! 1143: shlb bl, $1 ! 1144: mov si, cs:rowtab(bx) ! 1145: mov cx, si ! 1146: sub si, $2 ! 1147: mov di, cs:rowtab+2(bx) ! 1148: sub di, $2 ! 1149: movb bl, ROW ! 1150: shlb bl, $1 ! 1151: sub cx, cs:rowtab(bx) ! 1152: jle 0f ! 1153: shr cx, $1 ! 1154: std ! 1155: rep ! 1156: movsw ! 1157: mov di, cs:rowtab(bx) ! 1158: mov cx, $NCOL ! 1159: movb al, $SPACE ! 1160: cld ! 1161: rep ! 1162: stosw ! 1163: subb COL, COL ! 1164: movb bl, ROW ! 1165: shlb bl, $1 ! 1166: mov di, cs:rowtab(bx) ! 1167: 0: pop cx ! 1168: pop si ! 1169: pop ds ! 1170: call exit ! 1171: jmp eval ! 1172: ! 1173: //////// ! 1174: / ! 1175: / mm_hpa - horizontal position absolute ! 1176: / ! 1177: / Moves the active position within the active line to the position ! 1178: / specified by the parameter. A parameter value of zero or one ! 1179: / moves the active position to the first position of the active line. ! 1180: / ! 1181: //////// ! 1182: ! 1183: mm_hpa: movb COL, MM_N1(bp) ! 1184: decb COL ! 1185: jg 0f ! 1186: subb COL, COL ! 1187: 0: cmpb COL, $NCOL ! 1188: jb 0f ! 1189: movb COL, $NCOL-1 ! 1190: 0: jmp repos / reposition cursor ! 1191: ! 1192: //////// ! 1193: / ! 1194: / mm_hpr - horizontal position relative ! 1195: / ! 1196: / Moves the active position forward the number of positions specified ! 1197: / by the parameter. A parameter value of zero or one indicates a ! 1198: / single-position move. ! 1199: / ! 1200: //////// ! 1201: ! 1202: mm_hpr: movb al, MM_N1(bp) ! 1203: orb al, al ! 1204: jne 0f ! 1205: incb al ! 1206: 0: addb COL, al ! 1207: cmpb COL, $NCOL ! 1208: jb 0f ! 1209: movb COL, $NCOL-1 ! 1210: 0: jmp repos / reposition cursor ! 1211: ! 1212: //////// ! 1213: / ! 1214: / mm_hvp - horizontal and vertical position ! 1215: / ! 1216: / Moves the active position to the position specified by two parameters. ! 1217: / The first parameter specifies the vertical position (MM_ROW(bp)). ! 1218: / The second parameter specifies the horizontal position (MM_COL(bp)). ! 1219: / A parameter value of zero or one moves the active position to the ! 1220: / first line or column in the display. ! 1221: / ! 1222: //////// ! 1223: ! 1224: mm_hvp: movb ROW, MM_N1(bp) ! 1225: decb ROW ! 1226: jg 0f ! 1227: subb ROW, ROW ! 1228: 0: cmpb ROW, MM_LROW(bp) ! 1229: jna 0f ! 1230: movb ROW, MM_LROW(bp) ! 1231: 0: movb COL, MM_N2(bp) ! 1232: decb COL ! 1233: jg 0f ! 1234: subb COL, COL ! 1235: 0: cmpb COL, $NCOL ! 1236: jb 0f ! 1237: movb COL, $NCOL-1 ! 1238: 0: jmp repos / reposition cursor ! 1239: ! 1240: //////// ! 1241: / ! 1242: / mm_ind - index ! 1243: / ! 1244: / Causes the active position to move downward one line without changing ! 1245: / the horizontal position. Scrolling occurs if below scrolling region. ! 1246: / ! 1247: //////// ! 1248: ! 1249: mm_ind: incb ROW ! 1250: cmpb ROW, MM_EROW(bp) ! 1251: jg 0f ! 1252: jmp repos ! 1253: 0: movb ROW, MM_EROW(bp) ! 1254: jmp scrollup ! 1255: ! 1256: //////// ! 1257: / ! 1258: / mm_new - save cursor position ! 1259: / ! 1260: //////// ! 1261: ! 1262: mm_new: movb MM_SCOL(bp), COL ! 1263: movb MM_SROW(bp), ROW ! 1264: jmp eval ! 1265: ! 1266: //////// ! 1267: / ! 1268: / mm_old - restore old cursor position ! 1269: / ! 1270: //////// ! 1271: ! 1272: mm_old: movb COL, MM_SCOL(bp) ! 1273: movb ROW, MM_SROW(bp) ! 1274: jmp repos ! 1275: ! 1276: //////// ! 1277: / ! 1278: / mm_ri - reverse index ! 1279: / ! 1280: / Moves the active position to the same horizontal position on the ! 1281: / preceding line. Scrolling occurs if above scrolling region. ! 1282: / ! 1283: //////// ! 1284: ! 1285: mm_ri: decb ROW ! 1286: cmpb ROW, MM_BROW(bp) ! 1287: jge 0f ! 1288: movb ROW, MM_BROW(bp) ! 1289: jmp scrolldown ! 1290: 0: jmp repos ! 1291: ! 1292: //////// ! 1293: / ! 1294: / mm_scr - select cursor rendition ! 1295: / ! 1296: / Invokes the cursor rendition specified by the parameter. ! 1297: / ! 1298: / Recognized renditions are: 0 - cursor visible ! 1299: / 1 - cursor invisible ! 1300: //////// ! 1301: ! 1302: mm_scr: decb MM_N1(bp) ! 1303: je 0f ! 1304: jg 1f ! 1305: mov MM_INVIS(bp), $0 ! 1306: jmp eval ! 1307: ! 1308: 0: mov MM_INVIS(bp), $-1 ! 1309: 1: jmp eval ! 1310: ! 1311: //////// ! 1312: / ! 1313: / mm_sgr - select graphic rendition ! 1314: / ! 1315: / Invokes the graphic rendition specified by the parameter. ! 1316: / All following characters in the data stream are rendered ! 1317: / according to the parameters until the next occurrence of ! 1318: / SGR in the data stream. ! 1319: / ! 1320: / Recognized renditions are: 1 - high intensity ! 1321: / 4 - underline ! 1322: / 5 - slow blink ! 1323: / 7 - reverse video ! 1324: / 8 - concealed on ! 1325: / 30-37 - foreground color ! 1326: / 40-47 - background color ! 1327: / 50-57 - border color ! 1328: / ! 1329: //////// ! 1330: ! 1331: mm_sgr: movb al, MM_N1(bp) ! 1332: ! 1333: cmpb al, $0 / reset all = 0 ! 1334: jne 0f ! 1335: movb ATTR, $0x07 ! 1336: 1: jmp eval ! 1337: ! 1338: 0: cmpb al, $1 / bold = 1 ! 1339: jne 0f ! 1340: orb ATTR, $INTENSE ! 1341: jmp 1b ! 1342: ! 1343: 0: cmpb al, $4 / underline = 4 ! 1344: jne 0f ! 1345: cmp MM_PORT(bp), $0x03D4 / color card? ! 1346: je 1b / yes, ignore underline ! 1347: andb ATTR, $~0x77 ! 1348: orb ATTR, $0x01 ! 1349: jmp 1b ! 1350: ! 1351: 0: cmpb al, $5 / blinking = 5 ! 1352: jne 0f ! 1353: orb ATTR, $BLINK ! 1354: jmp 1b ! 1355: ! 1356: 0: cmpb al, $7 / reverse video = 7 ! 1357: jne 0f ! 1358: movb al, $0x70 ! 1359: cmp MM_PORT(bp), $0x3D4 / color card? ! 1360: jne 2f ! 1361: movb al, ATTR / yes, exchange foreground/background ! 1362: andb al, $0x77 ! 1363: rolb al, $1 ! 1364: rolb al, $1 ! 1365: rolb al, $1 ! 1366: rolb al, $1 ! 1367: 2: andb ATTR, $~0x77 ! 1368: orb ATTR, al ! 1369: jmp 1b ! 1370: ! 1371: 0: cmpb al, $8 / concealed on = 8 ! 1372: jne 0f ! 1373: cmp MM_PORT(bp), $0x3D4 / color card? ! 1374: jne 2f ! 1375: ! 1376: andb ATTR, $0x70 / Yes, Set foreground color ! 1377: movb al, ATTR / to background color. ! 1378: rorb al, $1 ! 1379: rorb al, $1 ! 1380: rorb al, $1 ! 1381: rorb al, $1 ! 1382: orb ATTR, al ! 1383: jmp 1b ! 1384: ! 1385: 2: andb ATTR, $0x80 / No, set attributes to non-display. ! 1386: jmp 1b / retain blink attribute. ! 1387: ! 1388: 0: cmp MM_PORT(bp), $0x03D4 / color card? ! 1389: jne 1b / no, ignore remaining options ! 1390: 0: subb al, $30 / foreground color ! 1391: jl 1f ! 1392: cmpb al, $7 ! 1393: jg 0f ! 1394: movb bl, al ! 1395: andb ATTR, $~0x07 ! 1396: orb ATTR, cs:fcolor(bx) ! 1397: jmp 1f ! 1398: 0: subb al, $10 ! 1399: jl 1f ! 1400: cmpb al, $7 ! 1401: jg 0f ! 1402: movb bl, al ! 1403: andb ATTR, $~0x70 ! 1404: orb ATTR, cs:bcolor(bx) ! 1405: jmp 1f ! 1406: 0: subb al, $10 ! 1407: jl 1f ! 1408: cmpb al, $7 ! 1409: jg 0f ! 1410: movb bl, al ! 1411: movb al, cs:fcolor(bx) ! 1412: push dx ! 1413: mov dx, MM_PORT(bp) ! 1414: add dx, $5 ! 1415: outb dx, al ! 1416: pop dx ! 1417: / jmp 1f ! 1418: 0: ! 1419: 1: jmp eval ! 1420: ! 1421: //////// ! 1422: / ! 1423: / mm_ssr - set scrolling region ! 1424: / ! 1425: //////// ! 1426: ! 1427: mm_ssr: movb al, MM_N1(bp) ! 1428: decb al ! 1429: jge 0f ! 1430: subb al, al ! 1431: 0: cmpb al, MM_LROW(bp) ! 1432: ja 1f ! 1433: movb bl, MM_N2(bp) ! 1434: decb bl ! 1435: jge 0f ! 1436: subb bl, bl ! 1437: 0: cmpb bl, MM_LROW(bp) ! 1438: ja 1f ! 1439: cmpb al, bl ! 1440: ja 1f ! 1441: movb MM_BROW(bp), al ! 1442: movb MM_EROW(bp), bl ! 1443: movb ROW, al ! 1444: subb COL, COL ! 1445: 1: jmp repos ! 1446: ! 1447: //////// ! 1448: / ! 1449: / mm_vpa - vertical position absolute ! 1450: / ! 1451: / Moves the active position to the line specified by the parameter ! 1452: / without changing the horizontal position. ! 1453: / A parameter value of 0 or 1 moves the active position vertically ! 1454: / to the first line. ! 1455: / ! 1456: //////// ! 1457: ! 1458: mm_vpa: movb ROW, MM_N1(bp) ! 1459: decb ROW ! 1460: jg 0f ! 1461: subb ROW, ROW ! 1462: 0: cmpb ROW, MM_LROW(bp) ! 1463: jna 0f ! 1464: movb ROW, MM_LROW(bp) ! 1465: 0: jmp repos / reposition cursor ! 1466: ! 1467: //////// ! 1468: / ! 1469: / mm_vpr - vertical position relative ! 1470: / ! 1471: / Moves the active position downward the number of lines specified ! 1472: / by the parameter without changing the horizontal position. ! 1473: / A parameter value of zero or one moves the active position ! 1474: / one line downward. ! 1475: / ! 1476: //////// ! 1477: ! 1478: mm_vpr: movb al, MM_N1(bp) ! 1479: orb al, al ! 1480: jne 0f ! 1481: incb al ! 1482: 0: addb ROW, al ! 1483: cmpb ROW, MM_LROW(bp) ! 1484: jb 0f ! 1485: movb ROW, MM_LROW(bp) ! 1486: 0: jmp repos / reposition cursor ! 1487: ! 1488: //////// ! 1489: / ! 1490: / asctab - table of functions indexed by ascii characters ! 1491: / ! 1492: //////// ! 1493: ! 1494: asctab: .word eval, eval, eval, eval /* NUL SOH STX ETX */ ! 1495: .word eval, eval, eval, mmbell /* EOT ENQ ACK BEL */ ! 1496: .word mm_cub, mm_cht, mm_cnl, mm_ind /* BS HT LF VT */ ! 1497: .word eval, mm_cr, eval, eval /* FF CR SO SI */ ! 1498: .word eval, eval, eval, eval /* DLE DC1 DC2 DC3 */ ! 1499: .word eval, eval, eval, eval /* DC4 NAK SYN ETB */ ! 1500: .word eval, eval, eval, mm_esc /* CAN EM SUB ESC */ ! 1501: .word eval, eval, eval, eval /* FS GS RS US */ ! 1502: .word mmputc, mmputc, mmputc, mmputc /* ! " # \040 - \043 */ ! 1503: .word mmputc, mmputc, mmputc, mmputc /* $ % & quote \044 - \047 */ ! 1504: .word mmputc, mmputc, mmputc, mmputc /* ( ) * + \050 - \053 */ ! 1505: .word mmputc, mmputc, mmputc, mmputc /* , - . / \054 - \057 */ ! 1506: .word mmputc, mmputc, mmputc, mmputc /* 0 1 2 3 \060 - \063 */ ! 1507: .word mmputc, mmputc, mmputc, mmputc /* 4 5 6 7 \064 - \067 */ ! 1508: .word mmputc, mmputc, mmputc, mmputc /* 8 9 : ; \070 - \073 */ ! 1509: .word mmputc, mmputc, mmputc, mmputc /* < = > ? \074 - \077 */ ! 1510: .word mmputc, mmputc, mmputc, mmputc /* @ A B C \100 - \103 */ ! 1511: .word mmputc, mmputc, mmputc, mmputc /* D E F G \104 - \107 */ ! 1512: .word mmputc, mmputc, mmputc, mmputc /* H I J K \110 - \113 */ ! 1513: .word mmputc, mmputc, mmputc, mmputc /* L M N O \114 - \117 */ ! 1514: .word mmputc, mmputc, mmputc, mmputc /* P Q R S \120 - \123 */ ! 1515: .word mmputc, mmputc, mmputc, mmputc /* T U V W \124 - \127 */ ! 1516: .word mmputc, mmputc, mmputc, mmputc /* X Y Z [ \130 - \133 */ ! 1517: .word mmputc, mmputc, mmputc, mmputc /* \ ] ^ _ \134 - \137 */ ! 1518: .word mmputc, mmputc, mmputc, mmputc /* ` a b c \140 - \143 */ ! 1519: .word mmputc, mmputc, mmputc, mmputc /* d e f g \144 - \147 */ ! 1520: .word mmputc, mmputc, mmputc, mmputc /* h i j k \150 - \153 */ ! 1521: .word mmputc, mmputc, mmputc, mmputc /* l m n o \154 - \157 */ ! 1522: .word mmputc, mmputc, mmputc, mmputc /* p q r s \160 - \163 */ ! 1523: .word mmputc, mmputc, mmputc, mmputc /* t u v w \164 - \167 */ ! 1524: .word mmputc, mmputc, mmputc, mmputc /* x y z { \170 - \173 */ ! 1525: .word mmputc, mmputc, mmputc, mmputc /* | } ~ ? \174 - \177 */ ! 1526: ! 1527: //////// ! 1528: / ! 1529: / esctab - table of functions indexed by ESC characters. ! 1530: / ! 1531: //////// ! 1532: ! 1533: esctab: .word mmputc, mmputc, mmputc, mmputc /* NUL SOH STX ETX */ ! 1534: .word mmputc, mmputc, mmputc, mmputc /* EOT ENQ ACK BEL */ ! 1535: .word mmputc, mmputc, mmputc, mmputc /* BS HT LF VT */ ! 1536: .word mmputc, mmputc, mmputc, mmputc /* FF CR SO SI */ ! 1537: .word mmputc, mmputc, mmputc, mmputc /* DLE DC1 DC2 DC3 */ ! 1538: .word mmputc, mmputc, mmputc, mmputc /* DC4 NAK SYN ETB */ ! 1539: .word mmputc, mmputc, mmputc, mmputc /* CAN EM SUB ESC */ ! 1540: .word mmputc, mmputc, mmputc, mmputc /* FS GS RS US */ ! 1541: .word eval, eval, eval, eval /* ! " # \040 - \043 */ ! 1542: .word eval, eval, eval, eval /* $ % & quote \044 - \047 */ ! 1543: .word eval, eval, eval, eval /* ( ) * + \050 - \053 */ ! 1544: .word eval, eval, eval, eval /* , - . / \054 - \057 */ ! 1545: .word eval, eval, eval, eval /* 0 1 2 3 \060 - \063 */ ! 1546: .word eval, eval, eval, mm_new /* 4 5 6 7 \064 - \067 */ ! 1547: .word mm_old, eval, eval, eval /* 8 9 : ; \070 - \073 */ ! 1548: .word eval, mmspec, mmspec, eval /* < = > ? \074 - \077 */ ! 1549: .word eval, eval, eval, eval /* @ A B C \100 - \103 */ ! 1550: .word mm_ind, mm_cnl, eval, eval /* D E F G \104 - \107 */ ! 1551: .word eval, eval, eval, eval /* H I J K \110 - \113 */ ! 1552: .word eval, mm_ri, eval, eval /* L M N O \114 - \117 */ ! 1553: .word eval, eval, eval, eval /* P Q R S \120 - \123 */ ! 1554: .word eval, eval, eval, eval /* T U V W \124 - \127 */ ! 1555: .word eval, eval, eval, csi_n1 /* X Y Z [ \130 - \133 */ ! 1556: .word eval, eval, eval, eval /* \ ] ^ _ \134 - \137 */ ! 1557: .word mm_dmi, eval, mm_emi, mminit2 /* quote a b c \140 - \143 */ ! 1558: .word eval, eval, eval, eval /* d e f g \144 - \147 */ ! 1559: .word eval, eval, eval, eval /* h i j k \150 - \153 */ ! 1560: .word eval, eval, eval, eval /* l m n o \154 - \157 */ ! 1561: .word eval, eval, eval, eval /* p q r s \160 - \163 */ ! 1562: .word mmspec, mmspec, eval, eval /* t u v w \164 - \167 */ ! 1563: .word eval, eval, eval, eval /* x y z { \170 - \173 */ ! 1564: .word eval, eval, eval, eval /* | } ~ ? \174 - \177 */ ! 1565: ! 1566: ! 1567: //////// ! 1568: / ! 1569: / csitab - table of functions indexed by ESC [ characters. ! 1570: / ! 1571: //////// ! 1572: ! 1573: csitab: .word eval, eval, eval, eval /* NUL SOH STX ETX */ ! 1574: .word eval, eval, eval, eval /* EOT ENQ ACK BEL */ ! 1575: .word eval, eval, eval, eval /* BS HT LF VT */ ! 1576: .word eval, eval, eval, eval /* FF CR SO SI */ ! 1577: .word eval, eval, eval, eval /* DLE DC1 DC2 DC3 */ ! 1578: .word eval, eval, eval, eval /* DC4 NAK SYN ETB */ ! 1579: .word eval, eval, eval, eval /* CAN EM SUB ESC */ ! 1580: .word eval, eval, eval, eval /* FS GS RS US */ ! 1581: .word eval, eval, eval, eval /* ! " # \040 - \043 */ ! 1582: .word eval, eval, eval, eval /* $ % & quote \044 - \047 */ ! 1583: .word eval, eval, eval, eval /* ( ) * + \050 - \053 */ ! 1584: .word eval, eval, eval, eval /* , - . / \054 - \057 */ ! 1585: .word eval, eval, eval, eval /* 0 1 2 3 \060 - \063 */ ! 1586: .word eval, eval, eval, eval /* 4 5 6 7 \064 - \067 */ ! 1587: .word eval, eval, eval, eval /* 8 9 : ; \070 - \073 */ ! 1588: .word eval, eval, csi_gt, csi_q /* < = > ? \074 - \077 */ ! 1589: .word eval, mm_cuu, mm_cud, mm_cuf /* @ A B C \100 - \103 */ ! 1590: .word mm_cub, mm_cnl, mm_cpl, mm_cha /* D E F G \104 - \107 */ ! 1591: .word mm_cup, mm_cht, mm_ed, mm_el /* H I J K \110 - \113 */ ! 1592: .word mm_il, mm_dl, eval, mm_ea /* L M N O \114 - \117 */ ! 1593: .word eval, eval, eval, mm_ind /* P Q R S \120 - \123 */ ! 1594: .word mm_ri, eval, eval, eval /* T U V W \124 - \127 */ ! 1595: .word eval, eval, mm_cbt, eval /* X Y Z [ \130 - \133 */ ! 1596: .word eval, eval, eval, eval /* \ ] ^ _ \134 - \137 */ ! 1597: .word mm_hpa, mm_hpr, eval, eval /* ` a b c \140 - \143 */ ! 1598: .word mm_vpa, mm_vpr, mm_hvp, mm_cup /* d e f g \144 - \147 */ ! 1599: .word eval, eval, eval, eval /* h i j k \150 - \153 */ ! 1600: .word eval, mm_sgr, eval, eval /* l m n o \154 - \157 */ ! 1601: .word eval, eval, mm_ssr, eval /* p q r s \160 - \163 */ ! 1602: .word eval, eval, mm_scr, eval /* t u v w \164 - \167 */ ! 1603: .word eval, eval, eval, eval /* x y z { \170 - \173 */ ! 1604: .word eval, eval, eval, eval /* | } ~ ? \174 - \177 */ ! 1605: ! 1606: //////// ! 1607: / ! 1608: / coltab - integer array of offsets to each column ! 1609: / ! 1610: //////// ! 1611: ! 1612: coltab: .word 0*NCB, 1*NCB, 2*NCB, 3*NCB ! 1613: .word 4*NCB, 5*NCB, 6*NCB, 7*NCB ! 1614: .word 8*NCB, 9*NCB, 10*NCB, 11*NCB ! 1615: .word 12*NCB, 13*NCB, 14*NCB, 15*NCB ! 1616: .word 16*NCB, 17*NCB, 18*NCB, 19*NCB ! 1617: .word 20*NCB, 21*NCB, 22*NCB, 23*NCB ! 1618: .word 24*NCB, 25*NCB, 26*NCB, 27*NCB ! 1619: .word 28*NCB, 29*NCB, 30*NCB, 31*NCB ! 1620: .word 32*NCB, 33*NCB, 34*NCB, 35*NCB ! 1621: .word 36*NCB, 37*NCB, 38*NCB, 39*NCB ! 1622: .word 40*NCB, 41*NCB, 42*NCB, 43*NCB ! 1623: .word 44*NCB, 45*NCB, 46*NCB, 47*NCB ! 1624: .word 48*NCB, 49*NCB, 50*NCB, 51*NCB ! 1625: .word 52*NCB, 53*NCB, 54*NCB, 55*NCB ! 1626: .word 56*NCB, 57*NCB, 58*NCB, 59*NCB ! 1627: .word 60*NCB, 61*NCB, 62*NCB, 63*NCB ! 1628: .word 64*NCB, 65*NCB, 66*NCB, 67*NCB ! 1629: .word 68*NCB, 69*NCB, 70*NCB, 71*NCB ! 1630: .word 72*NCB, 73*NCB, 74*NCB, 75*NCB ! 1631: .word 76*NCB, 77*NCB, 78*NCB, 79*NCB ! 1632: ! 1633: //////// ! 1634: / ! 1635: / rowtab - array of offsets to each row ! 1636: / ! 1637: //////// ! 1638: ! 1639: rowtab: .word 0*NRB, 1*NRB, 2*NRB, 3*NRB ! 1640: .word 4*NRB, 5*NRB, 6*NRB, 7*NRB ! 1641: .word 8*NRB, 9*NRB, 10*NRB, 11*NRB ! 1642: .word 12*NRB, 13*NRB, 14*NRB, 15*NRB ! 1643: .word 16*NRB, 17*NRB, 18*NRB, 19*NRB ! 1644: .word 20*NRB, 21*NRB, 22*NRB, 23*NRB ! 1645: .word 24*NRB, 25*NRB, 26*NRB, 27*NRB ! 1646: .word 28*NRB, 29*NRB, 30*NRB, 31*NRB ! 1647: ! 1648: //////// ! 1649: / ! 1650: / fcolor - foreground color ! 1651: / bcolor - background color ! 1652: / ! 1653: / indexed by ansi color (black,red,green,brown,blue,magenta,cyan,white) ! 1654: / yields graphics color (black,blue,green,cyan,red,magenta,brown,white) ! 1655: / which is properly shifted for installation in attribute byte. ! 1656: / ! 1657: //////// ! 1658: ! 1659: fcolor: .byte 0x00, 0x04, 0x02, 0x06, 0x01, 0x05, 0x03, 0x07 ! 1660: bcolor: .byte 0x00, 0x40, 0x20, 0x60, 0x10, 0x50, 0x30, 0x70 ! 1661: ! 1662: //////// ! 1663: / ! 1664: / mm_voff() -- turn video display off ! 1665: / ! 1666: //////// ! 1667: .globl mm_voff_ ! 1668: mm_voff_: ! 1669: mov dx, mmdata+MM_PORT ! 1670: add dx, $4 ! 1671: movb al, $0x21 ! 1672: outb dx, al ! 1673: ret ! 1674: ! 1675: //////// ! 1676: / ! 1677: / mm_von() -- turn video display on ! 1678: / ! 1679: //////// ! 1680: .globl mm_von_ ! 1681: mm_von_: ! 1682: mov dx, mmdata+MM_PORT / enable video display ! 1683: add dx, $4 ! 1684: movb al, $0x29 ! 1685: outb dx, al ! 1686: mov mmvcnt_, $900 / 900 seconds before video disabled ! 1687: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.