************************* * * * LIBRAIRIE DE MACROS 2 * * (C)1990 BY DECKARD * * * ************************* * O = 1 N = 0 PR? KBD "LST OFF (O/N)" DO PR? LST OFF LS = 1 ELSE LST ON LS = 0 FIN RDOS KBD "Assemblage pour RDOS (O/N)" DO RDOS LS2 = 1 ELSE LS2 = 0 FIN ******************************** AJ MAC INC ]1 BNE FAJ INC ]2 FAJ <<< ******************************** * MODULE RECOPIANT LIB.MACROS2 EN RAM AUX ORG $1000 CPTAUX EQU $6 ; ET $7 CPT2AUX EQU $8 ; ET $9 STORE_LIB EQU $6803 ; EQUIVALENCE LIB EN AUX LDA #LIB_MACROS2 STA CPTAUX STY CPTAUX+1 LDA #STORE_LIB STA CPT2AUX STY CPT2AUX+1 STA $C008 ; PILE ET P0 PRINC STA $C005 ; ECRITURE EN AUX LDY #0 RECOP LDA (CPTAUX),Y STA (CPT2AUX),Y AJ CPTAUX ;CPTAUX+1 AJ CPT2AUX ;CPT2AUX+1 TEST_FIN LDA CPT2AUX ; COMPARE LOW CMP #STORE_LIB+$1000 BNE RECOP ; PAS FINI STA $C004 RTS LIB_MACROS2 DO LS2 ORG $803 ELSE ORG $8000 FIN ******************************** * BANK 1 CARAC EQU $D004 ; DEBUT DATAS CARACTERES SET 0 CURSOR EQU $D1F4 ; 1ER DATA DU CURSEUR (= '^') (+$1F0) SPELL EQU $D39C ; CONNAISSANCE DES SORTS SPELL2 EQU $D3B0 ; POSSIBILITE DES SORTS VAL_ST EQU $D3EC ; SITUATION VAL_MO EQU $D416 ; MORT VAL_CRT EQU $D55F ; CREVE VAL_ACR EQU $D83B ; DOMAGE VAL_ACR0 EQU $D86B ; 'VOUS LUI ' VAL_LOC EQU $DA38 ; LOCALISATION VAL_MAG EQU $DAAD ; DATAS SPELL VAL_MAG2 EQU $DB25 ; IDEM VAL_BL EQU $DB9D ; BLESSURE VAL_SMAG EQU $DBF2 ; NOMS DES SORTS VAL_CH EQU $DF92 ; ATTENDRE/COMBAT/... * BANK 2 DATASP EQU $D000 ; STOCKAGE DATA SPRITE LIB_DESCRIPT EQU $F000 ; DESCRIPTIF LIBRARIE REF_BIT EQU $F00B ; BITS DES SPRITES * GERE LA RAM AUXILIAIRE SWAP_AUX EQU $03A0 STRING EQU $0349 VALS EQU $035A * GAME2 PIEGE EQU $401E DOMARCH EQU $4027 * RAM SPECIAL SON EQU $1FF0 ETAT EQU $1FF1 * ******************************** CRDO EQU $DAFB OUTDO EQU $DB5C COUT1 EQU $FDF0 WAIT EQU $FCA8 KEYBRD EQU $C000 ZKEYBRD EQU $C010 ; ; PAGE ZERO ; CSWL EQU $36 ; POINTE NORMALEMENT SUR COUT1 CSWH EQU $37 KSWL EQU $38 ; POINTE NORMALEMENT SUR KEYIN KSWH EQU $39 GBASL EQU $26 GBASH EQU $27 BASL EQU $28 BASH EQU $29 BAS2L EQU $2A BAS2H EQU $2B CH EQU $24 CV EQU $25 INVFLG EQU $32 ; MASQUE POUR NORMAL/INVERSE LARGEUR EQU $21 MARGEG EQU $20 MARGEH EQU $22 MARGEB EQU $23 XMAX EQU $1C Y EQU $1A X EQU $09 ETAT2 EQU $E7 ; ON N'UTILISE PAS SCALE ; JMP MACROCMD ******************************** * I N P U T * ******************************** * * BUT: AFFICHER UN CURSEUR QUI CHANGE SANS ARRET * ; * ON AFFICHE LE CURSEUR ; LST ON INPUT PHA ; MET DE COTE LE CURSEUR ACTUEL LST OFF INPUT2 STY INSTORE STX INSTORE+1 LDA #$DE ; CODE ASCII DE '^' JSR SCREEN ; * ON FAIT UNE ROTATION DE BAS EN HAUT ; LDA $C08B ; BANK1 : LECTURE ET ECRITURE MEV LDA $C08B LDA CURSOR EOR #$80 ; CHANGE COULEUR TAX ; SAUVEGARDE 1ER OCTET LDY #0 ROTATION LDA CURSOR+1,Y EOR #$80 ; BIT COULEUR VARIABLE STA CURSOR,Y INY CPY #7 ; ON EN FAIT 7 BNE ROTATION TXA ; RECUPERE 1ER OCTET STA CURSOR+7 ; ACCOMPLI LA ROTATION (1ER = DERNIER) LDA $C081 ; BANK 2 : LECTURE MEM ET ECRITURE MEV ; * AFFICHAGE DES SPRITES MOBILES+GENERATEUR ALEATOIRE ; JSR SPMOBIL0 ; RESTAURE LDY INSTORE LDX INSTORE+1 ; * CONTINUE ; JSR SUITE JMP INPUT2 ; SUITE LDA KEYBRD BMI SUITE2 LDA #$B0 JMP WAIT SUITE2 PLA ; RECUPERE LE CURSEUR SAUVE PLA ; 2 PLA EN + CAR IL Y A EUT UN JSR PLA STA (BASL),Y LDA KEYBRD BIT ZKEYBRD RTS ******************************** * O U T P U T * ******************************** * * BUT: ECRIRE A LA FOIS SUR ECRAN TEXT ET SUR ECRAN HGR * ; OUTPUT CMP #$A0 ; = ESPACE BCC OTHER ; POUR LES CARACTERES < A L'ESPACE STA OUTSTORE ; SAUVE POUR ECRAN TEXTE STY OUTSTORE+1 STX OUTSTORE+2 VASY LDY ETAT2 BEQ VASY2 PHA JSR OKDECAL PLA VASY2 JSR SCREEN BITJSR DFB #$2C ; BIT OU JSR DFB #TRT_RTN LDA OUTSTORE ; RECUPERE POUR ECRAN TEXTE LDY OUTSTORE+1 LDX OUTSTORE+2 JMP BYE2 ; OTHER PHA LDA ETAT BEQ BYE2+1 ; SI 0 RTN ET FLECHE NON AUTORISEE PLA CMP #$8D ; RETURN? BNE OTHER2 PHA LDA #$20 STA BITJSR ; BRANCHE LE JSR PLA ; RECUPERE ACC IDEM STA OUTSTORE ; SAUVE POUR ECRAN TEXTE STY OUTSTORE+1 STX OUTSTORE+2 LDA #$A0 JMP VASY OTHER2 CMP #$88 ; FLECHE GAUCHE? BEQ IDEM ; * SAUT A LA SUBROUTINE NORMALE ; BYE2 BIT $68 ; FAUX BIT. C'EST : PLA JMP COUT1 ; OUTSTORE DFB 0,0,0 INSTORE DFB 0,0 HEX 00 ; ANCIENNE PLACE DE 'ETAT' ******************************** ; ; TRAITEMENT RETURN EN LIGNE 24 ; TRT_RTN LDA #$2C STA BITJSR ; RETABLI LE BIT JSR TESTY LDA ETAT2 BEQ RTNFIN JMP OKDECAL RTNFIN RTS ; ; ; ; AFFICHE SUR ECRAN HGR ; SCREEN SEC SBC #$A0 ; OBTIENT LE NUMERO DU CARACTERE LDY #$00 STY GBASH ASL ASL ROL GBASH ASL ROL GBASH C1 ADC #CARAC STA GBASH ; CLC LDA BASL ADC CH ; POSITION HORIZONTALE DU CURSEUR STA BAS2L LDA BASH MODE ADC #$1C ; POUR AVOIR HGR STA BAS2H ; ; ECRITURE ; LDA $C088 ; BANK 1 : LECTURE MEV ONLY WRITE LDA (GBASL),Y ; DATA CARAC LDX INVFLG CPX #$FF BEQ AFFIC EOR #$FF ; AFFICHE EN INVERSE AFFIC STA (BAS2L),Y CLC LDA BAS2L ADC #$FF STA BAS2L ; POSITIONNE POUR OCTET SUIVANT LDA BAS2H ADC #$03 STA BAS2H INY CPY #$08 ; A-T-ON FAIT LES 8 OCTETS (= 1 CARACTERE) BNE WRITE LDA $C081 ; RTOUR BANK2 : LECTURE MEM ET ECRITURE MEV ; * OPERATIONS VIRTUELLES DE TESTS POUR DECALAGE ; LDA OUTSTORE BCC AUTRECAR ; AUTRES TOUCHES ENFONCEES LDY CH ; TEST DE X INY CPY LARGEUR BPL TESTY RTS TESTY LDY CV ; CHANGEMENT DE LIGNE INY CPY MARGEB BNE TESTY-1 ; ON EST PAS EN BAS DE L'ECRAN ; LDA #1 ; ON FORCE L'ETAT2 A 1 STA ETAT2 RTS ; ; AUTRECAR CMP #$8D ; RETURN? BEQ TESTY RTS ; ; OKDECAL JSR DECALAGE LDA #0 ; RETABLI ETAT POUR NE PLUS DECALER STA ETAT2 RTS ; ; DECALAGE ; LST ON DECALAGE LDA MARGEH LST OFF STA Y LDA MARGEG STA X LDA #$00 ; POSITION DU CURSEUR TOUJOURS NULLE STA CH LDA LARGEUR STA LECPX+1 FOLLOW1 JSR CALC LDA DATAL STA POKE+1 LDA DATAH STA POKE+2 INC Y JSR CALC LDA DATAL STA PEEK+1 LDA DATAH STA PEEK+2 ; BOUCLE LDA #$00 STA CPT JSR PEEK-2 JMP INCR LDX #$00 PEEK LDA $FFFF,X ; LDA $????,X POKE STA $FFFF,X ; STA $????,X INX LECPX CPX #$00 ; CPX #$?? BNE PEEK INC CPT LDY CPT CPY #$08 ; LES 8 OCTETS SONT AFFICHES? WHERE BNE NEXTOCT RTS ; CPT DFB 0 ; LIGNE D'OCTETS SUIVANTE NEXTOCT CLC LDA PEEK+2 ADC #$04 STA PEEK+2 NEXTOCT2 CLC LDA POKE+2 ADC #$04 STA POKE+2 JMP PEEK-2 ; FAIT UNE AUTRE LIGNE D'OCTETS ; INCREMENTE LIGNE DE CARACTERES INCR LDA MARGEB TAX DEX CPX Y BNE FOLLOW1 ; AFFICHE DES BLANCS SUR LA DERNIERE LIGNE LDA #$EA ; ON MET UN NOP STA PEEK LDA #$A9 ; LDA #$00 STA PEEK+1 LDA #$00 STA PEEK+2 STA CPT LDA DATAL ; REPOSITIONNE SUR LA 1ERE LIGNE D'OCTETS STA POKE+1 LDA DATAH STA POKE+2 ; EMPECHE L'INCREMENTATION DU LDA $????,X LDA #$0B ; SAUTE DIRECTEMENT EN NEXTOCT2 STA WHERE+1 JSR PEEK-2 ; REMPLISSAGE DE BLANCS ; RESTAURE LE LDA $????,X LDA #$BD STA PEEK ; RESTAURE LE BNE NEXTOCT LDA #$02 STA WHERE+1 RTS ; ; CALCUL LA POSITION ECRAN ; CALC LDX Y LDA DATA1,X PHA LDA DATA2,X EOR $E6 ; PAGE ECRAN ($20 OU $40) TAY CLC PLA ADC X STA DATAL TYA ADC #$00 ; RETENUES STA DATAH RTS ; DATAL DFB 0 DATAH DFB 0 ; ; DATAS GRAPHIQUES ; DATA1 HEX 0080008000800080 HEX 28A828A828A828A8 HEX 50D050D050D050D0 DATA2 HEX 0000010102020303 HEX 0000010102020303 HEX 0000010102020303 ******************************** * * MISE EN MOUVEMENT DES SPRITES MOBILES * ; SPMOBIL0 DEC $4E INC $4F ; SPMOBIL LDX SPMVT BNE NO_FINMVT RTS NO_FINMVT STX COPSPMVT ; SAUVEGARDE COMME COMPTEUR CPX #16 BMI LESS16 CPX #41 BMI LESS41 CPX #76 BMI LESS76 LDA #0 ; SI SUP>75 -> PAS D'ATTENTE HEX 2C LESS16 LDA #3 ; DE 1 A 15 -> 3 D'ATTENTE HEX 2C LESS41 LDA #2 ; DE 16 A 40 -> 2 D'ATTENTE HEX 2C LESS76 LDA #1 ; DE 41 A 75 -> 1 D'ATTENTE STA CPT_SWAP+1 ; SPMOBIL2 LDX COPSPMVT BEQ FINSPM ; ON A FAIT TOUS LES SPRITES LDA SPM-1,X ; PREND LE NUMERO DU SPRITE SAUVE PHA JSR KEL_TYPE? BCC ANIM1 ; 2 ANIMS ANIM2 LDY FILTRE2 BEQ SPMOBIL3 ; FILTRE: (=0 SP NORMAL/=1 DOUBLE/=2 TRIPLE) DEY BEQ SPMOBIL4 PLA JSR IS_MONS? BCC PAS_MONS3 LDX #10 ; MONSTRE A 3 MVT (TRIPLE) LDY #7 JMP LIT_DESCR PAS_MONS3 LDX #4 ; SP DECOR A 3 MVT (TRIPLE) LDY #1 JMP LIT_DESCR SPMOBIL4 PLA JSR IS_MONS? BCC PAS_MONS2 LDX #9 ; MONSTRE A 3 MVT (DOUBLE) LDY #7 JMP LIT_DESCR PAS_MONS2 LDX #3 ; SP DECOR A 3 MVT (DOUBLE) LDY #1 JMP LIT_DESCR ; UNE SEULE ANIMATION ANIM1 LDA FILTRE BEQ SPMOBIL3 ; FILTRE: (=0 SI SPRITE NORMAL/=1 PR COMPLEM.) PLA JSR IS_MONS? BCC PAS_MONS LDX #8 ; MONSTRE A 2 MVT LDY #6 JMP LIT_DESCR PAS_MONS LDX #2 ; SP DECOR A 2 MVT LDY #0 LIT_DESCR SEC STA $C080 ; LIRE BK 2 SBC LIB_DESCRIPT,Y ; TROUVE LE NUMERO DANS LA SERIE IMMOBILE CLC ADC LIB_DESCRIPT,X ; TROUVE LE NUM DANS DOUBLE OU TRIPLE PHA STA $C081 SPMOBIL3 LDX COPSPMVT LDA SPMX-1,X ; PRENDS COORDONNEE X DU SPRITE A POKER STA X LDA SPMY-1,X ; PRENDS COORDONNEE Y DU SPRITE A POKER STA Y PLA ; RECUPERE LE NUMERO DU SPRITE JSR SPRITED ; AFFICHE SPRITE DEC COPSPMVT ; PASSE AU SPRITE PRECEDENT JMP SPMOBIL2 ; ON RECOMMENCE ; FINSPM LDA SPCPT ; COMPTEUR (0 A 3:FILTRE NON MODIFIE/4:MODIF) CPT_SWAP CMP #0 ; CMP #0 OU #1 OU #2 OU #3 BPL NOFINMVT0 BMI FINMVT0 NOFINMVT0 LDA #0 ; REPOSITIONNE COMPTEUR STA SPCPT LDA FILTRE ; CHANGE ETAT DU FILTRE BEQ FINSPM2 LDA #0 ; NOUVEAU FILTRE = 0 DFB $2C ; FAUX BIT FINSPM2 LDA #1 ; NOUVEAU FILTRE = 1 STA FILTRE LDX FILTRE2 BEQ FINSPM3 DEX BEQ FINSPM4 LDA #0 ; NOUVEAU FILTRE2 = 0 HEX 2C FINSPM3 LDA #1 HEX 2C FINSPM4 LDA #2 STA FILTRE2 RTS ; FINMVT0 INC SPCPT ; AUGMENTE COMPTEUR RTS KEL_TYPE? JSR TAKE_REF AND #%00001000 LSR A LSR A LSR A LSR A RTS IS_MONS? PHA JSR TAKE_REF AND #%00000010 LSR A LSR A ; RECUPERE BIT IN CARRY PLA ; RECUPERE SP RTS TAKE_REF STA $C084 ; LECTURE BK2 TAY LDA REF_BIT,Y ; CHARGE VALEUR CORRESPONDANTE STA $C081 ; BK2 NORM RTS COPSPMVT DFB 0 FILTRE DFB 0 FILTRE2 DFB 0 LST ON SPCPT DFB 0 LST OFF SPMVT DFB 0 ; ; DATAS SPRITES/X/Y ; SPM DS 121 ; 121 SPRITES ACCUEILLABLES SPMX DS 121 ; COORD. X CORRESPONDANTES SPMY DS 121 ; COORD. Y CORRESPONDANTES ; ; INPUT2 ; INPUT_2 PHA STY INSTORE STX INSTORE+1 JSR SPMOBIL0 LDX INSTORE+1 LDY INSTORE JSR SUITE JMP INPUT_2+1 *********************** * * * COMMANDES ANNEXES & * * (C)1990 BY DECKARD * * * *********************** * ; ERROR EQU $DEC9 ; SYNTAX ERROR ADDON EQU $D998 GETBYT EQU $E6F8 CHECKCOM EQU $DEBE SPEAK EQU $C030 CPTL EQU $06 CPTX EQU $07 ; MACROCMD LDX #$00 STX CPT D1 LDY #$00 D2 LDA NEWCMD,X BEQ D5 CMP #$FF BEQ D3 CMP ($B8),Y BNE D4 INY INX BNE D2 D3 JMP ERROR D4 INX LDA NEWCMD,X BNE D4 INX INC CPT BNE D1 D5 JSR ADDON ; Y=Y+1 ASL CPT LDX CPT LDA ADRCMD+1,X PHA LDA ADRCMD,X PHA RTS ; CPT2 DFB 0 * * MUSIQUE * ; MUSIC JSR GETBYT ; LIRE LE NOMBRE DE NOTE STX CPTMUS AGAIN LDA CPTMUS BEQ FINMUS JSR CHECKCOM JSR GETBYT ; LECTURE SON STX $EC JSR CHECKCOM JSR GETBYT ; LECTURE DUREE LST ON MUSICD STX $ED LST OFF LDA SON BEQ MUS4 ; SON OFF MUS1 LDA $C030 MUS2 DEY BNE MUS3 DEC $ED BEQ MUS4 MUS3 DEX BNE MUS2 LDX $EC JMP MUS1 MUS4 DEC CPTMUS JMP AGAIN FINMUS RTS LST ON CPTMUS DFB 0 LST OFF ; * * WINDOW * ; WINDOW JSR GETBYT STX $20 JSR CHECKCOM JSR GETBYT STX $21 JSR CHECKCOM JSR GETBYT STX $22 JSR CHECKCOM JSR GETBYT STX $23 RTS ; * * SOUND * ; SOUND JSR STOCK LST ON SOUNDD LDA #$01 LST OFF STA AD2 LDY #$00 LDA SON BEQ FINSOUND ; DEBUT LDA AD3 PHA LDX AD1 DEX1 DEX BNE DEX1 BIT SPEAK LDX AD2 DEX2 DEX BNE DEX2 BIT SPEAK PLA TAX DEX TXA BNE DEBUT+3 CPY #$01 BEQ LA ; ICI LDA AD2 CLC ADC #$01 CMP #$1B BEQ CHANGE STA AD2 DEC AD1 JMP DEBUT CHANGE INY JMP DEBUT ; LA LDA AD2 SEC SBC #$01 CMP #$01 BEQ FINSOUND STA AD2 INC AD1 JMP DEBUT ; FINSOUND RTS ; STOCK JSR GETBYT STX AD1 JSR CHECKCOM JSR GETBYT STX AD3 RTS ; LST ON AD1 DFB $00 LST OFF AD2 DFB $00 LST ON AD3 DFB $00 LST OFF ; * * NOISE * ; ; NB EN AD1 ; COMPT EN AD3 ; FREQ EN AD2 ; NOISE JSR STOCK JSR CHECKCOM JSR GETBYT LST ON NOISED STX AD2 LST OFF LDA SON BEQ FIN_NOISE ; LDA #0 STA CPT2 ; BCL1 LDX AD2 BCL2 LDA CPT2 ADC AD3 STA CPT2 TAY BCL3 DEY BNE BCL3 LDA SPEAK TXA TAY BCL4 DEY BNE BCL4 LDA SPEAK DEX BNE BCL2 DEC AD1 BNE BCL1 FIN_NOISE RTS ; * * &MODE (0=NORMAL 1=OUTPUT 3=OUTPUT SUR DOS3.3),(0,1 OU 2) * ; CSWDOS EQU $AA53 MODECR LDA #0 ; TESTEUR DE DECALAGE STA ETAT2 JSR STOCK ; LECTURE DES DONNEES ; BRANCHE CSWL/CSWH LDA AD1 BEQ CSWNORM ; &MODE0,... CMP #1 BEQ OUTCSW ; &MODE1,... LDA #OUTPUT STA CSWDOS STX CSWDOS+1 RTS ; ON NE TOUCHE PAS A KSW OUTCSW LDA #OUTPUT JMP FOLLOW2 CSWNORM LDA #$F0 LDX #$FD FOLLOW2 STA CSWL STX CSWH MODECR2 LDX AD3 BEQ KSWNORM DEX BEQ FOLLOW10 LDA #INPUT_2 JMP FOLLOW3 FOLLOW10 LDA #INPUT JMP FOLLOW3 KSWNORM LDA #$1B LDX #$FD FOLLOW3 STA KSWL STX KSWH RTS ; * * SPRITE * ; SPRITE JSR STOCK JSR CHECKCOM JSR GETBYT STX Y LDA AD3 STA X ; NO SPRITE*(4*8) LDA AD1 LST ON SPRITED STA $EC LST OFF LDA #32 STA $ED JSR MULT ; +DEBUT DATA SPRITE CLC LDA $EF ; RESULTAT(-) ADC #DATASP STA LOAD+5 ; LDA #0 STA CPTL ; ON SE POSITIONNE POUR LE BLOC (=2 CARAC) STA CPTX ; COMPTEUR LECTURE DATA SPRITE LDA #16 STA NBF+1 ; FOLLOW4 JSR CALC LDA DATAL STA ECRIT+1 LDA DATAH STA ECRIT+2 LDX CPTX ; FOLLOW5 LDY #$00 LOAD STA $C084 ; LECTURE BK2 LDA $FFFF,X ; LDA $????,X STA $C081 ; ROM ECRIT STA $FFFF,Y ; STA $????,Y INX INY CPY #$02 BNE LOAD NBF CPX #16 BEQ FOLLOW6 ; +$400 POUR LIGNE SUIVANTE CLC LDA ECRIT+2 ADC #$04 STA ECRIT+2 JMP FOLLOW5 ; FOLLOW6 INC CPTL LDA CPTL CMP #$02 BEQ ENDSP ; ON A ECRIT 2 BLOC L'1 AU DESSUS DE L'AUTRE ; STX CPTX INC Y ; POUR ECRIRE LE SECOND BLOC ASL NBF+1 JMP FOLLOW4 ; RECOMMENCE PR 2EME BLOC ; ENDSP RTS ; FIN AFFICHAGE SPRITE ; * * MODULE MULTIPLICATION * * $EC*$ED= $EE(+) ET $EF(-) ; LST ON MULT LDA #$00 LST OFF STA $EE LDX #$08 FOLLOW7 ASL ROL $EE ASL $ED BCC FOLLOW8 CLC ADC $EC BCC FOLLOW8 INC $EE FOLLOW8 DEX BNE FOLLOW7 STA $EF RTS ; * * SET * ; SET JSR GETBYT LDA $C08C ; BANK 1 : LECTURE MEV ONLY CPX #0 BNE FOLLOW9 ; JEU DE CARATERES NORMAL SET1D LDA CARAC-4 ; L LDX CARAC-3 ; H JMP SETEND ; BRANCHE SUR LE SET COMPLEMENTAIRE FOLLOW9 LDA CARAC-2 ; L LDX CARAC-1 ; H SETEND STA C1+1 STX C2+1 LDA $C081 ; RETOUR BANK2 : LECTURE MEM ET ECRITURE MEV RTS ; * * &CLS * ; CLS LDA MARGEH STA Y LDA MARGEG STA X LDA LARGEUR STA LECPX2+1 CLS2 JSR CALC LDA DATAL STA POKE2+1 LDA DATAH STA POKE2+2 LDA #0 STA CPT JSR PEEK2-2 JMP INCR2 LDX #0 PEEK2 LDA #0 POKE2 STA $FFFF,X ; STA $????,X INX LECPX2 CPX #$00 ; CPX #$?? BNE PEEK2 INC CPT LDY CPT CPY #$08 BNE NEXTOCTT RTS ; NEXTOCTT CLC LDA POKE2+2 ADC #$04 STA POKE2+2 JMP PEEK2-2 ; INCR2 LDA MARGEB TAX DEX CPX Y BEQ FINCLS INC Y JMP CLS2 FINCLS LDA #0 STA CH LDA MARGEH STA CV JSR POSITION RTS ; * * &OU COORDONNEE X, COORDONNEE Y * ; POSITION EQU $FC22 ; ; OU JSR GETBYT TXA PHA JSR CHECKCOM JSR GETBYT STX CV PLA STA CH JSR POSITION RTS * &BIP X,Y NOUVELLE ROUTINE DE SON BIP JSR STOCK LDX AD1 BIP3 LDY AD3 BIP2 TYA JSR WAIT BIT $C030 DEY BNE BIP2 DEX BNE BIP3 RTS * * &SCRN COORDONNEE X, COORDONNEE Y, VARIABLE ENTIERE (%) * PTRGET EQU $DFE3 SCRN JSR GETBYT ; RECUPERE X TXA PHA JSR CHECKCOM JSR GETBYT ; RECUPERE Y ; LOCALISE LA VALEUR SUR L'ECRAN LDA DATA3,X ; CHARGE LE HIGH STA SCRN2+2 ; STOCKE L'ADR HI CLC PLA ADC DATA1,X STA SCRN2+1 ; STOCKE L'ADR LO JSR CHECKCOM JSR PTRGET ; LECTURE ET POSITIONNE SUR VARIABLE (%) LDY #0 TYA STA ($83),Y ; MET A ZERO LA PARTIE HIGH DE LA VALEUR INY SCRN2 LDA $FFFF ; LDA $???? STA ($83),Y ; MET LA VALEUR LU DANS LA PARTIE LOW RTS DATA3 HEX 0404050506060707 ; DATA HIGH POUR ECRAN TEXT HEX 0404050506060707 HEX 0404050506060707 ; ; &RELIRE ; RELIRE JSR $DD67 JSR $E752 CLC JSR $D61A BCS RELIRE2 LDX #$5A JMP $D412 ; RELIRE2 LDA $9B SBC #$01 LDY $9C BCS RELIRE3 DEY RELIRE3 STA $7D STY $7E JMP $00B7 ; * &GOSUB TOKEN CHKMEM = $D3D6 NEWSTT = $D7D2 CHRGOT = $00B7 TXTPTR = $B8 CURLIN = $75 CGOSUB = 176 ; #$B0 GOSUB LDA #$03 JSR CHKMEM LDA TXTPTR+1 PHA LDA TXTPTR PHA LDA CURLIN+1 PHA LDA CURLIN PHA LDA #CGOSUB PHA GOLINE JSR CHRGOT JSR GOTO JMP NEWSTT * &GOTO TOKEN GOTOD = $D941 FRMNUM = $DD67 GETADR = $E752 GOTO JSR FRMNUM JSR GETADR JMP GOTOD ; GOTO DIRECT SANS JSR LINGET * &CH 1-9,A$ MENU_CH JSR VAR_PREMIS0 PHA JSR CHECKCOM JSR PTRGET PLA TAY LDA #VAL_CH JMP RECOP_STRING * &LOBJ NUM,A$,A%,B%,C%,D%,E%,F%,G%,PRIX% LOBJ JSR GETBYT ; LIT NUMERO D'OBJET TXA TAY ; Y=ARGUMENT LDX #0 ; CMD=0 -> LECTURE OBJET JMP SWAP_AUX LST ON RETOUR_OBJ JSR CHECKCOM LST OFF JSR PTRGET LDY #1 LDA ($83),Y ; POINTEUR ADR (-) STA $EC INY LDA ($83),Y ; IDEM (+) STA $ED LDY #0 ; RECOPIE NOM OBJ DE BUFF A L'ADR TROUVEE RETOUR_OBJ3 LDA STRING,Y BEQ RETOUR_OBJ2 STA ($EC),Y INY BNE RETOUR_OBJ3 RETOUR_OBJ2 TYA ; PLACE LA LONGUEUR LDY #0 STA ($83),Y LDA #0 ; FAIT LES 7 PREMIERS OBJETS STA $EC RETOUR_OBJ4 JSR CHECKCOM JSR PTRGET LDY #1 LDX $EC LDA VALS,X STA ($83),Y ; LOW DEY LDA #0 STA ($83),Y ; HIGH INC $EC LDA $EC CMP #7 BNE RETOUR_OBJ4 JSR CHECKCOM ; FAIT LE PRIX (SUR 2 OCTETS) JSR PTRGET LDY #0 LDX #7 LDA VALS,X ; HIGH STA ($83),Y INY INX LDA VALS,X ; LOW STA ($83),Y RTS * &LSPELL = LECTURE SORT LSPELL JSR GETBYT ; LECTURE SPECIALITE LDA $C088 ; BANK 1 : LECTURE MEV ONLY DEX ; DE 0 A 14 LDA SPELL,X ; CHARGE L'OCTET DE LA SPECIALITE UTOBJ2 STA VARBIT LDA $C081 ; RETOUR BANK 2 : LECTURE MEM ET ECRITURE MEV JSR CHECKCOM JSR PTRGET ; LECTURE VARIABLE LDA VARBIT AND #%00001111 ; RECUPERE LA PUISSANCE JSR AFFECTE LDA VARBIT ; POSITIONNE POUR LECTURE LSR A LSR A LSR A STA VARBIT LDX #0 STX $EE ; COMPTEUR DE LA BOUCLE ENCORE_SORT JSR SORT_BIT INC $EE LDX $EE CPX #4 ; 4 BITS DE SORT BNE ENCORE_SORT RTS SORT_BIT JSR CHECKCOM JSR PTRGET ; LECTURE VARIABLE LDA VARBIT LSR A ; RECUPERE BIT CONNAISSANCE SORT EN BIT 0 STA VARBIT ; GARDE LE DECALAGE ACTUEL POUR LE SUIVANT AND #%00000001 ; GARDE QUE CE BIT JMP AFFECTE ; RTS COMPRIS VARBIT HEX 00 * &ESPELL = ECRITURE SORT ESPELL JSR GETBYT ; LECTURE SPECIALITE DEX ; DE 0 A 14 SUR LA TABLE STX $EE ; GARDE LA SPECIALITE JSR CHECKCOM ; VIRGULE PLEASE JSR GETBYT ; LECTURE PUISSANCE STX $EF ; SAUVE LA PUISSANCE ; NORMALEMENT 0000YYYY LDX #0 ; MISE EN PLACE DES 4 BITS DE SORT STX VARBIT ; MODELE STX $ED ; COMPTEUR ENCORE_SORT2 JSR MET_BIT INC $ED LDX $ED CPX #4 BNE ENCORE_SORT2 ; ON A OBTENU XXXX0000 LDA $C089 ; BANK 1 : ECRITURE MEV ET LECTURE MEM LDA VARBIT EOR $EF ; MELANGE AVEC LA PUISSANCE XXXXYYYY LDY $EE ; RECHARGE L'INDICE DU TABLEAU DES SORTS STA SPELL,Y LDA $C081 ; RETOUR BANK 2 : LECTURE MEM ET ECRITURE MEV RTS MET_BIT JSR CHECKCOM JSR GETBYT ; LECTURE VALEUR SORT (0 OU 1) TXA ; RECUPERE LA VALEUR SUR 1 BIT LSR A ; ENVOIE LE BIT DANS CARRY LDA VARBIT ; CHARGE LE FUTUR OCTET DE LA SPECIALITE ROR A ; COLLE LE BIT STA VARBIT ; SAUVE LA FUTUR SPECIALITE RTS * &UTOBJ OCTET,A%,B%,C%,D%,E% UTOBJ JSR GETBYT ; LECTURE OCTET TXA JMP UTOBJ2 ; REUTILISE LA ROUTINE DE LSPELL * &UTSPELL SPECIALITE, NUMERO SORT,A%,B%,C%,D% UTSPELL JSR GETBYT ; LECTURE SPECIALITE DEX ; DE 0 A 14 TXA ASL A ; *4 POUR POSTIONNER SUR LE 1ER SORT ASL A STA VARBIT JSR CHECKCOM JSR GETBYT ; LECTURE NUMERO DU SORT DEX ; POUR AVOIR DE 0 A 3 TXA CLC ADC VARBIT ; POSITIONNE SUR L'OCTET DU SORT DESIRE TAY ; VA SERVIR D'INDICE STA $C088 ; BK1 LECTURE LDA SPELL2,Y ; CHARGE L'OCTET STA $C081 STA VARBIT LDX #0 STX $EE BCL_UTSPELL JSR CHECKCOM JSR PTRGET LDA VARBIT LSR A ; BIT DANS CARRY STA VARBIT ; SAUVE OCTET DECALE LDA #0 ; VIDE L'OCTET ROL A ; RECASE LE BIT JSR AFFECTE ; DONNE LA VALEUR A LA VARIABLE INC $EE LDA $EE CMP #4 BNE BCL_UTSPELL RTS * &LARME = LECTURE ARME LARME JSR GETBYT ; LECTURE DE L'OCTET CODE TXA ASL A ; POUR UTILISER LA BOUCLE AVEC 1ERE VALEUR ASL A STA VARBIT ; SAUVE CARACTERISTIQUE DE L'ARME LDX #0 STX $EE ; COMPTEUR BOUCLE ENCORE_ARME JSR LIRE_ARME ; RECUPERE UN DOUBLET (ORDRE CROISSANT) INC $EE LDX $EE CPX #3 ; 3 DOUBLETS POUR BROYER/COUPER/PERCER BNE ENCORE_ARME RTS LIRE_ARME JSR CHECKCOM JSR PTRGET LDA VARBIT LSR A LSR A STA VARBIT ; SAUVE L'OCTET DECALE POUR NEXT DOUBLET AND #%00000011 ; GARDE QUE LES 2 PREMIERS BITS LDY #1 CLC ADC ($83),Y ; ADDITIONNE AVEC VALEUR ACTUELLE DE LA VAR STA ($83),Y JMP AFFECTE2 AFFECTE LDY #1 STA ($83),Y ; COLLE LA VALEUR EN LOW AFFECTE2 DEY TYA STA ($83),Y ; ANNULE LA HIGH RTS ******************************** * EXTRAIT LES CARACTERISTIQUES DU MONSTRE MM JSR MOD_BEAST LDA VALS+1,X JMP AFFECTE MLOC JSR MOD_BEAST LDA VALS+17,X JMP AFFECTE MTAC JSR MOD_BEAST LDA VALS+27,X JMP AFFECTE MRES JSR MOD_BEAST ASL A ; INDICE * 2 TAX LDA VALS+41,X LDY #1 STA ($83),Y ; LOW DEY INX LDA VALS+41,X STA ($83),Y ; HIGH RTS MOD_BEAST JSR GETBYT ; RECOIT L'INDICE DU TABLEAU DEX ; POUR COMMENCER A 0 TXA PHA JSR CHECKCOM JSR PTRGET PLA TAX RTS * &S = DETERMINE LE FLAG MUSICAL * S=0 PAS DE SON / S=1 SON S JSR GETBYT ; LECTURE FLAG STX SON RTS * &ST$ NB (1 A 3), A$ SITUATION JSR VAR_PREMIS0 LDA #VAL_ST PAS_CR JSR VAR_PREMIS JSR TRT_VAR LDA #0 STA CPT_CR JMP ST4 VAR_PREMIS0 JSR GETBYT DEX TXA ASL A ; *2 TAY RTS VAR_PREMIS STA $EC STX $ED STA $C088 ; BK1 LDA ($EC),Y ; LOW ADR DEBUT CHAINE CONCERNEE STA $EE INY LDA ($EC),Y ; HIGH STA $C081 STA $EF RTS TRT_VAR LDA #0 STA CPT_CR TRT_VARD LDY #0 ; SAUTE ICI POUR PAS INIT APRES 'VOUS LUI' STY $EC TRT_VAR2 STA $C088 ; BK1 LDA ($EE),Y STA $C081 ; ROM BEQ END_TRT_VAR JSR OUTDO INC CPT_CR LDA CPT_CR CMP #16 BNE NO_CR LDA #0 STA CPT_CR NO_CR INC $EC LDY $EC BNE TRT_VAR2 END_TRT_VAR RTS CPT_CR HEX 00 * &BL$ (1 A 5) BLESSURE JSR VAR_PREMIS0 LDA #VAL_BL ST2 JSR VAR_PREMIS JSR TRT_VAR ST4 JSR CRDO ; SAUTE 1 LIGNE LDA CPT_CR BEQ ST3 JSR CRDO ST3 RTS * &MO$ MORT JSR VAR_PREMIS0 LDA #VAL_MO JMP ST2 * &LOC$ LOCALISATION JSR VAR_PREMIS0 LDA #VAL_LOC JMP PAS_CR * &CRT$ CREVE JSR GETBYT DEX BEQ CRT2 LDA #9 HEX 24 ; BIT CRT2 TXA STA $EC ; INDICE 1 JSR CHECKCOM JSR GETBYT DEX BEQ CRT3 DEX BEQ CRT4 LDA #6 HEX 2C ; BIT CRT4 LDA #3 HEX 24 ; BIT CRT3 TXA ; INDICE 2 CLC ADC $EC ; INDICE4=(INDICE1*9)+(INDICE2*3) STA $EC JSR CHECKCOM JSR GETBYT DEX TXA CLC ADC $EC ; INDICE4+INDICE1 ASL A ; *2 TAY LDA #VAL_CRT JMP ST2 * &SMAG (1 A 15, 0 A 4),A$ SMAGIE JSR GETBYT DEX STX $EC LDA #5 STA $ED JSR MULT ; INDICE 1*5 JSR CHECKCOM JSR GETBYT TXA ; INDICE 2 CLC ADC $EF ASL A ; *2 PHA JSR CHECKCOM JSR PTRGET PLA TAY LDA #VAL_SMAG RECOP_STRING JSR VAR_PREMIS LDY #1 LDA ($83),Y ; LOW CHAINE ACTUELLE STA $EC INY LDA ($83),Y STA $ED ; HIGH CHAINE ACTUELLE LDY #0 ; TRANSFERT BANK 1 ->BUFFER STA $C088 ; BK1 SMAGIE3 LDA ($EE),Y BEQ SMAGIE2 STA ($EC),Y INY BNE SMAGIE3 SMAGIE2 STA $C081 ; ROM TYA ; RECUPERE LONGUEUR LDY #0 STA ($83),Y ; LONGUEUR RTS * &ACR$ DOMAGE LDA #VAL_ACR0 STA $EF JSR TRT_VAR JSR GETBYT DEX STX $EC LDA #3 STA $ED JSR MULT ; INDICE1*3 JSR CHECKCOM JSR GETBYT DEX TXA ; INDICE 2 CLC ADC $EF ASL A ; *2 TAY LDA #VAL_ACR JSR VAR_PREMIS JSR TRT_VARD ; ON NE REMET PAS A ZERO LE COMPTEUR JMP ST4 * &MAG% MAGIE JSR GETBYT DEX TXA ASL A ; INDICE1*4 ASL A STA $EF JSR CHECKCOM JSR GETBYT DEX ; INDICE2 TXA CLC ADC $EF PHA JSR CHECKCOM JSR GETBYT DEX STX $EC LDA #60 STA $ED JSR MULT ; INDICE3*60 PLA CLC ADC $EF PHA JSR CHECKCOM JSR PTRGET PLA PHA SEC SBC #60 BPL MAG2 PLA ; SUR 2 OCTETS ASL A ; *2 CAR 'DA' TAX STA $C088 ; BK1 LDA VAL_MAG,X LDY #1 STA ($83),Y ; LOW DEY INX LDA VAL_MAG,X STA $C081 STA ($83),Y RTS MAG2 TAX ; SUR 1 OCTET PLA STA $C088 ; BK1 LDA VAL_MAG2,X STA $C081 JMP AFFECTE * TROUVE QUELLE FACE RECHERCHER FACE JSR GETBYT LDA KELFACE,X PHA JSR CHECKCOM JSR PTRGET PLA JMP AFFECTE ; RTS INCLU KELFACE DFB 5,3,3,3,3,3,3,3,5,5,4,4,4,4,4,4,4 * * LISTE DES COMMANDES * ; NEWCMD ASC 'MUSIC'00 ASC 'SOUND'00 ASC 'WINDOW'00 ASC 'NOISE'00 ASC 'MODE'00 ASC 'SPRITE'00 ASC 'SET'00 ASC 'CLS'00 ASC 'RELIRE'00 ASC 'OU'00 ASC 'SCRN'00 ASC 'GT'00 ASC 'GS'00 ASC 'LSPELL'00 ASC 'ESPELL'00 ASC 'LARME'00 ASC 'UTSPELL'00 ASC 'OBJ'00 ASC 'LOBJ'00 ASC 'ST'00 ASC 'MO'00 ASC 'CRT'00 ASC 'ACR'00 ASC 'LOC'00 ASC 'MAG'00 ASC 'BL'00 ASC 'SMAG'00 ASC 'MM'00 ASC 'MRES'00 ASC 'MLOC'00 ASC 'MTAC'00 ASC 'SHOP'00 ASC 'S'00 ASC 'BIP'00 ASC 'CH'00 ASC 'PIEGE'00 ASC 'FACE'00 ; ; ERROR HEX FF ; * * LISTE DES ADRESSES * ; ADRCMD ; &MUSIC DA MUSIC-1 DA SOUND-1 DA WINDOW-1 DA NOISE-1 DA MODECR-1 DA SPRITE-1 DA SET-1 DA CLS-1 DA RELIRE-1 DA OU-1 DA SCRN-1 DA GOTO-1 DA GOSUB-1 DA LSPELL-1 DA ESPELL-1 DA LARME-1 DA UTSPELL-1 DA UTOBJ-1 DA LOBJ-1 DA SITUATION-1 DA MORT-1 DA CREVE-1 DA DOMAGE-1 DA LOCALISATION-1 DA MAGIE-1 DA BLESSURE-1 DA SMAGIE-1 DA MM-1 DA MRES-1 DA MLOC-1 DA MTAC-1 DA DOMARCH-1 DA S-1 DA BIP-1 DA MENU_CH-1 DA PIEGE-1 LST ON DA FACE-1 LST OFF