focshft equ 6 grdshft equ 8 darkshft equ 7 maxz equ 16<>2-1,d5 ; .loop movem (a6)+,d2-d3 ; move d6,d0 add d2,d0 cmp #32,d0 bcc .skip ; move d7,d1 add d3,d1 cmp #32,d1 bcc .skip ; ;d0,d1=x/z of map to check! ; lsl #5,d1 ;Y*32... add d1,d0 ;+X lea 0(a2,d0*4),a0 ;mapgrid move (a0)+,d4 ;how many polys here bmi .skip move (a0),d0 ;poly data offset lea 0(a3,d0*2),a0 ; .loop2 move (a0)+,d0 ;poly# lsl #5,d0 lea 0(a4,d0),a1 ;actual poly move frame(pc),d0 cmp (a1),d0 beq .skip2 move d0,(a1)+ addq #1,wallcnt ; bsr rotandadd ;x1,z1 bsr rotandadd ;x2,z2 ; move.l (a1)+,(a5)+ ;y,h move.l (a1)+,(a5)+ ;scale move.l (a1)+,(a5)+ ;texture ; .skip2 dbf d4,.loop2 ; .skip dbf d5,.loop ; rts rotandadd movem (a1)+,d0-d1 ;X,Z sub camx(pc),d0 sub camz(pc),d1 move d0,d2 move d1,d3 ; muls cm1(pc),d0 muls cm2(pc),d1 add.l d1,d0 add.l d0,d0 swap d0 move d0,(a5)+ ;X ; muls cm3(pc),d2 muls cm4(pc),d3 add.l d3,d2 add.l d2,d2 swap d2 move d2,(a5)+ ;Z ; rts castwalls ;process 'walls' list ; move.l castrots(pc),a6 move.l vertdraws(pc),a4 move minx(pc),d0 lsl #3,d0 add d0,a6 move width(pc),d7 subq #1,d7 ; .columnloop ;do this vert line! ; clr.l vd_data(a4) move.l walls(pc),a5 move wallcnt(pc),d6 bmi .nextcolumn ; ;OK, here we use Z buffer to find nearest Z! ; move #32767,vd_z(a4) .vertloop ; move va_lx(a5),d0 move va_lz(a5),d1 muls (a6),d0 muls 2(a6),d1 add.l d1,d0 ;LX! bgt .nextvert ; move va_rx(a5),d1 move va_rz(a5),d2 muls (a6),d1 muls 2(a6),d2 add.l d2,d1 ;RX! lsl.l #4,d1 swap d1 tst d1 ble .nextvert ; ;OK, this vertical section is in line with RAY! ;gotta find middle Z! ; ;LX<0 (-lx)/(rx-lx) ; lsl.l #4,d0 swap d0 sub d0,d1 ble .nextvert swap d0 neg.l d0 divu d1,d0 ;fraction! ; move va_lx(a5),d1 move va_lz(a5),d2 muls 4(a6),d1 muls 6(a6),d2 add.l d2,d1 ;LZ add.l d1,d1 swap d1 ; move va_rx(a5),d2 move va_rz(a5),d3 muls 4(a6),d2 muls 6(a6),d3 add.l d3,d2 ;RZ add.l d2,d2 swap d2 ; move d0,d3 lsr #1,d3 sub d1,d2 muls d3,d2 add.l d2,d2 swap d2 add d1,d2 ;middle Z! ble .nextvert cmp #maxz,d2 bcc .nextvert ; ;OK, d0.r=fraction, d2.w=middle Z!...calc real height! ; move d2,d3 lsr #darkshft,d3 movem d2-d3,vd_z(a4) ; move va_h(a5),d1 ext.l d1 lsl.l #focshft,d1 divs d2,d1 ;real h ble .nextvert move d1,vd_h(a4) ; lea textures(pc),a3 move va_texture(a5),d3 move.l -4(a3,d3*4),a3 ; ;have to divide h into real height of texture! ; move te_hand(a3),d3 addq #1,d3 swap d3 clr d3 ext.l d1 lsl.l #5,d1 lsl.l #5,d3 divu.l d1,d3 move.l d3,vd_ystep(a4) ; move va_y(a5),d1 ext.l d1 lsl.l #focshft,d1 divs d2,d1 ;real Y move d1,vd_y(a4) ; ;find which column....0 -> w-1 ; ;scale up fraction to find texture column! ; and.l #$ffff,d0 move.l va_scale(a5),d1 mulu.l d1,d1:d0 move d1,d0 swap d0 ; move te_wshift(a3),d1 lsl.l d1,d0 swap d0 ;which column! move te_wand(a3),d1 and d1,d0 ; move te_hshift(a3),d1 lsl d1,d0 ; lea te_size(a3,d0),a3 move.l a3,vd_data(a4) bra.s .nextcolumn ; .nextvert lea va_size(a5),a5 dbf d6,.vertloop ; .nextcolumn lea vd_size(a4),a4 addq #8,a6 dbf d7,.columnloop ; check .columnloop ; rts dbwindow ;a0=window to double buffer.... ; movem.l wi_cop(a0),d0-d1 cmp.l d0,d1 bne.s .skip move.l wi_cop2(a0),d1 .skip move.l d1,wi_cop(a0) ; usewindow ;a0=window to use... ; move.l wi_cop(a0),cop move wi_copmod(a0),copmod move wi_w(a0),d0 move d0,width lsr #1,d0 move d0,maxx neg d0 move d0,minx move wi_h(a0),d1 move d1,hite lsr #1,d1 move d1,maxy neg d1 move d1,miny ; rts clswindow ;clear window contents/arrays etc. ; blitcls ;use blitter to cls cop ; move width(pc),d0 subq #1,d0 ; move hite(pc),d1 lsl #6,d1 or #1,d1 ; move copmod(pc),d2 subq #2,d2 ; lea coloffs(pc),a0 lea $dff000,a1 ; btst #6,2(a1) .bwait btst #6,2(a1) bne.s .bwait ; move.l #$1000000,$040(a1) move d2,$066(a1) ;Dmod ; .loop move.l cop(pc),d2 add.l (a0)+,d2 ; move.l d2,$054(a1) ;Dpth move d1,$058(a1) ;size... ; btst #6,2(a1) .bwait2 btst #6,2(a1) bne.s .bwait2 ; dbf d0,.loop rts blitcls2 ;use blitter to cls cop ; move width(pc),d0 subq #1,d0 ; move hite(pc),d1 lsr #1,d1 lsl #6,d1 or #1,d1 ; move copmod(pc),d2 add d2,d2 subq #2,d2 ; lea coloffs(pc),a0 lea $dff000,a1 move #$f00,d7 move #0,d6 ; btst #6,6(a1) .bwait btst #6,6(a1) bne.s .bwait ; move.l #$1f00000,$040(a1) move d2,$066(a1) ;Dmod move.l #-1,$044(a1) ; .loop move.l cop(pc),d2 add.l (a0)+,d2 ; move.l d2,$054(a1) ;Dpth move d1,$058(a1) ;size... move d7,$074(a1) addq #1,d7 and #$f0f,d7 ; btst #6,2(a1) .bwait2 btst #6,2(a1) bne.s .bwait2 ; move copmod(pc),d5 ext.l d5 add.l d5,d2 move.l d2,$054(a1) ;Dpth move d1,$058(a1) ;size... move d6,$074(a1) addq #1,d6 and #$f0f,d6 ; btst #6,2(a1) .bwait3 btst #6,2(a1) bne.s .bwait3 ; dbf d0,.loop rts renderwindow ; ; renderwalls move.l vertdraws(pc),a6 lea coloffs(pc),a5 move width(pc),d7 subq #1,d7 lea palettes,a2 ; .loop move.l vd_data(a6),d0 beq .vertskip move.l d0,a0 ; move.l cop(pc),a1 add.l (a5),a1 ; move vd_h(a6),d5 move.l vd_ystep(a6),d1 ; move vd_y(a6),d0 add midy(pc),d0 bpl.s .noclip ; ;gotta clip Y add d0,d5 ;reduce hite ble .vertskip neg d0 ext.l d0 mulu.l d1,d0 ;y step* y bra.s .skipclip ; .noclip mulu copmod(pc),d0 add.l d0,a1 moveq #0,d0 .skipclip ; swap d0 swap d1 move vd_pal(a6),d2 move.l 0(a2,d2*4),a3 moveq #0,d2 moveq #0,d3 move copmod(pc),d4 ext.l d4 cmp hite(pc),d5 ble.s .hok move hite(pc),d5 .hok subq #1,d5 ; .vertloop ;a0=src texture column ;a1=dest coppoke ;a3=palette ;d0=current Y ;d1=Y step ;d2=0 ;d3=$00xx ;d4=copmod ;d5=count ; move.b 0(a0,d0),d3 ;lut entry move 0(a3,d3*2),(a1) ;colour! add.l d1,d0 addx.l d2,d0 add.l d4,a1 dbf d5,.vertloop ; .vertskip addq #4,a5 lea vd_size(a6),a6 dbf d7,.loop ; check .loop ; rts vbhandler subq #1,(a1) moveq #0,d0 rts vwait move #1,vbcounter .loop tst vbcounter bgt.s .loop rts ;************** DATA *************************** data palettes ds.l 16 ;16 palettes for 16 brightnesses rgbs ds.l 1 ;table for calculating palettes joyx0 dc 0 joyy0 dc 0 joyr0 dc 0 joyb0 dc 0 ; joyx1 dc 0 joyy1 dc 0 joyr1 dc 0 joyb1 dc 0 map_map dc.l mapinc map_grid dc.l 0 map_poly dc.l 0 map_ppnt dc.l 0 map_rgbs dc.l 0 map_txts dc.l 0 ; camx dc 0 camz dc 0 camy dc 0 camr dc 0 ;camera matrix... cm1 dc $7ffe cm2 dc 0 cm3 dc 0 cm4 dc $7ffe castrots dc.l castrotsinc+8*160 ;middle of table camrots dc.l camrotsinc vertdraws dc.l 0 ;vertical strips to draw walls dc.l 0 ;linked list of walls to display wallcnt dc.l 0 ;already rotated around camera! cop dc.l 0 copmod dc 0 width dc 0 hite dc 0 minx dc 0 midx ; maxx dc 0 miny dc 0 midy ; maxy dc 0 coplist dc.l 0 slice1 dc.l 0 slice2 dc.l 0 copstop dc.l 0 memlist dc.l 0 dispnest dc 0 coloffs ds.l 320 ;320 columns max window1 ; slice dc.l slice1 nslice dc.l copstop ;slice2 ;copstop here for 1 window ; dc 160-52*3 dc 44 dc 104 ;max width for 2 high = 90! dc 80 dc 3 dc 3 dc.l joyx1 dc 0,0,0,0 ;camx,z,y,r ; dc 0 dc.l 0 dc.l 0 ; dc.l 0 dc.l 0 dc.l 0 dc.l 0 dc 0 window2 ; dc.l slice2 dc.l copstop ; dc 160-32*3 dc 44+120 dc 64 dc 59 dc 3 dc 2 dc.l joyx0 dc 0,0,0,0 ;camx,z,y,r ; dc 0 dc.l 0 dc.l 0 ; dc.l 0 dc.l 0 dc.l 0 dc.l 0 dc 0 col0 equ $123 copinit ;initialization for display ; dc $1fc,15 dc $096,$0120 ;cop/bit/spr DMA off ;dc $08e,$2c81,$090,$f4c1 dc $092,$38,$094,$a0 dc $108,6*40,$10a,6*40 dc $100,$7200 ;lores, 7 bitplanes dc $102,0 ; dc 26<<8+1,$fffe ; ;lo colour nybs - lo bank dc $106,$0200 dc $180,col0 ; ;lo nybs - hi bank dc $106,$8200 dc $180,col0 ; ;hi colour nybs - lo bank dc $106,0 dc $180,col0 ; ;hi colour nybs - hi bank dc $106,$8000 dc $180,col0 ; ;slice... ; sl1 dc $e0,0,$e2,0 dc $e4,0,$e6,0 dc $e8,0,$ea,0 dc $ec,0,$ee,0 dc $f0,0,$f2,0 dc $f4,0,$f6,0 dc $f8,0,$fa,0 dc $08e,$2c81,$090,$f4c1 ;diw dc $096,$8100 dc $084,0,$086,0,$08a,0 ; sl2 dc $e0,0,$e2,0 dc $e4,0,$e6,0 dc $e8,0,$ea,0 dc $ec,0,$ee,0 dc $f0,0,$f2,0 dc $f4,0,$f6,0 dc $f8,0,$fa,0 ;56 dc $08e,$2c81,$090,$f4c1 ;diw ;64 dc $096,$8100 ;68 dc $084,0,$086,0,$08a,0 ; cstop dc $096,$0100 dc $ffff,$fffe copinitf ; bigdata textures ds.l 48 mapinc incbin maps/test castrotsinc incbin castrots.bin camrotsinc incbin camrots.bin palette incbin texture.pal testwall dc -256,1024,256,1024 dc -64,128 dc.l $40000 dc.l 0 ;************** SLOW SUBS ********************** slowsubs loadfile ;a0=name, d1=memtype ; ;return d0=pointer ; push ; move.l d1,-(a7) ; move.l a0,d1 move.l #1005,d2 move.l dosbase,a6 jsr -30(a6) ;open it! move.l d0,d7 ;handle beq .done ; move.l d7,d1 moveq #0,d2 moveq #1,d3 jsr -66(a6) ;seek to end ; move.l d7,d1 moveq #0,d2 moveq #-1,d3 ;seek to start jsr -66(a6) ; ;d0=length of file ? ; move.l d0,d3 move.l (a7),d1 jsr allocmem ; move.l d0,d2 move.l d7,d1 jsr -42(a6) move.l d7,d1 jsr -36(a6) move.l d2,d0 ; .done addq #4,a7 pull ; rts calcpalettes ;a0=palette! ; move.l map_rgbs(pc),a0 ; move.l rgbs(pc),a1 move #255,d0 move.l #$f0000,d1 ; .loop move (a0)+,d2 ; move d2,d3 lsl.l #8,d2 and.l d1,d2 move.l d2,(a1)+ ;R ; move d3,d2 lsl.l #8,d2 lsl.l #4,d2 and.l d1,d2 move.l d2,(a1)+ ;G ; swap d3 and.l d1,d3 move.l d3,(a1)+ ;B ; dbf d0,.loop ; lea palettes(pc),a0 moveq #15,d0 ; .loop2 move.l rgbs(pc),a1 move.l (a0)+,a2 move #255,d1 ; .loop3 movem.l (a1),d2-d4 lsr.l #8,d2 and #$f00,d2 lsr.l #8,d3 lsr.l #4,d3 and #$f0,d3 swap d4 and #$f,d4 or d4,d3 or d3,d2 move d2,(a2)+ ; move.l (a1),d2 sub.l #$10000,d2 bpl.s .rok moveq #0,d2 .rok move.l d2,(a1)+ ; move.l (a1),d3 sub.l #$10000,d3 bpl.s .gok moveq #0,d3 .gok move.l d3,(a1)+ ; move.l (a1),d4 sub.l #$10000,d4 bpl.s .bok moveq #0,d4 .bok move.l d4,(a1)+ ; dbf d1,.loop3 dbf d0,.loop2 rts dispoff tst dispnest bne.s .skip bsr vwait move #$01a0,$dff096 .skip addq #1,dispnest rts dispon subq #1,dispnest bgt.s .skip bsr vwait move #$8180,$dff096 .skip rts forbid push move.l 4.w,a6 jsr -132(a6) pull rts permit push move.l 4.w,a6 jsr -138(a6) pull rts initvbint push move.l 4.w,a6 moveq #5,d0 lea vbintserver,a1 jsr -168(a6) ;addintserver pull rts vbcounter dc 0 frame dc 0 vbintserver dc.l 0,0 dc.b 2,0 dc.l 0 vbintdata dc.l vbcounter vbintcode dc.l vbhandler finitvbint push move.l 4.w,a6 moveq #5,d0 lea vbintserver,a1 jsr -174(a6) pull rts ownblitter push move.l grbase,a6 jsr -456(a6) btst #6,$dff002 .bwait btst #6,$dff002 bne.s .bwait pull rts disownblitter push btst #6,$dff002 .bwait btst #6,$dff002 bne.s .bwait move.l grbase,a6 jsr -462(a6) pull rts makecoloffs push lea coloffs,a0 moveq #2,d0 moveq #3,d2 .loop addq.l #4,d0 moveq #31,d1 .loop2 move.l d0,(a0)+ addq.l #4,d0 dbf d1,.loop2 dbf d2,.loop pull rts grname dc.b 'graphics.library',0 even grbase dc.l 0 oldview dc.l 0 dosname dc.b 'dos.library',0 even dosbase dc.l 0 showwindow ;a0=window ; push ; ;poke bitmaps... move.l wi_slice(a0),a1 move.l (a1),a1 move.l wi_bmap(a0),d0 moveq #6,d1 ;7 bitplanes .loop move d0,6(a1) swap d0 move d0,2(a1) swap d0 add.l #40,d0 addq #8,a1 dbf d1,.loop ; ;create DIW move.l wi_slice(a0),a1 move.l (a1),a1 move wi_y(a0),d0 move d0,d1 add wi_bh(a0),d1 lsl #8,d0 or #$81,d0 move d0,56+2(a1) lsl #8,d1 or #$c1,d1 move d1,56+6(a1) ; ;create link to next! move.l wi_nslice(a0),a1 move.l (a1),d0 move.l wi_cop1(a0),a1 add.l wi_copmem(a0),a1 move.l wi_cop2(a0),a2 add.l wi_copmem(a0),a2 move d0,-6(a1) move d0,-6(a2) swap d0 move d0,-10(a1) move d0,-10(a2) ; pull ; showwindowq ;display coplist ; move.l wi_slice(a0),a1 move.l (a1),a1 move.l wi_cop(a0),d0 move d0,68+6(a1) swap d0 move d0,68+2(a1) rts finitdisplay push ; move.l grbase,a6 move.l oldview,a1 jsr -222(a6) ;load view jsr -270(a6) jsr -270(a6) move.l 38(a6),$dff080 move #0,$dff088 move #$81a0,$dff096 ; pull rts initdisplay push ; lea grname,a1 move.l 4.w,a6 jsr -408(a6) move.l d0,grbase ; move.l d0,a6 move.l 34(a6),oldview sub.l a1,a1 jsr -222(a6) ;loadview ; move.l #copinitf-copinit,d0 moveq #2,d1 bsr allocmem move.l d0,coplist ; move.l d0,a1 lea copinit,a0 lea copinitf,a2 ; .loop cmp.l a2,a0 bcc.s .done move.l (a0)+,(a1)+ bra.s .loop .done ; add.l #sl1-copinit,d0 move.l d0,slice1 add.l #sl2-sl1,d0 move.l d0,slice2 add.l #cstop-sl2,d0 move.l d0,copstop ; move.l copstop,d0 move.l slice1,a0 move.l slice2,a1 move d0,68+6(a0) move d0,68+6(a1) swap d0 move d0,68+2(a0) move d0,68+2(a1) ; jsr -270(a6) jsr -270(a6) move.l coplist,$dff080 move #0,$dff088 ; pull rts makewindow ; ;a0=window struct! ; push ; move.l a0,a2 ; move wi_h(a2),d0 mulu wi_ph(a2),d0 move d0,wi_bh(a2) mulu #40*7,d0 ; move.l #$10002,d1 move.l d0,wi_bmapmem(a2) bsr allocmem move.l d0,wi_bmap(a2) ; ;OK, plot colours on bitmap! move.l d0,a0 move wi_x(a2),d0 move d0,d1 lsr #3,d0 not d1 and #7,d1 moveq #127,d7 ;colour move wi_w(a2),d6 ;width subq #1,d6 ; .wloop move wi_pw(a2),d5 subq #1,d5 ; .wloop2 move d7,d4 moveq #6,d3 ; .dloop bclr d1,0(a0,d0) lsr #1,d4 bcc.s .dskip bset d1,0(a0,d0) .dskip lea 40(a0),a0 dbf d3,.dloop ; lea -40*7(a0),a0 subq #1,d1 bpl.s .dskip2 moveq #7,d1 addq #1,d0 .dskip2 dbf d5,.wloop2 ; subq #1,d7 dbf d6,.wloop ; move.l wi_bmapmem(a2),d0 sub.l #40*7,d0 lsr.l #2,d0 subq #1,d0 lea 40*7(a0),a1 .cbloop move.l (a0)+,(a1)+ dbf d0,.cbloop ; ;how many copins on one line? move wi_w(a2),d0 move d0,d1 subq #1,d0 lsr #5,d0 ;how many bank changes per line! addq #4,d0 ;2 waits - 1 eor, 1 init bank select add d1,d0 ;+colpokes ; move d0,d1 lsl #2,d1 move d1,wi_copmod(a2) ; mulu wi_h(a2),d0 addq #5,d0 ;2 waits and cop jump at end ; lsl.l #2,d0 ;4 bytes/copins moveq #2,d1 ;cop in chip move.l d0,wi_copmem(a2) lsl.l #1,d0 ;2 coplists! bsr allocmem move.l d0,wi_cop(a2) move.l d0,wi_cop1(a2) ; move.l d0,a0 move wi_y(a2),d6 move wi_h(a2),d7 subq #1,d7 move #$111,d3 ;test colour move #$8000,d4 ;Colour Eor ; .hloop ;make one copline... ; moveq #127,d0 ;colour reg to poke move wi_w(a2),d1 subq #1,d1 ; .lloop move d0,d2 addq #1,d2 and #31,d2 bne.s .notnbank ; ;new bank.... move d0,d2 sub #31,d2 and #$ffe0,d2 lsl #8,d2 or d4,d2 ;eor bank move #$106,(a0)+ ;bank select move d2,(a0)+ ; .notnbank move d0,d2 and #31,d2 add d2,d2 add #$180,d2 move d2,(a0)+ ;colour poke move d3,(a0)+ add #$111,d3 subq #1,d0 dbf d1,.lloop ; bsr .makewait ; ;ok, now do EOR! move #$10c,(a0)+ ;move #0,d4 move d4,(a0)+ bchg #15,d4 ; dbf d7,.hloop ; bsr .makewait ; move.l #$00840000,(a0)+ move.l #$00860000,(a0)+ move.l #$008a0000,(a0)+ ; ;OK, 1 list created...copy to other! ; move.l wi_cop1(a2),a0 move.l a0,a1 add.l wi_copmem(a2),a1 move.l a1,wi_cop2(a2) move.l a1,a3 ; .copycop move.l (a0)+,(a3)+ cmp.l a1,a0 bcs.s .copycop ; pull rts .makewait ; ;make wait ins. move.l #$01fe0000,(a0)+ ;no wait - nop cmp #256,d6 blt.s .not256 move.l #$00e1fffe,-4(a0) sub #256,d6 .not256 move.b d6,(a0)+ move.b #1,(a0)+ move #$fffe,(a0)+ ;wait! add wi_ph(a2),d6 rts allocmem ; ;d0=size, d1=requirements ; push move.l 4.w,a6 ; addq.l #8,d0 move.l d0,-(a7) jsr -198(a6) move.l d0,a0 move.l memlist,(a0) move.l (a7)+,4(a0) move.l a0,memlist addq.l #8,a0 move.l a0,d0 ; pull rts freememlist push move.l 4.w,a6 ; .more move.l memlist,d0 beq.s .done move.l d0,a1 move.l (a1),memlist move.l 4(a1),d0 jsr -210(a6) bra.s .more ; .done pull rts freemem ; ;a1=address to free! ; push move.l 4.w,a6 subq.l #8,a1 move.l #memlist,d0 ; .more move.l d0,a0 move.l (a0),d0 beq.s .done ;not found! cmp.l d0,a1 bne.s .more ; move.l (a1),(a0) move.l 4(a1),d0 jsr -210(a6) ; .done pull rts initmap push ; move.l map_map,a0 ; move.l a0,a1 add.l (a0),a1 move.l a1,map_grid ; move.l a0,a1 add.l 4(a0),a1 move.l a1,map_poly ; move.l a0,a1 add.l 8(a0),a1 move.l a1,map_ppnt ; move.l a0,a1 add.l 12(a0),a1 move.l a1,map_rgbs ; move.l a0,a1 add.l 16(a0),a1 move.l a1,map_txts ; jsr calcpalettes jsr loadtxts ; lea window1,a0 bsr initwindow lea window2,a0 bsr initwindow ; pull rts loadtxts move.l map_txts,a5 ;texture names lea textures,a6 moveq #47,d7 .ltl lea .temp(pc),a0 .ltl2 move.b (a5)+,(a0)+ bne.s .ltl2 cmp.l #.temp+1,a0 beq.s .notext lea .temp2(pc),a0 moveq #1,d1 jsr loadfile .notext move.l d0,(a6)+ dbf d7,.ltl rts .temp2 dc.b 'txts/' .temp ds.b 64 initwindow move #16<