3 // PUBLIC C plzline, C setplzparas, C psini, C lsini4, C lsini16
\r
6 // INCLUDE 'psini.inc'
\r
10 // INCLUDE 'lsini4.inc'
\r
11 // ; db 16384 dup(?)
\r
13 // LABEL lsini16 WORD
\r
14 // INCLUDE 'lsini16.inc'
\r
15 // ; db 16384 dup(?)
\r
18 word anSelfModifyOffsets[5*84];
\r
22 void lsini4_WriteWord(nIndex, nValue)
\r
24 word nByteOffset = lsini4_GetOffset() + (nIndex * 2);
\r
25 psini_WriteWord(nByteOffset, nValue);
\r
28 void lsini16_WriteWord(word nIndex, word nValue)
\r
30 word nByteOffset = lsini16_GetOffset() + (nIndex * 2);
\r
31 psini_WriteWord(nByteOffset, nValue);
\r
34 void anSelfModifyOffsets_WriteWord(word nOffset, word nValue)
\r
36 anSelfModifyOffsets[nOffset] = nValue;
\r
39 word set_plzstart(word start)
\r
43 mov al, 18h ; linecompare
\r
44 mov ah, [Byte PTR start]
\r
47 mov ah, [Byte PTR start+1]
\r
54 out dx, ax ; 8th bit
\r
59 int plzline(int y, int vseg)
\r
61 // vseg represented a segment, so multiply by sixteen (shift left by 4)
\r
62 // to convert into an offset.
\r
63 var nVgaYOffset = vseg * 16;
\r
67 3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,19,18,17,16,23,22,21,20,27,26,25,24,31,30,29,28,35,34,33,32,39,38,37,36,43,42,41,40,47,46,45,44,51,50,49,48,55,54,53,52,59,58,57,56,63,62,61,60,67,66,65,64,71,70,69,68,75,74,73,72,79,78,77,76,83,82,81,80
\r
75 for (var nIndex = 0; nIndex < nCount; nIndex++)
\r
77 var ccc = cccTable[nIndex];
\r
81 var nByteOffset = 0;
\r
84 nByteOffset = (y * 2) + anSelfModifyOffsets_ReadWord((2 * 84) + ccc);
\r
85 nByteOffset &= 0xFFFF;
\r
86 bx = psini_ReadWord(nByteOffset);
\r
88 nByteOffset = bx + anSelfModifyOffsets_ReadWord((1 * 84) + ccc);
\r
89 nByteOffset &= 0xFFFF;
\r
90 ah = psini_ReadByte(nByteOffset);
\r
92 nByteOffset = (y * 2) + anSelfModifyOffsets_ReadWord((4 * 84) + ccc);
\r
93 nByteOffset &= 0xFFFF;
\r
94 bx = psini_ReadWord(nByteOffset);
\r
96 nByteOffset = bx + (y * 2) + anSelfModifyOffsets_ReadWord((3 * 84) + ccc);
\r
97 nByteOffset &= 0xFFFF;
\r
98 ah += psini_ReadByte(nByteOffset);
\r
103 var nByteOffset = 0;
\r
106 nByteOffset = (y * 2) + anSelfModifyOffsets_ReadWord((2 * 84) + ccc);
\r
107 nByteOffset &= 0xFFFF;
\r
108 bx = psini_ReadWord(nByteOffset);
\r
110 nByteOffset = bx + anSelfModifyOffsets_ReadWord((1 * 84) + ccc);
\r
111 nByteOffset &= 0xFFFF;
\r
112 al = psini_ReadByte(nByteOffset);
\r
114 nByteOffset = (y * 2) + anSelfModifyOffsets_ReadWord((4 * 84) + ccc);
\r
115 nByteOffset &= 0xFFFF;
\r
116 bx = psini_ReadWord(nByteOffset);
\r
118 nByteOffset = bx + (y * 2) + anSelfModifyOffsets_ReadWord((3 * 84) + ccc);
\r
119 nByteOffset &= 0xFFFF;
\r
120 al += psini_ReadByte(nByteOffset);
\r
124 if ((ccc & 3) == 2)
\r
126 eax = (ah << 8) | (al << 0);
\r
130 if ((ccc & 3) == 0)
\r
132 eax |= (ah << 8) | (al << 0);
\r
134 VGA_WriteDword(nVgaYOffset + ccc, eax);
\r
142 int setplzparas(int c1, int c2, int c3, int c4)
\r
144 // static word psini;
\r
145 // static word lsini4;
\r
146 // static word lsini16;
\r
149 'psini.inc' INCLUDE
\r
152 'lsini4.inc' INCLUDE
\r
154 lsini16 WORD .LABEL
\r
155 'lsini16.inc' INCLUDE
\r
157 IRP ccc, <0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83>
\r
159 add ax, OFFSET psini+ccc*8
\r
160 mov [word (cs:lc1_&ccc)], ax
\r
163 add ax, OFFSET lsini16-ccc*8+80*8
\r
164 mov [word (cs:lc2_&ccc)], ax
\r
166 add ax, OFFSET psini-ccc*4+80*4
\r
167 mov [word (cs:lc3_&ccc)], ax
\r
170 add ax, OFFSET lsini4+ccc*32
\r
171 mov [word (cs:lc4_&ccc)], ax
\r
175 word psiniOffset = 0;
\r
176 word lsini16Offset = lsini16_GetOffset();
\r
177 word lsini4Offset = lsini4_GetOffset();
\r
179 word lc1, lc2, lc3, lc4;
\r
181 for (ccc=0; ccc < 84; ccc++)
\r
183 word lc1 = c1 + psiniOffset + (ccc * 8);
\r
185 anSelfModifyOffsets_WriteWord((1 * 84) + ccc, lc1);
\r
187 lc2 = (c2 * 2) + lsini16Offset - (ccc * 8) + (80 * 8);
\r
189 anSelfModifyOffsets_WriteWord((2 * 84) + ccc, lc2);
\r
191 lc3 = c3 + psiniOffset - (ccc * 4) + (80 * 4);
\r
193 anSelfModifyOffsets_WriteWord((3 * 84) + ccc, lc3);
\r
195 lc4 = (c4 * 2) + lsini4Offset + (ccc * 32);
\r
197 anSelfModifyOffsets_WriteWord((4 * 84) + ccc, lc4);
\r