Wolf3D-Mac/Wolf.ppc

1 line
4.6 KiB
Plaintext
Raw Normal View History

; ; Assembly language functions for wolf 3-D PPC version ; Written by Bill Heineman ; 9-12-94 (Rev for removing scalers and using direct code) ; ; ; Bullshit to make the PPC Mac environment know I'm here ; import VideoWidth ; global variable from C program import MacViewHeight import ArtData import VideoPointer import ScaleDiv toc tc VideoWidth[TC],VideoWidth tc MacViewHeight[TC],MacViewHeight tc ArtData[TC],ArtData tc VideoPointer[TC],VideoPointer tc ScaleDiv[TC],ScaleDiv export IO_ScaleWallColumn[DS] export .IO_ScaleWallColumn[PR] export SpriteGlue[DS] export .SpriteGlue[PR] toc ;Table of contents for the subroutines tc IO_ScaleWallColumn[TC], IO_ScaleWallColumn[DS] tc SpriteGlue[TC], SpriteGlue[DS] csect IO_ScaleWallColumn[DS] dc.l .IO_ScaleWallColumn[PR] dc.l TOC[tc0] csect SpriteGlue[DS] dc.l .SpriteGlue[PR] dc.l TOC[tc0] ; ; This routine will draw a scaled wall column. ; ; void IO_ScaleWallColumn(Word x,Word scale,LongWord column) ; WALLHEIGHT EQU 128+1 ; Passed from "C" X equ R3 ;X coord Scale equ R4 ;Scale factor Tile equ R5 ;Tile to draw Column equ R6 ;Packed wall column # ; Locals ArtStart EQU R7 ;Pointer to wall art ScreenPtr EQU R8 ;Pointer to screen memory column Frac EQU R9 ;Fractional scaler Integer EQU R10 ;Fractional integer VWidth EQU R11 ;Video of the video screen in bytes Delta EQU R6 ;Delta factor and temp VHeight EQU R12 ;Height of mac screen Temp EQU R3 ;Temp (Use AFTER X is added) csect .IO_ScaleWallColumn[PR] CMPLWI Scale,0 ;Is the scale factor zero? BEQLR ;Exit NOW! LWZ ScreenPtr,VideoPointer[TC](RTOC) ;Get handle to video LWZ ArtStart,ArtData[TC](RTOC) ;Get handle to art data list LWZ VWidth,VideoWidth[TC](RTOC) ;Get handle to video width LWZ Frac,ScaleDiv[TC](RTOC) LWZ VHeight,MacViewHeight[TC](RTOC) ;Get pointer to view height LWZ ScreenPtr,0(ScreenPtr) ;I have the base pointer LWZ VWidth,0(VWidth) ;Init video width LWZ VHeight,0(VHeight) ;Get the number of lines visible SLWI Scale,Scale,1 ;Mul scale by 2 (Get true pixel value ADD ScreenPtr,ScreenPtr,X ;Add the X coord (Frees Temp) SLWI Temp,Scale,1 ;Get low word index SLWI Tile,Tile,2 ;Get the wall shape pointer LWZX Frac,Frac,Temp ;Get the scale factor SLWI Column,Column,7 ;Mul by 128 pixels LWZX ArtStart,ArtStart,Tile ;Get pointer to the shape ADD ArtStart,ArtStart,Column ;I have the shape ptr CMPLW Scale,VHeight ;Too big? BGE ClipTop ;Clip the top ; ; No clipping needed! ; Adjust the dest screen for the starting Y coord ; MTCTR Scale ;Init counter SUB Temp,VHeight,Scale ;How many lines to jump down? LI Delta,0 ;Init the delta factor SRWI Temp,Temp,1 ;Divide by to center vertically SRWI Integer,Frac,24 ;Isolate the integer MULLW Temp,VWidth,Temp ;Adjust the Y coord SLWI Frac,Frac,8 ;Isolate the fraction ADD ScreenPtr,ScreenPtr,Temp ;Create the dest screen pointer ; ; Tight loop ; Grab byte, adjust fractional scaler values and store to screen ; More: LBZ R0,0(ArtStart) ;Fetch a shape byte ADDC. Delta,Delta,Frac ;Add the scaler fractional STB R0,0(ScreenPtr) ;Store on the screen ADDE ArtStart,ArtStart,Integer ;Add the constant ADD ScreenPtr,ScreenPtr,VWidth ;Go down a line BDNZ More ;All lines done? BLR ;Exit routine ; ; Clip the top and bottom ; Calc the number of lost lines by clipping and "Fake" ; the numbers as if I processed those missing lines ; ClipTop: MTCTR VHeight ;I will draw a screen line full SUB Temp,Scale,VHeight ;How many lines to jump down? SRWI Integer,Frac,24 ;Isolate the integer SRWI Temp,Temp,1 ;Divide by to center vertically MULLW Temp,Frac,Temp ;Adjust the scaler by lost lines SRWI Delta,Temp,24 ;How many bytes are lost? ADD ArtStart,ArtStart,Delta ;Create the SOURCE art pointer SLWI Frac,Frac,8 ;Isolate the fraction SLWI Delta,Temp,8 ;Init the adjusted delta B More ;Jump to the code ; ; Call the compiled scaler to draw a run of the line ; csect .SpriteGlue[PR] SGArtStart EQU R3 ;Pointer to the 6 byte run struct