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