home *** CD-ROM | disk | FTP | other *** search
/ The Party 1994: Try This At Home / disk_image.bin / source / gallery / a_flrsky.asm next >
Assembly Source File  |  1994-06-14  |  7KB  |  345 lines

  1. ; Floor&Sky darkness table
  2.  
  3.         IDEAL
  4.         MODEL Compact, Pascal
  5.         RADIX 10
  6.         P286
  7.  
  8.         FARDATA FloorSky
  9.  
  10. PUBLIC FloorSkyTable
  11.  
  12. FloorSkyTable:
  13.         INCLUDE "data\floorsky.inc"
  14.  
  15.         DATASEG
  16.  
  17. EXTRN CurrentBase : Word
  18. EXTRN CurrentPage : Word
  19.  
  20. PUBLIC SkyTexture, FloorTexture
  21. PUBLIC Column0, Column1, Column2, Column3
  22. PUBLIC LoY, HiY
  23.  
  24. SkyTexture     DD   100d DUP(?)      ; Colors for Sky...
  25. FloorTexture   DD   100d DUP(?)      ; ...and Floor
  26.  
  27. Column0        DD   200d DUP (?)
  28. Column1        DD   200d DUP (?)
  29. Column2        DD   200d DUP (?)
  30. Column3        DD   200d DUP (?)
  31.  
  32. ColumnMemoryP0 DB   200d*20d DUP(?)
  33. ColumnMemoryP1 DB   200d*20d DUP(?)
  34. ColumnMemoryP2 DB   200d*20d DUP(?)
  35.  
  36. Times4000      DW   0d,4000d,8000d   ; 4000 table to calculate offset
  37.                                      ; into ColumnMemoryP?
  38.                                      ; (seen 4000 in binary? :-o)
  39.  
  40. LoY            DW   ?
  41. HiY            DW   ?
  42.  
  43. PageLoHi       DW   3*20d DUP (00c7h)  ; Lo=199, Hi=0
  44.  
  45.         CODESEG
  46.  
  47. EXTRN DumpColumns : NEAR
  48.  
  49. PUBLIC InitColumnMemory
  50. PUBLIC FillWithFloorSky        ; fills 16 cols w/ background & reset LoY,HiY
  51. PUBLIC RegisterRange           ; (Y0,Y1:word)
  52. PUBLIC Dump16cols              ; (Ofs:word);
  53.  
  54. ; // InitColumnMemory
  55.  
  56.       PROC InitColumnMemory NEAR
  57. P386
  58.       USES eax, ecx, edi, es
  59.         xor eax,eax
  60.         mov ecx, 3000d
  61.         mov ax,ds
  62.         mov es,ax
  63.         xor edi,edi
  64.         mov di, offset ColumnMemoryP0
  65.         rep stosd
  66.       ret
  67.       ENDP
  68.  
  69. ; // FillWithFloorSky
  70.  
  71.       PROC FillWithFloorSky NEAR
  72. P386
  73.       USES ax, ecx, esi, edi, es
  74.  
  75.         mov [LoY], 199d
  76.         mov [HiY], 0
  77.  
  78.         mov ax,ds
  79.         mov es,ax
  80.  
  81.         xor esi,esi
  82.         xor edi,edi
  83.         cld
  84.         mov di, offset Column0
  85.  
  86.         REPT 4
  87.           mov si, offset SkyTexture
  88.           mov ecx, 200d
  89.           rep movsd
  90.         ENDM
  91.  
  92.         ret
  93. P286
  94.       ENDP
  95.  
  96. ; // RegisterRange
  97.  
  98.       PROC RegisterRange NEAR
  99.       ARG Y0 : Word, Y1 : Word
  100.       USES ax
  101.         mov ax, [Y0]
  102.         cmp ax, [LoY]
  103.         jnb @@Y0notLess
  104.         mov [LoY],ax
  105. @@Y0notLess:
  106.         mov ax, [Y1]
  107.         cmp ax, [HiY]
  108.         jna @@Y1notMore
  109.         mov [HiY], ax
  110. @@Y1notMore:
  111.         ret
  112.       ENDP
  113.  
  114. ; // UpdateColumns
  115.  
  116.         PROC UpdateColumns NEAR
  117.         ARG Texture : FAR PTR Byte, X : Word, \
  118.             ScreenOffset : Word, Y0 : Word, Y1 : Word
  119. P386
  120.         pusha
  121.         push es
  122.         push ds
  123.         push fs
  124.  
  125.           mov dx, 3c5h
  126.           mov al, 0fh
  127.           out dx, al        ; set mask to all
  128.  
  129.           mov ax, 0a000h
  130.           mov fs, ax
  131.           mov di, [CurrentBase]
  132.           add di, [ScreenOffset]
  133.  
  134.           mov ax, [Y0]
  135.           shl ax,4
  136.           add di, ax
  137.           shl ax,2
  138.           add di, ax         ; fs:di-> screen
  139.  
  140.           mov ax,ds
  141.           mov es,ax
  142.           mov bx, offset Times4000
  143.           mov ax, [CurrentPage]
  144.           shl ax,1
  145.           add bx,ax
  146.           mov bx,[bx]                   ; bx = 4000*page
  147.  
  148.           mov ax, [X]
  149.           shl ax,3
  150.           add bx,ax
  151.           shl ax,3
  152.           add bx,ax
  153.           shl ax,1
  154.           add bx,ax                     ; + 200*X
  155.  
  156.           add bx, [Y0]                  ; + Y0
  157.  
  158.           add bx, offset ColumnMemoryP0  ; es:bx -> ColumnMemory
  159.  
  160.           lds si, [Texture]              ; ds:si -> texture
  161.           mov ax, [Y0]
  162.           shl ax,2
  163.           add si, ax                     ; +4*Y0
  164.  
  165.           mov cx, [Y1]
  166.           sub cx, [Y0]
  167.           inc cx
  168.           jle @@nothing
  169.  
  170. @@updtLoop:
  171.           mov eax, [ds:si]    ; get floor/sky texture color
  172.           cmp al, [es:bx]     ; compare w/ memory
  173.           je @@same
  174.  
  175.           ; not the same, update screen:
  176.  
  177.           mov [es:bx], al     ; update memory
  178.           mov [fs:di], eax    ; ...and dump to screen
  179.  
  180. @@same:
  181.           inc bx
  182.           add si,4
  183.           add di,80d
  184.  
  185.           loop @@updtLoop
  186.  
  187. @@nothing:
  188.  
  189.         pop fs
  190.         pop ds
  191.         pop es
  192.         popa
  193. P286
  194.         ret
  195.         ENDP
  196.  
  197.  
  198. ; // KillMemory
  199.  
  200.         PROC KillMemory NEAR
  201.         ARG X : Word, Y0 : Word, Y1 : Word
  202. P386
  203.         pusha
  204.         push es
  205.  
  206.           mov ax,ds
  207.           mov es,ax
  208.           mov bx, offset Times4000
  209.           mov ax, [CurrentPage]
  210.           shl ax,1
  211.           add bx,ax
  212.           mov di,[bx]                   ; di = 4000*page
  213.  
  214.           mov ax, [X]
  215.           shl ax,3
  216.           add di,ax
  217.           shl ax,3
  218.           add di,ax
  219.           shl ax,1
  220.           add di,ax                     ; + 200*X
  221.  
  222.           add di, [Y0]                  ; + Y0
  223.  
  224.           add di, offset ColumnMemoryP0  ; es:bx -> ColumnMemory
  225.  
  226.           mov cx, [Y1]
  227.           sub cx, [Y0]
  228.           inc cx
  229.           jle @@nothing
  230.  
  231.           xor al,al
  232.           rep stosb
  233.  
  234. @@nothing:
  235.  
  236.         pop es
  237.         popa
  238. P286
  239.         ret
  240.         ENDP
  241.  
  242.  
  243. ; // Dump16cols
  244.  
  245. MACRO   dumpOne buf,msk
  246.         push ds
  247.         push offset buf
  248.         push [Ofs]
  249.         push [allY0]
  250.         push [allY1]
  251.         push msk
  252.         call DumpColumns
  253. ENDM
  254.  
  255.       PROC Dump16cols NEAR
  256.       ARG Ofs : Word, X : Word
  257.       LOCAL allY0 : Word, allY1 : Word
  258.  
  259.         ; find lo and hi Y
  260.  
  261.         mov si, offset PageLoHi
  262.         mov ax, [CurrentPage]
  263.         shl ax,3
  264.         mov bx,ax
  265.         shl ax,2
  266.         add ax,bx
  267.         add si, ax
  268.         mov ax, [X]     ; ax = 0..19
  269.         shl ax, 1
  270.         add si, ax      ; ax -> PageLoHi[X div 16]
  271.  
  272.         mov ax,[si]
  273.         xor bh,bh
  274.         mov bl,al       ; bx = oldLoY
  275.         mov cx, [LoY]
  276.         cmp bx, cx
  277.         jb @@1
  278.         mov bx,cx
  279. @@1:                    ; bx = min(oldLoY,LoY)
  280.         mov [allY0], bx
  281.  
  282.         xor bh,bh
  283.         mov bl,ah
  284.         mov cx, [HiY]
  285.         cmp bx,cx
  286.         ja @@2
  287.         mov bx,cx
  288. @@2:                    ; bx = max(oldHiY,HiY)
  289.         mov [allY1], bx
  290.  
  291.         ; draw walls
  292.  
  293.         DumpOne Column0, 1
  294.         DumpOne Column1, 2
  295.         DumpOne Column2, 4
  296.         DumpOne Column3, 8
  297.  
  298.         push [X]
  299.         push [allY0]
  300.         push [allY1]
  301.         call KillMemory
  302.  
  303.  
  304.         ; Update sky
  305.  
  306.         mov ax,[allY0]
  307.         dec ax
  308.         js @@skipSky
  309.  
  310.         push ds
  311.         push offset SkyTexture
  312.         push [X]
  313.         push [Ofs]
  314.         push 0         ; Y0
  315.         push ax        ; Y1 = allY0-1
  316.         call UpdateColumns
  317.  
  318. @@skipSky:
  319.  
  320.         ; update floor
  321.  
  322.         mov ax,[allY1]
  323.         inc ax
  324.         cmp ax,200
  325.         jae @@skipFloor
  326.  
  327.         push ds
  328.         push offset SkyTexture
  329.         push [X]
  330.         push [Ofs]
  331.         push ax        ; Y0 = allY1+1
  332.         push 199       ; Y1 = 199
  333.         call UpdateColumns
  334.  
  335. @@skipFloor:
  336.  
  337.         ret
  338.       ENDP
  339.  
  340.  
  341.  
  342.  
  343.         END
  344.  
  345.