]> 4ch.mooo.com Git - 16.git/blobdiff - 16/x_/mxpp.asm
refresh wwww
[16.git] / 16 / x_ / mxpp.asm
diff --git a/16/x_/mxpp.asm b/16/x_/mxpp.asm
new file mode 100755 (executable)
index 0000000..fc1755a
--- /dev/null
@@ -0,0 +1,121 @@
+;-----------------------------------------------------------\r
+;\r
+; MXPP.ASM - Get/put pixel functions\r
+; Copyright (c) 1993,1994 by Alessandro Scotti\r
+;\r
+;-----------------------------------------------------------\r
+WARN    PRO\r
+INCLUDE MODEX.DEF\r
+\r
+PUBLIC  mxGetPixel\r
+PUBLIC  mxPutPixel\r
+\r
+MX_TEXT         SEGMENT USE16 PARA PUBLIC 'CODE'\r
+                ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
+\r
+EXTRN   mx_BytesPerLine : WORD\r
+EXTRN   mx_VideoSegment : WORD\r
+EXTRN   mx_ClipX1       : WORD\r
+EXTRN   mx_ClipY1       : WORD\r
+EXTRN   mx_ClipX2       : WORD\r
+EXTRN   mx_ClipY2       : WORD\r
+\r
+;-----------------------------------------------------------\r
+;\r
+; Gets a pixel.\r
+;\r
+; Input:\r
+;       X, Y    = pixel coordinates\r
+; Output:\r
+;       pixel color\r
+;\r
+mxGetPixel      PROC    FAR\r
+        ARG     Y:WORD,                 \\r
+                X:WORD                  = ARG_SIZE\r
+        ASSUME  ds:NOTHING\r
+        .enter  0\r
+        .push   ds, si\r
+\r
+        xor     ax, ax\r
+        mov     si, [X]\r
+        cmp     si, [mx_ClipX1]\r
+        jl      @@Exit\r
+        cmp     si, [mx_ClipX2]\r
+        jg      @@Exit\r
+        mov     bx, [Y]\r
+        cmp     bx, [mx_ClipY1]\r
+        jl      @@Exit\r
+        cmp     bx, [mx_ClipY2]\r
+        jg      @@Exit\r
+\r
+        mov     al, 04h                 ; Set read plane\r
+        mov     ah, BYTE PTR [X]\r
+        and     ah, 3\r
+        mov     dx, GDC\r
+        out     dx, ax\r
+\r
+        mov     ds, [mx_VideoSegment]\r
+        mov     ax, bx\r
+        mul     [mx_BytesPerLine]\r
+        .shr    si, 2\r
+        add     si, ax\r
+\r
+        mov     al, ds:[si]             ; Get pixel value\r
+        xor     ah, ah\r
+\r
+@@Exit:\r
+        .pop    ds, si\r
+        .leave  ARG_SIZE\r
+mxGetPixel      ENDP\r
+\r
+;-----------------------------------------------------------\r
+;\r
+; Puts a pixel of the specified color.\r
+;\r
+; Input:\r
+;       X, Y    = pixel coordinates\r
+;       Color   = pixel color\r
+; Output:\r
+;       none\r
+;\r
+mxPutPixel      PROC    FAR\r
+        ARG     Color:BYTE:2,           \\r
+                Y:WORD,                 \\r
+                X:WORD                  = ARG_SIZE\r
+        .enter  0\r
+        .push   ds, si\r
+\r
+        mov     si, [X]\r
+        cmp     si, [mx_ClipX1]\r
+        jl      @@Exit\r
+        cmp     si, [mx_ClipX2]\r
+        jg      @@Exit\r
+        mov     ax, [Y]\r
+        cmp     ax, [mx_ClipY1]\r
+        jl      @@Exit\r
+        cmp     ax, [mx_ClipY2]\r
+        jg      @@Exit\r
+\r
+        mov     ds, [mx_VideoSegment]\r
+        mul     [mx_BytesPerLine]\r
+        .shr    si, 2\r
+        add     si, ax\r
+\r
+        mov     cl, BYTE PTR [X]        ; Set write plane\r
+        and     cl, 3\r
+        mov     ax, 0102h\r
+        shl     ah, cl\r
+        mov     dx, TS\r
+        out     dx, ax\r
+\r
+        mov     al, [Color]             ; Write pixel\r
+        mov     ds:[si], al\r
+\r
+@@Exit:\r
+        xor     ax, ax\r
+        .pop    ds, si\r
+        .leave  ARG_SIZE\r
+mxPutPixel      ENDP\r
+\r
+MX_TEXT         ENDS\r
+END\r