************************* * * * INPUT/OUTPUT HGR CHAR * * (C)1989 BY DECKARD * * * ************************* * CARAC EQU $0801 ; DEBUT DATAS CARACTERES ; CURSOR EQU $09F1 ; 1ER DATA DU CURSEUR (= '^') (+$1F0) CARAC2 EQU $0B01 ; STOCKAGE JEU EXTRA PRESENTATION (+$300) DATASP EQU $0BC1 ; STOCKAGE DATA SPRITE 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 ; ; ; ORG $16E1 ; ; --------- ; I N P U T ; --------- ; * * BUT: AFFICHER UN CURSEUR QUI CHANGE SANS ARRET * ; ; * ON AFFICHE LE CURSEUR ; INPUT PHA ; MET DE COTE LE CURSEUR ACTUEL INPUT2 STY INSTORE STX INSTORE+1 LDA #$DE ; CODE ASCII DE '^' JSR SCREEN ; * ON FAIT UNE ROTATION DE BAS EN HAUT ; LDA CURSOR TAX ; SAUVEGARDE 1ER OCTET LDY #0 ROTATION LDA CURSOR+1,Y STA CURSOR,Y INY CPY #7 ; ON EN FAIT 7 BNE ROTATION TXA ; RECUPERE 1ER OCTET STA CURSOR+7 ; ACCOMPLI LA ROTATION (1ER = DERNIER) ; * 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 ETAT DFB 0 ; ; 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 ; 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 ; * 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 ; DS 3,$EA ; ; DECALAGE ; DECALAGE LDA MARGEH 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 ; DS 7,$EA ; ; *********************** * * * COMMANDES ANNEXES & * * (C)1989 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 ; ; 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 ; * * LISTE DES COMMANDES * ; NEWCMD ; &MUSIC HEX 4D5553494300 ; &SOUND HEX 534F554E4400 ; &WINDOW HEX 57494E444F5700 ; &NOISE HEX 4E4F49534500 ; &SCRN HEX 5343524E00 ; &SPRITE HEX 53505249544500 ; &SET HEX 53455400 ; &CLS HEX 434C5300 ; &CADRE HEX 434144524500 ; &RELIRE HEX 52454C49524500 ; ; ERROR HEX FF ; * * LISTE DES ADRESSES * ; ADRCMD ; &MUSIC DFB #MUSIC ; &SOUND DFB #SOUND ; &WINDOW DFB #WINDOW ; &NOISE DFB #NOISE ; &SCRN DFB #SCRN ; &SPRITE DFB #SPRITE ; &SET DFB #SET ; &CLS DFB #CLS ; &CADRE DFB #CADRE ; &RELIRE DFB #RELIRE ; * * 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 MUSICD STX $ED 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 CPTMUS DFB 0 ; * * 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 SOUNDD LDA #$01 STA AD2 LDY #$00 ; 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 ; AD1 DFB $00 AD2 DFB $00 AD3 DFB $00 ; * * NOISE * ; ; NB EN AD1 ; COMPT EN AD3 ; FREQ EN AD2 ; NOISE JSR STOCK JSR CHECKCOM JSR GETBYT NOISED STX AD2 ; 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 RTS ; * * SCRN * ; SCRN LDA #0 ; TESTEUR DE DECALAGE STA ETAT2 JSR STOCK ; LECTURE DES DONNEES ; BRANCHE CSWL/CSWH LDA AD1 BEQ CSWNORM LDA #OUTPUT JMP FOLLOW2 CSWNORM LDA #$F0 LDX #$FD FOLLOW2 STA CSWL STX CSWH 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 SPRITED STA $EC LDA #32 STA $ED JSR MULT ; +DEBUT DATA SPRITE CLC LDA $EF ; RESULTAT(-) ADC #DATASP STA LOAD+2 ; 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 LDA $FFFF,X ; LDA $????,X 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 * ; MULT LDA #$00 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 CPX #$01 BNE FOLLOW9 ; BRANCHE SUR L'EXTRA SET SET1D LDA #CARAC2 JMP SETEND ; MET LE SET NORMAL FOLLOW9 LDA #CARAC SETEND STA C1+1 STX C2+1 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 ; * * &CADRE * ; HCLR EQU $F3F2 ; EFFACE ECRAN GRAPHIQUE (FOND NOIR) HOME EQU $FC58 OUTDO EQU $DB5C STROUT EQU $DB3A POSITION EQU $FC22 ; ; CADRE JSR SET1D ; BRANCHE LE JEU DE CARACTERES ANNEXE JSR HOME BIT $C051 ; ON PASSE EN TXT POUR PAS VOIR L'EFFACEMENT JSR HCLR ; EFFACE ECRAN HGR BIT $C050 ; REPASSE EN MODE GRAPHIQUE BIT $C054 BIT $C057 BIT $C052 ; ; ECRITURE DU CADRE ; LDA #0 STA CH STA CV JSR POSITION LDA #TRAIT_1 JSR STROUT LDA #24 STA CH LDA #7 STA CV JSR POSITION LDA #TRAIT_3 JSR STROUT LDA #0 STA CH LDA #23 STA CV JSR POSITION LDA #TRAIT_2 JSR STROUT ; AFFICHE TRAITS VERTICAUX CADRE PERSO LDA #24 LDX #$A4 ; '$' JSR MODPRES LDA #39 LDX #$A3 ; '#' JSR MODPRES ; TRAITS VERTICAUX CADRE ECRAN LDA #11 STA CPTPRES LDA #1 STA CV PRESBCL LDA #0 STA CH JSR POSITION LDX #$AC ; ',' LDY #$AD ; '-' TXA JSR OUTDO INC CV DEC CH JSR POSITION TYA JSR OUTDO DEC CV LDA #23 STA CH JSR POSITION TYA JSR OUTDO INC CV DEC CH JSR POSITION TXA JSR OUTDO INC CV DEC CPTPRES BNE PRESBCL JMP FOLLOW9 ; RETABLIT JEU CARAC NORMAL+FIN ; CPTPRES DFB 0 ; ; ; MODPRES STA CH LDY #6 CONTPRES PHA STY CV JSR POSITION TXA JSR OUTDO PLA STA CH DEY BNE CONTPRES RTS ; ; TRAIT_1 ASC "()))))))01234567*******+ !!!!!!!!!!!!!!&" DFB 0 TRAIT_2 ASC ".)))))))))))***********/" DFB 0 TRAIT_3 DFB $A2 ASC "''''''''''''''%" DFB 0 ; ; &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 ; ; ; ************************************************** * * MISE EN MOUVEMENT DES SPRITES MOBILES * ; SPMOBIL0 DEC $4E INC $4F ; SPMOBIL LDX SPMVT BEQ FINMVT ; PAS DE SPRITE EN MOUVEMENT STX COPSPMVT ; SAUVEGARDE COMME COMPTEUR ; SPMOBIL2 LDX COPSPMVT BEQ FINSPM ; ON A FAIT TOUS LES SPRITES LDA FILTRE BEQ SPMOBIL3 ; FILTRE: (=0 SI SPRITE NORMAL/=1 PR COMPLEM.) LDA SPM-1,X ; PRENDS LE NUMERO DU SPRITE CLC ADC #$1E ; +30 POUR AVOIR LE COMPLEMENTAIRE JMP SPMOBIL4 SPMOBIL3 LDA SPM-1,X SPMOBIL4 PHA 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) CMP #$03 BNE FINMVT0 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 FINMVT RTS ; FINMVT0 INC SPCPT ; AUGMENTE COMPTEUR RTS ; SPMVT DFB 0 COPSPMVT DFB 0 FILTRE DFB 0 SPCPT DFB 0 ; ; DATAS SPRITES/X/Y ; SPM DS 100 ; 100 SPRITES ACCUEILLABLES SPMX DS 100 ; COORD. X CORRESPONDANTES SPMY DS 100 ; 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 ; SAV CMD