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