;Th.FERNIQUE ; 240 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿0 | ;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´dy | ;³ ³ | ;³ ECRAN VISIBLE ³ | HANDLE=ECRAN+une bande de 16 ;³ ³ | ;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ; @program _main,_comment ;****************************************************************************; WriteStrA MACRO move.w \3,-(a7) move.l \4,-(a7) move.w \2,-(a7) move.w \1,-(a7) jsr romlib[puttext] lea 10(a7),a7 ENDM ;****************************************************************************; _main: move.l #LCD_MEM,plane_1 move.w #2,-(a7) jsr romlib[set_font] lea 2(a7),a7 move.l #4320,-(a7) ;place pour ‚cran virtuel jsr romlib[create_handle] lea 4(a7),a7 cmp #0,d0 beq OutOfMem move.w d0,hnum handle_ptr d0,a0 move.l a0,hptr bsr ChooseSpeed cmp #3,d2 beq Exit lsl.w #1,d2 lea speed_data(PC),a0 move.w 0(a0,d2),delayvar move.w #2,npix ;scroll npix. +npix, +vitesse avec 0on continue ! movem.l (a7)+,d2-d3 move.w #1,d4 rts PasBloque: btst.b #4,keystat bne NoLeft cmp #2,d0 blt NoLeft sub.w npix,d0 bsr InBlock tst.w d4 beq NoLeft ;c'est bon on bouge add.w npix,d0 ;on va dans un bloc -> remet d0 comme c'‚tait NoLeft: btst.b #6,keystat bne NoRight cmp #222,d0 bgt NoRight add.w npix,d0 bsr InBlock tst.w d4 beq NoRight ;c'est bon on bouge sub.w npix,d0 ;on va dans un bloc -> remet d0 comme c'‚tait NoRight: cmp #126,d3 bge NoDown add.w npix,d1 add.w npix,d1 bsr InBlock tst.w d4 beq NoDown ;c'est bon on bouge sub.w npix,d1 ;on va dans un bloc -> remet d1 comme c'‚tait sub.w npix,d1 NoDown: movem.l (a7)+,d2-d3 clr.w d4 rts InBlock: ;return d4=1 if (d0,d1) in filled block movem.l d0-d1/a0,-(a7) add.w #8,d0 add.w #12,d1 lsr.w #4,d1 lsl.w #1,d1 lea cur_screen(PC),a0 move.w 0(a0,d1),d1 lsr.w #4,d0 eori.w #%1111,d0 sub.w #1,d0 btst.b d0,d1 beq False move.w #1,d4 movem.l (a7)+,d0-d1/a0 rts False: move.w #0,d4 movem.l (a7)+,d0-d1/a0 rts ScrollUp: movem.l d0-d2/a0-a2,-(a7) move.l hptr,a0 move.l #959,d2 RepScrollDown: move.l 480(a0),(a0)+ dbra d2,RepScrollDown ;*** scroll la matrice de l'‚cran d'une ligne vers le bas ***; lea cur_screen(PC),a2 move.w 2(a2),(a2) move.w 4(a2),2(a2) move.w 6(a2),4(a2) move.w 8(a2),6(a2) move.w 10(a2),8(a2) move.w 12(a2),10(a2) move.w 14(a2),12(a2) move.w 16(a2),14(a2) clr.l d0 add.w #1,mod3 cmp.w #3,mod3 ;pour un mur toutes les 3 lignes bne NoPutRow ;y'aura pas de ligne ! clr.w mod3 bsr CreateRow NoPutRow: move.w d0,16(a2) ;*** y'a pu qu'… refaire la premiŠre ligne de cases ***; lea blocks(PC),a1 moveq #14,d1 RepVirtualCol: movem.l a0-a1,-(a7) btst.w d1,d0 beq CaseVide add.l #32,a1 CaseVide: moveq #15,d2 RepPutRow: move.w (a1)+,(a0) add.l #30,a0 dbra d2,RepPutRow movem.l (a7)+,a0-a1 add.l #2,a0 dbra d1,RepVirtualCol movem.l (a7)+,d0-d2/a0-a2 rts CreateRow: move.w d1,-(a7) move.w #$FFFF,d1 ;ligne pleine move.l #15,d0 ;1 trou ds les cases 0-14 jsr flib[random] bclr.w d0,d1 move.l #15,d0 ;1 dans les cases 0-14 jsr flib[random] bclr.w d0,d1 move.l #15,d0 ;1 dans les cases 0-14 jsr flib[random] bclr.w d0,d1 move.w d1,d0 ;ligne dans d0 move.w (a7)+,d1 rts DrawScreen: movem.l d0-d2/a0-a1,-(a7) move.l hptr,a0 move.l plane_1,a1 clr.l d0 move.w dy,d0 lsl.w #1,d0 move.l d0,d1 lsl.w #4,d1 sub.w d0,d1 add.l d1,a0 ;a0+30*dy move.l #959,d0 RepCopy: move.l (a0)+,(a1)+ dbra d0,RepCopy movem.l (a7)+,d0-d2/a0-a1 rts GetBg: movem.l d0-d2/a0-a1,-(a7) lea background(PC),a0 lsl.w #1,d1 move.l d1,d2 lsl.w #4,d2 sub.w d1,d2 move.b d0,d1 and.w #$FFF0,d0 lsr.b #3,d0 add.w d0,d2 and.b #$0F,d1 eori.b #%1111,d1 move.l hptr,a1 adda.l d2,a1 moveq #15,d0 BW_Get_Next_Row: move.l (a1),(a0)+ add.l #30,a1 dbra d0,BW_Get_Next_Row movem.l (a7)+,d0-d2/a0-a1 rts PutSprite: movem.l d0-d4/a0-a2,-(a7) lea ball(PC),a0 clr.l d4 move.w d1,d4 add.w #8,d4 sub.w dy,d4 lsr.w #4,d4 and.w #%11,d4 lsl.l #5,d4 add.l d4,a0 lea mask(PC),a2 lsl.w #1,d1 move.l d1,d2 lsl.w #4,d2 sub.w d1,d2 move.b d0,d1 and.w #$FFF0,d0 lsr.b #3,d0 add.w d0,d2 and.b #$0F,d1 eori.b #%1111,d1 move.l hptr,a1 adda.l d2,a1 moveq #15,d0 BW_Next_Row: clr.l d2 clr.l d3 move.w (a2),d3 ;lit le masque rol.l d1,d3 not.l d3 and.l d3,(a1) move.w (a0)+,d2 ;dessin lsl.l d1,d2 or.l d2,(a1) add.l #30,a1 dbra d0,BW_Next_Row movem.l (a7)+,d0-d4/a0-a2 rts PutBg: movem.l d0-d2/a0-a1,-(a7) lea background(PC),a0 lsl.w #1,d1 move.l d1,d2 lsl.w #4,d2 sub.w d1,d2 move.b d0,d1 and.w #$FFF0,d0 lsr.b #3,d0 add.w d0,d2 and.b #$0F,d1 eori.b #%1111,d1 move.l hptr,a1 adda.l d2,a1 moveq #15,d0 BW_Put_Next_Row: move.l (a0)+,(a1) add.l #30,a1 dbra d0,BW_Put_Next_Row movem.l (a7)+,d0-d2/a0-a1 rts ConvStr: movem.l d0-d2,-(a7) clr.b (a0) RepConv: divu #10,d0 move.l d0,d2 swap d2 add.b #48,d2 move.b d2,-(a0) subq #1,d1 and.l #$FFFF,d0 bne RepConv tst.w d1 beq CS_Done subq #1,d1 FillOut: move.b #48,-(a0) dbra d1,FillOut CS_Done: movem.l (a7)+,d0-d2 rts ChooseSpeed: ;return d2=speed (3=exit) movem.l d0-d1/a0,-(a7) lea menu(PC),a6 jsr flib[show_dialog] move.w #1,d2 PutDiff: lea difmsgs(PC),a0 move.w #46,d1 move.w #2,d0 RepPutDiff: movem.l d0-d2/a0,-(a7) cmp d0,d2 bne NoSelect move.w #0,-(a7) bra SuiteDiff NoSelect: move.w #4,-(a7) SuiteDiff: move.l a0,-(a7) move.w d1,-(a7) move.w #88,-(a7) jsr romlib[puttext] lea 10(a7),a7 movem.l (a7)+,d0-d2/a0 lea 10(a0),a0 add.w #12,d1 dbra d0,RepPutDiff jsr flib[idle_loop] cmp #338,d0 bne D_NoUp cmp #2,d2 beq D_NoUp add.w #1,d2 D_NoUp: cmp #344,d0 bne D_NoDown cmp #0,d2 beq D_NoDown sub.w #1,d2 D_NoDown: cmp #13,d0 beq DiffEnd cmp #264,d0 bne PutDiff move.w #3,d2 DiffEnd: move.w d2,speed movem.l (a7)+,d0-d1/a0 rts ResetScores: movem.l d0-d1/a0,-(a7) lea hiscores(PC),a0 move.w speed,d1 mulu #90,d1 add.w d1,a0 moveq #4,d0 ClrNextScore: moveq #14,d1 ClrNextChar: move.b #95,(a0)+ ;_ dbra d1,ClrNextChar move.b #0,(a0)+ move.w #0,(a0)+ dbra d0,ClrNextScore movem.l (a7)+,d0-d1/a0 rts ArchiveScore: movem.l d0-d1/a0-a2,-(a7) move.w score,d0 lea hiscores(PC),a2 move.w speed,d1 mulu #90,d1 add.w d1,a2 cmp.w 88(a2),d0 ble TooLow lea 16(a2),a0 moveq #4,d1 CheckHigher: ;r‚pŠte jusqu'… trouver un score sup‚rieur ou d1=0, c…d on est premier (YEAH!) cmp.w (a0),d0 bgt HigherFound lea 18(a0),a0 dbra d1,CheckHigher HigherFound: move.w d1,place lea 90(a2),a0 lea 72(a2),a1 tst.w d1 ;on est le dernier ? beq NoScrollDown ;oui=>pas besoin de d‚caler les scores plus faibles vers le bas mulu #9,d1 ;1 score = 1 chaŒne (16 bytes)+1 word (score) = 9 words subq #1,d1 ScrollDown: ;d‚place les scores vers le bas move.w -(a1),-(a0) dbra d1,ScrollDown NoScrollDown: move.w d0,16(a1) ;insŠre le score dans le longword bsr ReadName lea str(PC),a0 RepPutName: move.b (a0)+,(a1)+ dbra d4,RepPutName TooLow: movem.l (a7)+,d0-d1/a0-a2 rts ReadName: movem.l d0-d3,-(a7) lea inputdialog(PC),a6 jsr flib[show_dialog] move.w #60,d3 ;x move.w #66,d1 ;y clr.w ($75B0) lea str(PC),a0 clr.l d4 Input: jsr flib[idle_loop] cmp.w #13,d0 beq InputDone cmp.w #257,d0 beq BackSpace cmp.w #32,d0 bcs Input cmp.w #256,d0 bcc Input cmp.w #15,d4 beq Input move.b d0,(a0)+ move.w d0,d2 move.w d3,d0 bsr WriteChar addq #8,d3 addq #1,d4 bra Input BackSpace: tst.w d4 beq Input clr.b -(a0) subq #8,d3 move.w d3,d0 moveq #32,d2 bsr WriteChar subq #1,d4 bra Input InputDone: clr.b (a0) movem.l (a7)+,d0-d3 rts ShowScores: movem.l d0-d4/a0-a2,-(a7) lea hiscores(PC),a2 move.w speed,d1 mulu #90,d1 add.w d1,a2 moveq #36,d0 moveq #46,d1 move.l #$002E0031,d2 moveq #4,d3 ShowNextScore: bsr WriteChar swap d2 addq #8,d0 bsr WriteChar swap d2 subq #8,d0 move.l d1,d4 movem.l d0-d2,-(a7) WriteStrA #52,d1,#4,a2 lea strend(PC),a0 move.w 16(a2),d0 moveq #4,d1 bsr ConvStr WriteStrA #172,d4,#4,a0 movem.l (a7)+,d0-d2 lea 18(a2),a2 addq #1,d2 add.l #10,d1 dbra d3,ShowNextScore movem.l (a7)+,d0-d4/a0-a2 rts WriteChar: movem.l d0-d2/a0,-(a7) move.w #$00FF,-(a7) clr.w -(a7) move.w #$00FF,-(a7) move.w #4,-(a7) move.w d1,-(a7) move.w d0,-(a7) move.w d2,-(a7) jsr romlib[putchar] lea 14(a7),a7 movem.l (a7)+,d0-d2/a0 rts ;************************NOUVELLE INTERRUPTION #1****************************; newint#1: tst.w timer beq NoDecTimer sub.w #1,timer NoDecTimer: rte ;******************************VARIABLES*************************************; scoredialog dc.w 30,26,210,102,50,6 dc.l scoretxt,0 scoretxt dc.b "HIGH SCORES",0 inputdialog dc.w 54,46,186,82,16,6 dc.l inputtxt,0 inputtxt dc.b "your name :",0 menu dc.w 83,41,156,84,0,0 dc.l menutxt,0 menutxt dc.b " ",0 oldint#1 dc.l 0 timer dc.w 0 hptr dc.l 0 plane_1 dc.l 0 delayvar dc.w 0 speed_data dc.w 0,2,4 ;delay selon la vitesse choisie speed dc.w 0 ;2=slow 1=medium 0=fast hnum dc.w 0 score dc.w 0 place dc.w 0 highscore dc.w 0 mod3 dc.w 0 ;pour mettre un mur toutes les 3 cases (verticalement) dy dc.w 0 x_save dc.w 0 y_save dc.w 0 npix dc.w 0 str ds.b 8 strend keystat ds.b 10 cur_screen ds.w 9 background ds.l 16 difmsgs: dc.b " SLOW ",0,0 dc.b " MEDIUM ",0,0 dc.b " FAST ",0,0 hiscores: dc.b "_______________",0,0,0 ;FAST dc.b "_______________",0,0,0 dc.b "_______________",0,0,0 dc.b "_______________",0,0,0 dc.b "_______________",0,0,0 dc.b "_______________",0,0,0 ;MEDIUM dc.b "_______________",0,0,0 dc.b "_______________",0,0,0 dc.b "_______________",0,0,0 dc.b "_______________",0,0,0 dc.b "_______________",0,0,0 ;SLOW dc.b "_______________",0,0,0 dc.b "_______________",0,0,0 dc.b "_______________",0,0,0 dc.b "_______________",0,0,0 blocks: dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000001 dc.w %0111111111111111 dc.w %0111111111111111 dc.w %0111111111111111 dc.w %0111111111111111 dc.w %0111111111111111 dc.w %0111111111111111 dc.w %0111111111111111 dc.w %1111111111111111 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000000000000000 ball: dc.w %0000000000000000 dc.w %0000001111000000 dc.w %0000111111110000 dc.w %0001100111111000 dc.w %0011000111111100 dc.w %0011001111111100 dc.w %0111111111111110 dc.w %0111111111111110 dc.w %0111111111111110 dc.w %0111111111111110 dc.w %0011111111111100 dc.w %0011111111111100 dc.w %0001111111111000 dc.w %0000111111110000 dc.w %0000001111000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000001111000000 dc.w %0000110000110000 dc.w %0001000000001000 dc.w %0010000000000100 dc.w %0010000000000100 dc.w %0100000000000010 dc.w %0100000000000010 dc.w %0111111111111110 dc.w %0111111111111110 dc.w %0011111111111100 dc.w %0011111111111100 dc.w %0001111111111000 dc.w %0000111111110000 dc.w %0000001111000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000001111000000 dc.w %0000100000110000 dc.w %0001000000001000 dc.w %0010000000000100 dc.w %0010000000000100 dc.w %0100000000000010 dc.w %0100000000000010 dc.w %0100000000000010 dc.w %0100000000000010 dc.w %0010000000000100 dc.w %0010000000000100 dc.w %0001000000001000 dc.w %0000110000110000 dc.w %0000001111000000 dc.w %0000000000000000 dc.w %0000000000000000 dc.w %0000001111000000 dc.w %0000111111110000 dc.w %0001100111111000 dc.w %0011000111111100 dc.w %0011001111111100 dc.w %0111111111111110 dc.w %0111111111111110 dc.w %0100000000000010 dc.w %0100000000000010 dc.w %0010000000000100 dc.w %0010000000000100 dc.w %0001000000001000 dc.w %0000110000110000 dc.w %0000001111000000 dc.w %0000000000000000 mask: dc.w %0000001111000000 dc.w %0000111111110000 dc.w %0001111111111000 dc.w %0011111111111100 dc.w %0111111111111110 dc.w %0111111111111110 dc.w %1111111111111111 dc.w %1111111111111111 dc.w %1111111111111111 dc.w %1111111111111111 dc.w %0111111111111110 dc.w %0111111111111110 dc.w %0011111111111100 dc.w %0001111111111000 dc.w %0000111111110000 dc.w %0000001111000000 _comment: dc.b "par Thomas FERNIQUE",0 ;*************** End of Fargo program ****************; reloc_open add_library romlib add_library flib reloc_close end