]> 4ch.mooo.com Git - plz.git/blobdiff - asmyt.c
i dunot know why it dose not work wwww
[plz.git] / asmyt.c
diff --git a/asmyt.c b/asmyt.c
index bc5818ba4f73b8bca837917b27327998ab1604f2..d8447479a20927cf9c9ae4603dbfb9997d9c9827 100755 (executable)
--- a/asmyt.c
+++ b/asmyt.c
-#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
-//     static word psini;\r
-//     static word lsini4;\r
-//     static word lsini16;\r
-       __asm{\r
-psini WORD .LABEL\r
-'psini.inc' INCLUDE\r
-\r
-lsini4 WORD .LABEL\r
-'lsini4.inc' INCLUDE\r
-\r
-lsini16 WORD .LABEL\r
-'lsini16.inc' INCLUDE\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
-       return 0;\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;
+}