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