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