home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1993 #2 / Image.iso / graphics / acksrc.zip / ACKASM.VGA < prev    next >
Text File  |  1993-06-19  |  11KB  |  438 lines

  1. PAGE 80,132
  2. TITLE - XTASM.ASM - Assembly routines for 3D engine
  3. ;;;.286P
  4. ;==============================================================================
  5. ; COMMAND LINE ASSEMBLY
  6. ;    MASM /B63 /Z /D_Mx FILENAME;
  7. ;
  8. ;  WHERE Mx SPECIFIES MODEL (l OR c) FOR LARGE OR COMPACT MODELS
  9. ;==============================================================================
  10.     INCLUDE        ET.EQU
  11.     INCLUDE        ET.MAC
  12.  
  13.     ANGLE_30    equ        160
  14.     ANGLE_360   equ        1920
  15.  
  16.     extrn    _bMaps:DWORD
  17.     extrn    _oMaps:DWORD
  18.     extrn    _bdfp:DWORD
  19.     extrn    _PageBegin:WORD
  20.     extrn    _InvCosTable:DWORD
  21.     extrn    _InvSinTable:DWORD
  22.     extrn    _LongCosTable:DWORD
  23.     extrn    _DistanceTable:WORD
  24.     extrn    _AdjustTable:DWORD
  25.     extrn    _CenterRow:WORD
  26.     extrn    _MaxDistance:WORD
  27.     extrn    _TopColor:WORD
  28.     extrn    _BottomColor:WORD
  29.  
  30.     extrn    _ScreenBuffer:DWORD
  31.     extrn    _VidRow:WORD
  32.     extrn    _lowmask:BYTE
  33.     extrn    _Walls:WORD
  34.  
  35.  
  36.     extrn    _xRay:NEAR
  37.     extrn    _yRay:NEAR
  38.     extrn    N_LDIV@:FAR
  39.  
  40.  
  41.     PUBLIC        _graphinit
  42.     PUBLIC        _usepage
  43.     PUBLIC        _flippage
  44.     PUBLIC        _SetPalette
  45.     PUBLIC        _DrawWalls
  46.     PUBLIC        _DrawOneObject
  47.  
  48. SC_INDEX equ    03c4h    ;Sequence Controller Index
  49. CRTC_INDEX equ    03d4h    ;CRT Controller Index
  50. MISC_OUTPUT equ 03c2h    ;Miscellaneous Output register
  51. SCREEN_SEG equ    0a000h    ;segment of display memory in mode X
  52.  
  53.  
  54. _TEXT    segment byte public 'CODE'
  55. DGROUP    group    _DATA,_BSS
  56.     assume    cs:_TEXT,ds:DGROUP
  57. _ViewPage  dw 0 ; The address of the current view page
  58. _WritePage dw 0 ; The address of the current write page
  59. PageTable dw 4 dup (0)     ; Address of 4 pages
  60. ScreenWidth dw 320/4     ; The width of the screen
  61. PageSize    dw 320/4*240 ; The size of each page
  62. CRTParms label    word
  63.           dw      00d06h  ;vertical total
  64.           dw      03e07h  ;overflow (bit 8 of vertical counts)
  65.           dw      04109h  ;cell height (2 to double-scan)
  66.           dw      0ea10h  ;v sync start
  67.           dw      0ac11h  ;v sync end and protect cr0-cr7
  68.           dw      0df12h  ;vertical displayed
  69.           dw      00014h  ;turn off dword mode
  70.           dw      0e715h  ;v blank start
  71.           dw      00616h  ;v blank end
  72.           dw      0e317h  ;turn on byte mode
  73. CRT_PARM_LENGTH equ    (($-CRTParms)/2)
  74.  
  75. _TEXT    ends
  76. _DATA    segment word public 'DATA'
  77. ; Index/data pairs for CRT Controller registers that differ between
  78. ; mode 13h and mode X.
  79. _d@    label    byte
  80. _DATA    ends
  81. _BSS    segment word public 'BSS'
  82. _b@    label    byte
  83. _BSS    ends
  84.  
  85.  
  86. public _graphinit
  87. public _ViewPage,_WritePage
  88. public ScreenWidth,PageSize,PageTable
  89.  
  90.  
  91. _TEXT    SEGMENT byte public 'CODE'
  92.     ASSUME cs:_TEXT
  93.  
  94. ;==============================================================================
  95. ; void graphinit(int width,int psize,int mask)
  96. ;   width - width of the screen in bytes/plane (defaults to 320/4 if 0)
  97. ;   psize - size of each page in bytes/plane (defaults to 320*200/4 if 0)
  98. ;==============================================================================
  99. PBEGIN     _graphinit
  100.     mov    ax,13h
  101.     int    10h
  102.     ret
  103. _graphinit endp
  104.  
  105. ;==============================================================================
  106. ; void SetVGAmode(void);
  107. ;==============================================================================
  108. PBEGIN    _SetVGAmode
  109.     push    bp
  110.     mov    ax,13h
  111.     int    10h        ; Set 320x200x256
  112.     pop    bp
  113.     ret
  114. _SetVGAmode endp
  115.  
  116. ;==============================================================================
  117. ; void usepage(int page)
  118. ;==============================================================================
  119. UPnum    equ    [bp+ABASE]
  120.  
  121. PBEGIN    _usepage
  122.     ret
  123. _usepage endp
  124.  
  125. ;==============================================================================
  126. ; void flippage()
  127. ;
  128. ; NOTE: Some lines have been commented out for test purposes. If you experience
  129. ;    flicker when the page flips, un-comment the lines waiting for vertical
  130. ;    retrace.
  131. ;==============================================================================
  132. PBEGIN    _flippage
  133.     push    ds
  134.     push    si
  135.     push    di
  136.     mov    ax,0A000H
  137.     mov    es,ax
  138.     xor    di,di
  139.     lds    si,DGROUP:_ScreenBuffer
  140.     mov    cx,32000
  141. ;    cli
  142.     rep movsw
  143. ;    sti
  144.     pop    di
  145.     pop    si
  146.     pop    ds
  147.     ret
  148. _flippage endp
  149.  
  150.  
  151. ;==============================================================================
  152. ; void SetPalette(unsigned char far *PalBuf);
  153. ;==============================================================================
  154. SPbuf    equ    [bp+ABASE]
  155.  
  156. PBEGIN    _SetPalette
  157.     push    bp
  158.     mov    bp,sp
  159.     push    ds
  160.     push    si
  161.  
  162.     lds    si,dword ptr SPbuf
  163.     mov    cx,256
  164.     xor    bx,bx
  165.     cld
  166.     mov    dx,3C8H
  167. sp010:
  168.     mov    al,bl
  169.     out    dx,al
  170.     inc    dx
  171.     lodsb
  172.     out    dx,al
  173.     lodsb
  174.     out    dx,al
  175.     lodsb
  176.     out    dx,al
  177.     dec    dx
  178.     inc    bx
  179.     loop    sp010
  180.  
  181.     pop    si
  182.     pop    ds
  183.     pop    bp
  184.     ret
  185. _SetPalette endp
  186.  
  187. ;==============================================================================
  188. ; void DrawWalls(void);
  189. ;==============================================================================
  190. Y2    equ    [bp-2]
  191. AVLOW    equ    [bp-4]
  192. AVHI    equ    [bp-6]
  193. VCOL    equ    [bp-8]
  194. BOFFLOW equ    [bp-10]
  195. BOFFHI    equ    [bp-12]
  196. sColor    equ    [bp-14]
  197. fColor    equ    [bp-16]
  198.  
  199. PBEGIN    _DrawWalls
  200.     push    bp
  201.     mov    bp,sp
  202.     sub    sp,18
  203.     push    ds
  204.     push    si
  205.     push    di
  206.  
  207.     les    di,dword ptr ds:_ScreenBuffer
  208.     mov    cx,16000
  209.     mov    ax,ds:_TopColor
  210.     mov    ah,al
  211.   rep    stosw
  212.     mov    cx,16000
  213.     mov    ax,ds:_BottomColor
  214.     mov    ah,al
  215.   rep    stosw
  216.  
  217.     xor    ax,ax            ;Initial loop/plane counter
  218.     mov    VCOL,ax            ;Set beginning video column
  219.     mov    si,offset _Walls    ; Point to wall array
  220.  
  221.     mov    cx,320            ;Number of walls to display
  222. drw020:
  223.     push    ds            ;save data segment
  224.     push    si            ;save wall pointer
  225.     push    cx            ;save wall count
  226.     lodsw                ;Get bitmap number
  227.     xchg    ax,bx            ;use bx as the index
  228.     shl    bx,1
  229.     shl    bx,1            ;dword index into bitmap table
  230.     mov    di,word ptr DGROUP:_bMaps[bx]        ;offset to bitmap
  231.     mov    es,word ptr DGROUP:_bMaps[bx+2]        ;segment of bitmap
  232.     lodsw                ;get bitmap column to display
  233.     mov    cl,6
  234.     shl    ax,cl            ;x64 to get correct row
  235.     add    di,ax            ;and add to bitmap offset
  236.     lodsw                ;get bitmap distance
  237.     shl    ax,1            ; Make word index for table lookup
  238.     mov    si,ax            ;save distance
  239.     mov    bx,word ptr DGROUP:_DistanceTable[si]  ;get height of bitmap
  240.  
  241.     mov    cx,word ptr DGROUP:_CenterRow
  242.     mov    ax,bx            ; Pick up the height
  243.     shr    ax,1            ; Divide by two
  244.     sub    cx,ax            ; And subtract from center for Y1
  245.  
  246.     mov    ax,cx            ; Start with Y1
  247.     add    ax,bx            ; and add height to it for Y2
  248.  
  249.     cmp    ax,199            ; Don't let Y2 go beyond screen height
  250.     jle    short drw030
  251.     mov    ax,199            ; Else force it to screen height
  252. drw030:
  253.     mov    Y2,ax            ;save y2
  254.     shl    si,1            ; Turn object distance into dword index
  255.  
  256.     mov    ax,word ptr DGROUP:_AdjustTable[si+2]
  257.     mov    dx,word ptr DGROUP:_AdjustTable[si]
  258.  
  259.     mov    AVHI,ax            ; Get (64 * 65536) / height
  260.     mov    AVLOW,dx
  261.     xchg    si,di            ;si now points to bitmap
  262.     mov    ax,es            ; Pick up segment to bitmap
  263.     les    di,dword ptr DGROUP:_ScreenBuffer
  264.     add    di,word ptr VCOL
  265.     mov    word ptr BOFFLOW,0    ; Initialize the current bitmap offset
  266.     mov    word ptr BOFFHI,0
  267.  
  268.     cmp    cx,word ptr Y2        ; is Y1 > Y2?
  269.     jge    short drw090        ; Yes, get on out
  270.     or    cx,cx            ; Y1 <= 0?
  271.     jle    drw050            ; Yes, no sky color needed
  272.  
  273.     mov    bx,cx            ; determine video row
  274.     shl    bx,1
  275.     add    di,word ptr ds:_VidRow[bx]
  276.  
  277. drw050:
  278.     mov    ds,ax            ;ds:si->bitmap
  279.     mov    bx,319            ; Offset to next video row
  280.     mov    dx,AVLOW        ; Hold onto lsb of adjustment
  281.     mov    ax,AVHI            ; Pick up msb of bitmap adjustment
  282.  
  283. ;------------------------------------------------------------------------------
  284. ; Here is where the actual bitmap is transferred to the screen. Better
  285. ; optimization could be done by precalculating the adjustment factor instead
  286. ; of looping until Y1 >= 0. This has not been tried so I don't know if the
  287. ; speed would make it worth it....
  288. ;------------------------------------------------------------------------------
  289. drw060:
  290.     or    cx,cx            ; Is Y1 still < 0 ?
  291.     jl    short drw070        ; Yes, don't start drawing yet
  292.  
  293.     movsb                ;Move bitmap to video
  294.     dec    si
  295.     add    di,bx            ;next row of video
  296.  
  297. drw070:
  298.     add    word ptr BOFFLOW,dx    ; Add lsb to current offset
  299.     adc    si,ax            ; Use msb to get next bitmap location
  300.     inc    cx            ; Next y1
  301.     cmp    cx,word ptr Y2        ; Beyond Y2 yet?
  302.     jl    short drw060        ; Nope, keep looping
  303.  
  304. drw090:
  305.     pop    cx            ;get wall count
  306.     pop    si            ;recover structure pointer
  307.     pop    ds
  308.     add    si,8            ;Wall structure size * 4
  309.     inc    word ptr VCOL        ;next video column to display at
  310.     dec    cx
  311.     jz    drw100
  312.     jmp    drw020            ;next wall to display
  313.  
  314. drw100:
  315.  
  316. drwDone:
  317.     mov    dx,3c5H
  318.     mov    al,0FFH            ;Enable all planes again
  319.     out    dx,al
  320.     pop    di
  321.     pop    si
  322.     pop    ds
  323.     mov    sp,bp
  324.     pop    bp
  325.     ret
  326. _DrawWalls endp
  327.  
  328. ;==============================================================================
  329. ;              +4         +6        +8        +10           +12
  330. ;  void DrawOneObject(int ObjNum,int ObjCol,int ObjDist,int VidCol,int PageNum);
  331. ;==============================================================================
  332. PBEGIN    _DrawOneObject
  333.     push    bp
  334.     mov    bp,sp
  335.     sub    sp,20
  336.     push    si
  337.     push    di
  338.     push    ds
  339.  
  340.     mov    bx,word ptr [bp+8]    ; Get the distance to the bitmap
  341.     shl    bx,1            ; Make word index for table lookup
  342.     mov    si,bx            ; Save index for now
  343.     mov    bx,word ptr DGROUP:_DistanceTable[bx]
  344.  
  345. dob010:
  346.     mov    cx,100
  347.     mov    ax,bx            ; Pick up the height
  348.     shr    ax,1            ; Divide by two
  349.     sub    cx,ax            ; And subtract from center for Y1
  350.  
  351.     mov    di,cx            ; Start with Y1
  352.     add    di,bx            ; and add height to it for Y2
  353.  
  354.     cmp    di,199            ; Don't let Y2 go beyond screen height
  355.     jle    short dob020
  356.     mov    di,199            ; Else force it to screen height
  357.  
  358. dob020:
  359.     mov    word ptr [bp-2],di  ;save y2
  360.     shl    si,1            ; Turn object distance into dword index
  361.  
  362.     mov    ax,word ptr DGROUP:_AdjustTable[si+2]
  363.     mov    dx,word ptr DGROUP:_AdjustTable[si]
  364.  
  365.     mov    word ptr [bp-14],ax    ; Get (64 * 65536) / height
  366.     mov    word ptr [bp-16],dx
  367.  
  368.     mov    bx,word ptr [bp+4]    ; Bitmap number to display
  369.     shl    bx,1            ; dword index
  370.     shl    bx,1            ; dword index
  371.     mov    ax,word ptr DGROUP:_oMaps[bx+2]
  372.     mov    dx,word ptr DGROUP:_oMaps[bx]
  373.  
  374.     mov    bx,word ptr [bp+6]    ; Bitmap column to display
  375.     shl    bx,1
  376.     shl    bx,1
  377.     shl    bx,1
  378.     shl    bx,1
  379.     shl    bx,1
  380.     shl    bx,1            ; x 64 to get correct bitmap row
  381.     add    dx,bx            ; then add to start of bitmap
  382.     mov    word ptr [bp-6],ax
  383.     mov    word ptr [bp-8],dx
  384.     les    di,dword ptr DGROUP:_ScreenBuffer
  385.     add    di,word ptr [bp+10]    ; Video column to display at
  386.     mov    word ptr [bp-18],0    ; Initialize the current bitmap offset
  387.     mov    word ptr [bp-20],0
  388.  
  389.     or    cx,cx            ; Is Y1 > 0 ?
  390.     jle    short dob030        ; Nope, start above video
  391.  
  392.     mov    ax,320
  393.     imul    cx
  394.     add    di,ax
  395.  
  396. dob030:
  397.     cmp    cx,word ptr [bp-2]    ; is Y1 > Y2?
  398.     jge    short dob090        ; Yes, get on out
  399.  
  400.     mov    bx,320            ;Amount to next row of video
  401.     lds    si,dword ptr [bp-8]    ;Get image buffer
  402.     mov    dx,word ptr [bp-16]    ; Hold onto lsb of adjustment
  403.  
  404. dob040:
  405.     or    cx,cx            ; Is Y1 still < 0 ?
  406.     jl    short dob080        ; Yes, don't start drawing yet
  407.  
  408.     lodsb
  409.     dec    si
  410.     or    al,al            ;Transparent color?
  411.     jz    dob050            ;Yes, don't write it to video
  412.     mov    byte ptr es:[di],al    ;place character in video
  413.  
  414. dob050:
  415.     add    di,bx            ;next row of video
  416.  
  417. dob080:
  418.     mov    ax,word ptr [bp-14]    ; Pick up msb of bitmap adjustment
  419.     add    word ptr [bp-20],dx    ;   and add to current offset
  420.     adc    si,ax            ; Keep the msb correct
  421.     inc    cx            ; Next y1
  422.     cmp    cx,word ptr [bp-2]    ; Beyond Y2 yet?
  423.     jl    short dob040        ; Nope, keep looping
  424.  
  425. dob090:
  426.     pop    ds
  427.     pop    di
  428.     pop    si
  429.     mov    sp,bp
  430.     pop    bp
  431.     ret
  432. _DrawOneObject      endp
  433.  
  434.  
  435. _TEXT    ENDS
  436.     END
  437.  
  438.