]> 4ch.mooo.com Git - 16.git/blobdiff - 16/x_/mxtl.asm
wwww
[16.git] / 16 / x_ / mxtl.asm
diff --git a/16/x_/mxtl.asm b/16/x_/mxtl.asm
new file mode 100755 (executable)
index 0000000..69900c8
--- /dev/null
@@ -0,0 +1,169 @@
+;-----------------------------------------------------------\r
+;\r
+; MXTL.ASM - Put tile\r
+; Copyright (c) 1994 by Alessandro Scotti\r
+;\r
+;-----------------------------------------------------------\r
+WARN    PRO\r
+NOWARN  RES\r
+INCLUDE MODEX.DEF\r
+\r
+PUBLIC  mxPutTile\r
+PUBLIC  mxTransPutTile\r
+\r
+MX_TEXT         SEGMENT USE16 PARA PUBLIC 'CODE'\r
+                ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
+\r
+EXTRN   mx_VideoSegment : WORD\r
+EXTRN   mx_BytesPerLine : WORD\r
+\r
+;-----------------------------------------------------------\r
+;\r
+; Copies a "mode-x" tile from memory to screen.\r
+;\r
+; Input:\r
+;       Image   = pointer to tile\r
+;       X, Y    = coordinates of destination\r
+;       Width   = width of image in pixels (Width and 3 = 0)\r
+;       Height  = height of image in pixels\r
+; Output:\r
+;       none\r
+; Note:\r
+;       no clipping is performed on tiles!\r
+;\r
+mxPutTile       PROC    FAR\r
+        ARG     Height:WORD,            \\r
+                Width:WORD,             \\r
+                Y:WORD,                 \\r
+                X:WORD,                 \\r
+                Image:DWORD             = ARG_SIZE\r
+        ASSUME  ds:NOTHING\r
+        .enter  0\r
+        .push   ds, si, es, di\r
+\r
+        mov     ax, [Y]                 ; Get pixel address\r
+        mul     [mx_BytesPerLine]\r
+        mov     di, [X]\r
+        .shr    di, 2\r
+        add     di, ax\r
+        mov     es, [mx_VideoSegment]\r
+\r
+        lds     si, [Image]             ; Get tile address\r
+        .shr    [Width], 2              ; Number of bytes per plane\r
+        mov     cl, BYTE PTR [X]\r
+        and     cl, 3\r
+        mov     ah, 11h                 ; AH = plane mask\r
+        shl     ah, cl                  ; Align mask to first plane\r
+\r
+        mov     [Y], 4                  ; Number of planes\r
+        mov     bx, [mx_BytesPerLine]\r
+        sub     bx, [Width]             ; Extra bytes per line\r
+@@Loop:\r
+        mov     al, 02h\r
+        mov     dx, TS\r
+        out     dx, ax                  ; Set write plane\r
+        mov     [X], di                 ; Save video offset\r
+        mov     dx, [Height]\r
+@@Loop2:\r
+        mov     cx, [Width]             ; Number of bytes to move\r
+\r
+        shr     cx, 1                   ; Move line\r
+        rep     movsw\r
+        rcl     cx, 1\r
+        rep     movsb\r
+\r
+        add     di, bx                  ; Move video offset to next line\r
+        dec     dx                      ; Done all lines?\r
+        jnz     @@Loop2                 ; No, continue\r
+        mov     di, [X]                 ; Restore video offset\r
+        rol     ah, 1                   ; Next plane\r
+        adc     di, 0                   ; Bump video offset if needed\r
+        dec     [Y]                     ; Any plane left?\r
+        jnz     @@Loop                  ; Yes, keep looping\r
+\r
+        xor     ax, ax\r
+        .pop    ds, si, es, di\r
+        .leave  ARG_SIZE\r
+mxPutTile       ENDP\r
+\r
+;-----------------------------------------------------------\r
+;\r
+; Copies a "mode-x" tile from memory to screen.\r
+; Skips over color 0.\r
+;\r
+; Input:\r
+;       Image   = pointer to tile\r
+;       X, Y    = coordinates of destination\r
+;       Width   = width of image in pixels (Width and 3 = 0)\r
+;       Height  = height of image in pixels\r
+; Output:\r
+;       none\r
+; Note:\r
+;       no clipping is performed on tiles!\r
+;\r
+mxTransPutTile  PROC    FAR\r
+        ARG     Height:WORD,            \\r
+                Width:WORD,             \\r
+                Y:WORD,                 \\r
+                X:WORD,                 \\r
+                Image:DWORD             = ARG_SIZE\r
+        ASSUME  ds:NOTHING\r
+        .enter  0\r
+        .push   ds, si, es, di\r
+\r
+        mov     ax, [Y]                 ; Get pixel address\r
+        mul     [mx_BytesPerLine]\r
+        mov     di, [X]\r
+        .shr    di, 2\r
+        add     di, ax\r
+        mov     es, [mx_VideoSegment]\r
+\r
+        lds     si, [Image]             ; Get tile address\r
+        .shr    [Width], 2              ; Number of bytes per plane\r
+        mov     cl, BYTE PTR [X]\r
+        and     cl, 3\r
+        mov     ah, 11h                 ; AH = plane mask\r
+        shl     ah, cl                  ; Align mask to first plane\r
+\r
+        mov     [Y], 4                  ; Number of planes\r
+        mov     bx, [mx_BytesPerLine]\r
+        sub     bx, [Width]             ; Extra bytes per line\r
+@@Loop:\r
+        mov     al, 02h\r
+        mov     dx, TS\r
+        out     dx, ax                  ; Set write plane\r
+        mov     [X], di                 ; Save video offset\r
+        mov     dx, [Height]\r
+@@Loop2:\r
+        mov     cx, [Width]             ; Number of bytes to move\r
+\r
+; Move one line\r
+        jcxz    @@MoveLineDone\r
+@@MoveLineLoop:\r
+        mov     al, ds:[si]\r
+        test    al, al\r
+        jz      @@MoveLineNext\r
+        mov     es:[di], al\r
+@@MoveLineNext:\r
+        inc     si\r
+        inc     di\r
+        dec     cx\r
+        jnz     @@MoveLineLoop\r
+@@MoveLineDone:\r
+\r
+        add     di, bx                  ; Move video offset to next line\r
+        dec     dx                      ; Done all lines?\r
+        jnz     @@Loop2                 ; No, continue\r
+        mov     di, [X]                 ; Restore video offset\r
+        rol     ah, 1                   ; Next plane\r
+        adc     di, 0                   ; Bump video offset if needed\r
+        dec     [Y]                     ; Any plane left?\r
+        jnz     @@Loop                  ; Yes, keep looping\r
+\r
+        xor     ax, ax\r
+        .pop    ds, si, es, di\r
+        .leave  ARG_SIZE\r
+mxTransPutTile  ENDP\r
+\r
+MX_TEXT         ENDS\r
+END\r