|
|
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: .globl grread_
7: .globl grwrite_
8: .globl mmgo_
9:
10: ////////
11: /
12: / State driven code
13: /
14: / Input: DS:SI - input string
15: / ES:DI - current screen location
16: / SS:BP - terminal attributes
17: / CX - input count
18: / BP - references terminal information
19: / AL - character
20: / BH - (usually) kept zeroed for efficiency
21: / DH - current row
22: / DL - current column
23: /
24: ////////
25:
26: #ifdef HERCULES
27: VSEG = 0xB000 / Video Display Segment
28: BANKSZ = 8192 / Size of Display Banks
29: LROW = 24 / Last legal row
30: NCR = 8 / number of horizontal lines per char
31: NCR2 = 4 / number of horizontal lines per char / 2
32: NCR4 = 2 / number of horizontal lines per char / 4
33: NHB = 90 / number of horizontal bytes per line
34: #else
35: #ifdef TECMAR
36: VSEG = 0xA000 / Video Display Segment
37: BANKSZ = 32768 / Size of Display Banks
38: LROW = 24 / Last legal row
39: NCR = 16 / number of horizontal lines per char
40: NCR2 = 8 / number of horizontal lines per char / 2
41: NCR4 = 4 / number of horizontal lines per char / 4
42: NHB = 80 / number of horizontal bytes per line
43: #else
44: VSEG = 0xB800 / Video Display Segment
45: BANKSZ = 8192 / Size of Display Banks
46: LROW = 24 / Last legal row
47: NCR = 8 / number of horizontal lines per char
48: NCR2 = 4 / number of horizontal lines per char / 2
49: NCR4 = 2 / number of horizontal lines per char / 4
50: NHB = 80 / number of horizontal bytes per line
51: #endif
52: #endif
53:
54: NRB = NHB*NCR / number of bytes per character row
55: NRB2 = NHB*NCR2 / number of bytes per character row / 2
56: NRB4 = NHB*NCR4 / number of bytes per character row / 4
57:
58:
59: ZERO = bh / (almost) always zero
60: ROW = dh / currently active vertical position
61: COL = dl / currently active horizontal position
62: POS = di / currently active display address
63:
64: CSR = 0x3D9 / Color Select Register
65: MSR = 0x3D8 / Mode Select Register
66: XMSR = 0x3DA / Extended Mode Select Register
67:
68:
69: ////////
70: /
71: / Magic constants from <sys/io.h>
72: /
73: ////////
74:
75: IO_SEG = 0
76: IO_IOC = 2
77: IO_SEEK = 4
78: IO_BASE = 8
79:
80: IOSYS = 0
81:
82: ////////
83: /
84: / Data
85: /
86: ////////
87:
88: MM_FUNC = 0 / current state
89: MM_PORT = 2 / adapter base i/o port
90: MM_BASE = 4 / adapter base memory address
91: MM_ROW = 6 / screen row
92: MM_COL = 7 / screen column
93: MM_POS = 8 / screen position
94: MM_ATTR = 10 / attributes
95: MM_N1 = 11 / numeric argument 1
96: MM_N2 = 12 / numeric argument 2
97: MM_BROW = 13 / base row
98: MM_EROW = 14 / end row
99: MM_LROW = 15 / legal row limit
100: MM_SROW = 16 / saved cursor row
101: MM_SCOL = 17 / saved cursor column
102: MM_IBROW = 18 / initial base row
103: MM_IEROW = 19 / initial end row
104: MM_FLIP = 20
105: MM_MASK = 22
106: MM_ULINE = 24
107: MM_CURSE = 26
108: MM_VIS = 28 / set to -1 to make cursor visible
109: MM_NCOL = 30
110: MM_WRAP = 31
111:
112: / ASCII characters
113: AZERO = 0x30
114: CLOWER = 0x63
115: HLOWER = 0x68
116: LLOWER = 0x6C
117: SEMIC = 0x3B
118:
119: .prvd
120: mmdata: .word mminit, 0x03D4, VSEG
121: .byte 0, 0
122: .word 0
123: .byte 0x7, 0, 0, 0, LROW-1, LROW, 0, 0, 0, LROW-1
124: .word 0, -1, 0, 0xff
125: .word 0
126: .byte 80
127: .byte 1
128:
129: .shri
130: #ifdef HERCULES
131: crtdata:.byte 54, 45, 45, 8, 91, 1, 86, 88
132: .byte 2, 3, 32, 0, 0, 0, 0, 0
133: #else
134: #ifdef TECMAR
135: crtdata:.byte 56, 40, 43, 8, 127, 6, 100, 112
136: .byte 3, 1, 32, 0, 0, 0, 0, 0
137: #else
138: crtdata:.byte 56, 40, 43, 8, 127, 6, 100, 112
139: .byte 2, 1, 32, 0, 0, 0, 0, 0
140: #endif
141: #endif
142: .shri
143:
144: ////////
145: /
146: / mmgo( iop ) - Entry point for text stream output
147: / IO *iop;
148: /
149: ////////
150:
151: mmgo_:
152: push si
153: push di
154: push bp
155: mov bp, sp
156: push ds
157: push es
158: cld
159: mov bx, 8(bp) / iop
160: mov si, IO_BASE(bx) / iop->io_base
161: mov cx, IO_IOC(bx) / iop->io_ioc
162: cmp IO_SEG(bx), $IOSYS
163: je 0f
164: mov bx, uds_
165: mov ds, bx
166: 0: mov bp, $mmdata
167: movb ROW, MM_ROW(bp)
168: movb COL, MM_COL(bp)
169: mov es, MM_BASE(bp)
170: mov POS, MM_POS(bp)
171: mov ax, MM_CURSE(bp)
172: and ax, MM_VIS(bp)
173: #ifdef TECMAR
174: xor es:[NHB*6](POS), ax
175: xor es:[NHB*6]+BANKSZ(POS), ax
176: xor es:[NHB*7](POS), ax
177: xor es:[NHB*7]+BANKSZ(POS), ax
178: #else
179: xor es:[NHB*3](POS), ax / turn cursor off
180: xor es:[NHB*3]+BANKSZ(POS), ax
181: #endif
182: sub bx, bx
183: ijmp MM_FUNC(bp)
184:
185: exit: movb bl, ROW / reposition to ROW and COL
186: shlb bl, $1
187: mov POS, cs:rowtab(bx)
188: movb bl, COL
189: cmpb MM_NCOL(bp), $40
190: jne 0f
191: shlb bl, $1
192: 0: add POS, bx
193: mov ax, MM_CURSE(bp)
194: and ax, MM_VIS(bp)
195: #ifdef TECMAR
196: xor es:[NHB*6](POS), ax / turn cursor on
197: xor es:[NHB*6]+BANKSZ(POS), ax
198: xor es:[NHB*7](POS), ax
199: xor es:[NHB*7]+BANKSZ(POS), ax
200: #else
201: xor es:[NHB*3](POS), ax / turn cursor on
202: xor es:[NHB*3]+BANKSZ(POS), ax
203: #endif
204: pop bx
205: pop es
206: pop ds
207: mov MM_FUNC(bp), bx
208: movb MM_ROW(bp), ROW / save row,column
209: movb MM_COL(bp), COL
210: mov MM_POS(bp), POS / save position
211:
212: mov dx, $MSR / enable video display
213: movb al, $0x1A
214: outb dx, al
215: mov mmvcnt_, $480 / 480 seconds before video disabled
216:
217: mov bp, sp
218: mov bx, 8(bp)
219: mov ax, cx / Return the residual count.
220: xchg cx, IO_IOC(bx)
221: sub cx, IO_IOC(bx)
222: add IO_BASE(bx), cx
223: pop bp
224: pop di
225: pop si
226: ret
227:
228: ////////
229: /
230: / mminit - initialize screen
231: /
232: ////////
233:
234: mminit: movb ss:mmesc_, $CLOWER / schedule keyboard initialization
235: mov dx, $MSR / disable video display
236: movb al, $0x12
237: outb dx, al
238:
239: push cx / program registers, last to first
240: mov bx, $15
241: mov dx, MM_PORT(bp)
242: 0: movb al, bl
243: outb dx, al
244: inc dx
245: movb al, cs:crtdata(bx)
246: outb dx, al
247: dec dx
248: dec bx
249: jge 0b
250: pop cx
251:
252: mov dx, $CSR
253: movb al, $0x0F
254: outb dx, al
255:
256: mov dx, $XMSR
257: #ifdef TECMAR
258: movb al, $31
259: #else
260: movb al, $0
261: #endif
262: outb dx, al
263:
264: / mov dx, $XMSR
265: 0: inb al, dx / wait for vertical retrace
266: andb al, $8
267: je 0b
268:
269: mov dx, $MSR
270: movb al, $0x1A / video display on
271: outb dx, al
272:
273: mov MM_VIS(bp), $-1
274: mov MM_MASK(bp), $0xAAAA
275: mov MM_FLIP(bp), $0
276: mov MM_ULINE(bp), $0
277: mov MM_CURSE(bp), $0x00ff
278: movb MM_WRAP(bp), $1
279: movb MM_NCOL(bp), $80
280: subb COL, COL
281: movb ROW, MM_IBROW(bp)
282: movb MM_BROW(bp), ROW
283: movb bl, MM_IEROW(bp)
284: movb MM_EROW(bp), bl
285: sub bx, bx
286: movb MM_N1(bp), $2
287: jmp mm_ed
288:
289: ////////
290: /
291: / mmbell - schedule beep
292: /
293: ////////
294:
295: mmbell: movb ss:mmbeeps_, $-1
296: jmp eval
297:
298: ////////
299: /
300: / mmspec - pass special characters on to keyboard routine(s).
301: /
302: ////////
303:
304: mmspec: movb ss:mmesc_, al
305: jmp eval
306:
307: ////////
308: /
309: / mm_cnl - cursor next line
310: /
311: / Moves the active position to the first column of the next display line.
312: / Scrolls the active display if necessary.
313: / Returns to mmwrite() to allow flow control on each output line.
314: /
315: ////////
316:
317: mm_cnl: subb COL, COL
318: incb ROW
319: cmpb ROW, MM_EROW(bp)
320: jle repos
321: movb ROW, MM_EROW(bp)
322: / jmp scrollup
323:
324: ////////
325: /
326: / scrollup - scroll display upwards
327: /
328: ////////
329:
330: scrollup:
331: push ds
332: push si
333: push cx
334: mov ds, MM_BASE(bp)
335: movb bl, MM_BROW(bp)
336: shlb bl, $1
337: mov di, cs:rowtab(bx)
338: mov si, cs:rowtab+2(bx)
339: movb bl, ROW
340: shlb bl, $1
341: mov cx, cs:rowtab(bx)
342: push cx
343: sub cx, di
344: shr cx, $1
345: push si
346: push di
347: push cx
348: rep
349: movsw
350: pop cx
351: pop di
352: pop si
353: add si, $BANKSZ
354: add di, $BANKSZ
355: rep
356: movsw
357: mov ax, MM_FLIP(bp)
358: and ax, MM_MASK(bp)
359: pop di
360: push di
361: mov cx, $NRB4
362: rep
363: stosw
364: pop di
365: add di, $BANKSZ
366: mov cx, $NRB4
367: rep
368: stosw
369: pop cx
370: pop si
371: pop ds
372: jmp ewait
373:
374: ////////
375: /
376: / repos - reposition cursor
377: /
378: ////////
379:
380: repos: movb bl, ROW / reposition to ROW and COL
381: shlb bl, $1
382: mov POS, cs:rowtab(bx)
383: movb bl, COL
384: cmpb MM_NCOL(bp), $40
385: jne 0f
386: shlb bl, $1
387: 0: add POS, bx
388: / jmp eval
389:
390: ////////
391: /
392: / eval - evaluate input character
393: /
394: ////////
395:
396: eval: jcxz ewait0
397: dec cx / evaluate next char
398: lodsb
399: movb bl, al
400: shlb bl, $1
401: ijmp cs:asctab(bx)
402:
403: ewait0: call exit
404: jcxz 0b
405: dec cx
406: lodsb
407: movb bl, al
408: shlb bl, $1
409: ijmp cs:asctab(bx)
410:
411: ////////
412: /
413: / mmputc - put character on screen
414: /
415: ////////
416:
417: mmputc: cmpb MM_NCOL(bp), $40
418: jne putc8
419:
420:
421: putc16: push ds
422: push si
423: subb ah, ah
424: shlb al, $1
425: shl ax, $1
426: shl ax, $1
427: shl ax, $1
428: add ax, $fontw_
429: mov si, ax
430: mov ax, cs
431: mov ds, ax
432: mov bx, $BANKSZ-2
433:
434: lodsw / row 0
435: xor ax, MM_FLIP(bp)
436: and ax, MM_MASK(bp)
437: stosw
438: push di / save position for next char
439: #ifdef TECMAR
440: mov es:(bx,di), ax
441: add di, $78
442: #endif
443: lodsw / row 1
444: xor ax, MM_FLIP(bp)
445: and ax, MM_MASK(bp)
446: #ifdef TECMAR
447: stosw
448: #endif
449: mov es:(bx,di), ax
450: add di, $78
451:
452: lodsw / row 2
453: xor ax, MM_FLIP(bp)
454: and ax, MM_MASK(bp)
455: stosw
456: #ifdef TECMAR
457: mov es:(bx,di), ax
458: add di, $78
459: #endif
460:
461: lodsw / row 3
462: xor ax, MM_FLIP(bp)
463: and ax, MM_MASK(bp)
464: #ifdef TECMAR
465: stosw
466: #endif
467: mov es:(bx,di), ax
468: add di, $78
469:
470: lodsw / row 4
471: xor ax, MM_FLIP(bp)
472: and ax, MM_MASK(bp)
473: stosw
474: #ifdef TECMAR
475: mov es:(bx,di), ax
476: add di, $78
477: #endif
478:
479: lodsw / row 5
480: xor ax, MM_FLIP(bp)
481: and ax, MM_MASK(bp)
482: #ifdef TECMAR
483: stosw
484: #endif
485: mov es:(bx,di), ax
486: add di, $78
487:
488: lodsw / row 6
489: xor ax, MM_FLIP(bp)
490: and ax, MM_MASK(bp)
491: stosw
492: #ifdef TECMAR
493: mov es:(bx,di), ax
494: add di, $78
495: #endif
496: lodsw / row 7
497: or ax, MM_ULINE(bp)
498: xor ax, MM_FLIP(bp)
499: and ax, MM_MASK(bp)
500: #ifdef TECMAR
501: stosw
502: #endif
503: mov es:(bx,di), ax
504:
505:
506: pop di / restore position for next char
507: pop si
508: pop ds
509:
510: sub bx, bx
511: incb COL
512: cmpb COL, MM_NCOL(bp)
513: jge 0f
514: jcxz ewait1
515: dec cx
516: lodsb
517: movb bl, al
518: shlb bl, $1
519: ijmp cs:asctab(bx)
520:
521: 0: subb COL, COL
522: incb ROW
523: cmpb ROW, MM_EROW(bp)
524: jg 0f
525: jmp repos
526:
527: 0: movb ROW, MM_EROW(bp)
528: jmp scrollup
529:
530: ewait1: jmp ewait
531:
532: putc8: push ds
533: push si
534: subb ah, ah
535: shlb al, $1
536: shl ax, $1
537: shl ax, $1
538: add ax, $0xFA6E
539: mov si, ax
540: mov ax, $0xF000
541: mov ds, ax
542: mov bx, $BANKSZ-1
543:
544: lodsw
545: xor ax, MM_FLIP(bp)
546: stosb / row 0
547: push di / save position for next char
548: #ifdef TECMAR
549: movb es:(bx,di), al
550: movb es:79(di), ah / row 1
551: movb es:80(bx,di), ah
552: add di, $79+80
553: #else
554: movb es:(bx,di), ah / row 1
555: add di, $79
556: #endif
557:
558: lodsw
559: xor ax, MM_FLIP(bp)
560: stosb / row 2
561: #ifdef TECMAR
562: movb es:(bx,di), al
563: movb es:79(di), ah
564: movb es:80(bx,di), ah / row 3
565: add di, $79+80
566: #else
567: movb es:(bx,di), ah / row 3
568: add di, $79
569: #endif
570:
571: lodsw
572: xor ax, MM_FLIP(bp)
573: stosb / row 4
574: #ifdef TECMAR
575: movb es:(bx,di), al
576: movb es:79(di), ah / row 5
577: movb es:80(bx,di), ah
578: add di, $79+80
579: #else
580: movb es:(bx,di), ah / row 5
581: add di, $79
582: #endif
583:
584: lodsw
585: orb ah, MM_ULINE(bp)
586: xor ax, MM_FLIP(bp)
587: stosb / row 6
588: #ifdef TECMAR
589: movb es:(bx,di), al
590: movb es:79(di), ah
591: movb es:80(bx,di), ah
592: #else
593: movb es:(bx,di), ah / row 7
594: #endif
595:
596: pop di / restore position for next char
597: pop si
598: pop ds
599:
600: sub bx, bx
601: incb COL
602: cmpb COL, MM_NCOL(bp)
603: jge 0f
604: jcxz ewait
605: dec cx
606: lodsb
607: movb bl, al
608: shlb bl, $1
609: ijmp cs:asctab(bx)
610:
611: 0: subb COL, COL
612: incb ROW
613: cmpb ROW, MM_EROW(bp)
614: jg 0f
615: jmp repos
616:
617: 0: movb ROW, MM_EROW(bp)
618: jmp scrollup
619:
620: ////////
621: /
622: / Ewait - wait for next input char to evaluate
623: /
624: ////////
625:
626: ewait: call exit
627: jcxz ewait
628: dec cx
629: lodsb
630: movb bl, al
631: shlb bl, $1
632: ijmp cs:asctab(bx)
633:
634: ////////
635: /
636: / mm_cr - carriage return
637: /
638: / Moves the active position to first position of current display line.
639: /
640: ////////
641:
642: mm_cr: subb COL, COL
643: movb bl, ROW
644: shlb bl, $1
645: mov POS, cs:rowtab(bx)
646: jcxz ewait
647: dec cx
648: lodsb
649: movb bl, al
650: shlb bl, $1
651: ijmp cs:asctab(bx)
652:
653: ////////
654: /
655: / mm_cub - cursor backwards
656: /
657: ////////
658:
659: mm_cub: decb COL
660: jge 0f
661: movb COL, MM_NCOL(bp)
662: decb COL
663: decb ROW
664: cmpb ROW, MM_BROW(bp)
665: jge 0f
666: subb COL, COL
667: movb ROW, MM_BROW(bp)
668: 0: jmp repos
669:
670: ////////
671: /
672: / Esc state - entered when last char was ESC - transient state.
673: /
674: ////////
675:
676: 0: call exit
677: mm_esc: jcxz 0b
678: dec cx
679: lodsb
680: movb MM_N1(bp), ZERO
681: movb MM_N2(bp), ZERO
682: movb bl, al
683: shlb bl, $1
684: ijmp cs:esctab(bx)
685:
686: ////////
687: /
688: / Csi_n1 state - entered when last two chars were ESC [
689: /
690: / Action: Evaluates numeric chars as numeric parameter 1.
691: /
692: ////////
693:
694: 0: call exit
695: csi_n1: jcxz 0b
696: dec cx
697: lodsb
698: cmpb al, $SEMIC
699: je csi_n2
700: movb bl, al
701: subb bl, $AZERO
702: cmpb bl, $9
703: ja csival
704: shlb MM_N1(bp), $1 / n1 * 2
705: movb al, MM_N1(bp) / n1 * 2
706: shlb al, $1 / n1 * 4
707: shlb al, $1 / n1 * 8
708: addb al, MM_N1(bp) / n1 * 10
709: addb al, bl / n1 * 10 + digit
710: movb MM_N1(bp), al / n1 = (n1 * 10) + digit
711: jmp csi_n1
712:
713: ////////
714: /
715: / Csi_n2 state - entered after input sequence ESC [ n ;
716: /
717: ////////
718:
719: 0: call exit
720: csi_n2: jcxz 0b
721: dec cx
722: lodsb
723: movb bl, al
724: subb bl, $AZERO
725: cmpb bl, $9
726: ja csival
727: shlb MM_N2(bp), $1 / n2 * 2
728: movb al, MM_N2(bp) / n2 * 2
729: shlb al, $1 / n2 * 4
730: shlb al, $1 / n2 * 8
731: addb al, MM_N2(bp) / n2 * 10
732: addb al, bl / n2 * 10 + digit
733: movb MM_N2(bp), al / n2 = (n2 * 10) + digit
734: jmp csi_n2
735:
736: csival: movb bl, al
737: shlb bl, $1
738: ijmp cs:csitab(bx)
739:
740: ////////
741: /
742: / Csi_gt state - entered after input sequence ESC [ >
743: /
744: ////////
745:
746: 0: call exit
747: csi_gt: jcxz 0b
748: dec cx
749: lodsb
750: movb bl, al
751: subb bl, $AZERO
752: cmpb bl, $9
753: ja 0f
754: shlb MM_N1(bp), $1 / n1 * 2
755: movb al, MM_N1(bp) / n1 * 2
756: shlb al, $1 / n1 * 4
757: shlb al, $1 / n1 * 8
758: addb al, MM_N1(bp) / n1 * 10
759: addb al, bl / n1 * 10 + digit
760: movb MM_N1(bp), al / n1 = (n1 * 10) + digit
761: jmp csi_gt
762:
763: 0: cmpb al, $HLOWER
764: je mm_cgh
765: cmpb al, $LLOWER
766: je mm_cgl
767: jmp eval
768:
769: ////////
770: /
771: / Csi_q state - entered after input sequence ESC [ ?
772: /
773: ////////
774:
775: 0: call exit
776: csi_q: jcxz 0b
777: dec cx
778: lodsb
779: movb bl, al
780: subb bl, $AZERO
781: cmpb bl, $9
782: ja 0f
783: shlb MM_N1(bp), $1 / n1 * 2
784: movb al, MM_N1(bp) / n1 * 2
785: shlb al, $1 / n1 * 4
786: shlb al, $1 / n1 * 8
787: addb al, MM_N1(bp) / n1 * 10
788: addb al, bl / n1 * 10 + digit
789: movb MM_N1(bp), al / n1 = (n1 * 10) + digit
790: jmp csi_q
791:
792: 0: cmpb al, $HLOWER
793: je mm_cqh
794: cmpb al, $LLOWER
795: je mm_cql
796: jmp eval
797:
798: ////////
799: /
800: / mm_cbt - cursor backward tabulation
801: /
802: / Moves the active position horizontally in the backward direction
803: / to the preceding in a series of predetermined positions.
804: /
805: ////////
806:
807: mm_cbt: orb COL, $7 / calculate next tab stop
808: incb COL
809: subb COL, $16 / step back two tab positions
810: jg 0f
811: subb COL, COL / cannot step past column 0
812: 0: jmp repos / reposition cursor
813:
814: ////////
815: /
816: / mm_cgh - process ESC [ > N1 h escape sequence
817: /
818: / Recognized sequences: ESC [ > 13 h -- Set CRT saver enabled.
819: /
820: ////////
821:
822: mm_cgh: cmpb MM_N1(bp), $13
823: jne 0f
824: mov ss:mmcrtsav_, $1
825: 0: jmp eval
826:
827: ////////
828: /
829: / mm_cgl - process ESC [ > N1 l escape sequence
830: /
831: / Recognized sequences: ESC [ > 13 l -- Reset CRT saver.
832: /
833: ////////
834:
835: mm_cgl: cmpb MM_N1(bp), $13
836: jne 0f
837: mov ss:mmcrtsav_, $0
838: 0: jmp eval
839:
840: ////////
841: /
842: / mm_cha - cursor horizontal absolute
843: /
844: / Advances the active position forward or backward along the active line
845: / to the character position specified by the parameter.
846: / A parameter value of zero or one moves the active position to the
847: / first character position of the active line.
848: / A parameter value of N moves the active position to character position
849: / N of the active line.
850: /
851: ////////
852:
853: mm_cha: movb COL, MM_N1(bp)
854: decb COL
855: jge 0f
856: subb COL, COL
857: 0: cmpb COL, MM_NCOL(bp)
858: jb 0f
859: movb COL, MM_NCOL(bp)
860: decb COL
861: 0: jmp repos / reposition cursor
862:
863:
864: ////////
865: /
866: / mm_cht - cursor horizontal tabulation
867: /
868: / Advances the active position horizontally to the next or following
869: / in a series of predetermined positions.
870: /
871: ////////
872:
873: mm_cht: mov bx, $BANKSZ
874: push cx
875: push si
876: sub cx, cx
877: movb cl, COL
878: orb cl, $7
879: incb cl
880: subb cl, COL
881: addb COL, cl
882:
883: mov si, MM_MASK(bp)
884: cmpb MM_NCOL(bp), $80
885: jne 0f
886: mov si, $-1
887: inc cx
888: shr cx, $1
889:
890: 0: mov ax, MM_FLIP(bp)
891: and ax, si
892: #ifdef TECMAR
893: stosw / row 0
894: mov es:[NHB*0]-2(di,bx), ax
895: mov es:[NHB*1]-2(di), ax / row 1
896: mov es:[NHB*1]-2(di,bx), ax
897: mov es:[NHB*2]-2(di), ax / row 2
898: mov es:[NHB*2]-2(di,bx), ax
899: mov es:[NHB*3]-2(di), ax / row 3
900: mov es:[NHB*3]-2(di,bx), ax
901: mov es:[NHB*4]-2(di), ax / row 4
902: mov es:[NHB*4]-2(di,bx), ax
903: mov es:[NHB*5]-2(di), ax / row 5
904: mov es:[NHB*5]-2(di,bx), ax
905: mov es:[NHB*6]-2(di), ax / row 6
906: mov es:[NHB*6]-2(di,bx), ax
907: or ax, MM_ULINE(bp)
908: and ax, si
909: mov es:[NHB*7]-2(di), ax / row 7
910: mov es:[NHB*7]-2(di,bx), ax
911: #else
912: stosw / row 0
913: mov es:[NHB*0]-2(di,bx), ax / row 1
914: mov es:[NHB*1]-2(di), ax / row 2
915: mov es:[NHB*1]-2(di,bx), ax / row 3
916: mov es:[NHB*2]-2(di), ax / row 4
917: mov es:[NHB*2]-2(di,bx), ax / row 5
918: mov es:[NHB*3]-2(di), ax / row 6
919: or ax, MM_ULINE(bp)
920: and ax, si
921: mov es:[NHB*3]-2(di,bx), ax / row 7
922: #endif
923: loop 0b
924: sub bx, bx
925: pop si
926: pop cx
927: cmpb COL, MM_NCOL(bp)
928: jl 0f
929: subb COL, MM_NCOL(bp)
930: incb ROW
931: cmpb ROW, MM_EROW(bp)
932: jle 0f
933: movb ROW, MM_EROW(bp)
934: jmp scrollup
935: 0: jmp repos
936:
937: ////////
938: /
939: / mm_cpl - cursor preceding line
940: /
941: / Moves the active position to the first position of the preceding
942: / display line.
943: /
944: ////////
945:
946: mm_cpl: subb COL, COL
947: decb ROW
948: cmpb ROW, MM_BROW(bp)
949: jnb 0f
950: movb ROW, MM_BROW(bp)
951: jmp scrolldown
952: 0: jmp repos / reposition cursor
953:
954: ////////
955: /
956: / mm_cqh - process ESC [ ? N1 h escape sequence
957: /
958: / Recognized sequences: ESC [ ? 7 h -- Set wraparound.
959: /
960: ////////
961:
962: mm_cqh:
963: cmpb MM_N1(bp), $7 / Wraparound.
964: jne 0f
965: movb MM_WRAP(bp), $1
966: 0: jmp eval
967:
968: ////////
969: /
970: / mm_cql - process ESC [ ? N1 l escape sequence
971: /
972: / Recognized sequences: ESC [ ? 7 l -- Reset wraparound.
973: /
974: ////////
975:
976: mm_cql:
977: cmpb MM_N1(bp), $7 / No wraparound.
978: jne 0f
979: movb MM_WRAP(bp), $0
980: 0: jmp eval
981:
982: ////////
983: /
984: / mm_cud - cursor down
985: /
986: / Moves the active position downward without altering the
987: / horizontal position.
988: /
989: ////////
990:
991: mm_cud: incb ROW
992: cmpb ROW, MM_EROW(bp)
993: jna 0f
994: movb ROW, MM_EROW(bp)
995: 0: jmp repos / reposition cursor
996:
997: ////////
998: /
999: / mm_cuf - cursor forward
1000: /
1001: / Moves the active position in the forward direction.
1002: /
1003: ////////
1004:
1005: mm_cuf: incb COL
1006: cmpb COL, MM_NCOL(bp)
1007: jb 0f
1008: subb COL, MM_NCOL(bp)
1009: incb ROW
1010: cmpb ROW, MM_EROW(bp)
1011: jna 0f
1012: movb ROW, MM_EROW(bp)
1013: movb COL, MM_NCOL(bp)
1014: decb COL
1015: 0: jmp repos
1016:
1017: ////////
1018: /
1019: / mm_cup - cursor position
1020: /
1021: / Moves the active position to the position specified by two parameters.
1022: / The first parameter (mm_n1) specifies the vertical position (MM_ROW(bp)).
1023: / The second parameter (mm_n2) specifies the horizontal position (MM_COL(bp)).
1024: / A parameter value of 0 or 1 for the first or second parameter
1025: / moves the active position to the first line or column in the
1026: / display respectively.
1027: /
1028: ////////
1029:
1030: mm_cup: movb ROW, MM_N1(bp)
1031: decb ROW
1032: jg 0f
1033: subb ROW, ROW
1034: 0: addb ROW, MM_BROW(bp)
1035: cmpb ROW, MM_EROW(bp)
1036: jb 0f
1037: movb ROW, MM_EROW(bp)
1038: 0: movb COL, MM_N2(bp)
1039: decb COL
1040: jg 0f
1041: subb COL, COL
1042: 0: cmpb COL, MM_NCOL(bp)
1043: jb 0f
1044: movb COL, MM_NCOL(bp)
1045: decb COL
1046: 0: jmp repos / reposition cursor
1047:
1048: ////////
1049: /
1050: / mm_cuu - cursor up
1051: /
1052: / Moves the active position upward without altering the horizontal
1053: / position.
1054: /
1055: ////////
1056:
1057: mm_cuu: decb ROW
1058: cmpb ROW, MM_BROW(bp)
1059: jge 0f
1060: movb ROW, MM_BROW(bp)
1061: 0: jmp repos / reposition cursor
1062:
1063: ////////
1064: /
1065: / mm_dl - delete line
1066: /
1067: / Removes the contents of the active line.
1068: / The contents of all following lines are shifted in a block
1069: / toward the active line.
1070: /
1071: ////////
1072:
1073: mm_dl: push ds
1074: push si
1075: push cx
1076: mov ds, MM_BASE(bp)
1077: movb bl, ROW
1078: shlb bl, $1
1079: mov di, cs:rowtab(bx)
1080: mov si, cs:rowtab+2(bx)
1081: movb bl, MM_EROW(bp)
1082: shlb bl, $1
1083: mov cx, cs:rowtab(bx)
1084: sub cx, di
1085: jle 0f
1086: shr cx, $1
1087: push si
1088: push di
1089: push cx
1090: rep
1091: movsw
1092: pop cx
1093: pop di
1094: pop si
1095: add si, $BANKSZ
1096: add di, $BANKSZ
1097: rep
1098: movsw
1099: mov di, cs:rowtab(bx)
1100: push di
1101: mov cx, $NRB4
1102: mov ax, MM_FLIP(bp)
1103: and ax, MM_MASK(bp)
1104: rep
1105: stosw
1106: pop di
1107: add di, $BANKSZ
1108: mov cx, $NRB4
1109: rep
1110: stosw
1111: subb COL, COL
1112: 0: pop cx
1113: pop si
1114: pop ds
1115: jmp repos
1116:
1117: ////////
1118: /
1119: / mm_dmi - disable manual input
1120: /
1121: / Set flag preventing keyboard input.
1122: /
1123: ////////
1124:
1125: mm_dmi:
1126: mov ss:islock_, $1
1127: jmp eval
1128:
1129: ////////
1130: /
1131: / mm_ea - erase in area
1132: /
1133: / Erase some or all of the characters in the currently active area
1134: / according to the parameter:
1135: / 0 - erase from active position to end inclusive (default)
1136: / 1 - erase from start to active position inclusive
1137: / 2 - erase all of active area
1138: /
1139: ////////
1140:
1141: mm_ea: movb al, MM_N1(bp)
1142: cmpb al, $0
1143: jne 0f
1144: movb bl, MM_EROW(bp)
1145: jmp mm_e0
1146: 0: cmpb al, $1
1147: jne 0f
1148: movb bl, MM_BROW(bp)
1149: jmp mm_e1
1150: 0: subb COL, COL
1151: movb ROW, MM_BROW(bp)
1152: movb bl, ROW
1153: shlb bl, $1
1154: mov POS, cs:rowtab(bx)
1155: movb bl, MM_EROW(bp)
1156: subb bl, ROW
1157: jmp mm_e2
1158:
1159: ////////
1160: /
1161: / mm_ed - erase in display
1162: /
1163: / Erase some or all of the characters in the display according to the
1164: / parameter
1165: / 0 - erase from active position to end inclusive (default)
1166: / 1 - erase from start to active position inclusive
1167: / 2 - erase all of display
1168: /
1169: ////////
1170:
1171: mm_ed: movb al, MM_N1(bp)
1172: cmpb al, $0
1173: jne 0f
1174: movb bl, MM_LROW(bp)
1175: jmp mm_e0
1176: 0: cmpb al, $1
1177: jne 0f
1178: subb bl, bl
1179: jmp mm_e1
1180: 0: subb COL, COL
1181: movb ROW, MM_BROW(bp)
1182: sub POS, POS
1183: movb bl, MM_LROW(bp)
1184: jmp mm_e2
1185:
1186: ////////
1187: /
1188: / mm_el - erase in line
1189: /
1190: / Erase some or all of the characters in the line according to the
1191: / parameter:
1192: / 0 - erase from active position to end inclusive (default)
1193: / 1 - erase from start to active position inclusive
1194: / 2 - erase entire line
1195: /
1196: ////////
1197:
1198: mm_el: movb al, MM_N1(bp)
1199: movb bl, ROW
1200: cmpb al, $0
1201: je mm_e0
1202: cmpb al, $1
1203: je mm_e1
1204: shlb bl, $1
1205: mov POS, cs:rowtab(bx)
1206: subb COL, COL
1207: subb bl, bl
1208: / jmp mm_e2
1209:
1210: ////////
1211: /
1212: / mm_e2 - erase from POS for BL rows (minimum 1 row)
1213: /
1214: ////////
1215:
1216: mm_e2: push cx
1217: mov ax, MM_FLIP(bp)
1218: and ax, MM_MASK(bp)
1219: 0: mov cx, $NRB4
1220: rep
1221: stosw
1222: add di, $BANKSZ-NRB2
1223: mov cx, $NRB4
1224: rep
1225: stosw
1226: sub di, $BANKSZ
1227: decb bl
1228: jge 0b
1229: pop cx
1230: jmp repos
1231:
1232: ////////
1233: /
1234: / mm_e1 - erase from row BL to current cursor position.
1235: /
1236: ////////
1237:
1238: mm_e1: push dx
1239: push cx
1240: push di
1241: mov ax, MM_FLIP(bp)
1242: and ax, MM_MASK(bp)
1243: shlb bl, $1
1244: mov di, cs:rowtab(bx)
1245: movb bl, ROW
1246: shlb bl, $1
1247: mov cx, cs:rowtab(bx)
1248: sub cx, di
1249: jle 0f
1250: shr cx, $1
1251: push di
1252: push cx
1253: rep
1254: stosw
1255: pop cx
1256: pop di
1257: add di, $BANKSZ
1258: rep
1259: stosw
1260: 0: pop cx
1261: movb bl, ROW
1262: shlb bl, $1
1263: mov di, cs:rowtab(bx)
1264: sub cx, di
1265: jle 0f
1266:
1267: mov dx, di
1268: mov bx, cx
1269: rep / erase row 0
1270: stosb
1271: add dx, $80
1272: mov di, dx
1273: mov cx, bx
1274: #ifdef TECMAR
1275: rep / erase row 1
1276: stosb
1277: add dx, $80
1278: mov di, dx
1279: mov cx, bx
1280: #endif
1281: rep / erase row 2
1282: stosb
1283: add dx, $80
1284: mov di, dx
1285: mov cx, bx
1286: #ifdef TECMAR
1287: rep / erase row 3
1288: stosb
1289: add dx, $80
1290: mov di, dx
1291: mov cx, bx
1292: #endif
1293: rep / erase row 4
1294: stosb
1295: add dx, $80
1296: mov di, dx
1297: mov cx, bx
1298: #ifdef TECMAR
1299: rep / erase row 5
1300: stosb
1301: add dx, $80
1302: mov di, dx
1303: mov cx, bx
1304: #endif
1305: rep / erase row 6
1306: stosb
1307: #ifdef TECMAR
1308: add dx, $80
1309: mov di, dx
1310: mov cx, bx
1311: rep / erase row 7
1312: stosb
1313: add dx, $BANKSZ-560
1314: #else
1315: add dx, $BANKSZ-240
1316: #endif
1317: mov di, dx
1318: mov cx, bx
1319: #ifdef TECMAR
1320: rep / erase row 0
1321: stosb
1322: add dx, $80
1323: mov di, dx
1324: mov cx, bx
1325: #endif
1326: rep / erase row 1
1327: stosb
1328: add dx, $80
1329: mov di, dx
1330: mov cx, bx
1331: #ifdef TECMAR
1332: rep / erase row 2
1333: stosb
1334: add dx, $80
1335: mov di, dx
1336: mov cx, bx
1337: #endif
1338: rep / erase row 3
1339: stosb
1340: add dx, $80
1341: mov di, dx
1342: mov cx, bx
1343: #ifdef TECMAR
1344: rep / erase row 4
1345: stosb
1346: add dx, $80
1347: mov di, dx
1348: mov cx, bx
1349: #endif
1350: rep / erase row 5
1351: stosb
1352: add dx, $80
1353: mov di, dx
1354: mov cx, bx
1355: #ifdef TECMAR
1356: rep / erase row 6
1357: stosb
1358: add dx, $80
1359: mov di, dx
1360: mov cx, bx
1361: #endif
1362: rep / erase row 7
1363: stosb
1364: 1: sub bx, bx
1365: pop cx
1366: pop dx
1367: jmp repos
1368:
1369: ////////
1370: /
1371: / mm_e0 - erase from current cursor position to row BL inclusive.
1372: /
1373: ////////
1374:
1375: mm_e0: push dx
1376: push cx
1377: push di
1378: mov ax, MM_FLIP(bp)
1379: and ax, MM_MASK(bp)
1380: shlb bl, $1
1381: mov cx, cs:rowtab+2(bx)
1382: movb bl, ROW
1383: shlb bl, $1
1384: mov di, cs:rowtab+2(bx)
1385: sub cx, di
1386: jle 0f
1387: shr cx, $1
1388: push di
1389: push cx
1390: rep
1391: stosw
1392: pop cx
1393: pop di
1394: add di, $BANKSZ
1395: rep
1396: stosw
1397: 0: pop di
1398: sub cx, cx
1399: movb cl, MM_NCOL(bp)
1400: subb cl, COL
1401: cmpb MM_NCOL(bp), $40
1402: jne 0f
1403: shlb cl, $1
1404: 0: mov dx, di
1405: mov bx, cx
1406: rep / erase row 0
1407: stosb
1408: add dx, $80
1409: mov di, dx
1410: mov cx, bx
1411: #ifdef TECMAR
1412: rep / erase row 1
1413: stosb
1414: add dx, $80
1415: mov di, dx
1416: mov cx, bx
1417: #endif
1418: rep / erase row 2
1419: stosb
1420: add dx, $80
1421: mov di, dx
1422: mov cx, bx
1423: #ifdef TECMAR
1424: rep / erase row 3
1425: stosb
1426: add dx, $80
1427: mov di, dx
1428: mov cx, bx
1429: #endif
1430: rep / erase row 4
1431: stosb
1432: add dx, $80
1433: mov di, dx
1434: mov cx, bx
1435: #ifdef TECMAR
1436: rep / erase row 5
1437: stosb
1438: add dx, $80
1439: mov di, dx
1440: mov cx, bx
1441: #endif
1442: rep / erase row 6
1443: stosb
1444: #ifdef TECMAR
1445: add dx, $80
1446: mov di, dx
1447: mov cx, bx
1448: rep / erase row 7
1449: stosb
1450: add dx, $BANKSZ-560
1451: #else
1452: add dx, $BANKSZ-240
1453: #endif
1454: mov di, dx
1455: mov cx, bx
1456: #ifdef TECMAR
1457: rep / erase row 0
1458: stosb
1459: add dx, $80
1460: mov di, dx
1461: mov cx, bx
1462: #endif
1463: rep / erase row 1
1464: stosb
1465: add dx, $80
1466: mov di, dx
1467: mov cx, bx
1468: #ifdef TECMAR
1469: rep / erase row 2
1470: stosb
1471: add dx, $80
1472: mov di, dx
1473: mov cx, bx
1474: #endif
1475: rep / erase row 3
1476: stosb
1477: add dx, $80
1478: mov di, dx
1479: mov cx, bx
1480: #ifdef TECMAR
1481: rep / erase row 4
1482: stosb
1483: add dx, $80
1484: mov di, dx
1485: mov cx, bx
1486: #endif
1487: rep / erase row 5
1488: stosb
1489: add dx, $80
1490: mov di, dx
1491: mov cx, bx
1492: #ifdef TECMAR
1493: rep / erase row 6
1494: stosb
1495: add dx, $80
1496: mov di, dx
1497: mov cx, bx
1498: #endif
1499: rep / erase row 7
1500: stosb
1501: 1: sub bx, bx
1502: pop cx
1503: pop dx
1504: jmp repos
1505:
1506: ////////
1507: /
1508: / mm_emi - enable manual input
1509: /
1510: / Clear flag preventing keyboard input.
1511: /
1512: ////////
1513:
1514: mm_emi:
1515: mov ss:islock_, $0
1516: jmp eval
1517:
1518: ////////
1519: /
1520: / mm_il - insert line
1521: /
1522: / Insert a erased line at the active line by shifting the contents
1523: / of the active line and all following lines away from the active line.
1524: / The contents of the last line in the scrolling region are removed.
1525: /
1526: ////////
1527:
1528: scrolldown:
1529: mm_il: push ds
1530: push si
1531: push cx
1532: mov ds, MM_BASE(bp)
1533: movb bl, MM_EROW(bp)
1534: shlb bl, $1
1535: mov si, cs:rowtab(bx)
1536: mov cx, si
1537: sub si, $2
1538: mov di, cs:rowtab+2(bx)
1539: sub di, $2
1540: movb bl, ROW
1541: shlb bl, $1
1542: sub cx, cs:rowtab(bx)
1543: jle 0f
1544: shr cx, $1
1545: push si
1546: push di
1547: push cx
1548: std
1549: rep
1550: movsw
1551: pop cx
1552: pop di
1553: pop si
1554: add si, $BANKSZ
1555: add di, $BANKSZ
1556: rep
1557: movsw
1558: mov di, cs:rowtab(bx)
1559: push di
1560: mov cx, $NRB4
1561: mov ax, MM_FLIP(bp)
1562: and ax, MM_MASK(bp)
1563: cld
1564: rep
1565: stosw
1566: pop di
1567: add di, $BANKSZ
1568: mov cx, $NRB4
1569: rep
1570: stosw
1571: subb COL, COL
1572: 0: pop cx
1573: pop si
1574: pop ds
1575: jmp repos
1576:
1577: ////////
1578: /
1579: / mm_hpa - horizontal position absolute
1580: /
1581: / Moves the active position within the active line to the position
1582: / specified by the parameter. A parameter value of zero or one
1583: / moves the active position to the first position of the active line.
1584: /
1585: ////////
1586:
1587: mm_hpa: movb COL, MM_N1(bp)
1588: decb COL
1589: jg 0f
1590: subb COL, COL
1591: 0: cmpb COL, MM_NCOL(bp)
1592: jb 0f
1593: movb COL, MM_NCOL(bp)
1594: decb COL
1595: 0: jmp repos / reposition cursor
1596:
1597: ////////
1598: /
1599: / mm_hpr - horizontal position relative
1600: /
1601: / Moves the active position forward the number of positions specified
1602: / by the parameter. A parameter value of zero or one indicates a
1603: / single-position move.
1604: /
1605: ////////
1606:
1607: mm_hpr: movb al, MM_N1(bp)
1608: orb al, al
1609: jne 0f
1610: incb al
1611: 0: addb COL, al
1612: cmpb COL, MM_NCOL(bp)
1613: jb 0f
1614: movb COL, MM_NCOL(bp)
1615: decb COL
1616: 0: jmp repos / reposition cursor
1617:
1618: ////////
1619: /
1620: / mm_hvp - horizontal and vertical position
1621: /
1622: / Moves the active position to the position specified by two parameters.
1623: / The first parameter specifies the vertical position (MM_ROW(bp)).
1624: / The second parameter specifies the horizontal position (MM_COL(bp)).
1625: / A parameter value of zero or one moves the active position to the
1626: / first line or column in the display.
1627: /
1628: ////////
1629:
1630: mm_hvp: movb ROW, MM_N1(bp)
1631: decb ROW
1632: jg 0f
1633: subb ROW, ROW
1634: 0: cmpb ROW, MM_LROW(bp)
1635: jna 0f
1636: movb ROW, MM_LROW(bp)
1637: 0: movb COL, MM_N2(bp)
1638: decb COL
1639: jg 0f
1640: subb COL, COL
1641: 0: cmpb COL, MM_NCOL(bp)
1642: jb 0f
1643: movb COL, MM_NCOL(bp)
1644: decb COL
1645: 0: jmp repos / reposition cursor
1646:
1647: ////////
1648: /
1649: / mm_ind - index
1650: /
1651: / Causes the active position to move downward one line without changing
1652: / the horizontal position. Scrolling occurs if below scrolling region.
1653: /
1654: ////////
1655:
1656: mm_ind: incb ROW
1657: cmpb ROW, MM_EROW(bp)
1658: jg 0f
1659: jmp repos
1660: 0: movb ROW, MM_EROW(bp)
1661: jmp scrollup
1662:
1663: ////////
1664: /
1665: / mm_new - save cursor position
1666: /
1667: ////////
1668:
1669: mm_new: movb MM_SCOL(bp), COL
1670: movb MM_SROW(bp), ROW
1671: jmp eval
1672:
1673: ////////
1674: /
1675: / mm_old - restore old cursor position
1676: /
1677: ////////
1678:
1679: mm_old: movb COL, MM_SCOL(bp)
1680: movb ROW, MM_SROW(bp)
1681: jmp repos
1682:
1683: ////////
1684: /
1685: / mm_ri - reverse index
1686: /
1687: / Moves the active position to the same horizontal position on the
1688: / preceding line. Scrolling occurs if above scrolling region.
1689: /
1690: ////////
1691:
1692: mm_ri: decb ROW
1693: cmpb ROW, MM_BROW(bp)
1694: jge 0f
1695: movb ROW, MM_BROW(bp)
1696: jmp scrolldown
1697: 0: jmp repos
1698:
1699: ////////
1700: /
1701: / mm_scr - select cursor rendition
1702: /
1703: / Invokes the cursor rendition specified by the parameter.
1704: /
1705: / Recognized renditions are: 0 - cursor visible
1706: / 1 - cursor invisible
1707: ////////
1708:
1709: mm_scr: decb MM_N1(bp)
1710: je 0f
1711: jg 1f
1712: mov MM_VIS(bp), $-1
1713: jmp eval
1714:
1715: 0: mov MM_VIS(bp), $0
1716: 1: jmp eval
1717:
1718: ////////
1719: /
1720: / mm_sgr - select graphic rendition
1721: /
1722: / Invokes the graphic rendition specified by the parameter.
1723: / All following characters in the data stream are rendered
1724: / according to the parameters until the next occurrence of
1725: / SGR in the data stream.
1726: /
1727: / Recognized renditions are: 1 - high intensity
1728: / 4 - underline
1729: / 7 - reverse video
1730: /
1731: ////////
1732:
1733: mm_sgr: movb al, MM_N1(bp)
1734: cmpb al, $0
1735: jne 0f
1736: mov MM_MASK(bp), $0xAAAA
1737: mov MM_FLIP(bp), $0
1738: mov MM_ULINE(bp), $0
1739: jmp 1f
1740: 0: cmpb al, $1 / bold
1741: jne 0f
1742: mov MM_MASK(bp), $-1
1743: jmp 1f
1744: 0: cmpb al, $4 / underline
1745: jne 0f
1746: mov MM_ULINE(bp), $0xFFFF
1747: jmp 1f
1748: 0: cmpb al, $7 / reverse video
1749: jne 0f
1750: mov MM_FLIP(bp), $-1
1751: jmp 1f
1752: 0:
1753: 1: jmp eval
1754:
1755: ////////
1756: /
1757: / mm_so - stand out - enter 40 column mode
1758: /
1759: ////////
1760:
1761: mm_so: cmpb MM_NCOL(bp), $80
1762: jne 0f
1763: movb MM_NCOL(bp), $40
1764: incb COL
1765: shrb COL, $1
1766: 0: mov MM_CURSE(bp), $0xffff
1767: jmp repos
1768:
1769: ////////
1770: /
1771: / mm_si - stand in - enter 80 column mode
1772: /
1773: ////////
1774:
1775: mm_si: cmpb MM_NCOL(bp), $40
1776: jne 0f
1777: movb MM_NCOL(bp), $80
1778: shlb COL, $1
1779: 0: mov MM_CURSE(bp), $0x00ff
1780: jmp repos
1781:
1782: ////////
1783: /
1784: / mm_ssr - set scrolling region
1785: /
1786: ////////
1787:
1788: mm_ssr: movb al, MM_N1(bp)
1789: decb al
1790: jge 0f
1791: subb al, al
1792: 0: cmpb al, MM_LROW(bp)
1793: ja 1f
1794: movb bl, MM_N2(bp)
1795: decb bl
1796: jge 0f
1797: subb bl, bl
1798: 0: cmpb bl, MM_LROW(bp)
1799: ja 1f
1800: cmpb al, bl
1801: ja 1f
1802: movb MM_BROW(bp), al
1803: movb MM_EROW(bp), bl
1804: movb ROW, al
1805: subb COL, COL
1806: 1: jmp repos
1807:
1808: ////////
1809: /
1810: / mm_vpa - vertical position absolute
1811: /
1812: / Moves the active position to the line specified by the parameter
1813: / without changing the horizontal position.
1814: / A parameter value of 0 or 1 moves the active position vertically
1815: / to the first line.
1816: /
1817: ////////
1818:
1819: mm_vpa: movb ROW, MM_N1(bp)
1820: decb ROW
1821: jg 0f
1822: subb ROW, ROW
1823: 0: cmpb ROW, MM_LROW(bp)
1824: jna 0f
1825: movb ROW, MM_LROW(bp)
1826: 0: jmp repos / reposition cursor
1827:
1828: ////////
1829: /
1830: / mm_vpr - vertical position relative
1831: /
1832: / Moves the active position downward the number of lines specified
1833: / by the parameter without changing the horizontal position.
1834: / A parameter value of zero or one moves the active position
1835: / one line downward.
1836: /
1837: ////////
1838:
1839: mm_vpr: movb al, MM_N1(bp)
1840: orb al, al
1841: jne 0f
1842: incb al
1843: 0: addb ROW, al
1844: cmpb ROW, MM_LROW(bp)
1845: jb 0f
1846: movb ROW, MM_LROW(bp)
1847: 0: jmp repos / reposition cursor
1848:
1849: ////////
1850: /
1851: / asctab - table of functions indexed by ascii characters
1852: /
1853: ////////
1854:
1855: asctab: .word eval, eval, eval, eval /* NUL SOH STX ETX */
1856: .word eval, eval, eval, mmbell /* EOT ENQ ACK BEL */
1857: .word mm_cub, mm_cht, mm_cnl, mm_ind /* BS HT LF VT */
1858: .word eval, mm_cr, mm_so, mm_si /* FF CR SO SI */
1859: .word eval, eval, eval, eval /* DLE DC1 DC2 DC3 */
1860: .word eval, eval, eval, eval /* DC4 NAK SYN ETB */
1861: .word eval, eval, eval, mm_esc /* CAN EM SUB ESC */
1862: .word eval, eval, eval, eval /* FS GS RS US */
1863: .word mmputc, mmputc, mmputc, mmputc /* ! " # \040 - \043 */
1864: .word mmputc, mmputc, mmputc, mmputc /* $ % & quote \044 - \047 */
1865: .word mmputc, mmputc, mmputc, mmputc /* ( ) * + \050 - \053 */
1866: .word mmputc, mmputc, mmputc, mmputc /* , - . / \054 - \057 */
1867: .word mmputc, mmputc, mmputc, mmputc /* 0 1 2 3 \060 - \063 */
1868: .word mmputc, mmputc, mmputc, mmputc /* 4 5 6 7 \064 - \067 */
1869: .word mmputc, mmputc, mmputc, mmputc /* 8 9 : ; \070 - \073 */
1870: .word mmputc, mmputc, mmputc, mmputc /* < = > ? \074 - \077 */
1871: .word mmputc, mmputc, mmputc, mmputc /* @ A B C \100 - \103 */
1872: .word mmputc, mmputc, mmputc, mmputc /* D E F G \104 - \107 */
1873: .word mmputc, mmputc, mmputc, mmputc /* H I J K \110 - \113 */
1874: .word mmputc, mmputc, mmputc, mmputc /* L M N O \114 - \117 */
1875: .word mmputc, mmputc, mmputc, mmputc /* P Q R S \120 - \123 */
1876: .word mmputc, mmputc, mmputc, mmputc /* T U V W \124 - \127 */
1877: .word mmputc, mmputc, mmputc, mmputc /* X Y Z [ \130 - \133 */
1878: .word mmputc, mmputc, mmputc, mmputc /* \ ] ^ _ \134 - \137 */
1879: .word mmputc, mmputc, mmputc, mmputc /* ` a b c \140 - \143 */
1880: .word mmputc, mmputc, mmputc, mmputc /* d e f g \144 - \147 */
1881: .word mmputc, mmputc, mmputc, mmputc /* h i j k \150 - \153 */
1882: .word mmputc, mmputc, mmputc, mmputc /* l m n o \154 - \157 */
1883: .word mmputc, mmputc, mmputc, mmputc /* p q r s \160 - \163 */
1884: .word mmputc, mmputc, mmputc, mmputc /* t u v w \164 - \167 */
1885: .word mmputc, mmputc, mmputc, mmputc /* x y z { \170 - \173 */
1886: .word mmputc, mmputc, mmputc, mmputc /* | } ~ ? \174 - \177 */
1887:
1888: ////////
1889: /
1890: / esctab - table of functions indexed by escape characters.
1891: /
1892: ////////
1893:
1894: esctab: .word mmputc, mmputc, mmputc, mmputc /* NUL SOH STX ETX */
1895: .word mmputc, mmputc, mmputc, mmputc /* EOT ENQ ACK BEL */
1896: .word mmputc, mmputc, mmputc, mmputc /* BS HT LF VT */
1897: .word mmputc, mmputc, mmputc, mmputc /* FF CR SO SI */
1898: .word mmputc, mmputc, mmputc, mmputc /* DLE DC1 DC2 DC3 */
1899: .word mmputc, mmputc, mmputc, mmputc /* DC4 NAK SYN ETB */
1900: .word mmputc, mmputc, mmputc, mmputc /* CAN EM SUB ESC */
1901: .word mmputc, mmputc, mmputc, mmputc /* FS GS RS US */
1902: .word eval, eval, eval, eval /* ! " # \040 - \043 */
1903: .word eval, eval, eval, eval /* $ % & quote \044 - \047 */
1904: .word eval, eval, eval, eval /* ( ) * + \050 - \053 */
1905: .word eval, eval, eval, eval /* , - . / \054 - \057 */
1906: .word eval, eval, eval, eval /* 0 1 2 3 \060 - \063 */
1907: .word eval, eval, eval, mm_new /* 4 5 6 7 \064 - \067 */
1908: .word mm_old, eval, eval, eval /* 8 9 : ; \070 - \073 */
1909: .word eval, mmspec, mmspec, eval /* < = > ? \074 - \077 */
1910: .word eval, eval, eval, eval /* @ A B C \100 - \103 */
1911: .word mm_ind, mm_cnl, eval, eval /* D E F G \104 - \107 */
1912: .word eval, eval, eval, eval /* H I J K \110 - \113 */
1913: .word eval, mm_ri, eval, eval /* L M N O \114 - \117 */
1914: .word eval, eval, eval, eval /* P Q R S \120 - \123 */
1915: .word eval, eval, eval, eval /* T U V W \124 - \127 */
1916: .word eval, eval, eval, csi_n1 /* X Y Z [ \130 - \133 */
1917: .word eval, eval, eval, eval /* \ ] ^ _ \134 - \137 */
1918: .word mm_dmi, eval, mm_emi, mminit /* ` a b c \140 - \143 */
1919: .word eval, eval, eval, eval /* d e f g \144 - \147 */
1920: .word eval, eval, eval, eval /* h i j k \150 - \153 */
1921: .word eval, eval, eval, eval /* l m n o \154 - \157 */
1922: .word eval, eval, eval, eval /* p q r s \160 - \163 */
1923: .word mmspec, mmspec, eval, eval /* t u v w \164 - \167 */
1924: .word eval, eval, eval, eval /* x y z { \170 - \173 */
1925: .word eval, eval, eval, eval /* | } ~ ? \174 - \177 */
1926:
1927: ////////
1928: /
1929: / csitab - table of functions indexed by ESC [ characters.
1930: /
1931: ////////
1932:
1933: csitab: .word eval, eval, eval, eval /* NUL SOH STX ETX */
1934: .word eval, eval, eval, eval /* EOT ENQ ACK BEL */
1935: .word eval, eval, eval, eval /* BS HT LF VT */
1936: .word eval, eval, eval, eval /* FF CR SO SI */
1937: .word eval, eval, eval, eval /* DLE DC1 DC2 DC3 */
1938: .word eval, eval, eval, eval /* DC4 NAK SYN ETB */
1939: .word eval, eval, eval, eval /* CAN EM SUB ESC */
1940: .word eval, eval, eval, eval /* FS GS RS US */
1941: .word eval, eval, eval, eval /* ! " # \040 - \043 */
1942: .word eval, eval, eval, eval /* $ % & quote \044 - \047 */
1943: .word eval, eval, eval, eval /* ( ) * + \050 - \053 */
1944: .word eval, eval, eval, eval /* , - . / \054 - \057 */
1945: .word eval, eval, eval, eval /* 0 1 2 3 \060 - \063 */
1946: .word eval, eval, eval, eval /* 4 5 6 7 \064 - \067 */
1947: .word eval, eval, eval, eval /* 8 9 : ; \070 - \073 */
1948: .word eval, eval, csi_gt, eval /* < = > ? \074 - \077 */
1949: .word eval, mm_cuu, mm_cud, mm_cuf /* @ A B C \100 - \103 */
1950: .word mm_cub, mm_cnl, mm_cpl, mm_cha /* D E F G \104 - \107 */
1951: .word mm_cup, mm_cht, mm_ed, mm_el /* H I J K \110 - \113 */
1952: .word mm_il, mm_dl, eval, mm_ea /* L M N O \114 - \117 */
1953: .word eval, eval, eval, mm_ind /* P Q R S \120 - \123 */
1954: .word mm_ri, eval, eval, eval /* T U V W \124 - \127 */
1955: .word eval, eval, mm_cbt, eval /* X Y Z [ \130 - \133 */
1956: .word eval, eval, eval, eval /* \ ] ^ _ \134 - \137 */
1957: .word mm_hpa, mm_hpr, eval, eval /* ` a b c \140 - \143 */
1958: .word mm_vpa, mm_vpr, mm_hvp, mm_cup /* d e f g \144 - \147 */
1959: .word eval, eval, eval, eval /* h i j k \150 - \153 */
1960: .word eval, mm_sgr, eval, eval /* l m n o \154 - \157 */
1961: .word eval, eval, mm_ssr, eval /* p q r s \160 - \163 */
1962: .word eval, eval, mm_scr, eval /* t u v w \164 - \167 */
1963: .word eval, eval, eval, eval /* x y z { \170 - \173 */
1964: .word eval, eval, eval, eval /* | } ~ ? \174 - \177 */
1965:
1966: ////////
1967: /
1968: / rowtab - array of offsets to each row
1969: /
1970: ////////
1971:
1972: rowtab: .word 0*NRB2, 1*NRB2, 2*NRB2, 3*NRB2
1973: .word 4*NRB2, 5*NRB2, 6*NRB2, 7*NRB2
1974: .word 8*NRB2, 9*NRB2, 10*NRB2, 11*NRB2
1975: .word 12*NRB2, 13*NRB2, 14*NRB2, 15*NRB2
1976: .word 16*NRB2, 17*NRB2, 18*NRB2, 19*NRB2
1977: .word 20*NRB2, 21*NRB2, 22*NRB2, 23*NRB2
1978: .word 24*NRB2, 25*NRB2, 26*NRB2, 27*NRB2
1979: .word 28*NRB2, 29*NRB2, 30*NRB2, 31*NRB2
1980: .word 32*NRB2, 33*NRB2, 34*NRB2, 35*NRB2
1981: .word 36*NRB2, 37*NRB2, 38*NRB2, 39*NRB2
1982: .word 40*NRB2, 41*NRB2, 42*NRB2, 43*NRB2
1983: .word 44*NRB2, 45*NRB2, 46*NRB2, 47*NRB2
1984: .word 48*NRB2, 49*NRB2, 50*NRB2, 51*NRB2
1985:
1986: ////////
1987: /
1988: / grread( dev, iop ) - read graphics display memory
1989: /
1990: ////////
1991:
1992: grread_:
1993: push si
1994: push di
1995: push bp
1996: mov bp, sp
1997: mov bp, 10(bp)
1998: push ds
1999: push es
2000: cmp IO_SEG(bp), $IOSYS
2001: je 0f
2002: mov ax, uds_
2003: mov es, ax
2004: 0: mov di, IO_BASE(bp)
2005: mov ax, $VSEG
2006: mov ds, ax
2007:
2008: #ifndef TECMAR
2009: mov ax, IO_SEEK(bp)
2010: add ax, IO_IOC(bp)
2011: cmp ax, $BANKSZ*2
2012: ja done
2013: #endif
2014:
2015: mov ax, IO_SEEK(bp)
2016: sub dx, dx
2017: mov cx, $NHB
2018: div cx
2019: mov si, dx
2020: mov bx, ax
2021: shr ax, $1
2022: mul cx
2023: mov dx, si
2024: add si, ax
2025: testb bl, $1
2026: jne read2
2027:
2028: read1: mov cx, $NHB
2029: sub cx, dx
2030: cmp cx, IO_IOC(bp)
2031: jle 0f
2032: mov cx, IO_IOC(bp)
2033: jcxz done
2034: 0: sub IO_IOC(bp), cx
2035: add IO_BASE(bp), cx
2036: push si
2037: rep
2038: movsb
2039: pop si
2040: read2: add si, $BANKSZ
2041: mov cx, $NHB
2042: sub cx, dx
2043: cmp cx, IO_IOC(bp)
2044: jle 0f
2045: mov cx, IO_IOC(bp)
2046: jcxz done
2047: 0: sub IO_IOC(bp), cx
2048: add IO_BASE(bp), cx
2049: rep
2050: movsb
2051: sub si, $BANKSZ
2052: sub dx, dx
2053: jmp read1
2054:
2055: done: pop es
2056: pop ds
2057: pop bp
2058: pop di
2059: pop si
2060: ret
2061:
2062: ////////
2063: /
2064: / grwrite( dev, iop ) - write graphics display memory
2065: /
2066: ////////
2067:
2068: grwrite_:
2069: push si
2070: push di
2071: push bp
2072: mov bp, sp
2073: mov bp, 10(bp)
2074: push ds
2075: push es
2076: cmp IO_SEG(bp), $IOSYS
2077: je 0f
2078: mov ax, uds_
2079: mov ds, ax
2080: 0: mov si, IO_BASE(bp)
2081: mov ax, $VSEG
2082: mov es, ax
2083:
2084: #ifndef TECMAR
2085: mov ax, IO_SEEK(bp)
2086: add ax, IO_IOC(bp)
2087: cmp ax, $BANKSZ*2
2088: ja done
2089: #endif
2090:
2091: mov ax, IO_SEEK(bp)
2092: sub dx, dx
2093: mov cx, $NHB
2094: div cx
2095: mov di, dx
2096: mov bx, ax
2097: shr ax, $1
2098: mul cx
2099: mov dx, di
2100: add di, ax
2101: testb bl, $1
2102: jne page2
2103:
2104: page1: mov cx, $NHB
2105: sub cx, dx
2106: cmp cx, IO_IOC(bp)
2107: jle 0f
2108: mov cx, IO_IOC(bp)
2109: jcxz done
2110: 0: sub IO_IOC(bp), cx
2111: add IO_BASE(bp), cx
2112: push di
2113: rep
2114: movsb
2115: pop di
2116: page2: add di, $BANKSZ
2117: mov cx, $NHB
2118: sub cx, dx
2119: cmp cx, IO_IOC(bp)
2120: jle 0f
2121: mov cx, IO_IOC(bp)
2122: jcxz done
2123: 0: sub IO_IOC(bp), cx
2124: add IO_BASE(bp), cx
2125: rep
2126: movsb
2127: sub di, $BANKSZ
2128: sub dx, dx
2129: jmp page1
2130:
2131: ////////
2132: /
2133: / mm_voff() -- Disable video display
2134: /
2135: ////////
2136: .globl mm_voff_
2137: mm_voff_:
2138: mov dx, $MSR
2139: movb al, $0x12
2140: outb dx, al
2141: ret
2142:
2143: ////////
2144: /
2145: / mm_von() -- Enable video display
2146: /
2147: ////////
2148: .globl mm_von_
2149: mm_von_:
2150: mov dx, $MSR / enable video display
2151: movb al, $0x1A
2152: outb dx, al
2153: mov ss:mmvcnt_, $480 / 480 seconds before video disabled
2154: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.