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