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