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