diff --git a/blockade/Blockade.Anim.s b/blockade/Blockade.Anim.s new file mode 100644 index 0000000..1bce35b --- /dev/null +++ b/blockade/Blockade.Anim.s @@ -0,0 +1,396 @@ +* +* Blockade: Anim +* + + mx %00 + xc + xc + +*-------------------------------------- +* Animation + +animIT stz temp ; Chargement + + lda #$6038 + sta loadPATCH + +]lp lda temp + asl + tax + asl + tay + lda animWHICH,x + xba + sta pANIM+23 + + lda ptrSCR,y + sta animPTR + lda ptrSCR+2,y + sta animPTR+2 + + jsr animTHERMO + + lda #pANIM + ldx ptrUNPACK+2 + ldy ptrUNPACK + jsr loadFILE + bcc animIT1 + brl animIT12 + +animIT1 ldx animPTR+2 + ldy animPTR + jsr unPACK + + lda temp + bne animIT2 + + ldx ptrSCR+2 + ldy ptrSCR + lda #-1 + jsr fadeIN + +animIT2 inc temp + lda temp + cmp #17 + bne ]lp + +*--- Load sprite picture + + lda animPTR + clc + adc #$8000 + sta animSPR + lda animPTR+2 + adc #0 + sta animSPR+2 + + lda #pSPRIT + ldx ptrUNPACK+2 + ldy ptrUNPACK + jsr loadFILE + bcc animIT3 + brl animIT12 + +animIT3 ldx animSPR+2 + ldy animSPR + jsr unPACK + +*-------------------------------------- + + lda #0 ; Animation +animIT4 tax + phx + lda ptrSCR,x + sta Debut + lda ptrSCR+2,x + sta Debut+2 + + ldy #0 +]lp tyx + lda [Debut],y + stal $e12000,x + iny + iny + bpl ]lp + + jsr nextVBL + jsr nextVBL + + pla + clc + adc #4 + cmp #4*16 + bne animIT4 + +*-------------------------------------- + + ldx #15*4 + lda ptrSCR,x + sta animMINE + lda ptrSCR+2,x + sta animMINE+2 + + lda animMINE + clc + adc #$3875 + sta Arrivee + lda animMINE+2 + adc #0 + sta Arrivee+2 + + lda animSPR + clc + adc #$3e0d + sta Debut + lda animSPR+2 + adc #0 + sta Debut+2 + + ldx #40 +animIT5 ldy #30 +]lp lda [Debut],y + sta [Arrivee],y + dey + dey + bpl ]lp + + lda Debut + clc + adc #160 + sta Debut + + lda Arrivee + clc + adc #160 + sta Arrivee + + dex + bpl animIT5 + +*-------------------------------------- Animation lettres + + lda animSPR + clc + adc ptrB + sta ptrB + lda animSPR+2 + adc #0 + sta ptrB+2 + + lda animSPR + clc + adc ptrD + sta ptrD + lda animSPR+2 + adc #0 + sta ptrD+2 + +*--- + + stz temp + +animIT6 ldx ptrB+2 + ldy ptrB + lda #0 + jsr animPRINT + + ldx ptrD+2 + ldy ptrD + lda #1 + jsr animPRINT + + jsr nextVBL + jsr nextVBL + + inc temp + lda temp + cmp #10 + bne animIT6 + +*-------------------------------------- Animation derniere image + + ldx #16*4 + lda ptrSCR,x + sta Debut + sta Second + lda ptrSCR+2,x + sta Debut+2 + sta Second+2 + + lda #$2000 + sta Arrivee + sta Third + lda #$00e1 + sta Arrivee+2 + sta Third+2 + + ldy #$7e00 ; palettes +]lp lda [Debut],y + sta [Arrivee],y + iny + iny + bpl ]lp + +*-------------------------------------- + + ldx #0 + +animIT11 ldy #160-2 +]lp lda [Debut],y + sta [Arrivee],y + dey + dey + bpl ]lp + + txa + clc + adc #$7d00 + tay + sep #$20 + lda [Second],y + sta [Third],y + rep #$20 + + lda Debut + clc + adc #160 + sta Debut + + lda Arrivee + clc + adc #160 + sta Arrivee + + inx + cpx #200 + bne animIT11 + +*-------------------------------------- + +animIT12 lda #$eaea + sta loadPATCH + + rts + +*-------------------------------------- + +animTHERMO lda temp + asl + tax + lda #$ffff + stal $e12cbe,x + stal $e12d5e,x + stal $e12dfe,x + stal $e12e9e,x + stal $e12f3e,x + stal $e12fde,x + stal $e1307e,x + rts + +*-------------------------------------- Routine animation + +animPRINT sty Debut + stx Debut+2 + + asl + tax + lda nbX,x + sta maxX + lda nbY,x + sta maxY + + lda temp + asl + tay + + cpx #0 + bne animPRINT1 + + lda animB,y + bra animPRINT2 +animPRINT1 lda animD,y + +animPRINT2 sec + sbc #$0320 + + pha + clc + adc #$2000 + sta Arrivee + lda #$00e1 + sta Arrivee+2 + + pla + clc + adc animMINE + sta Second + lda animMINE+2 + adc #0 + sta Second+2 + +animPRINT3 sep #$20 + + ldy #0 +]lp lda [Debut],y ; data + tax + lda [Second],y + and tblMASK,x ; MASK + ora tblVALUE,x ; pour couleur + sta [Arrivee],y + iny + cpy maxX + bne ]lp + + rep #$20 + + lda Debut + clc + adc #160 + sta Debut + + lda Second + clc + adc #160 + sta Second + + lda Arrivee + clc + adc #160 + sta Arrivee + + dec maxY + lda maxY + bpl animPRINT3 + + rts + +*-------------------------------------- + +animWHICH dw $3031,$3032,$3033,$3034,$3035,$3036,$3037,$3038 + dw $3039,$3130,$3131,$3132,$3133,$3134,$3135,$3136 + dw $3137 + +pANIM strl '1/Blockade.Data/Anim.01' + +animPTR ds 4 + +decBUF ds 4 +decPIC ds 4 +decSIZ ds 2 + +ptrB adrl $3de1 +ptrD adrl $3dfa + +animSPR ds 4 +animLAST ds 4 +animMINE ds 4 + +animB dw $3d70,$3f4b,$41c6,$43a1,$457c + dw $4757,$49d2,$4bad,$4d88,$4f62 + +animD dw $3d85,$4006,$41e7,$43c8,$45a9 + dw $478a,$496b,$4b4c,$4dcd,$504e + +maxX ds 2 +maxY ds 2 + +nbX dw 23,18 +nbY dw 39,38 + +tblVALUE hex 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f + hex 202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f + hex 404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f + hex 606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f + hex 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f + hex a0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf + hex c0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedf + hex e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff + +tblMASK hex fff0f0f0f0f0f0f0f0f0f0f0f0f0f0f00f000000000000000000000000000000 + hex 0f0000000000000000000000000000000f000000000000000000000000000000 + hex 0f0000000000000000000000000000000f000000000000000000000000000000 + hex 0f0000000000000000000000000000000f000000000000000000000000000000 + hex 0f0000000000000000000000000000000f000000000000000000000000000000 + hex 0f0000000000000000000000000000000f000000000000000000000000000000 + hex 0f0000000000000000000000000000000f000000000000000000000000000000 + hex 0f0000000000000000000000000000000f000000000000000000000000000000 diff --git a/blockade/Blockade.Docu.s b/blockade/Blockade.Docu.s new file mode 100644 index 0000000..e1aa113 --- /dev/null +++ b/blockade/Blockade.Docu.s @@ -0,0 +1,150 @@ +* +* Blockade: Documentation +* + +*-------------------------------------- + +printIT sta printIT2+1 + +printIT1 sty Arrivee + stx Arrivee+2 + +printIT2 lda $ffff + and #$ff + bne printIT3 + rts + +printIT3 pha + inc printIT2+1 + + ldy #0 +]lp lda tblFNT8,y + and #$00ff + beq printIT4 + cmp 1,s + beq printIT5 + iny + bra ]lp +printIT4 ldy #0 + +printIT5 pla + tya + asl + tay + lda adrFNT8,y + sta Debut + lda #^adrSP + sta Debut+2 + + ldy #0 ; Partie gauche du caractere + lda [Debut],y + sta [Arrivee],y + + ldy #2 + lda [Debut],y + ldy #160 + sta [Arrivee],y + + ldy #4 + lda [Debut],y + ldy #320 + sta [Arrivee],y + + ldy #6 + lda [Debut],y + ldy #480 + sta [Arrivee],y + + ldy #8 + lda [Debut],y + ldy #640 + sta [Arrivee],y + + ldy #10 ; Partie droite du sprite + lda [Debut],y + ldy #2 + sta [Arrivee],y + + ldy #12 + lda [Debut],y + ldy #162 + sta [Arrivee],y + + ldy #14 + lda [Debut],y + ldy #322 + sta [Arrivee],y + + ldy #16 + lda [Debut],y + ldy #482 + sta [Arrivee],y + + ldy #18 + lda [Debut],y + ldy #642 + sta [Arrivee],y + + lda Arrivee + clc + adc #3 + sta Arrivee + + brl printIT2 + +*--- Adresses caracteres + +tblFNT8 asc ' ABCDEFGHIJKLMNOPQRSTUVWXYZ' + asc '0123456789' + asc '_:',27,'?' + dfb 00 + +adrFNT8 da adrSP,adrA,adrB,adrC,adrD,adrE,adrF + da adrG,adrH,adrI,adrJ,adrK,adrL,adrM + da adrN,adrO,adrP,adrQ,adrR,adrS,adrT + da adrU,adrV,adrW,adrX,adrY,adrZ + da adr0,adr1,adr2,adr3,adr4 + da adr5,adr6,adr7,adr8,adr9 + da adrTR,adrDP,adrAP,adrQM + +adrSP hex 0000000000000000000000000000000000000000 ; SPACE +adrA hex 00FF0F000FFF0F000F00F0000F00FF000F000F00 ; A +adrB hex 0FFF0F000FFF0F000FFFF0000F00F0000F00F000 ; B +adrC hex 00FF0F000F000F0000FFF0000F0000000F00F000 ; C +adrD hex 0FFF0F000F000F000FFFF0000F000F000F00F000 ; D +adrE hex 0FFF0F000FFF0F000FFFFF00000000000000FF00 ; E +adrF hex 0FFF0F000FFF0F000F00FF000000000000000000 ; F +adrG hex 00FF0F000F000F0000FFF0000000FF000F00F000 ; G +adrH hex 0F000F000FFF0F000F000F000F00FF000F000F00 ; H +adrI hex 0FFF000F000F000F0FFFFF00000000000000FF00 ; I +adrJ hex 000F000000000F0000FFFF00F000F000F0000000 ; J +adrK hex 0F000F000FFF0F000F000F00F0000000F0000F00 ; K +adrL hex 0F000F000F000F000FFF0000000000000000FF00 ; L +adrM hex 0F000FF00F0F0F000F000F00FF000F000F000F00 ; M +adrN hex 0F000FF00F0F0F000F000F000F000F00FF000F00 ; N +adrO hex 00FF0F000F000F0000FFF0000F000F000F00F000 ; O +adrP hex 0FFF0F000FFF0F000F00F0000F00F00000000000 ; P +adrQ hex 00FF0F000F000F0000FFF0000F000F00F0000F00 ; Q +adrR hex 0FFF0F000FFF0F000F00F0000F00F000F0000F00 ; R +adrS hex 00FF0F0000FF00000FFFFF000000F0000F00F000 ; S +adrT hex 0FFF000F000F000F000FFF000000000000000000 ; T +adrU hex 0F000F000F000F0000FF0F000F000F000F00F000 ; U +adrV hex 0F000F0000F000F0000F0F000F00F000F0000000 ; V +adrW hex 0F000F000F0F0FF00F000F000F000F00FF000F00 ; W +adrX hex 0F0000F0000F00F00F000F00F0000000F0000F00 ; X +adrY hex 0F000F0000F0000F000F0F000F00F00000000000 ; Y +adrZ hex 0FFF0000000F00F00FFFFF00F00000000000FF00 ; Z +adr0 hex 00FF0F000F000F0000FFF0000F000F000F00F000 ; 0 +adr1 hex 000F00FF000F000F0FFF0000000000000000FF00 ; 1 +adr2 hex 0FFF000000FF0F000FFFF0000F00F0000000FF00 ; 2 +adr3 hex 0FFF0000000F00000FFFF0000F00F0000F00F000 ; 3 +adr4 hex 0F000F000F000FFF00000000F000F000FF00F000 ; 4 +adr5 hex 0FFF0F000FFF00000FFFFF000000F0000F00F000 ; 5 +adr6 hex 00FF0F000FFF0F0000FFFF000000F0000F00F000 ; 6 +adr7 hex 0FFF0000000F00F000F0FF00F000000000000000 ; 7 +adr8 hex 00FF0F0000FF0F0000FFF0000F00F0000F00F000 ; 8 +adr9 hex 00FF0F0000FF00000FFFF0000F00FF000F00F000 ; 9 +adrTR hex 00000000000000000FFF0000000000000000FFF0 ; _ +adrDP hex 0000000F0000000F00000000F0000000F0000000 ; : +adrAP hex 000F000F000000000000F000F000000000000000 ; ' +adrQM hex 000F00F0000000000000F0000F000F00F000F000 ; ? diff --git a/blockade/Blockade.Main.s b/blockade/Blockade.Main.s new file mode 100644 index 0000000..81f11ba --- /dev/null +++ b/blockade/Blockade.Main.s @@ -0,0 +1,1569 @@ +*--------------------------* +* * +* BLOCKADE * +* * +* Brutal Deluxe * +* * +* Version: 1.0 du 1/1/95 * +*--------------------------* + + lst off + rel + dsk Blockade.l + + mx %00 + xc + xc + +lvl = 1 + +*-------------------------------------- + + use 4/Locator.Macs + use 4/Mem.Macs + use 4/Misc.Macs + use 4/Sound.Macs + use 4/Util.Macs + +*-------------------------------------- + +Debut = $00 +Arrivee = $04 +Second = $08 +Third = $0c + +proDOS = $e100a8 + +*-------------------------------------- + + brl ICI + + asc 0d0d + asc 'Happy New Year' + asc 0d0d + +ICI phk + plb + + _TLStartUp + pha + _MMStartUp + pla + sta myID + _MTStartUp + +*--- Keyboard buffering off + + PushWord #0 + PushWord #$2b + _ReadBParam + PullWord save5 + + PushWord #0 + PushWord #$2b + _WriteBParam + + sep #$20 + + ldal $e0c022 + sta save1 + ldal $e0c029 + sta save2 + ldal $e0c034 + sta save3 + ldal $e0c035 + sta save4 + + lda #$f0 + stal $e0c022 + lda #$00 + stal $e0c034 + + rep #$20 + +*-------------------------------------- + + ldal $e0c060 + bmi okINIT1 + + pha + _SoundToolStatus + pla + bne okINIT1 + + lda #1 + sta fgSND + +*-------------------------------------- + + brl okINIT1 + + asc 0d'Hello Joe'0d + asc 'Now that you have 1000 subscribers'0d + asc 'We hope that Sheva will love your IIGS :-)'0d + +*-------------------------------------- + +okINIT1 PushLong #0 + PushLong #$8fffff + PushWord myID + PushWord #%11000000_00000000 + PushLong #0 + _NewHandle + _DisposeHandle + _CompactMem + +*-------------------------------------- + +]lp PushLong #0 + PushLong #$10000 + PushWord myID + PushWord #%11000000_00011100 + PushLong #0 + _NewHandle + ldx temp + phd + tsc + tcd + ldy #0 + lda [3],y + sta ptrUNPACK,x + ldy #2 + lda [3],y + sta ptrUNPACK+2,x + pld + pla + pla + jsr memERR + inx + inx + inx + inx + stx temp + cpx #4*6 ; 6*64ko + bne ]lp + + PushLong #0 + PushLong #$40000 + PushWord myID + PushWord #%11000000_00001100 + PushLong #0 + _NewHandle + phd + tsc + tcd + ldy #0 + lda [3],y + sta ptrMUSIC + ldy #2 + lda [3],y + sta ptrMUSIC+2 + pld + pla + pla + bcc okINIT2 + + lda #1 + sta fgZIK + +*-------------------------------------- + +okINIT2 ldx #0 + +]lp lda ptrSCR,x + clc + adc #$8000 + sta ptrLEVEL,x + lda ptrSCR+2,x + adc #0 + sta ptrLEVEL+2,x + + txa + clc + adc #4 + tax + cpx #4*5 + bne ]lp + +*-------------------------------------- + + ldx #0 +]lp lda ptrMUSIC,x + clc + adc #$8000 + sta ptrMUSIC+4,x + lda ptrMUSIC+2,x + adc #0 + sta ptrMUSIC+6,x + + txa + clc + adc #4 + tax + cpx #4*6 + bne ]lp + +*-------------------------------------- + + ldx #0 + txa +]lp stal $e12000,x + inx + inx + bpl ]lp + + sep #$20 + lda #$c1 + stal $e0c029 + rep #$20 + +*-------------------------------------- + + PushWord #0 + PushWord #0 + PushWord #0 + PushWord #0 + _ReadTimeHex + plx + plx + plx + pla + and #$ff00 + cmp #$0100 + beq okINIT4 + cmp #$0200 + bne okINIT5 + + lda #1 + sta fgBORDURE + bra okINIT5 + +okINIT4 lda #$0f6f + sta adrSPRITE+20 + lda #$0f7a + sta adrSPRITE+22 + +okINIT5 PushWord #0 + PushWord #$29 + _ReadBParam + pla + and #$ff + cmp #$02 + beq okINIT51 + brl okINIT6 + +okINIT51 lda #1 + sta fgLANG + +*-------------------------------------- + + brl okINIT6 + + asc 0d'In the last issue of PowerGs'0d + asc 'You saw no pictures of Digital Exodus members:'0d + asc 'They consider their visage to be their own property'0d0d + + asc 'They act the same way with their software'0d + asc 'They certainly program many things but...'0d + asc 'They keep them for themselves... :-('0d + asc 'That'27's why there is no available software from Digital Exodus'0d + +*-------------------------------------- + +okINIT6 ldal $e0c061 + bmi okINIT7 + + lda fgZIK + bne okINIT9 + + jsr animIT + bra okINIT9 + +okINIT7 lda #$6038 + sta loadPATCH + + lda #pANIM17 + ldx ptrUNPACK+2 + ldy ptrUNPACK + jsr loadFILE + bcs okINIT8 + + ldx ptrSCR+2 + ldy ptrSCR + jsr unPACK + + ldx ptrSCR+2 + ldy ptrSCR + lda #-1 + jsr fadeIN + +okINIT8 lda #$eaea + sta loadPATCH + +okINIT9 brl doCODE + +*-------------------------------------- + +initOFF ldx #0 + txa +]lp stal $e12000,x + inx + inx + bpl ]lp + + PushWord save5 + PushWord #$2b + _WriteBParam + + sep #$20 + + lda save4 + stal $e0c035 + lda save3 + stal $e0c034 + lda save2 + stal $e0c029 + lda save1 + stal $e0c022 + + rep #$20 + + _MTShutDown + + PushWord myID + _DisposeAll + PushWord myID + _MMShutDown + _TLShutDown + + jsl proDOS + dw $2029 + adrl proQUIT + +*-------------------------------------- +* Le programme + +doCODE lda #pSPRIT + ldx ptrUNPACK+2 + ldy ptrUNPACK + jsr loadFILE + ldx ptrSPRITE+2 + ldy ptrSPRITE + jsr unPACK + + lda #pHELP1 + ldx ptrUNPACK+2 + ldy ptrUNPACK + jsr loadFILE + ldx ptrHELP1+2 + ldy ptrHELP1 + jsr unPACK + + lda fgLANG + beq doCODE1 + brl doCODE2 + +doCODE1 lda #pHELP2 + ldx ptrUNPACK+2 + ldy ptrUNPACK + jsr loadFILE + ldx ptrHELP2+2 + ldy ptrHELP2 + jsr unPACK + + lda #pHELP3 + ldx ptrUNPACK+2 + ldy ptrUNPACK + jsr loadFILE + ldx ptrHELP3+2 + ldy ptrHELP3 + jsr unPACK + + lda #pHELP4 + ldx ptrUNPACK+2 + ldy ptrUNPACK + jsr loadFILE + ldx ptrHELP4+2 + ldy ptrHELP4 + jsr unPACK + + lda #pHELP5 + ldx ptrUNPACK+2 + ldy ptrUNPACK + jsr loadFILE + ldx ptrHELP5+2 + ldy ptrHELP5 + jsr unPACK + + lda #pHELP6 + ldx ptrUNPACK+2 + ldy ptrUNPACK + jsr loadFILE + ldx ptrHELP6+2 + ldy ptrHELP6 + jsr unPACK + brl doCODE3 + +doCODE2 lda #pHELP2VF + ldx ptrUNPACK+2 + ldy ptrUNPACK + jsr loadFILE + ldx ptrHELP2+2 + ldy ptrHELP2 + jsr unPACK + + lda #pHELP3VF + ldx ptrUNPACK+2 + ldy ptrUNPACK + jsr loadFILE + ldx ptrHELP3+2 + ldy ptrHELP3 + jsr unPACK + + lda #pHELP4VF + ldx ptrUNPACK+2 + ldy ptrUNPACK + jsr loadFILE + ldx ptrHELP4+2 + ldy ptrHELP4 + jsr unPACK + + lda #pHELP5VF + ldx ptrUNPACK+2 + ldy ptrUNPACK + jsr loadFILE + ldx ptrHELP5+2 + ldy ptrHELP5 + jsr unPACK + + lda #pHELP6VF + ldx ptrUNPACK+2 + ldy ptrUNPACK + jsr loadFILE + ldx ptrHELP6+2 + ldy ptrHELP6 + jsr unPACK + +doCODE3 lda #pLEVEL + ldx ptrLEVEL+2 + ldy ptrLEVEL + jsr loadFILE + + lda fgSND + beq doCODE4 + +*--- + + lda #$6038 + sta loadPATCH + + lda #pSOUND + ldx ptrUNPACK+2 + ldy ptrUNPACK + jsr loadFILE + bcc doCODE31 + + lda #1 + sta fgFX + bra doCODE32 + +doCODE31 jsr initSND + +doCODE32 lda ptrUNPACK + clc + adc #$8000 + tay + lda ptrUNPACK+2 + adc #0 + tax + lda #pFONTE + jsr loadFILE + bcc doCODE321 + + lda #1 + sta fgAAHH + +doCODE321 lda fgZIK + bne doCODE4 + + lda #pMUSIC + ldx ptrMUSIC+2 + ldy ptrMUSIC + jsr loadFILE + bcc doCODE33 + + lda #1 ; no ZIK + sta fgZIK + bra doCODE4 + +doCODE33 jsr initMUSIC + +doCODE4 lda #$eaea + sta loadPATCH + + lda #lvl + sta level + + jsr fadeOUT + +*-------------------------------------- + +loopGAME jsr preparePIC + + jsr decodeLEVEL + jsr printLEVEL + + lda #1 + ldx ptrSCR+2 + ldy ptrSCR + jsr fadeIN + + lda #-1 + sta windowC + + stz currC + + jsr moFORE + + jsr theMOUSE + + pha + jsr fadeOUT + pla + cmp #-1 ; Quit + beq loopGAME1 + cmp #-2 ; Restart + beq loopGAME + + ldy #1 + jsr playSND + + inc level + lda level + cmp #82 + bne loopGAME + lda #1 + sta level + bra loopGAME + +*--- + +loopGAME1 lda fgSND + beq loopGAME2 + lda fgZIK + bne loopGAME2 + + sei + stz fgPLAY + jsr shutMUSIC1 + jsr shutMUSIC + +loopGAME2 brl initOFF + +*-------------------------------------- +* Routines sonores + +initSND lda ptrUNPACK + sta Debut + lda ptrUNPACK+2 + sta Debut+2 + ldy #0 + sei + +initSND1 sep #$20 + + ldal $e100ca + ora #%0110_0000 + stal $e0c03c + + lda #0 + stal $e0c03e + stal $e0c03f + + ldy #0 +]lp lda [Debut],y + stal $e0c03d + iny + bne ]lp + + rep #$20 + cli + rts + +*--- + +playSND pha + lda fgSND + bne playSND1 + pla + rts + +playSND1 lda fgPLAY + beq playSND2 + pla + rts + +playSND2 lda fgFX + beq playSND3 + pla + rts + +playSND3 tya + asl + tay + + sep #$20 + + ldal $e100ca + and #$0f + stal $e0c03c + + tya + stal $e0c03e + lda #$d1 + stal $e0c03d + tya + ora #$01 + stal $e0c03e + lda #$d1 + stal $e0c03d + + tya + ora #$20 + stal $e0c03e + lda #0 + stal $e0c03d + tya + ora #$21 + stal $e0c03e + lda #0 + stal $e0c03d + + tya + ora #$40 + stal $e0c03e + lda #$ff + stal $e0c03d + tya + ora #$41 + stal $e0c03e + lda #$ff + stal $e0c03d + + tya + ora #$80 + stal $e0c03e + lda sndADR,y + stal $e0c03d + tya + ora #$81 + stal $e0c03e + lda sndADR,y + stal $e0c03d + + tya + ora #$c0 + stal $e0c03e + lda sndPAGE,y + stal $e0c03d + tya + ora #$c1 + stal $e0c03e + lda sndPAGE,y + stal $e0c03d + + tya + ora #$a0 + stal $e0c03e + lda #%0000_0010 + stal $e0c03d + tya + ora #$a1 + stal $e0c03e + lda #%0001_0010 + stal $e0c03d + + rep #$20 + + pla + rts + + mx %00 + +*-------------------------------------- + + asc 0d'Thanks to Jerome Cretaux for having shown us'0d + asc 'this game for the first time a month ago.'0d + +*-------------------------------------- + +initMUSIC sei + + PushLong #0 + PushWord #$000b + _GetVector + PullLong sndVECTOR + + PushWord #$000b + PushLong #sndINTERRUPT + _SetVector + + lda #$373 + sta zikPAGE + lda ptrMUSIC + sta zikMUSIC + lda ptrMUSIC+2 + sta zikMUSIC+2 + + sep #$20 + + ldal $e100ca + stal $e0c03c + + ldy #$04 + + tya + ora #$00 + stal $e0c03e + lda #$d1 + stal $e0c03d + tya + ora #$01 + stal $e0c03e + lda #$d1 + stal $e0c03d + + tya + ora #$20 + stal $e0c03e + lda #$00 + stal $e0c03d + tya + ora #$21 + stal $e0c03e + lda #0 + stal $e0c03d + + tya + ora #$40 + stal $e0c03e + lda #$f0 + stal $e0c03d + tya + ora #$41 + stal $e0c03e + lda #$f0 + stal $e0c03d + + tya + ora #$80 + stal $e0c03e + lda #$3e + stal $e0c03d + tya + ora #$81 + stal $e0c03e + lda #$3f + stal $e0c03d + + tya + ora #$c0 + stal $e0c03e + lda #0 + stal $e0c03d + tya + ora #$c1 + stal $e0c03e + lda #0 + stal $e0c03d + + rep #$20 + + jsr shutMUSIC2 + + lda #1 + sta zikPLAY + + rts + +*--- + +shutMUSIC sei + + stz zikPLAY + + PushWord #$000b + PushLong sndVECTOR + _SetVector + +shutMUSIC1 sep #$20 + + ldal $e100ca + and #%0000_1111 + stal $e0c03c + + ldy #$1f +]lp tya + ora #$a0 + stal $e0c03e + lda #$01 + stal $e0c03d + dey + bpl ]lp + + rep #$20 + + cli + rts + +*--- + +shutMUSIC2 sei + phd + lda #$c000 + tcd + jsr sndINTERRUPT2 + rep #$20 + pld + cli + rts + +*--- + +sndINTERRUPT phb + phd + phk + plb + + clc + xce + rep #$30 + + lda #$c000 + tcd + + lda zikPLAY + beq sndINTERRUPT1 + + mx %10 + +]lp jsr sndINTERRUPT2 + + ldal $e100ca + sta $3c + lda #$e0 + sta $3e + lda $3d + lda $3d + bpl ]lp + +sndINTERRUPT1 clc + xce + sep #$30 + + pld + plb + clc + rtl + +*--- + + mx %10 + +sndINTERRUPT2 sep #$20 + + ldal $e100ca + ora #%0110_0000 + sta $3c + + stz $3e + lda #$3e + ora fgPAGE + eor #1 + sta $3f + + ldy zikMUSIC + lda zikMUSIC+2 + pha + plb + jsr sndINTERRUPT10 + phk + plb + + rep #$20 + + lda zikMUSIC+1 + clc + adc #$0001 + sta zikMUSIC+1 + + dec zikPAGE + lda zikPAGE + bne sndINTERRUPT3 + + lda whichSND + beq sndINTERRUPT21 + + sep #$20 + + ldal $e100ca + sta $3c + + lda #$a4 + sta $3e + lda #%0000_0011 + sta $3d + inc $3e + lda #%0001_0011 + sta $3d + bra sndINTERRUPT5 + + rts + + mx %00 + +sndINTERRUPT21 lda #$373 + sta zikPAGE + lda ptrMUSIC + sta zikMUSIC + lda ptrMUSIC+2 + sta zikMUSIC+2 + +sndINTERRUPT3 sep #$20 + + ldal $e100ca + sta $3c + + ldy #$04 + + ldx fgPAGE + bne sndINTERRUPT4 + + tya + ora #$a0 + sta $3e + lda #%0000_1110 + sta $3d + inc $3e + lda #%0001_1111 + sta $3d + bra sndINTERRUPT5 + +sndINTERRUPT4 tya + ora #$a0 + sta $3e + lda #%0000_1111 + sta $3d + inc $3e + lda #%0001_1110 + sta $3d + +sndINTERRUPT5 lda fgPAGE + eor #1 + sta fgPAGE + + rts + +*--- + +sndINTERRUPT10 = * + +]move = $00 + lup 256 + lda ]move,y + sta $3d +]move = ]move+1 + --^ + rts + + mx %00 + +*-------------------------------------- + + asc 0d0d'PRIZM from ORCA/C is a great desktop environment'0d + asc 'for developing software'0d + asc 'You only have to reboot every 2 minutes!!'0d + asc 'Thank you Mike :-)'0d + +*-------------------------------------- +* Routines gs/os + +loadFILE sta proOPEN+4 + sty proREAD+4 + stx proREAD+6 + +loadFILE1 jsl proDOS + dw $2010 + adrl proOPEN + bcs loadERR + + lda proOPEN+2 + sta proGETEOF+2 + sta proREAD+2 + + jsl proDOS + dw $2019 + adrl proGETEOF + + lda proGETEOF+4 + sta proREAD+8 + lda proGETEOF+6 + sta proREAD+10 + + jsl proDOS + dw $2012 + adrl proREAD + bcs loadERR + +loadFILE2 jsl proDOS + dw $2014 + adrl proCLOSE + clc + rts + +loadERR jsr loadFILE2 + +loadPATCH nop + nop + + PushWord #0 + PushLong #proSTR1 + PushLong #proSTR2 + PushLong #proSTR3 + PushLong #proSTR4 + _TLTextMountVolume + pla + cmp #1 + bne loadERR1 + brl loadFILE1 +loadERR1 jmp initOFF + +*-------------------------------------- +* Routines diverses + +memERR bcs memERR1 ; Erreur de memoire + rts +memERR1 PushWord #0 + PushLong #memSTR1 + PushLong #memSTR2 + PushLong #proSTR3 + PushLong #proSTR4 + _TLTextMountVolume + pla + jmp initOFF + +*-------------------------- + +clickIT ldal $e0bfff + bpl clickIT1 + stal $e0c010 + xba + and #$ff + clc + rts +clickIT1 sec + rts + +*------------------------------ + +nextVBL lda #75 + pha +]lp ldal $e0c02e + and #$7f + cmp 1,s + blt ]lp + cmp #100 + bge ]lp + pla +waitVBL ldal $e0c018 + bpl waitVBL + rts + +*-------------------------- Decompression + +unPACK phd + tdc + clc + adc #$200 + tcd + + sty $04 + stx $06 + + lda ptrUNPACK + sta $00 + lda ptrUNPACK+2 + sta $02 + + lda ptrUNPACK + clc + adc #$8000 + sta $1e + clc + adc #$2000 + sta $22 + lda ptrUNPACK+2 + sta $20 + sta $24 + + ldy #$3fff + lda #0 +]lp sta [$1e],y + dey + dey + bpl ]lp + + lda #$0009 + sta L0517+1 + lda #$01FF + sta L051E+1 + stz $1C + pea $FFFF + +L042C jsr L04E8 + cmp #$0101 + bne L042D + brl L04A4 +L042D cmp #$0100 + beq L0491 + sta $12 + cmp $14 + bcc L0443 + lda $10 + pei $0E +L0443 cmp #$0100 + bcc L0455 + asl +L0449 tay + lda [$22],Y + pha + lda [$1E],Y + cmp #$0200 + bcs L0449 + lsr +L0455 and #$00FF + sta $0E + sta $1A + ldy #$0000 +L045F sta [$04],Y + iny + pla + bpl L045F + pha + tya + clc + adc $04 + sta $04 + lda $06 + adc #0 + sta $06 + + jsr L04D8 + lda $12 + sta $10 + lda $14 + cmp $18 + bcc L048F + lda L0517+1 + cmp #$000C + beq L048F + inc + sta L0517+1 + asl + tax + lda packMASK-$12,X + sta L051E+1 + asl $18 +L048F bra L042C +L0491 jsr L04C1 + jsr L04E8 + sta $10 + sta $1A + sta $0E + sta [$04] + + lda $04 + clc + adc #1 + sta $04 + lda $06 + adc #0 + sta $06 + + jmp L042C + +L04A4 pla + pld + rts + +L04C1 lda #$0009 + sta L0517+1 + lda #$01FF + sta L051E+1 + lda #$0200 + sta $18 + lda #$0102 + sta $14 + rts + +L04D8 lda $14 + asl + tay + lda $1A + sta [$22],Y + lda $10 + asl + sta [$1E],Y + inc $14 + rts + +L04E8 lda $1C + and #$0007 + tax + lda $1C + lsr + lsr + lsr + cmp #$03FD + bcc L0502 + clc + adc $00 + sta $00 + stx $1C + lda #$0000 +L0502 tay + lda [$00],Y + sta $08 + iny + iny + lda [$00],Y + txy + beq L0514 +L050E lsr +L050F ror $08 + dex + bne L050E +L0514 lda $1C + clc +L0517 adc #$FFFF ; $0009 on beginning + sta $1C + lda $08 +L051E and #$FFFF ; $01FF on beginning + rts + +*------------------------------ + +nowWAIT dec ; Attend A secondes + tax + lda #0 +]lp clc + adc #60 + cpx #0 + beq nowWAIT1 + dex + bra ]lp +nowWAIT1 pha + jsr waitVBL + jsr clickIT + bcc nowWAIT2 +]lp ldal $e0c018 + bmi ]lp + pla + dec + bne nowWAIT1 + sec + rts +nowWAIT2 pla + clc + rts + +*-------------------------------------- + + asc 0d' Tinies'27'last level code is MUADDIBU'0d + +*-------------------------------------- +* Routines graphiques + +fadeIN sty Debut + stx Debut+2 + + ldy #$2000 + sty Arrivee + ldx #$00e1 + stx Arrivee+2 + + cmp #0 + beq fadeIN1 + + ldy #$7dfe +]lp lda [Debut],y + sta [Arrivee],y + dey + dey + bpl ]lp + +fadeIN1 lda Debut + clc + adc #$7e00 + sta Debut + lda Debut+2 + adc #0 + sta Debut+2 + + lda Arrivee + clc + adc #$7e00 + sta Arrivee + lda Arrivee+2 + adc #0 + sta Arrivee+2 + + ldx #$000f +fadeIN2 ldy #$01fe +fadeIN3 lda [Arrivee],y + and #$000f + sta temp + lda [Debut],y + and #$000f + cmp temp + beq fadeIN4 + lda [Arrivee],y + clc + adc #$0001 + sta [Arrivee],y +fadeIN4 lda [Arrivee],y + and #$00f0 + sta temp + lda [Debut],y + and #$00f0 + cmp temp + beq fadeIN5 + lda [Arrivee],y + clc + adc #$0010 + sta [Arrivee],y +fadeIN5 lda [Arrivee],y + and #$0f00 + sta temp + lda [Debut],y + and #$0f00 + cmp temp + beq fadeIN6 + lda [Arrivee],y + clc + adc #$0100 + sta [Arrivee],y + +fadeIN6 dey + dey + bpl fadeIN3 + jsr nextVBL + dex + bpl fadeIN2 + rts + +*--- + +fadeOUT lda #$9e00 + sta Debut + lda #$00e1 + sta Debut+2 + + ldx #$000f +fadeOUT1 ldy #$01fe +fadeOUT2 lda [Debut],y + and #$000f + beq fadeOUT3 + lda [Debut],y + sec + sbc #$0001 + sta [Debut],y +fadeOUT3 lda [Debut],y + and #$00f0 + beq fadeOUT4 + lda [Debut],y + sec + sbc #$0010 + sta [Debut],y +fadeOUT4 lda [Debut],y + and #$0f00 + beq fadeOUT5 + lda [Debut],y + sec + sbc #$0100 + sta [Debut],y + +fadeOUT5 dey + dey + bpl fadeOUT2 + jsr nextVBL + dex + bpl fadeOUT1 + rts + +*-------------------------------------- +* All the data + + hex 8d8d + asc "------------ BLOCKADE ------------",8d + asc " Version Apple //gs ",8d + asc " Antoine Vignau Olivier Zardini ",8d + asc " Brutal Deluxe ",8d + asc "------------ 1 1 1995 ------------",8d,8d + +*--- Flags + +save1 ds 1 +save2 ds 1 +save3 ds 1 +save4 ds 1 +save5 ds 2 + +*--- Textes + +memSTR1 str 'Can'27't allocate memory' +memSTR2 str 'Press a key to quit.' + +proSTR1 str 'Can'27't load file' +proSTR2 str 'Do what now ?' +proSTR3 str '[RET] Continue' +proSTR4 str '[ESC] Quit' + +*--- Prodos + +proQUIT dw 2 + ds 4 + ds 2 + +proOPEN dw 2 + ds 2 + adrl pLEVEL + +proGETEOF dw 2 + ds 2 + ds 4 + +proREAD dw 4 + ds 2 + ds 4 + ds 4 + ds 4 + +proCLOSE dw 1 + ds 2 + +*--- Nom des fichiers + +pFONTE strl '1/Blockade.Data/Fontes' +pLEVEL strl '1/Blockade.Data/Levels' +pMUSIC strl '1/Blockade.Data/Musics' +pSPRIT strl '1/Blockade.Data/Sprite' +pSOUND strl '1/Blockade.Data/Sounds' +pHELP1 strl '1/Blockade.Data/Help.1' +pHELP2 strl '1/Blockade.Data/Help.2' +pHELP3 strl '1/Blockade.Data/Help.3' +pHELP4 strl '1/Blockade.Data/Help.4' +pHELP5 strl '1/Blockade.Data/Help.5' +pHELP6 strl '1/Blockade.Data/Help.6' +pHELP2VF strl '1/Blockade.Data/Help.2.V' +pHELP3VF strl '1/Blockade.Data/Help.3.V' +pHELP4VF strl '1/Blockade.Data/Help.4.V' +pHELP5VF strl '1/Blockade.Data/Help.5.V' +pHELP6VF strl '1/Blockade.Data/Help.6.V' +pANIM17 strl '1/Blockade.Data/Anim.17' + +*--- Sons + +fgSND ds 2 +fgPLAY ds 2 +fgFX ds 2 +fgZIK ds 2 +fgAAHH ds 2 +copyPLAY ds 2 +whichSND ds 2 + +sndADR dw $60,$00,$78,$d0,$26,$a0,$30,$28,$c0,$98,$40,$80,$e0 +sndPAGE dw $2d,$36,$1b,$24,$00,$2d,$24,$1b,$24,$1b,$2d,$2d,$24 + +fgPAGE ds 2 +zikPLAY ds 2 +zikPAGE ds 2 +zikMUSIC ds 4 + +sndVECTOR ds 4 + +*--- Memoire + +myID ds 2 + +ptrUNPACK ds 4 ; 0 + +ptrSCR ds 4 ; 1 +ptrSPRITE ds 4 ; 2 +ptrHELP1 ds 4 ; 3 +ptrHELP3 ds 4 ; 4 +ptrHELP5 ds 4 ; 5 + +ptrLEVEL ds 4 ; 6 + ds 4 ; 7 +ptrHELP2 ds 4 ; 8 +ptrHELP4 ds 4 ; 9 +ptrHELP6 ds 4 ; 10 + +ptrMUSIC ds 4 ; 11 + ds 4 ; 12 + ds 4 ; 13 + ds 4 ; 14 + ds 4 ; 15 + ds 4 ; 16 + ds 4 ; 17 + ds 4 ; 18 + +*--- Divers + +fgLANG ds 2 +fgBORDURE ds 2 + +*--- Conversion + +scdVAR hex 00,01,02,03,04,05,06,07,08,09 + hex 10,11,12,13,14,15,16,17,18,19 + hex 20,21,22,23,24,25,26,27,28,29 + hex 30,31,32,33,34,35,36,37,38,39 + hex 40,41,42,43,44,45,46,47,48,49 + hex 50,51,52,53,54,55,56,57,58,59 + hex 60,61,62,63,64,65,66,67,68,69 + hex 70,71,72,73,74,75,76,77,78,79 + hex 80,81,82,83,84,85,86,87,88,89 + +*--- Decompression + +packMASK dw $01ff + dw $03ff + dw $07ff + dw $0fff + dw $0000 + +temp ds 8 + +*--- Lignes + +Ligne = * + +]Ligne = $0 + lup 200 + dw ]Ligne +]Ligne = ]Ligne+160 + --^ + +*-------------------------------------- + + asc 0d'Don'27't waste your time reading this'0d + asc 0d'Try to succeed all the levels'0d + +*-------------------------------------- + + put Blockade.Anim + put Blockade.Mice + put Blockade.Play + put Blockade.Docu diff --git a/blockade/Blockade.Mice.s b/blockade/Blockade.Mice.s new file mode 100644 index 0000000..30f8637 --- /dev/null +++ b/blockade/Blockade.Mice.s @@ -0,0 +1,1394 @@ +* +* Blockade: Souris +* + +*-------------------------------------- + +maximumX = 312 +maximumY = 194 + + +theMOUSE lda nbPIECES + bne theMOUSE1 + lda #0 + rts + +theMOUSE1 jsr moREAD + jsr moCONTROL + bcs theMOUSE10 + + cpx #-1 + beq theMOUSE10 + cpx #135*2 + bcc theMOUSE4 + brl doBUTTON + +theMOUSE4 lda coorX + sta oldX + lda coorY + sta oldY + lda currC + sta oldC + + ldy #0 + +theMOUSE5 jsr checkVALID + bcc theMOUSE6 + + ldx oldX + stx coorX + ldy oldY + sty coorY + lda oldC + sta currC + + bra theMOUSE10 + +theMOUSE6 lda #-1 + sta windowC + + ldx coorX + stx currX + ldy coorY + sty currY + + jsr moBACK + jsr nowPLAY + jsr moFORE + + ldx currX + stx coorX + ldy currY + sty coorY + + brl theMOUSE + +*--- + +theMOUSE10 lda fgBORDURE + beq theMOUSE12 + + sep #$20 + ldal $e0c034 + inc + stal $e0c034 + rep #$20 + +theMOUSE12 ldy #0 + jsr clickIT + bcc theMOUSE13 + brl theMOUSE + +theMOUSE13 sta theKEY + + cpy #0 + bne theMOUSE14 + + ldal $e0c060 + bmi theMOUSE14 + brl theMOUSE30 + +theMOUSE14 lda theKEY + and #%00000000_11011111 + cmp #"Q" + bne theMOUSE16 + + jsr doQUIT + bcs theMOUSE15 + lda #-1 + clc + rts +theMOUSE15 brl theMOUSE + +theMOUSE16 lda theKEY + and #%00000000_11011111 + cmp #"R" + bne theMOUSE17 + + lda #-2 + rts + +theMOUSE17 lda theKEY + and #%00000000_11011111 + cmp #"Z" + bne theMOUSE18 + + lda #-1 + sta windowC + + jsr moBACK + jsr restoreALL + jsr moFORE + brl theMOUSE + +theMOUSE18 lda theKEY + and #%00000000_11011111 + cmp #"P" + bne theMOUSE20 + + jsr doLEVEL + bcc theMOUSE19 + jsr moFORE + brl theMOUSE +theMOUSE19 lda #-2 + rts + +theMOUSE20 lda theKEY + cmp #"?" + bne theMOUSE21 + + jsr doHELP + brl theMOUSE + +theMOUSE21 lda fgFX + bne theMOUSE22 + lda fgSND + beq theMOUSE22 + + lda theKEY + and #%00000000_11011111 + cmp #"S" + bne theMOUSE22 + + lda fgPLAY + eor #1 + sta fgPLAY + brl theMOUSE + +theMOUSE22 lda fgZIK + bne theMOUSE24 + lda fgSND + beq theMOUSE24 + + lda theKEY + and #%00000000_11011111 + cmp #"M" + bne theMOUSE24 + + lda zikPLAY + eor #1 + sta zikPLAY + beq theMOUSE23 + jsr shutMUSIC2 + bra theMOUSE24 +theMOUSE23 jsr shutMUSIC1 + +theMOUSE24 brl theMOUSE + +*--- + +theMOUSE30 ldx coorX + stx oldX + ldy coorY + sty oldY + ldx currC + stx oldC + + lda theKEY + cmp #"4" + beq theMOUSE32 + cmp #$88 + beq theMOUSE32 + cmp #"J" + beq theMOUSE32 + cmp #"j" + beq theMOUSE32 + + cmp #"6" + beq theMOUSE33 + cmp #$95 + beq theMOUSE33 + cmp #"L" + beq theMOUSE33 + cmp #"l" + beq theMOUSE33 + + cmp #"8" + beq theMOUSE34 + cmp #$8b + beq theMOUSE34 + cmp #"I" + beq theMOUSE34 + cmp #"i" + beq theMOUSE34 + + cmp #"2" + beq theMOUSE35 + cmp #"5" + beq theMOUSE35 + cmp #$8a + beq theMOUSE35 + cmp #"K" + beq theMOUSE35 + cmp #"k" + beq theMOUSE35 + +theMOUSE31 brl theMOUSE + +theMOUSE32 lda coorX + beq theMOUSE31 + dec coorX + bra theMOUSE36 + +theMOUSE33 lda coorX + cmp #14 + beq theMOUSE31 + inc coorX + bra theMOUSE36 + +theMOUSE34 lda coorY + beq theMOUSE31 + dec coorY + bra theMOUSE36 + +theMOUSE35 lda coorY + cmp #8 + beq theMOUSE31 + inc coorY + +theMOUSE36 ldx coorX + ldy coorY + jsr calcPLATEAU + tax + ldy #1 + brl theMOUSE5 + +*-------------------------------------- + +doBUTTON lda #-1 + sta windowC + + cpx #135*2 + bne doBUTTON1 + lda #"?" ; help + ldy #-1 + brl theMOUSE13 +doBUTTON1 cpx #136*2 + bne doBUTTON2 + lda #"P" ; level + ldy #-1 + brl theMOUSE13 +doBUTTON2 cpx #137*2 + bne doBUTTON3 + lda #"S" ; sound + ldy #-1 + brl theMOUSE13 +doBUTTON3 cpx #138*2 + bne doBUTTON4 + lda #"M" ; music + ldy #-1 + brl theMOUSE13 +doBUTTON4 cpx #139*2 + bne doBUTTON5 + lda #"Q" ; quit + ldy #-1 + brl theMOUSE13 +doBUTTON5 brl theMOUSE + +*-------------------------------------- + +doLEVEL lda #' ' + sta strLEVEL + + lda level + sta oldLEVEL + + jsr moBACK + + lda #$9999 ; Affiche barre rouge + stal $e19913 + stal $e19914 + + jsr putLEVEL1 + +]lp jsr clickIT + bcs ]lp + cmp #$b1 + bcc ]lp + cmp #$ba + bcs ]lp + + sep #$20 + and #$7f + sta strLEVEL+1 + rep #$20 + + jsr putLEVEL1 + +]lp jsr clickIT + bcs ]lp + cmp #$8d + beq doLEVEL1 + cmp #$b0 + bcc ]lp + cmp #$ba + bcs ]lp + + sep #$20 + and #$7f + pha + lda strLEVEL+1 + sta strLEVEL + pla + sta strLEVEL+1 + rep #$20 + +doLEVEL1 lda #$0000 + stal $e19913 + stal $e19914 + + sep #$20 + + lda strLEVEL+1 + and #$0f + pha + lda strLEVEL + and #$0f + asl + asl + asl + asl + clc + adc 1,s + sta level + pla + + lda level + cmp #130 ; 130d=82h + bcs doLEVEL3 + + ldx #0 +]lp lda scdVAR,x + cmp level + beq doLEVEL2 + inx + bne ]lp + ldx #1 +doLEVEL2 stx level + + lda level + cmp oldLEVEL + bne doLEVEL4 + + rep #$20 + jsr putLEVEL + sec + rts + +doLEVEL3 rep #$20 + lda #1 + sta level + sta oldLEVEL + jsr putLEVEL + clc + rts + +doLEVEL4 rep #$20 + lda level + sta oldLEVEL + jsr putLEVEL + clc + rts + +*-------------------------------------- + +doHELP jsr moBACK + + sei + lda zikPLAY + sta copyPLAY + stz zikPLAY + jsr shutMUSIC1 + cli + + lda ptrSCR + sta Debut + lda ptrSCR+2 + sta Debut+2 + + ldx #0 +]lp txy + ldal $e12000,x + sta [Debut],y + inx + inx + bpl ]lp + + jsr fadeOUT + ldx ptrHELP1+2 + ldy ptrHELP1 + lda #-1 + jsr fadeIN + jsr moFORE + + lda #2 + sta window + + lda #-1 + sta windowC + + lda #"1" + sta theKEY + +*--- + +doHELP1 sep #$20 + ldal $e0c000 + bpl doHELP2 + stal $e0c010 + cmp #$9b + beq doHELP3 + +doHELP2 rep #$20 + + jsr moREAD + jsr moCONTROL + bcs doHELP1 + cpx #142*2 + bne doHELP21 + + lda theKEY + cmp #"1" + bne doHELP21 + +*--- + + lda fgSND + beq doHELP21 + lda fgAAHH + bne doHELP21 + + sei + lda ptrUNPACK + clc + adc #$8000 + sta zikMUSIC + lda ptrUNPACK+2 + adc #0 + sta zikMUSIC+2 + lda #$18 + sta zikPAGE + + jsr shutMUSIC2 + + lda #1 + sta fgPAGE + sta zikPLAY + sta whichSND + + lda #-1 + sta windowC + + brl doHELP1 + +*--- + +doHELP21 inc theKEY + + lda theKEY + cmp #"7" + bne doHELP10 + +doHELP3 sep #$20 + stal $e0c010 + rep #$20 + + jsr moBACK + jsr fadeOUT + ldx ptrSCR+2 + ldy ptrSCR + lda #-1 + jsr fadeIN + jsr moFORE + +*--- + + sei + + lda ptrMUSIC + sta zikMUSIC + lda ptrMUSIC+2 + sta zikMUSIC+2 + lda #$373 + sta zikPAGE + + stz whichSND + lda copyPLAY + sta zikPLAY + beq doHELP31 + + jsr shutMUSIC2 + +*--- + +doHELP31 lda #-1 + sta windowC + stz window + rts + +*--- + +doHELP10 lda theKEY + cmp #"2" + bne doHELP11 + ldx ptrHELP2+2 + ldy ptrHELP2 + bra doHELP20 + +doHELP11 cmp #"3" + bne doHELP12 + ldx ptrHELP3+2 + ldy ptrHELP3 + bra doHELP20 + +doHELP12 cmp #"4" + bne doHELP13 + ldx ptrHELP4+2 + ldy ptrHELP4 + bra doHELP20 + +doHELP13 cmp #"5" + bne doHELP14 + ldx ptrHELP5+2 + ldy ptrHELP5 + bra doHELP20 + +doHELP14 ldx ptrHELP6+2 + ldy ptrHELP6 + +doHELP20 stx temp+4 + sty temp+6 + jsr moBACK + jsr fadeOUT + ldx temp+4 + ldy temp+6 + lda #-1 + jsr fadeIN + jsr moFORE + + lda #-1 + sta windowC + + brl doHELP1 + +*-------------------------------------- + +doQUIT lda #1 + sta window + lda #-1 + sta windowC + jsr showMSG + +doQUIT1 sep #$20 + ldal $e0c000 + bpl doQUIT2 + stal $e0c010 + cmp #$9b + bne doQUIT2 + rep #$20 + ldx #141*2 + bra doQUIT3 + +doQUIT2 rep #$20 + jsr moREAD + jsr moCONTROL + bcs doQUIT1 + + cpx #140*2 + bne doQUIT3 + + stz window + lda #-1 + sta windowC + jsr redrawMSG + clc + rts + +doQUIT3 cpx #141*2 + bne doQUIT1 + + stz window + lda #-1 + sta windowC + jsr redrawMSG + sec + rts + +*-------------------------------------- + +checkVALID cpy #1 + beq checkVALID1 + + lda window2XY,x + pha + and #$ff + sta coorX + pla + xba + and #$ff + sta coorY + +checkVALID1 lda coorX ; regarde si varX=1 + ora currX + cmp #1 + beq checkVALID2 + cmp coorX + beq checkVALID2 + + lda coorY ; regarde si varY=1 + ora currY + cmp #1 + beq checkVALID2 + cmp coorY + beq checkVALID2 + sec + rts + +checkVALID2 lda coorX + cmp currX + beq checkVALID4 + ldy #1 + lda coorY + cmp currY + bne checkVALID3 + lda coorX + sec + sbc currX + cmp #1 + beq checkVALID5 + ldy #0 + lda coorY + cmp currY + bne checkVALID3 + lda currX + sec + sbc coorX + cmp #1 + beq checkVALID5 +checkVALID3 sec + rts + +checkVALID4 lda coorY + cmp currY + beq checkVALID3 + ldy #3 + lda coorX + cmp currX + bne checkVALID3 + lda coorY + sec + sbc currY + cmp #1 + beq checkVALID5 + ldy #2 + lda coorX + cmp currX + bne checkVALID3 + lda currY + sec + sbc coorY + cmp #1 + beq checkVALID5 + sec + rts + +checkVALID5 sty theDIR + clc + rts + +*-------------------------------------- +* Routines souris + +moREAD jsr moTOOL + + sep #$20 + ldal $e0c034 + and #$f0 + stal $e0c034 + rep #$20 + + lda moX + cmp oldMOx + bne moREAD1 + lda moY + cmp oldMOy + bne moREAD1 + rts + +moREAD1 jsr moBACK + ldx moX + stx oldMOx + ldy moY + sty oldMOy + jsr moFORE + rts + +*-------------------------------------- + +moCONTROL lda window + asl + tax + lda windowS+2,x + asl + pha + lda windowS,x + asl + tax + +moCONTROL1 lda moX + cmp windowL,x + bcc moCONTROL2 + cmp windowR,x + bcs moCONTROL2 + + lda moY + cmp windowU,x + bcc moCONTROL2 + cmp windowD,x + bcc moCONTROL3 + +moCONTROL2 inx + inx + txa + cmp 1,s + bcc moCONTROL1 + ldx #-1 + +moCONTROL3 pla + + lda moBTN0 + and #%00000000_11000000 + cmp #%00000000_01000000 + beq moCONTROL10 + cmp #%00000000_10000000 + beq moCONTROL20 + cmp #%00000000_11000000 + bne moCONTROL4 + brl moCONTROL30 +moCONTROL4 sec + rts + +*- is up, was down + +moCONTROL10 cpx #-1 + bne moCONTROL12 + ldx windowC + lda windowFLG,x + and #%00000000_00000010 + bne moCONTROL11 + lda windowFLG,x + and #%00000000_00000001 + beq moCONTROL11 + lda windowFLG,x + and #%11111111_11111110 + sta windowFLG,x + ldy #0 + jsr inverseIT +moCONTROL11 sec ; not same control + rts +moCONTROL12 cpx windowC + bne moCONTROL11 + lda windowFLG,x + and #%00000000_00000010 + bne moCONTROL11 + lda windowFLG,x + and #%00000000_00000001 + beq moCONTROL13 + lda windowFLG,x + and #%11111111_11111110 + sta windowFLG,x + ldy #0 + jsr inverseIT +moCONTROL13 clc ; same control + rts + +*- is down, was up + +moCONTROL20 cpx #-1 + beq moCONTROL21 + lda windowFLG,x + and #%00000000_00000010 + bne moCONTROL21 + stx windowC + lda windowFLG,x + and #%00000000_00000001 + bne moCONTROL21 + lda windowFLG,x + and #%11111111_11111110 + ora #%00000000_00000001 + sta windowFLG,x + ldy #1 + jsr inverseIT +moCONTROL21 sec ; set new control + rts + +*- is down, was down + +moCONTROL30 cpx windowC + beq moCONTROL32 + ldx windowC + cpx #-1 + beq moCONTROL31 + lda windowFLG,x + and #%00000000_00000010 + bne moCONTROL31 + lda windowFLG,x + and #%00000000_00000001 + beq moCONTROL31 + lda windowFLG,x + and #%11111111_11111110 + sta windowFLG,x + ldy #0 + jsr inverseIT +moCONTROL31 sec ; no more on control + rts + +moCONTROL32 cpx #-1 + beq moCONTROL33 + lda windowFLG,x + and #%00000000_00000010 + bne moCONTROL33 + lda windowFLG,x + and #%00000000_00000001 + bne moCONTROL33 + lda windowFLG,x + and #%11111111_11111110 + ora #%00000000_00000001 + sta windowFLG,x + ldy #1 + jsr inverseIT +moCONTROL33 sec ; same control + rts + +*-------------------------------------- + +moTOOL ldal $e0c026 + bpl moTOOL1 + and #%00000010_00000000 + beq moTOOL2 + ldal $e0c024 +moTOOL1 rts + +moTOOL2 ldal $e0c024 + tax + and #%00000000_10000000 + eor #%00000000_10000000 + lsr moBTN1 + eor moBTN1 + and #%00000000_11000000 + sta moBTN1 + + ldal $e0c024 + tay + and #%00000000_10000000 + eor #%00000000_10000000 + lsr moBTN0 + eor moBTN0 + and #%00000000_11000000 + sta moBTN0 + +*- Occupe toi de X + + txa + and #%00000000_00111111 + pha + txa + and #%00000000_01000000 + beq moTOOL3 + + lda moX + clc + adc 1,s + sec + sbc #64 + bcc moTOOL4 + sta moX + bra moTOOL4 + +moTOOL3 lda moX + clc + adc 1,s + cmp #maximumX + bcs moTOOL4 + sta moX + +*- Occupe toi de Y + +moTOOL4 pla ; Recupere la pile + + tya + and #%00000000_00111111 + pha + tya + and #%00000000_01000000 + beq moTOOL6 + + lda moY + clc + adc 1,s + sec + sbc #64 + bcc moTOOL5 + sta moY +moTOOL5 pla + rts + +moTOOL6 lda moY + clc + adc 1,s + cmp #maximumY + bcs moTOOL7 + sta moY +moTOOL7 pla + rts + +*-------------------------------------- + +moBACK lda oldMOx + lsr + pha + + lda oldMOy + asl + tay + lda Ligne,y + clc + adc 1,s + tax + + ldy #0 + +moBACK1 lda moDATA,y + stal $e12000,x + lda moDATA+2,y + stal $e12002,x + lda moDATA+4,y + stal $e12004,x + + txa + clc + adc #160 + tax + cpx #$7d00 + bcs moBACK2 + iny + iny + iny + iny + iny + iny + cpy #36 + bne moBACK1 + +moBACK2 pla + rts + +*-------------------------------------- + +moFORE lda #moDATA + sta moFORE3+1 + sta moFORE4+1 + sta moFORE5+1 + ldy #0 + ldx #36 + + lda moX + lsr + pha + bcc moFORE1 + + lda #moDATA + sec + sbc #36 + sta moFORE3+1 + sta moFORE4+1 + sta moFORE5+1 + ldy #36 + ldx #72 + +moFORE1 stx moFORE6+1 + + lda moY + asl + tax + lda Ligne,x + clc + adc 1,s + tax + +moFORE2 ldal $e12000,x +moFORE3 sta moDATA,y + and moMASK,y + ora moSPRI,y + stal $e12000,x + + iny + iny + ldal $e12002,x +moFORE4 sta moDATA,y + and moMASK,y + ora moSPRI,y + stal $e12002,x + + iny + iny + ldal $e12004,x +moFORE5 sta moDATA,y + and moMASK,y + ora moSPRI,y + stal $e12004,x + + txa + clc + adc #160 + tax + cpx #$7d00 + bcs moFORE7 + + iny + iny +moFORE6 cpy #-1 + bne moFORE2 + +moFORE7 pla + rts + +*-------------------------------------- + +inverseIT cpx #144*2 + bcs inverseIT0 + + lda windowFLG,x + and #%00000000_00000100 + beq inverseIT1 +inverseIT0 rts + +inverseIT1 phx + + txa + sec + sbc #135*2 + tax + + cpy #1 + beq inverseIT2 + + lda windowNOR,x + bra inverseIT3 + +inverseIT2 lda windowINV,x + +inverseIT3 clc + adc ptrSPRITE + sta Debut + lda ptrSPRITE+2 + adc #0 + sta Debut+2 + + lda windowSCR,x + clc + adc #$2000 + sta Arrivee + lda #$00e1 + sta Arrivee+2 + + lda windowLR,x + lsr + sta temp + + lda windowUP,x + sta temp+2 + + jsr moBACK ; restore background + +inverseIT5 ldy #0 + sep #$20 +]lp lda [Debut],y + sta [Arrivee],y + iny + cpy temp + bne ]lp + rep #$20 + + lda Debut + clc + adc #160 + sta Debut + + lda Arrivee + clc + adc #160 + sta Arrivee + cmp #$9d00 + bcs inverseIT6 + + dec temp+2 + lda temp+2 + bpl inverseIT5 + +inverseIT6 jsr moFORE ; show cursor + plx ; pull X from stack + + rts + +*-------------------------------------- +* Fenetres + +showMSG lda ptrSPRITE+1 + sta showMSG3+2 + + lda adrMSG ; adresse source + clc + adc ptrSPRITE + sta showMSG3+1 + + lda adrMSGscr ; adresse ecran + sta showMSG2+1 + sta showMSG4+1 + + lda adrMSGx ; nombre de points + lsr + sta temp + lda adrMSGy ; nombre de lignes + sta temp+2 + + lda ptrUNPACK + sta Debut + lda ptrUNPACK+2 + sta Debut+2 + + jsr moBACK + + ldy #0 +showMSG1 ldx #0 + sep #$20 +showMSG2 ldal $e12000,x + sta [Debut],y +showMSG3 ldal $e12000,x +showMSG4 stal $e12000,x + iny + inx + cpx temp + bcc showMSG2 + rep #$20 + + lda showMSG3+1 + clc + adc #160 + sta showMSG3+1 + lda showMSG3+2 + adc #0 + sta showMSG3+2 + + lda showMSG2+1 + clc + adc #160 + sta showMSG2+1 + sta showMSG4+1 + cmp #$9d00 + bcs showMSG5 + + dec temp+2 + lda temp+2 + bpl showMSG1 + +showMSG5 jsr moFORE + + rts + +*-------------------------- Redraw Fenetre + +redrawMSG lda adrMSGscr ; adresse ecran + sta redrawMSG3+1 + + lda adrMSGx ; nombre de points + lsr + sta temp + lda adrMSGy ; nombre de lignes + sta temp+2 + + lda ptrUNPACK + sta Debut + lda ptrUNPACK+2 + sta Debut+2 + + jsr moBACK + + ldy #0 +redrawMSG1 ldx #0 + sep #$20 +redrawMSG2 lda [Debut],y +redrawMSG3 stal $e12000,x + iny + inx + cpx temp + bcc redrawMSG2 + rep #$20 + + lda redrawMSG3+1 + clc + adc #160 + sta redrawMSG3+1 + cmp #$9d00 + bcs redrawMSG4 + + dec temp+2 + lda temp+2 + bpl redrawMSG1 + +redrawMSG4 jsr moFORE + + rts + +*--- Donnes fenetres + +window ds 2 ; numero de la fenetre active +windowC dw -1 ; numero du controle actif +windowS dw 0 ; debut des boutons de la fenetre + dw 140 + dw 142 + dw 144 + +windowL dw 5,25,45,65,85,105,125,145,165,185,205,225,245,265,285 + dw 5,25,45,65,85,105,125,145,165,185,205,225,245,265,285 + dw 5,25,45,65,85,105,125,145,165,185,205,225,245,265,285 + dw 5,25,45,65,85,105,125,145,165,185,205,225,245,265,285 + dw 5,25,45,65,85,105,125,145,165,185,205,225,245,265,285 + dw 5,25,45,65,85,105,125,145,165,185,205,225,245,265,285 + dw 5,25,45,65,85,105,125,145,165,185,205,225,245,265,285 + dw 5,25,45,65,85,105,125,145,165,185,205,225,245,265,285 + dw 5,25,45,65,85,105,125,145,165,185,205,225,245,265,285 + dw 6,178,245,266,282 + dw 126,144 + dw 30,0 + +windowR dw 24,44,64,84,104,124,144,164,184,204,224,244,264,284,304 + dw 24,44,64,84,104,124,144,164,184,204,224,244,264,284,304 + dw 24,44,64,84,104,124,144,164,184,204,224,244,264,284,304 + dw 24,44,64,84,104,124,144,164,184,204,224,244,264,284,304 + dw 24,44,64,84,104,124,144,164,184,204,224,244,264,284,304 + dw 24,44,64,84,104,124,144,164,184,204,224,244,264,284,304 + dw 24,44,64,84,104,124,144,164,184,204,224,244,264,284,304 + dw 24,44,64,84,104,124,144,164,184,204,224,244,264,284,304 + dw 24,44,64,84,104,124,144,164,184,204,224,244,264,284,304 + dw 39,236,260,274,313 + dw 193,175 + dw 46,319 + +windowU dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + dw 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20 + dw 40,40,40,40,40,40,40,40,40,40,40,40,40,40,40 + dw 60,60,60,60,60,60,60,60,60,60,60,60,60,60,60 + dw 80,80,80,80,80,80,80,80,80,80,80,80,80,80,80 + dw 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100 + dw 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120 + dw 140,140,140,140,140,140,140,140,140,140,140,140,140,140,140 + dw 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160 + dw 185,187,185,185,185 + dw 89,105 + dw 77,0 + +windowD dw 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19 + dw 39,39,39,39,39,39,39,39,39,39,39,39,39,39,39 + dw 59,59,59,59,59,59,59,59,59,59,59,59,59,59,59 + dw 79,79,79,79,79,79,79,79,79,79,79,79,79,79,79 + dw 99,99,99,99,99,99,99,99,99,99,99,99,99,99,99 + dw 119,119,119,119,119,119,119,119,119,119,119,119,119,119,119 + dw 139,139,139,139,139,139,139,139,139,139,139,139,139,139,139 + dw 159,159,159,159,159,159,159,159,159,159,159,159,159,159,159 + dw 179,179,179,179,179,179,179,179,179,179,179,179,179,179,179 + dw 195,193,195,195,195 + dw 99,115 + dw 88,199 + +*--- Flags des fenetres +* bit 0: windowFLG (old windowA) -> 0 +* bit 1: windowTGT (can't be target if 1) -> 2 +* bit 2: windowREF (can't refresh if 1) -> 4 + +windowFLG dw 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 + dw 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 + dw 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 + dw 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 + dw 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 + dw 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 + dw 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 + dw 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 + dw 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 + dw 0,0,0,0,0 + dw 0,0 + dw 4,4 + +*--- + +window2XY dw $000,$001,$002,$003,$004,$005,$006,$007,$008,$009,$00a,$00b,$00c,$00d,$00e + dw $100,$101,$102,$103,$104,$105,$106,$107,$108,$109,$10a,$10b,$10c,$10d,$10e + dw $200,$201,$202,$203,$204,$205,$206,$207,$208,$209,$20a,$20b,$20c,$20d,$20e + dw $300,$301,$302,$303,$304,$305,$306,$307,$308,$309,$30a,$30b,$30c,$30d,$30e + dw $400,$401,$402,$403,$404,$405,$406,$407,$408,$409,$40a,$40b,$40c,$40d,$40e + dw $500,$501,$502,$503,$504,$505,$506,$507,$508,$509,$50a,$50b,$50c,$50d,$50e + dw $600,$601,$602,$603,$604,$605,$606,$607,$608,$609,$60a,$60b,$60c,$60d,$60e + dw $700,$701,$702,$703,$704,$705,$706,$707,$708,$709,$70a,$70b,$70c,$70d,$70e + dw $800,$801,$802,$803,$804,$805,$806,$807,$808,$809,$80a,$80b,$80c,$80d,$80e + +coorX ds 2 +coorY ds 2 + +*--- + +windowNOR dw $73a3,$75d9,$741a,$7425,$742d + dw $24ef,$2ef8 +windowINV dw $6874,$6c47,$68a7,$68b9,$68d1 + dw $608c,$6054 +windowSCR dw $73a3,$75d9,$741a,$7425,$742d + dw $37df,$41e8 +windowLR dw 34,40,18,10,32 + dw 70,34 +windowUP dw 10,4,10,10,10 + dw 10,10 + +*--- Adresses des fenetres + +adrMSG dw $1cc0 ; adresse source +adrMSGscr dw $4fb0 ; adresse ecran +adrMSGx dw 128 ; nombre de colonnes +adrMSGy dw 94-46 ; nombre de lignes + +*--- Datas souris + +moX ds 2 ; coordonnee X +moY ds 2 ; coordonnee Y +moBTN0 ds 2 ; bouton 0 +moBTN1 ds 2 ; bouton 1 +oldMOx ds 2 ; ancienne coordonnee X +oldMOy ds 2 ; ancienne coordonnee Y + +moDATA ds 36 ; buffer du fond de l'image + +moSPRI hex FFFFFFFF0000 ; sprite pointeur pair + hex 0F00000F0000 + hex 00F000F00000 + hex 000F00F00000 + hex 0000FF000000 + hex 00000F000000 + + hex 0FFFFFFFF000 ; sprite pointeur impair + hex 00F00000F000 + hex 000F000F0000 + hex 0000F00F0000 + hex 00000FF00000 + hex 000000F00000 + +moMASK hex 00000000FFFF ; mask pointeur pair + hex F0000000FFFF + hex FF00000FFFFF + hex FFF0000FFFFF + hex FFFF00FFFFFF + hex FFFFF0FFFFFF + + hex F00000000FFF ; mask pointeur impair + hex FF0000000FFF + hex FFF00000FFFF + hex FFFF0000FFFF + hex FFFFF00FFFFF + hex FFFFFF0FFFFF diff --git a/blockade/Blockade.Play.s b/blockade/Blockade.Play.s new file mode 100644 index 0000000..5c17526 --- /dev/null +++ b/blockade/Blockade.Play.s @@ -0,0 +1,952 @@ +* +* Blockade: Game +* + +*-------------------------------------- +* Gestion du jeu + +nowPLAY ldx currX + ldy currY + jsr calcPLATEAU + tax + lda plateauBACK,x ; on ne deplace pas + and #$ff ; si on a qqch de fixe + sta valueCURR + cmp #$07 + beq nowPLAY1 + cmp #$11 + bcs nowPLAY1 + + lda plateauFORE,x ; si rien en fore, alors retour + and #$ff + beq nowPLAY2 + + brl nowPLAY20 ; on a qqch en fore + +*--- + +nowPLAY1 ldy #6 + jsr playSND + + ldx oldX ; retour sans changement + stx currX + ldy oldY + sty currY + lda oldC + sta currC + rts + +nowPLAY2 lda #06 ; on affiche le sprite + ldx currX + ldy currY + jsr showSCREEN + lda oldC + ldx oldX + ldy oldY + jsr showSCREEN + + lda valueCURR + sta currC + + ldy #4 + jsr playSND + + rts + +*--- On a qqch en foreground + +nowPLAY20 sta currC + + jsr calcNEXT + bcs nowPLAY1 + + tax + lda plateauFORE,x + and #$ff + sta nextC + cmp #$11 + bcc nowPLAY201 + + brl nowPLAY1 + +nowPLAY201 eor currC + cmp #1 + bne nowPLAY22 + + jsr saveALL + + lda nextC ; regarde si CARRE + cmp #$0a + bcs nowPLAY21 + + ldy #10 + jsr playSND + + dec nbPIECES ; CARRE -> effacer + dec nbPIECES + + ldx nextX + ldy nextY + jsr calcPLATEAU + tax + lda plateauFORE,x + and #$ff00 + sta plateauFORE,x + + stz currC + stz nextC + brl nowPLAY40 + +nowPLAY21 lda nextC + sec + sbc #2 + sta nextC + + ldy #0 + jsr playSND + + stz currC + dec nbPIECES + brl nowPLAY40 + +nowPLAY22 cmp currC ; si =currC alors on a rien + beq nowPLAY23 ; en fore + + brl nowPLAY1 + +nowPLAY23 lda currC + sta nextC + + phx + jsr saveALL + plx + +*--- Rien en nextFore, regarde en nextBack + +nowPLAY30 lda plateauBACK,x + and #$ff + cmp #$07 + beq nowPLAY31 + cmp #$11 + bcc nowPLAY32 + +nowPLAY31 brl nowPLAY1 + +nowPLAY32 ldy currC ; gestion du mur mouvant + cpy #$10 + bne nowPLAY321 + sty nextC + brl nowPLAY40 + +nowPLAY321 cmp #1 ; force jaune + bne nowPLAY33 + + ldy #9 + jsr playSND + + lda currC + and #$fe + sta nextC + brl nowPLAY40 + +nowPLAY33 cmp #2 ; force bleu + bne nowPLAY34 + + ldy #3 + jsr playSND + + lda currC + ora #$01 + sta nextC + brl nowPLAY40 + +nowPLAY34 cmp #3 ; echange couleur + bne nowPLAY35 + + ldy #12 + jsr playSND + + lda currC ; vire bit 0 + and #$fe + pha + lda currC + and #$01 ; garde bit 0 + eor #$01 ; 0=>1 & 1=>0 + ora 1,s + ply + sta nextC + brl nowPLAY40 + +nowPLAY35 cmp #4 ; degenerateur + bne nowPLAY37 + + lda currC + cmp #$0e + bcs nowPLAY36 + clc + adc #2 + sta nextC + + ldy #5 + jsr playSND + +nowPLAY36 brl nowPLAY40 + +nowPLAY37 cmp #5 ; teleporteur + bne nowPLAY40 + + jsr manageTELE + bcs nowPLAY40 + + stx nextX + sty nextY + + lda currC + sta nextC + + ldy #11 + jsr playSND + +*--- Reaffiche tout ce qui a change + +nowPLAY40 lda #06 ; on affiche le curseur + ldx currX + ldy currY + jsr showSCREEN + lda oldC ; on reaffiche l'ancien sprite + ldx oldX + ldy oldY + jsr showSCREEN + + ldy #8 + jsr playSND + + lda nbPIECES + cmp nbPIECES2 + bne nowPLAY41 + + jsr saveALL + +nowPLAY41 ldx oldX ; on efface l'ancienne valeur + ldy oldY + jsr calcPLATEAU + tax + lda plateauFORE,x + and #$ff00 + sta plateauFORE,x + + ldx currX + ldy currY + jsr calcPLATEAU + tax + lda plateauFORE,x + and #$ff00 + sta plateauFORE,x + + ldx nextX ; on met la nouvelle valeur + ldy nextY + jsr calcPLATEAU + tax + lda plateauFORE,x + and #$ff00 + ora nextC + sta plateauFORE,x + + lda nextC + bne nowPLAY42 + + ldx nextX ; on met la nouvelle valeur + ldy nextY + jsr calcPLATEAU + tax + lda plateauBACK,x + and #$ff +nowPLAY42 ldx nextX ; affiche it + ldy nextY + jsr showSCREEN + + lda valueCURR + sta currC + + lda #1 + sta fgUNDO + + rts + +*--- Gestion du teleporteur + +manageTELE lda #1 + sta deltaMVT + + ldx nextX + stx teleX + ldy nextY + sty teleY + +*--- + +manageTELE1 lda deltaMVT + asl + asl + clc + adc #2 + sta maxMVT ; nombre maxi de deplacement + + stz nbMVT ; nb de deplacements effectues + + ldx teleX ; calcul de l'adresse + stx xFIRST ; de la premiere case + stx xSECOND + + lda teleY + sec + sbc deltaMVT + sta yFIRST + sta ySECOND + +*--- + +manageTELE2 ldx xFIRST + ldy yFIRST + jsr manageTELE10 + bcs manageTELE3 + ldx xFIRST + ldy yFIRST + clc + rts +manageTELE3 ldx xSECOND + ldy ySECOND + jsr manageTELE10 + bcs manageTELE4 + ldx xSECOND + ldy ySECOND + clc + rts + +*--- + +manageTELE4 lda nbMVT + clc + adc #2 + sta nbMVT ; incremente le numero du mouvement + cmp maxMVT + bne manageTELE6 + + lda deltaMVT + clc + adc #1 + sta deltaMVT + cmp #16 + beq manageTELE5 + brl manageTELE1 +manageTELE5 sec + rts + +*--- + +manageTELE6 lda yFIRST + clc + adc #1 + sta yFIRST + sta ySECOND + bmi manageTELE7 + cmp teleY + bcc manageTELE7 + beq manageTELE7 + + inc xFIRST + bra manageTELE8 + +manageTELE7 dec xFIRST + +manageTELE8 lda teleX + sec + sbc xFIRST + clc + adc teleX + sta xSECOND + brl manageTELE2 + +*--- + +manageTELE10 cpx #15 ; x<15 + bcc manageTELE11 + bra manageTELE15 + +manageTELE11 cpy #9 ; y<9 + bcc manageTELE12 + bra manageTELE15 + +manageTELE12 cpx currX ; sur curseur + bne manageTELE13 + cpy currY + beq manageTELE15 + +manageTELE13 cpx teleX ; sur teleporteur de depart + bne manageTELE14 + cpy teleY + beq manageTELE15 + +manageTELE14 jsr calcPLATEAU ; regarde si on a un teleporteur + tax + lda plateauBACK,x + and #$ff + cmp #$05 + bne manageTELE15 + + lda plateauFORE,x + and #$ff + bne manageTELE15 + + clc + rts +manageTELE15 sec + rts + +*-------------------------------------- + +saveALL ldx #0 + sep #$20 +]lp lda plateauBACK,x + sta plateauBACK2,x + lda plateauFORE,x + sta plateauFORE2,x + inx + cpx #15*9 + bne ]lp + + rep #$20 + + ldx oldX + stx copyX + ldy oldY + sty copyY + lda oldC + sta copyC + + lda nbPIECES + sta nbPIECES2 + + rts + +*--- + +restoreALL lda fgUNDO + bne restoreALL1 + rts + +restoreALL1 ldx #0 + sep #$20 + +]lp lda plateauBACK,x + pha + lda plateauBACK2,x + sta plateauBACK,x + pla + sta plateauBACK2,x + + lda plateauFORE,x + pha + lda plateauFORE2,x + sta plateauFORE,x + tay + pla + sta plateauFORE2,x + + tya + bne restoreALL2 + lda plateauBACK,x +restoreALL2 sta plateauALL,x + + inx + cpx #15*9 + bne ]lp + + rep #$20 + + lda #showSCREEN + sta printLEVEL1+1 + jsr printLEVEL + lda #showSPRITE + sta printLEVEL1+1 + + lda coorX + ldx copyX + stx currX + stx coorX + sta copyX + + lda coorY + ldy copyY + sty currY + sty coorY + sta copyY + + lda currC + pha + lda copyC + sta currC + pla + sta copyC + + lda #6 + jsr showSCREEN + + ldx nbPIECES + lda nbPIECES2 + sta nbPIECES + stx nbPIECES2 + + rts + +*-------------------------------------- +* Routines diverses + +decodeLEVEL lda ptrLEVEL + sta Debut + lda ptrLEVEL+2 + sta Debut+2 + + lda #0 + ldx level +]lp dex + cpx #0 + beq decodeLEVEL1 + clc + adc #$b8 + bra ]lp +decodeLEVEL1 clc + adc Debut + sta Debut + lda Debut+2 + adc #0 + sta Debut+2 + +*--- Recopie nom + + ldy #24-2 +]lp lda [Debut],y + sta levelNAME,y + dey + dey + bpl ]lp + +*--- Recopie fond + + lda Debut + clc + adc #$18 + sta Debut + lda Debut+2 + adc #0 + sta Debut+2 + + lda #plateauALL + sta Arrivee + lda #^plateauALL + sta Arrivee+2 + + ldx #9 +decodeLEVEL2 ldy #14 +]lp lda [Debut],y + sta [Arrivee],y + dey + dey + bpl ]lp + + lda Debut + clc + adc #16 + sta Debut + + lda Arrivee + clc + adc #15 + sta Arrivee + + dex + bne decodeLEVEL2 + + lda [Debut] + xba + sta nbPIECES + +*--- Gere le premier plan + + sep #$20 + ldx #0 +]lp lda plateauALL,x + cmp #$06 + beq decodeLEVEL3 + cmp #$13 + bcs decodeLEVEL5 + cmp #$08 + bcs decodeLEVEL4 + bra decodeLEVEL5 + +decodeLEVEL3 lda #0 + +decodeLEVEL4 sta plateauFORE,x + stz plateauBACK,x + bra decodeLEVEL6 + +decodeLEVEL5 sta plateauBACK,x + stz plateauFORE,x + +decodeLEVEL6 inx + cpx #15*9 + bne ]lp + + rep #$20 + + stz fgUNDO + + rts + +*-------------------------------------- + +putLEVEL sep #$20 + + ldx level + lda scdVAR,x + and #$f0 + lsr + lsr + lsr + lsr + ora #'0' + cmp #'0' + bne putLEVEL0 + lda #' ' +putLEVEL0 sta strLEVEL + + lda scdVAR,x + and #$0f + ora #'0' + sta strLEVEL+1 + + rep #$20 + +putLEVEL1 lda #strLEVEL + ldx #$00e1 + ldy #$95f0 + jsr printIT + + lda ptrSCR + clc + adc #$75f0 + tay + + lda #strLEVEL + ldx ptrSCR+2 + jsr printIT + + rts + +*-------------------------------------- + +printLEVEL lda #0 + sta printY + sta showX + sta showY + +]lp tax + lda plateauALL,x + and #$ff + ldx showX + ldy showY + cmp #$06 + bne printLEVEL1 + stx currX + stx coorX + stx oldX + sty currY + sty coorY + sty oldY + +printLEVEL1 jsr showSPRITE + + inc showX + lda showX + cmp #15 + bne printLEVEL2 + stz showX + inc showY + +printLEVEL2 inc printY + lda printY + cmp #15*9 + bne ]lp + +*--- Affiche le nom + + lda levelNAME + and #$ff + tax + stz levelNAME1,x + + lda #$7598 + clc + adc ptrSCR + tay + + lda #levelNAME1 + ldx ptrSCR+2 + jsr printIT + + jsr putLEVEL + + rts + +*-------------------------------------- + +showSCREEN phy + + asl + tay + lda adrSPRITE,y + clc + adc ptrSPRITE + sta Debut + lda ptrSPRITE+2 + adc #0 + sta Debut+2 + + ply + jsr calcWHAT + clc + adc #$2005 + sta Arrivee + lda #$00e1 + sta Arrivee+2 + bra showSPRITE1 + +*-------------------------------------- + +showSPRITE phy + + asl + tay + lda adrSPRITE,y + clc + adc ptrSPRITE + sta Debut + lda ptrSPRITE+2 + adc #0 + sta Debut+2 + + ply + jsr calcWHAT + clc + adc #5 ; Correctif centre + clc + adc ptrSCR + sta Arrivee + lda ptrSCR+2 + adc #0 + sta Arrivee+2 + +showSPRITE1 ldx #20 + ldy #0 +]lp lda [Debut],y + sta [Arrivee],y + iny + iny + lda [Debut],y + sta [Arrivee],y + iny + iny + lda [Debut],y + sta [Arrivee],y + iny + iny + lda [Debut],y + sta [Arrivee],y + iny + iny + lda [Debut],y + sta [Arrivee],y + + tya + clc + adc #160-8 + tay + + dex + bne ]lp + + rts + +*-------------------------------------- + +calcWHAT tya + asl + tay + lda scrY,y + pha + + txa + asl + tax + lda scrX,x + clc + adc 1,s + plx + rts + +*-------------------------------------- + +calcPLATEAU lda platY,y + and #$ff + pha + + txa + clc + adc 1,s + plx + clc + rts + +*-------------------------------------- + +calcNEXT lda currX + sta nextX + lda currY + sta nextY + + lda theDIR ; left + bne calcNEXT1 + lda nextX + beq calcNEXT5 + dec nextX + bra calcNEXT4 + +calcNEXT1 cmp #1 ; right + bne calcNEXT2 + lda nextX + cmp #14 + beq calcNEXT5 + inc nextX + bra calcNEXT4 + +calcNEXT2 cmp #2 ; up + bne calcNEXT3 + lda nextY + beq calcNEXT5 + dec nextY + bra calcNEXT4 + +calcNEXT3 lda nextY ; down + cmp #8 + beq calcNEXT5 + inc nextY + +calcNEXT4 ldx nextX + ldy nextY + jsr calcPLATEAU + clc + rts +calcNEXT5 sec + rts + +*-------------------------------------- + +preparePIC lda ptrSPRITE + sta Debut + lda ptrSPRITE+2 + sta Debut+2 + + lda ptrSCR + sta Arrivee + lda ptrSCR+2 + sta Arrivee+2 + + ldy #0 + tya +]lp sta [Arrivee],y + iny + iny + bpl ]lp + + ldy #180*160 +]lp lda [Debut],y + sta [Arrivee],y + iny + iny + bpl ]lp + rts + +*--- Jeu + +level ds 2 +oldLEVEL ds 2 + +strLEVEL asc ' '00 + +nbPIECES ds 2 +nbPIECES2 ds 2 + +fgUNDO ds 2 + +printY ds 2 + +showX ds 2 +showY ds 2 + +valueCURR ds 2 + +xFIRST ds 2 ; teleporteur +yFIRST ds 2 + +xSECOND ds 2 +ySECOND ds 2 + +nbMVT ds 2 +maxMVT ds 2 + +teleX ds 2 +teleY ds 2 + +deltaMVT ds 2 + +oldX ds 2 ; ancien +oldY ds 2 +oldC ds 2 + +currX ds 2 ; courant +currY ds 2 +currC ds 2 + +nextX ds 2 ; le premier apres +nextY ds 2 +nextC ds 2 + +copyX ds 2 ; sauvegarde +copyY ds 2 +copyC ds 2 + +theDIR ds 2 +theKEY ds 2 + +scrX dw $00,$0a,$14,$1e,$28,$32,$3c,$46 + dw $50,$5a,$64,$6e,$78,$82,$8c +scrY dw $0000,$0c80,$1900,$2580,$3200 + dw $3e80,$4b00,$5780,$6400 + +adrSPRITE dw $141,$14c,$157,$162,$16d,$178,$183 + dw $18e,$199,$1a4,$1af,$1ba,$1c5,$1d0 + dw $f01,$f0c,$f17,$f22,$f2d,$f38,$f43 + dw $f4e,$f59,$f64,$f6f,$f7a,$f85,$f90 + +platY db 0,15,30,45,60,75,90,105,120,135 + +levelNAME ds 1 +levelNAME1 ds 24 + +plateauALL ds 15*9 + +plateauBACK2 ds 15*9 +plateauFORE2 ds 15*9 + +plateauBACK ds 15*9 +plateauFORE ds 15*9