|
|
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.