-#include "asmyt.h"\r
-// __asm{\r
-// PUBLIC C plzline, C setplzparas, C psini, C lsini4, C lsini16\r
-//\r
-// LABEL psini BYTE\r
-// INCLUDE 'psini.inc'\r
-// ; db 16384 dup(?)\r
-//\r
-// LABEL lsini4 WORD\r
-// INCLUDE 'lsini4.inc'\r
-// ; db 16384 dup(?)\r
-//\r
-// LABEL lsini16 WORD\r
-// INCLUDE 'lsini16.inc'\r
-// ; db 16384 dup(?)\r
-// }\r
-\r
-int ccc;\r
-\r
-word set_plzstart(word start)\r
-{\r
-__asm{\r
- mov dx, 3d4h\r
- mov al, 18h ; linecompare\r
- mov ah, [Byte PTR start]\r
- out dx, ax\r
- mov al, 07h\r
- mov ah, [Byte PTR start+1]\r
- shl ah, 1d\r
- shl ah, 1d\r
- shl ah, 1d\r
- shl ah, 1d\r
- and ah, 10h\r
- or ah, 0fh\r
- out dx, ax ; 8th bit\r
-}\r
- return start;\r
-}\r
-/*\r
-int plzline(int y, int vseg)\r
-{\r
- // vseg represented a segment, so multiply by sixteen (shift left by 4)\r
- // to convert into an offset.\r
- var nVgaYOffset = vseg * 16;\r
-\r
- var cccTable =\r
- [\r
- 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
- ];\r
- var nCount = 84;\r
-\r
- var ah = 0;\r
- var al = 0;\r
- var eax = 0;\r
-\r
- for (var nIndex = 0; nIndex < nCount; nIndex++)\r
- {\r
- var ccc = cccTable[nIndex];\r
-\r
- if ((ccc & 1) == 1)\r
- {\r
- var nByteOffset = 0;\r
- var bx = 0;\r
-\r
- nByteOffset = (y * 2) + anSelfModifyOffsets_ReadWord((2 * 84) + ccc);\r
- nByteOffset &= 0xFFFF;\r
- bx = psini_ReadWord(nByteOffset);\r
-\r
- nByteOffset = bx + anSelfModifyOffsets_ReadWord((1 * 84) + ccc);\r
- nByteOffset &= 0xFFFF;\r
- ah = psini_ReadByte(nByteOffset);\r
-\r
- nByteOffset = (y * 2) + anSelfModifyOffsets_ReadWord((4 * 84) + ccc);\r
- nByteOffset &= 0xFFFF;\r
- bx = psini_ReadWord(nByteOffset);\r
-\r
- nByteOffset = bx + (y * 2) + anSelfModifyOffsets_ReadWord((3 * 84) + ccc);\r
- nByteOffset &= 0xFFFF;\r
- ah += psini_ReadByte(nByteOffset);\r
- ah &= 0xFF;\r
- }\r
- else\r
- {\r
- var nByteOffset = 0;\r
- var bx = 0;\r
-\r
- nByteOffset = (y * 2) + anSelfModifyOffsets_ReadWord((2 * 84) + ccc);\r
- nByteOffset &= 0xFFFF;\r
- bx = psini_ReadWord(nByteOffset);\r
-\r
- nByteOffset = bx + anSelfModifyOffsets_ReadWord((1 * 84) + ccc);\r
- nByteOffset &= 0xFFFF;\r
- al = psini_ReadByte(nByteOffset);\r
-\r
- nByteOffset = (y * 2) + anSelfModifyOffsets_ReadWord((4 * 84) + ccc);\r
- nByteOffset &= 0xFFFF;\r
- bx = psini_ReadWord(nByteOffset);\r
-\r
- nByteOffset = bx + (y * 2) + anSelfModifyOffsets_ReadWord((3 * 84) + ccc);\r
- nByteOffset &= 0xFFFF;\r
- al += psini_ReadByte(nByteOffset);\r
- al &= 0xFF;\r
- }\r
-\r
- if ((ccc & 3) == 2)\r
- {\r
- eax = (ah << 8) | (al << 0);\r
- eax <<= 16;\r
- }\r
-\r
- if ((ccc & 3) == 0)\r
- {\r
- eax |= (ah << 8) | (al << 0);\r
-\r
- VGA_WriteDword(nVgaYOffset + ccc, eax);\r
- }\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-*/\r
-int setplzparas(int c1, int c2, int c3, int c4)\r
-{\r
- __asm{\r
- LABEL psini BYTE\r
-INCLUDE 'psini.inc'\r
-; db 16384 dup(?)\r
-\r
-LABEL lsini4 WORD\r
-INCLUDE 'lsini4.inc'\r
-; db 16384 dup(?)\r
-\r
-LABEL lsini16 WORD\r
-INCLUDE 'lsini16.inc'\r
-; db 16384 dup(?)\r
-\r
- 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
- mov ax, [c1]\r
- add ax, OFFSET psini+ccc*8\r
- mov [word (cs:lc1_&ccc)], ax\r
- mov ax, [c2]\r
- shl ax, 1d\r
- add ax, OFFSET lsini16-ccc*8+80*8\r
- mov [word (cs:lc2_&ccc)], ax\r
- mov ax, [c3]\r
- add ax, OFFSET psini-ccc*4+80*4\r
- mov [word (cs:lc3_&ccc)], ax\r
- mov ax, [c4]\r
- shl ax, 1d\r
- add ax, OFFSET lsini4+ccc*32\r
- mov [word (cs:lc4_&ccc)], ax\r
- ENDM\r
- ret\r
- }\r
-}\r
-/* var psiniOffset = 0;\r
- var lsini16Offset = lsini16_GetOffset();\r
- var lsini4Offset = lsini4_GetOffset();\r
-\r
- for (var ccc = 0; ccc < 84; ccc++)\r
- {\r
- var lc1 = c1 + psiniOffset + (ccc * 8);\r
- lc1 &= 0xFFFF;\r
- anSelfModifyOffsets_WriteWord((1 * 84) + ccc, lc1);\r
-\r
- var lc2 = (c2 * 2) + lsini16Offset - (ccc * 8) + (80 * 8);\r
- lc2 &= 0xFFFF;\r
- anSelfModifyOffsets_WriteWord((2 * 84) + ccc, lc2);\r
-\r
- var lc3 = c3 + psiniOffset - (ccc * 4) + (80 * 4);\r
- lc3 &= 0xFFFF;\r
- anSelfModifyOffsets_WriteWord((3 * 84) + ccc, lc3);\r
-\r
- var lc4 = (c4 * 2) + lsini4Offset + (ccc * 32);\r
- lc4 &= 0xFFFF;\r
- anSelfModifyOffsets_WriteWord((4 * 84) + ccc, lc4);\r
- }\r
-\r
- return 0;\r
-}*/\r
+/*
+ * Written by Nick Kovac with minor changes by Claudio Matsuoka
+ */
+
+#include "common.h"
+
+static uint16_t selfmod[5][84];
+extern char *psini;
+
+#define PSINI_OFFSET 0
+#define LSINI4_OFFSET 16384
+#define LSINI16_OFFSET (16384 + 2 * 8192)
+
+
+int plzline(int y, int vseg)
+{
+ // vseg represented a segment, so multiply by sixteen (shift left by 4)
+ // to convert into an offset.
+ int nVgaYOffset = vseg << 4;
+
+ int cccTable[] = {
+ 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
+ };
+ uint8_t ah = 0;
+ uint8_t al = 0;
+ uint16_t eax = 0;
+ int i;
+
+ for (i = 0; i < 84; i++) {
+ int ccc = cccTable[i];
+ uint16_t offs;
+ int bx;
+
+ if ((ccc & 1) == 1) {
+ // within lsini16
+ offs = (y * 2) + selfmod[2][ccc];
+ bx = *(short *)&psini[offs];
+
+ // within psini
+ offs = bx + selfmod[1][ccc];
+ ah = psini[offs];
+
+ // within lsini4
+ offs = (y * 2) + selfmod[4][ccc];
+ bx = *(short *)&psini[offs];
+
+ // within psini
+ offs = bx + (y * 2) + selfmod[3][ccc];
+ ah += psini[offs];
+ } else {
+ offs = (y * 2) + selfmod[2][ccc];
+ bx = *(short *)&psini[offs];
+
+ offs = bx + selfmod[1][ccc];
+ al = psini[offs];
+
+ offs = (y * 2) + selfmod[4][ccc];
+ bx = *(short *)&psini[offs];
+
+ offs = bx + (y * 2) + selfmod[3][ccc];
+ al += psini[offs];
+ }
+
+ if ((ccc & 3) == 2) {
+ eax = (ah << 8) | al;
+ eax <<= 8;
+ }
+
+ if ((ccc & 3) == 0) {
+ eax |= (ah << 8) | al;
+// vga_write32(nVgaYOffset + ccc, eax);
+ __asm {
+ mov [es:ccc], ax
+ }
+ }
+ }
+
+ return 0;
+}
+
+int setplzparas(int c1, int c2, int c3, int c4)
+{
+ int ccc;
+
+ for (ccc = 0; ccc < 84; ccc++) {
+ uint16_t lc1, lc2, lc3, lc4;
+
+ lc1 = c1 + PSINI_OFFSET + (ccc * 8);
+ selfmod[1][ccc] = lc1;
+
+ lc2 = (c2 * 2) + LSINI16_OFFSET - (ccc * 8) + (80 * 8);
+ selfmod[2][ccc] = lc2;
+
+ lc3 = c3 + PSINI_OFFSET - (ccc * 4) + (80 * 4);
+ selfmod[3][ccc] = lc3;
+
+ lc4 = (c4 * 2) + LSINI4_OFFSET + (ccc * 32);
+ selfmod[4][ccc] = lc4;
+ }
+
+ return 0;
+}
+
+word set_plzstart(word start)
+{
+__asm{
+ mov dx, 3d4h
+ mov al, 18h ; linecompare
+ mov ah, [Byte PTR start]
+ out dx, ax
+ mov al, 07h
+ mov ah, [Byte PTR start+1]
+ shl ah, 1d
+ shl ah, 1d
+ shl ah, 1d
+ shl ah, 1d
+ and ah, 10h
+ or ah, 0fh
+ out dx, ax ; 8th bit
+}
+ return start;
+}