********************* *********************** ****** . . ****** **** . . . Init & Exit code . " **** *** ' . """""""""""""""" . *** ** . . . . . " . . ** ** " written in a hurry for . . ** *** . : . . """""""""""""""""""""" . *** **** #Amycoders' starfield compo by **** ****** . """"""""""""""""""""""""""" morbid ********************* *********************** bsr CloseWB ; Flush view and disable multitasking bsr OpenScreen ; Set pointers and sync jsr Starfield_init ;Init starfield ** ************************************************************ ************************************************************ ** ** >>> M A I N <<< ** Main btst #6,$bfe001 beq Exit ************************************************************ bsr DisplayScreen jsr Starfield ;call starfield (a0=Bitplane) bra Main ** ************************************************************ ** ** Flush view & disable system ** CloseWB movea.l 4.w,a6 ; exec base jsr -132(a6) ; Forbid jsr -120(a6) ; Disable lea GfxName(pc),a1 ; graphics.library moveq #0,d0 ; whatever verision jsr -552(a6) ; open it ! move.l d0,GfxBase ; store gfxbase movea.l d0,a6 ; gfxbase in a6 move.l $22(a6),OldView ; store system view move.l $26(a6),OldCop ; store system copper sub.l a1,a1 jsr -222(a6) ; flush view (LoadView) jsr -270(a6) ; WaitTOF jsr -270(a6) ; twice for interlaced views move.w $dff002,OldDMAcon ; store old dma control register ori.w #$8000,OldDMAcon ; set bit #15 move.w #$7fff,$dff096 move.w #$8380,$dff096 rts GfxName dc.b 'graphics.library',0 even GfxBase dc.l 0 OldView dc.l 0 OldCop dc.l 0 OldDMAcon dc.w 0 cnop 0,4 ** ************************************************************* ** ** Display Screen ** DisplayScreen movem.l d0-d1,-(sp) move.b $bfe801,d0 .wait cmp.b $bfe801,d0 beq.b .wait move.l screen_logical(pc),d0 move.l screen_physical(pc),screen_logical move.l d0,screen_physical lea copper_bpl,a0 move.w d0,6(a0) ; lower part of bpl address swap d0 move.w d0,2(a0) ; higher word movea.l screen_logical(pc),a0 moveq #0,d0 move.l #(320/32)*256-1,d1 .clear move.l d0,(a0)+ ; clear logical screen dbf d1,.clear lea -(320/8)*256(a0),a0 movem.l (sp)+,d0-d1 rts screen_physical dc.l 0 screen_logical dc.l 0 ** ************************************************************* ** ** Open Screen ** OpenScreen lea $dff000,a5 move.l #Copper,$80(a5) move.w #$2c81,$08e(a5) ; display window start pos move.w #$2cc1,$090(a5) ; display window stop pos move.w #$0038,$092(a5) ; data fetch start pos move.w #$00d0,$094(a5) ; data fetch stop pos move.l #ScreenA,screen_logical move.l #ScreenB,screen_physical bsr DisplayScreen rts ** ************************************************************** ** ** Open WB ** Exit lea $dff000,a5 move.w #$7fff,$96(a5) ; clear dmacon move.w OldDMAcon(pc),$96(a5) ; set old bits move.l GfxBase(pc),a6 ; gfxbase in a6 move.l OldCop(pc),$80(a5) ; restart old copperlist move.l OldView(pc),a1 jsr -222(a6) ; Load system view move.l a6,a1 move.l 4.w,a6 jsr -414(a6) ; close graphics.library jsr -126(a6) ; Enable jsr -138(a6) ; Permit rts ************************************************************************ section screens,bss_c ScreenA ds.b (320*256)/8 ScreenB ds.b (320*256)/8 ************************************************************************ section copperlist,data_c Copper dc.l $01001000 ; bplcon0 dc.l $01080000 ; bpl1mod dc.l $010a0000 ; bpl2mod dc.l $01800000 ; colour 0 = black dc.l $01820fff ; colour 1 = white copper_bpl dc.l $00e00000 ; bpl1pth dc.l $00e20000 ; bpl1ptl dc.l $fffffffe ************************************************************************** ************************************************************************** ** ** ** Your starfield code starts here ** ** ************************************************************************** ************************************************************************** section code,code ;put your code here ********************************************* ** Do all initialisations here ********************************************* ********************************************* * * 128 bytes long starfield routine. * Coded by Flynn/Capsule in a sleepless night * ********************************************* Starfield_init: a lea RNDSeed,a2 ; a2 will remain constant for all the program lea 4(a2),a3 ; Stars table move.w #511,d2 ; yet another constant ; the rts that should come here was ; removed so the code gets 2 bytes ; smaller. rnd ; <- d1 : max, -> d0 : random move.l (a2),d0 add.l d0,d0 ; d0 x 2 bhi.s .over eori.w #$1d87,d0 .over move.l d0,(a2) ; new seed andi.l #$ffff,d0 divu.w d1,d0 swap d0 b rts ; ony this rts is needed. ********************************************* ** This routine is called once a frame ** ** The destination Bitplane is given in a0 ********************************************* Starfield: c move.l a3,a4 ; stars tabelle move.w d2,d6 ; 512 stars/frame dostar move.w (a4),d5 ; d5 = z bne.s notzeroyet ; zero? ;--- move.w d2,d1 ; z max (512) bsr.b rnd ; generate move.w d0,(a4)+ ; store z coord lsl.w #3,d1 ; x max (32704) bsr.b rnd ; generate sub.w #2048,d0 ; convert to coords. move.w d0,(a4)+ bsr.b rnd ; generate sub.w #2048,d0 ; convert to coords. move.w d0,(a4)+ ;--- subq.l #6,a4 ; point to new star. addq.w #1,(a4) ; for safe. move.w (a4),d5 ; get new star. notzeroyet ; start the dance... subq.w #1,(a4)+ ; z = z - 1 and point to x coord. move.w (a4)+,d4 ; d4 = x move.w (a4)+,d3 ; d3 = y ext.l d4 ; sign extension divs.w d5,d4 ; x' = x / z ext.l d3 ; sign extension divs.w d5,d3 ; y' = y / z add.w #127,d3 ; back to screen coords. cmpi.w #255,d3 ; y > 255? bhi.s skipped ; do not plot. mulu.w #40,d3 ; (y * xsize) add.w #159,d4 ; back to screen coords. cmpi.w #319,d4 ; x > 319? bhi.s skipped ; skip it. move.w d4,d7 ; keep a copy in d2 lsr.w #3,d4 ; 320/8 (40 bytes/plane) not d7 ; for the bset business. add.w d4,d3 ; add x offset bset.b d7,(a0,d3.w) ; magically plot the star. skipped dbf d6,dostar ; do it 512 times. d rts printt "Length of code:" printv ((b-a)+(d-c)) ********************************************** ** ** Data area ** ********************************************** section bss,bss ;put your tables heres RNDSeed ds.l 1 ; random seed. ; Stars table. Data is stored in (z,x,y) triads so that the first ; value you get is z so you can inmediatly check for z = 0. Tabelle ds.w 512*3 ; (z,x,y) for 512 stars. .