; +------------------------+ ; | SETUP | ; +------------------------+ ; | | ; | Coded By H. Erlandsson | ; +------------------------+ **************** EXT FILES **************** **************** SYMBOLS **************** Wid=320 Hgt=256 Bpls=4 Bwid=Wid/8 Bpl=Bwid*Hgt Buff1=$7f800-Bpls*Bpl ;leave space for SSP Buff2=Buff1-Bpls*Bpl **************** MACROS **************** WaitBlit:MACRO ;wait until blitter is finished btst #14,2(a6) bne.s *-6 ENDM WaitBlit2:MACRO ;wait until blitter is finished btst #14,(a6) ;A6=DFF002! bne.s *-4 ENDM WaitSync:MACRO ;wait until raster beam=\1 btst #0,5(a6) bne.s *-6 cmp.b \1,6(a6) bne.s *-14 ENDM WaitSync1:MACRO ;wait until raster beam=$100+\1 btst #0,5(a6) beq.s *-6 cmp.b \1,6(a6) bne.s *-14 ENDM **************** PROGRAM **************** JUMPPTR B ORG $20000 LOAD $20000 B: MOVEM.L D1-A6,-(SP) LEA $DFF000,A6 move.w $1c(a6),-(SP) move.w 2(a6),-(SP) move.l $78.w,-(SP) move.w #$7fff,$9c(a6) move.w #$7fff,$9a(a6) move.w #$7fff,$96(a6) WAITSYNC #0 move.l #Cop0,$80(a6) move.w #0,$88(a6) move.l #Lvl6,$78.w ;int pointer lea $bfd400,a5 ;reg. base lea LoHi(PC),a0 move.b (a5),(a0)+ ;save old timerA values move.b $100(a5),(a0)+ move.b #$81,(a5) ;set new timerA value move.b #$37,$100(a5) ;to approx 1/50th of a second move.b #$81,$900(a5) ;bit#7=set/clr,#0=TimerA WAITSYNC #$80 ;so that visible! move.b #$11,$a00(a5) ;Bit#0=TimerA,#4=strobe,#3=one-shot move.w #$e000,$9a(a6) ;enable lvl6! move.w #$87f0,$96(a6) bset #1,$bfe001 ;filter off INIT: lea Buff1,a0 move.l #Bpls*Bpl,d0 bsr ClrMem ;Clear Screen(s) ;; MLOOP: WAITSYNC #0 moveq #0,d0 bsr ChkKey move.b Key(PC),d0 beq.s .NoKey cmp.b #$66,d0 ;P? bne.s .NoP .Pause: move.w #$0200,Ena0+2 moveq #0,d0 bsr ChkKey cmp.b #$66,Key ;P? bne.s .Pause move.w #$4200,Ena0+2 .NoP: cmp.b #$3a,d0 ;ESC? beq.s EXIT .NoKey: BRA MLOOP EXIT: bclr #1,$bfe001 move.w #$7fff,$9c(a6) move.w #$7fff,$9a(a6) move.w #$7fff,$96(a6) move.l (SP)+,$78.w move.l 4.w,a0 move.l (a0),a0 move.l (a0),a0 WAITSYNC #0 move.l $26(a0),$80(a6) move.w #0,$88(a6) ;restore cop move.w (SP)+,d0 bset #15,d0 move.w d0,$96(a6) move.w (SP)+,d0 bset #15,d0 move.w d0,$9a(a6) MOVEM.L (SP)+,D1-A6 MOVEQ #0,D0 RTS **************** PROGRAM ROUTINES **************** ;; Lvl6: btst #0,$bfdd00 ;is this MY TimerA int? beq.s .End ;if not, skip move.w #$fff,$dff180 move.w #$000,$dff180 .End: move.w #$2000,$dff09c RTE Vbl: MOVEM.L D0-A6,-(SP) addq.w #1,Frame MOVEM.L (SP)+,D0-A6 move.w #$0020,$dff09c RTE **************** SYSTEM ROUTINES **************** ShadeRGB: ;shade from a0 to a1-->a2.d0=step0-16,d1=dstmod,d2=nrcols-1 MOVEM.L D0-D1/A0,-(SP) .loop: move.w (a0)+,d3 ;get src1-col->d2 move.w (a1)+,d4 ;get src2-col->d3 move.w d3,d5 ;R clr.b d5 move.w d4,d7 clr.b d7 sub.w d5,d7 muls d0,d7 asr.w #4,d7 add.w d5,d7 move.w d3,d5 ;G and.w #$f0,d5 move.w d4,d6 and.w #$f0,d6 sub.w d5,d6 muls d0,d6 asr.w #4,d6 add.w d5,d6 and.w #$f0,d6 move.b d6,d7 and.w #$f,d3 and.w #$f,d4 sub.w d3,d4 ;B muls d0,d4 asr.w #4,d4 add.w d3,d4 or.w d4,d7 move.w d7,(a2)+ add.w d1,a2 dbf d2,.loop MOVEM.L (SP)+,D0-D1/A0 RTS BlitFill: ;a0=ptr,d0=bltsize,d1=mod,d2=fillword WAITBLIT move.l a0,$54(a6) move.w d1,$66(a6) move.l #$01f00000,$40(a6) moveq #-1,d1 move.l d1,$44(a6) move.w d2,$74(a6) move.w d0,$58(a6) RTS BlitCopy: ;copies a0-->a1.d0=bltsize,d1=smod/dmod.addrs=incstart/decend move.l #$09f00000,d2 cmp.l a0,a1 ble.s .inc addq.b #2,d2 .inc: WAITBLIT move.l a0,$50(a6) move.l a1,$54(a6) move.l d1,$64(a6) move.l d2,$40(a6) moveq #-1,d1 move.l d1,$44(a6) move.w d0,$58(a6) RTS DblBuf: ;double buffer the two screens.a0=copper ptrs+2 move.l Scrn(PC),d0 move.w #Bpls-1,d1 subq.w #1,d1 .Loop: swap d0 move.w d0,(a0) swap d0 move.w d0,4(a0) addq.w #8,a0 add.l #Bpl,d0 dbf d1,.Loop move.l #Buff1,d0 btst #0,Frame+1 beq.s .Buf1 move.l #Buff2,d0 .Buf1: move.l d0,Scrn RTS ;[Buff] is now the non-shown plf ChkKey: ;read RAW key code-->d0.0=no key!Clr d0 if 1st! lea $bfec01,a0 lea OldC01(PC),a1 btst #3,$100(a0) beq.s .End ;key pressed down? move.b (a0),d0 ;read key bset #6,$200(a0) bclr #6,$200(a0) ;ready to receive next! lsr.b #1,d0 bcc.s .NoKey move.b d0,(a1) bra.s .End .NoKey: moveq #0,d0 .End: move.b d0,Key RTS ClrMem: ;Clr a0-mem,word aligned. d0.L=nrBYTES! add.l d0,a0 moveq #0,d1 move.b d0,d1 and.b #31,d1 beq.s .NoClrb .loop1: clr.b -(a0) subq.b #1,d1 bne.s .loop1 .NoClrb:lea Black(PC),a2 movem.l (a2)+,d1-d7/a1 lsr.l #5,d0 beq.s .NoMVM subq.w #1,d0 .loop2: movem.l d1-d7/a1,-(a0) dbf d0,.loop2 .NoMVM: RTS **************** COPPER **************** EVEN Cop0: dc.w $0100,$0200 dc.l -2 dc.w $180,$0 dc.w $08e,$2881 dc.w $090,$28c1 dc.w $092,$38 dc.w $094,$d0 dc.w $102,0 dc.w $104,0 dc.w $108,0 dc.w $10a,0 Spr0: dc.w $120,0,$122,0,$124,0,$126,0,$128,0,$12a,0,$12c,0,$12e,0 dc.w $130,0,$132,0,$134,0,$136,0,$138,0,$13a,0,$13c,0,$13e,0 Pal0: dc.w $180,$000,$182,$fff,$184,$000,$186,$000 dc.w $188,$000,$18a,$000,$18c,$000,$18e,$000 dc.w $190,$000,$192,$000,$194,$000,$196,$000 dc.w $198,$000,$19a,$000,$19c,$000,$19e,$000 dc.w $1a0,$000,$1a2,$000,$1a4,$000,$1a6,$000 dc.w $1a8,$000,$1aa,$000,$1ac,$000,$1ae,$000 dc.w $1b0,$000,$1b2,$000,$1b4,$000,$1b6,$000 dc.w $1b8,$000,$1ba,$000,$1bc,$000,$1be,$000 Bpl0: dc.w $0e0,(Buff1+Bpl*0)/65536 dc.w $0e2,(Buff1+Bpl*0)&65535 dc.w $0e4,(Buff1+Bpl*1)/65536 dc.w $0e6,(Buff1+Bpl*1)&65535 dc.w $0e8,(Buff1+Bpl*2)/65536 dc.w $0ea,(Buff1+Bpl*2)&65535 dc.w $0ec,(Buff1+Bpl*3)/65536 dc.w $0ee,(Buff1+Bpl*3)&65535 dc.w $0f0,(Buff1+Bpl*4)/65536 dc.w $0f2,(Buff1+Bpl*4)&65535 Ena0: dc.w $100,$4200 dc.l -2 **************** DC-DATA **************** EVEN ;; Black: blk.w 32,0 ;also used for ClrMem **************** VARS **************** EVEN ;; Scrn: dc.l Buff1 ;Buffer NOT shown Frame: dc.w 1 ;if odd then show Buff2 otherwise Buff1 Vars: blk.l 8,0 SaveSP: dc.l 0 LoHi: dc.b 0,0 Key: dc.b 0 OldC01: dc.b 0 E: *************** LOADED DATA ************** ***************** WORKSPACE ***************