* * Bill Palmer * * (c) 1987, François Coulon * (c) 2021, Brutal Deluxe * lst off rel dsk palmer.l mx %00 xc xc *----------------------------------- Macros use 4/Ctl.Macs use 4/Desk.Macs use 4/Event.Macs use 4/Int.Macs use 4/Line.Macs use 4/Locator.Macs use 4/Mem.Macs use 4/Menu.Macs use 4/MIDISyn.Macs use 4/Misc.Macs use 4/Print.Macs use 4/Qd.Macs use 4/QdAux.Macs use 4/Resource.Macs use 4/Scrap.Macs use 4/Sound.Macs use 4/Std.Macs use 4/TextEdit.Macs use 4/Util.Macs use 4/Window.Macs *----------------------------------- Constantes *-------------- Softswitches RDVBLBAR = $E0C019 GSOS = $e100a8 *-------------- GUI wMAIN = 1 alertQUIT = 1 alertRESTART = 2 refIsPointer = $0 refIsHandle = $1 refIsResource = $2 appleKey = $0100 *-------------- dpFROM = $00 dpTO = dpFROM+4 Second = dpTO+4 dpSTR = Second+4 dpBUF = dpSTR+4 dpSALLE = dpBUF+4 *--- TRUE = 255 FALSE = 0 *----------------------------------- Entry point phk plb _TLStartUp pha _MMStartUp pla sta myID tdc sta myDP *--- Version du systeme jsl GSOS dw $202a adrl proVERS lda proVERS+2 and #%01111111_11111111 cmp #$0402 bcs okVERS pha PushLong #verSTR1 PushLong #verSTR2 PushLong #errSTR1 PushLong #errSTR2 _TLTextMountVolume pla brl meQUIT1 *--- 64K pour les images des scènes okVERS jsr make64KB bcc okMEM1 koMEM pha PushLong #memSTR1 PushLong #errSTR2 PushLong #errSTR1 PushLong #errSTR2 _TLTextMountVolume pla brl meQUIT1 okMEM1 sty ptrIMAGE sty ptrToSourceLocInfo+2 stx ptrIMAGE+2 stx ptrToSourceLocInfo+4 sep #$10 ; save ptrIMAGE+2 stx saveBACK1+3 ; for interactions stx loadBACK1+3 ; with the toolbox rep #$10 *--- 64K pour les images compressees et les icônes jsr make64KB bcs koMEM sty ptrUNPACK stx ptrUNPACK+2 stx ptrICONS+2 ; ptrICONS is set to $8000 stx iconToSourceLocInfo+4 *--- Chargement des outils pha pha PushWord myID PushWord #refIsResource PushLong #1 _StartUpTools PullLong SStopREC bcc okTOOL pha PushLong #tolSTR1 PushLong #errSTR2 PushLong #errSTR1 PushLong #errSTR2 _TLTextMountVolume pla brl meQUIT *--- Et la musique... okTOOL jsr initMIDI *--- Charge les images nécessaires du jeu lda #pICONS ldx ptrUNPACK+2 ldy ptrUNPACK jsr loadFILE bcc okMEM2 pha PushLong #filSTR1 PushLong #errSTR2 PushLong #errSTR1 PushLong #errSTR2 _TLTextMountVolume pla brl meQUIT1 okMEM2 tya jsr unpackLZ4 PushLong ptrIMAGE PushLong ptrICONS PushLong #32768 _BlockMove *--- Affichage desktop _HideMenuBar PushWord #0 PushWord #%11111111_11111111 PushWord #0 _FlushEvents pla _InitCursor *---------------------------------------- * INITIALISATIONS *---------------------------------------- memOK PushLong #0 PushWord #5 ; SetDeskPat PushWord #$4000 PushWord #$00F0 _Desktop pla pla pha pha PushLong #0 PushLong #wMAIN PushLong #PAINTMAIN PushLong #0 PushWord #refIsResource PushLong #wMAIN PushWord #$800e _NewWindow2 PullLong wiMAIN *---------------------------------------- * DEBUT DU JEU *---------------------------------------- jsr debut jsr chargement_image jsr doSOUNDON *---------------------------------------- * TASK MASTER *---------------------------------------- taskLOOP PushWord #0 PushWord #0 PushWord #$c000 PushWord #0 _HandleDiskInsert pla pla jsr checkREPLAY PushWord #0 PushWord #%11111111_11111111 PushLong #taskREC _TaskMaster pla beq taskLOOP asl tax jsr (taskTBL,x) lda instruction1 ora instruction2 ora instructionDIR ora zone_cliquee beq taskLOOP99 jsr commentaires jsr directions ; clr instructionDIR jsr actions_permanentes lda instruction1 beq taskLOOP99 lda salle asl tax jsr (lessalles,x) taskLOOP99 stz zone_cliquee stz instruction2 jsr chargement_image bra taskLOOP *----------------------------------- Gestion du keyDown * on gère les directions et les open-apple-qqch doKEYDOWN lda taskMODIFIERS and #appleKey cmp #appleKey beq doOPENAPPLE *--- gère les directions lda taskMESSAGE ldx #nord cmp #$0b beq keydownOK ldx #sud cmp #$0a beq keydownOK ldx #gauche cmp #$08 beq keydownOK ldx #droite cmp #$15 beq keydownOK rts keydownOK stx instructionDIR rts *--- gère les open-apple-qqch doOPENAPPLE ldx #-1 sep #$20 ]lp inx lda tblKEYVALUE,x ; get key cmp #$ff ; end of table beq doOPENAPPLE99 ; so exit cmp taskMESSAGE ; same as pressed key? bne ]lp ; no, loop rep #$20 txa asl tax jmp (tblKEYADDRESS,x) doOPENAPPLE99 doNOT rep #$20 rts *--- * Main / Oreille / Bouche sont pris également ! ! ! tblKEYVALUE asc 'QqLlSs??' asc 'Dd' asc 'Cc' asc 'Zz' hex ff tblKEYADDRESS da doQUIT,doQUIT,doLOAD,doLOAD,doSAVE,doSAVE,doCOPYRIGHT,doCOPYRIGHT da doRESTART,doRESTART da doCHEAT,doCHEAT ; cheat mode da doMUSIK,doMUSIK *----------------------------------- Gestion du mouseUp * on compare les coordonnées avec celles du incontent * si dans le même rectangle, on traite doMOUSEUP jsr test_icone jmp test_zone *----------------------------------- Gestion des controles doCONTROL lda taskREC+38 asl tax jmp (ctrlTBL,x) *---------------------------------------- * FENETRES *---------------------------------------- PAINTMAIN PushLong wiMAIN _DrawControls * BOX 1,161,318,198 PushWord #1 PushWord #160 _MoveTo PushWord #317 PushWord #160 _LineTo PushWord #317 PushWord #198 _LineTo PushWord #1 PushWord #198 _LineTo PushWord #1 PushWord #160 _LineTo * BOX 1,1,273,110 PushWord #1 PushWord #1 _MoveTo PushWord #273 PushWord #1 _LineTo PushWord #273 PushWord #110 _LineTo PushWord #1 PushWord #110 _LineTo PushWord #1 PushWord #1 _LineTo rtl *---------------------------------------- * ACTIONS DES CONTROLES DU JEU *---------------------------------------- doNORD doSUD doGAUCHE doDROITE doEXIT lda taskREC+38 sta instructionDIR rts *--- Main doMAIN lda fgMAIN eor #1 sta fgMAIN lda fgMAIN ldx #main stx instruction1 jsr setCTLVALUE lda fgMAIN bne mainOK stz instruction1 ldx #main jmp invalCTL mainOK stz fgOEIL stz fgBOUCHE lda #FALSE ; plus de oeil ldx #oeil jsr setCTLVALUE ldx #oeil jsr invalCTL lda #FALSE ; plus de bouche ldx #bouche jsr setCTLVALUE ldx #bouche jmp invalCTL *--- Oeil doOEIL lda fgOEIL eor #1 sta fgOEIL lda fgOEIL ldx #oeil stx instruction1 jsr setCTLVALUE lda fgOEIL bne oeilOK stz instruction1 ldx #oeil jmp invalCTL oeilOK stz fgMAIN stz fgBOUCHE lda #FALSE ; plus de main ldx #main jsr setCTLVALUE ldx #main jsr invalCTL lda #FALSE ; plus de bouche ldx #bouche jsr setCTLVALUE ldx #bouche jmp invalCTL *--- Bouche doBOUCHE lda fgBOUCHE eor #1 sta fgBOUCHE ldx #bouche ; on force la bouche stx instruction1 jsr setCTLVALUE ; et on met la value dans le controle lda fgBOUCHE ; et on a quoi en valeur bne boucheOK ; 1 = on va invalider les autres stz instruction1 ldx #bouche ; 0 = on s'invalide jmp invalCTL boucheOK stz fgMAIN stz fgOEIL lda #FALSE ; plus de main ldx #main jsr setCTLVALUE ldx #main jsr invalCTL lda #FALSE ; plus d'oeil ldx #oeil jsr setCTLVALUE ldx #oeil jmp invalCTL *--- Play with controls getCTLVALUE pea $0000 pea $0000 pea $0000 pea $0000 phx _GetCtlValueByID pla rts setCTLVALUE pha pea $0000 pea $0000 pea $0000 phx _SetCtlValueByID rts invalCTL pea $0000 ; space for result pea $0000 pea $0000 ; top window pea $0000 pea $0000 ; ID value for desired control phx _GetCtlHandleFromID _DrawOneCtl rts *--- fgMAIN ds 2 fgOEIL ds 2 fgBOUCHE ds 2 *---------------------------------------- * CODE DU JEU *---------------------------------------- actions_permanentes lda instruction1 ; quelle action ? cmp #oeil bne ap5 ; ce n'est pas un oeil * cliquer sur un objet avec une instruction avant (que l'on limite à l'oeil) ap1 lda instruction2 ; est-on sur un objet ? bne ap2 rts ap2 cmp #nombre_objets ; oeil + objet bcc ap3 ; ne teste pas animation rts ap3 tax ; objet visible ? lda objet_apparu-1,x and #$ff bne ap4 rts ap4 txa ; get address of description dec asl tax lda description_objet,x jmp ecriture ; output it * cliquer sur un objet sans instruction avant ap5 lda instruction1 ; on ne doit pas avoir beq ap6 ; d'action active rts ap6 lda instruction2 ; est-on sur un objet ? bne ap7 rts ap7 cmp #nombre_objets bcc ap8 ; ne teste pas animation rts ap8 tax lda objet-1,x ; a-t-on pris l'objet ? and #$ff cmp #objet_pris bne ap9 sep #$20 ; on pose l'objet lda salle sta objet-1,x rep #$20 jmp inversion_icone * on n'a pas pris l'objet ap9 cmp salle ; on est dans la meme salle ? bne ap10 sep #$20 ; si on est dans la bonne salle lda #objet_pris sta objet-1,x rep #$20 jmp affichage_icone ap10 rts *--- Teste si on a cliqué sur un objet test_icone stz instruction2 lda #0 ; from 1 ]lp pha asl asl asl tax lda taskWHERE+2 ; compare le X cmp icones_coordonnees,x bcc icone_ko lda icones_coordonnees+4,x cmp taskWHERE+2 bcc icone_ko lda taskWHERE ; et le Y cmp icones_coordonnees+2,x bcc icone_ko lda icones_coordonnees+6,x cmp taskWHERE bcc icone_ko pla ; on a notre icône inc sta instruction2 rts icone_ko pla inc cmp #nombre_objets ; et non plus nombre_icones bcc ]lp rts *--- test_zone stz zone_cliquee lda salle dec asl tax lda table_salle,x sta dpSALLE ; salle1 à salle56 ldy #0 lda (dpSALLE),y sta nb_zones lda dpSALLE ; pointe sur les coordonnees de la première zone clc adc #10 sta dpSALLE lda #0 ]lp pha ldy #0 lda taskWHERE+2 ; compare le X cmp (dpSALLE),y bcc zone_ko ldy #4 lda (dpSALLE),y cmp taskWHERE+2 bcc zone_ko ldy #2 lda taskWHERE ; et le Y cmp (dpSALLE),y bcc zone_ko ldy #6 lda (dpSALLE),y cmp taskWHERE bcc zone_ko pla inc sta zone_cliquee rts zone_ko lda dpSALLE ; pointe sur la prochaine zone clc adc #14 sta dpSALLE pla inc cmp nb_zones ; to nb_zones bcc ]lp rts nb_zones ds 2 *--- commentaires lda zone_cliquee bne comm1 rts comm1 ldy #0 ; index du pointeur du commentaire dans la zone lda instruction1 cmp #main beq comm2 ldy #2 cmp #oeil beq comm2 ldy #4 cmp #bouche beq comm2 rts comm2 lda salle dec asl tax lda table_salle,x clc adc #18 ; pointe sur les pointeurs des commentaires de la premiere zone sta dpSALLE ; salle1 à salle56 lda #0 ; on fait +14 X fois ldx zone_cliquee ; X est l'index de la zone cliquée ]lp dex beq comm3 clc adc #14 bra ]lp comm3 clc ; on met à jour le pointeur adc dpSALLE sta dpSALLE lda (dpSALLE),y ; et on retourne le pointeur vers le commentaire main/oeil/bouche jmp ecriture *--- apparition_objet ; X is object, A is string pha lda objet_apparu-1,x and #$ff bne do99 ; = TRUE, ie <> 0 sep #$20 lda salle sta objet-1,x lda #TRUE sta objet_apparu-1,x rep #$20 jsr inversion_icone bra fin_objet *--- disparition_objet ; X is object pha lda objet_apparu-1,x and #$ff beq do99 sep #$20 lda #objet_detruit sta objet-1,x rep #$20 jsr disparition_icone *--- fin_objet pla jmp ecriture do99 pla rts *--- directions lda salle cmp #38 bne dire1 lda instructionDIR ; 1 cmp #droite bne dire1 lda #di_str1 jsr ecriture dire1 lda salle cmp #36 bne dire2 lda instructionDIR ; 1 cmp #nord bne dire2 lda #di_str2 jsr ecriture dire2 lda salle cmp #22 bne dire3 lda instructionDIR ; 1 cmp #gauche bne dire3 lda #di_str3 jsr ecriture dire3 lda salle cmp #21 bne dire4 lda instructionDIR ; 1 cmp #gauche bne dire4 lda #di_str4 jsr ecriture dire4 lda salle cmp #11 bne dire5 lda instructionDIR ; 1 cmp #droite bne dire5 lda #di_str5 jsr ecriture dire5 lda instructionDIR ; 1 cmp #nord bcc dire6 lda #droite cmp instructionDIR ; 1 bcc dire6 lda salle ; salle dec ; - 1 asl ; *2 parce que 16-bits tax lda table_salle,x ; pointe sur les données de la salle inc inc sta dpSALLE ; pointe sur le tableau des directions lda instructionDIR ; instruction1 sec sbc #nord ; - première direction asl ; *2 parce que 16-bits tay lda (dpSALLE),y ; récupère la prochaine salle beq direNOSALLE ; 0 = pas de salle sta salle direNOSALLE stz instructionDIR ; 1 dire6 lda salle cmp #25 bne dire7 ldx #elephant_enfuis lda indicateur-1,x and #$ff cmp #TRUE bne dire7 lda #26 sta salle dire7 lda salle cmp #28 bne dire8 ldx #mechant_assome lda indicateur-1,x and #$ff cmp #TRUE bne dire8 lda #27 sta salle dire8 lda salle cmp #29 bne dire9 ldx #mechant_assome lda indicateur-1,x and #$ff cmp #TRUE bne dire9 lda #30 sta salle dire9 lda salle cmp #32 bne dire10 ldx #mechant_assome lda indicateur-1,x and #$ff cmp #TRUE bne dire10 lda #31 sta salle dire10 lda salle cmp #34 bne dire11 ldx #feu_allume lda indicateur-1,x and #$ff cmp #TRUE bne dire11 lda #35 sta salle dire11 lda salle cmp #36 bne dire12 ldx #photo_montree lda indicateur-1,x and #$ff cmp #FALSE bne dire12 lda #33 sta salle dire12 rts *--- di_str1 str 'Mieux vaudrait ne pas suivre le Professeur...' di_str2 str 'Il n'27'y a qu'2788' pousser la porte... (auriez-vous peur de quelque chose ?)' di_str3 str 'Bill saute facilement du train et attend que celui-ci reparte' di_str4 str 'Ce genre de saut ne marche que dans les films...' di_str5 str 'Bill s'27'envole pour l'27'Afrique' *--- disparition_icone ; X is object cpx #0 beq di1 txa dec asl asl asl ; because we are 16-bit tax lda icones_coordonnees+2,x sta diRECT lda icones_coordonnees,x sta diRECT+2 lda icones_coordonnees+6,x sta diRECT+4 lda icones_coordonnees+4,x sta diRECT+6 _HideCursor PushLong #diRECT _EraseRect _ShowCursor di1 rts diRECT ds 8 rts *--- affichage_icone ; X is object cpx #0 beq ai1 txa dec asl asl asl ; because we are 16-bit tax lda icones_coordonnees+2,x sta iconToSourceRect sta iconToDestPoint lda icones_coordonnees,x sta iconToSourceRect+2 sta iconToDestPoint+2 lda icones_coordonnees+6,x sta iconToSourceRect+4 lda icones_coordonnees+4,x sta iconToSourceRect+6 _HideCursor PushLong #iconParamPtr _PaintPixels _ShowCursor ai1 rts *--- iconParamPtr adrl iconToSourceLocInfo adrl iconToDestLocInfo adrl iconToSourceRect adrl iconToDestPoint dw $0000 ; mode copy ds 4 iconToSourceLocInfo dw $0000 ; mode 320 adrl $8000 ; ptrICON - $8000 on entry, high set after _NewHandle dw 160 dw 0,0,199,319 iconToDestLocInfo dw $0000 ; mode 320 adrl $012000 dw 160 dw 0,0,199,319 iconToSourceRect dw 3,0,109,272 iconToDestPoint dw 3,0 *--- inversion_icone ; X is object cpx #0 beq ii1 phx jsr affichage_icone pla dec asl asl asl ; because we are 16-bit tax lda icones_coordonnees+2,x sta iiRECT lda icones_coordonnees,x sta iiRECT+2 lda icones_coordonnees+6,x sta iiRECT+4 lda icones_coordonnees+4,x sta iiRECT+6 _HideCursor PushLong #iiRECT _InvertRect _ShowCursor ii1 rts iiRECT ds 8 *--- affichage_objets ldx #1 ]lp phx jsr disparition_icone plx phx lda objet-1,x and #$ff cmp salle bne ao_1 jsr inversion_icone bra ao_2 ao_1 cmp #objet_pris bne ao_2 jsr affichage_icone ao_2 plx inx cpx #nombre_objets ; to 20 - do not want the animation icon bcc ]lp rts *--- ecriture sta dpFROM lda (dpFROM) ; get length of string and #$ff bne ecriture1 rts ecriture1 pea #^strVIDE ; get pointer to string ldx dpFROM inx phx pha ; push length PushLong #myRECT PushWord #0 ; left justified _LETextBox2 rts myRECT dw 161 dw 2 dw 198 dw 317 *--- chargement_image lda salle cmp ancienne_salle bne ci_ok rts ci_ok sta ancienne_salle jsr reset_icones ; etat initial jsr affichage_objets ; affiche les objets jmp affichage_image ; charge l'image * lda #strVIDE ; plus de texte * jmp ecriture *--- affichage_image PushWord salle PushLong #tempSTR PushWord #2 PushWord #0 _Int2Dec lda tempSTR ora #'00' sta pIMAGE+10 jmp decompression_image tempSTR ds 4 *--- decompression_image lda #pIMAGE ldx ptrUNPACK+2 ldy ptrUNPACK jsr loadFILE bcs di_err decompression_image_cheat lda proREAD+12 jsr unpackLZ4 _HideCursor PushLong #paintParamPtr _PaintPixels PushWord #0 lda ptrIMAGE+2 pha lda ptrIMAGE clc adc #$7e00 pha _SetColorTable jsr showCHEAT ; the cheat mode _ShowCursor di_err rts paintParamPtr adrl ptrToSourceLocInfo adrl ptrToDestLocInfo adrl ptrToSourceRect adrl ptrToDestPoint dw $0000 ; mode copy ds 4 ptrToSourceLocInfo dw $0000 ; mode 320 ds 4 ; ptrIMAGE dw 160 dw 0,0,199,319 ptrToDestLocInfo dw $0000 ; mode 320 adrl $012000 dw 160 dw 0,0,199,319 ptrToSourceRect dw 3,0,109,272 ptrToDestPoint dw 3,0 *--- fin jsr ecriture jsr debut lda #5 jmp nowWAIT *--- debut sep #$20 ldx #nombre_objets lda #objet_inexistant ]lp sta objet-1,x dex bne ]lp ldx #nombre_objets lda #FALSE ]lp sta objet_apparu-1,x dex bne ]lp ldx #nombre_indicateurs ]lp sta indicateur-1,x dex bne ]lp rep #$20 lda #4 sta salle stz ancienne_salle *--- reset_icones stz instruction1 stz instruction2 stz instructionDIR stz zone_cliquee stz fgMAIN stz fgOEIL stz fgBOUCHE ldx #main lda #FALSE jsr setCTLVALUE ldx #oeil lda #FALSE jsr setCTLVALUE ldx #bouche lda #FALSE jsr setCTLVALUE ldx #main jsr invalCTL ldx #oeil jsr invalCTL ldx #bouche jmp invalCTL *---------------------------------------- *--- Donnees du jeu salle ds 2 ancienne_salle ds 2 instruction1 ds 2 instruction2 ds 2 instructionDIR ds 2 zone_cliquee ds 2 *----------------------------------- Copyright doCOPYRIGHT lda #0 ]lp pha asl tax lda message,x jsr ecriture lda #3 ; 150 ms / 50 (GFA) = 3 secondes jsr nowWAIT pla inc cmp #nombre_messages bcc ]lp rts *----------------------------------- Open doLOAD jsr doSOUNDOFF jsr saveBACK PushWord #30 PushWord #43 PushLong #strLOADFILE PushLong #0 PushLong #typeLIST PushLong #replyPTR _SFGetFile jsr loadBACK jsr doSOUNDON lda replyPTR bne doLOAD1 rts doLOAD1 jsr copyPATH jsr loadALL stz ancienne_salle stz instruction1 stz instruction2 stz instructionDIR jsr reset_icones lda #strVIDE jmp ecriture *----------------------------------- Save doSAVE jsr doSOUNDOFF jsr saveBACK PushWord #25 PushWord #36 PushLong #strSAVEFILE PushLong #namePATH PushWord #15 PushLong #replyPTR _SFPutFile jsr loadBACK jsr doSOUNDON lda replyPTR bne doSAVE1 rts doSAVE1 jsr copyPATH jsr saveALL lda #strVIDE jmp ecriture *--- Recopie le filename du fichier de sauvegarde copyPATH sep #$20 ldx #16-1 ]lp lda namePATH1,x sta pGAME+4,x dex bpl ]lp lda namePATH inc inc sta pGAME rep #$20 rts *--- Charge le fichier de sauvegarde en mémoire loadALL jsl GSOS dw $2010 adrl proOPENGAME bcs loadKO99 lda proOPENGAME+2 sta proREADGAME+2 sta proCLOSE+2 jsr loadPART jsl GSOS dw $2014 adrl proCLOSE loadKO99 rts *--- loadPART ldx #nombre_indicateurs ldy #indicateur jsr loadIT ldx #nombre_objets ldy #objet jsr loadIT ldx #nombre_objets ldy #objet_apparu jsr loadIT ldx #1 ldy #salle loadIT stx proREADGAME+8 sty proREADGAME+4 jsl GSOS dw $2012 adrl proREADGAME rts *--- Enregistre le fichier de sauvegarde saveALL jsl GSOS dw $2002 adrl proDESTROYGAME jsl GSOS dw $2001 adrl proCREATEGAME bcs saveKO99 jsl GSOS dw $2010 adrl proOPENGAME bcs saveKO99 lda proOPENGAME+2 sta proWRITEGAME+2 sta proCLOSE+2 jsr savePART jsl GSOS dw $2014 adrl proCLOSE saveKO99 rts *--- savePART ldx #nombre_indicateurs ldy #indicateur jsr saveIT ldx #nombre_objets ldy #objet jsr saveIT ldx #nombre_objets ldy #objet_apparu jsr saveIT ldx #1 ldy #salle saveIT stx proWRITEGAME+8 sty proWRITEGAME+4 jsl GSOS dw $2013 adrl proWRITEGAME rts *----------------------------------- Restart doRESTART jsr saveBACK PushWord #0 PushWord #5 PushLong #0 PushLong #alertRESTART _AlertWindow jsr loadBACK pla beq re1 rts re1 jmp debut *----------------------------------- doCHEAT lda fgCHEAT eor #1 sta fgCHEAT jmp decompression_image_cheat *--- showCHEAT lda fgCHEAT bne showCHEAT1 rts showCHEAT1 lda salle dec asl tax lda table_salle,x sta dpSALLE ; salle1 à salle56 ldy #0 lda (dpSALLE),y sta nb_zones lda dpSALLE ; pointe sur les coordonnees de la première zone clc adc #10 sta dpSALLE lda #0 ]lp pha ldy #0 lda (dpSALLE),y ; X1 sta frameRECT+2 ldy #2 lda (dpSALLE),y ; Y1 sta frameRECT ldy #4 lda (dpSALLE),y ; X2 sta frameRECT+6 ldy #6 lda (dpSALLE),y ; Y2 sta frameRECT+4 PushLong #frameRECT _FrameRect *--- lda dpSALLE ; pointe sur la prochaine zone clc adc #14 sta dpSALLE pla inc cmp nb_zones ; to nb_zones bcc ]lp rts *--- fgCHEAT ds 2 frameRECT ds 8 *----------------------------------- Quit doQUIT jsr saveBACK PushWord #0 PushWord #5 PushLong #0 PushLong #alertQUIT _AlertWindow jsr loadBACK pla beq meQUIT rts *----------------------------------- Quit meQUIT jsr stopMIDI PushWord #refIsHandle PushLong SStopREC _ShutDownTools meQUIT1 PushWord myID _DisposeAll PushWord myID _MMShutDown _TLShutDown jsl GSOS dw $2029 adrl proQUIT brk $bd *---------------------------------------- * MEMOIRE *---------------------------------------- make64KB pha pha PushLong #$010000 PushWord myID PushWord #%11000000_00011100 PushLong #0 _NewHandle phd tsc tcd lda [3] tax ; low in X ldy #2 lda [3],y txy ; low in Y tax ; high in X pld pla ; we do not keep track of the handle pla rts *---------------------------------------- * GFX *---------------------------------------- *---------------------------- * unpackLZ4 * Unpacks a LZ4 file * Uses the two pointers: * - ptrUNPACK: packed img (MUST BE AT $0000) * - ptrDG: temp unpack zone * * Entry: * A: packed data size * * Exit: * A: unpacked data size * *---------------------------- unpackLZ4 sta LZ4_Limit+1 jsr suspendMUSIC sep #$20 *--- Source lda ptrUNPACK+2 sta LZ4_Literal_3+2 sta LZ4_ReadToken+3 sta LZ4_Match_1+3 sta LZ4_GetLength_1+3 *--- Destination lda ptrIMAGE+2 sta LZ4_Literal_3+1 sta LZ4_Match_5+1 sta LZ4_Match_5+2 rep #$20 * REP #$30 * STY LZ4_Limit+1 *-- ldy #0 ; Init Target unpacked Data offset ldx #16 ; Offset after header LZ4_ReadToken LDAL $AA0000,X ; Read Token Byte INX STA LZ4_Match_2+1 *---------------- LZ4_Literal AND #$00F0 ; >>> Process Literal Bytes <<< BEQ LZ4_Limit ; No Literal CMP #$00F0 BNE LZ4_Literal_1 JSR LZ4_GetLengthLit ; Compute Literal Length with next bytes BRA LZ4_Literal_2 LZ4_Literal_1 LSR ; Literal Length use the 4 bit LSR LSR LSR LZ4_Literal_2 DEC ; Copy A+1 Bytes LZ4_Literal_3 MVN $AA,$BB ; Copy Literal Bytes from packed data buffer PHK ; X and Y are auto incremented PLB *---------------- LZ4_Limit CPX #$AAAA ; End Of Packed Data buffer ? BEQ LZ4_End *---------------- LZ4_Match TYA ; >>> Process Match Bytes <<< SEC LZ4_Match_1 SBCL $AA0000,X ; Match Offset INX INX STA LZ4_Match_4+1 LZ4_Match_2 LDA #$0000 ; Current Token Value AND #$000F CMP #$000F BNE LZ4_Match_3 JSR LZ4_GetLengthMat ; Compute Match Length with next bytes LZ4_Match_3 CLC ADC #$0003 ; Minimum Match Length is 4 (-1 for the MVN) PHX LZ4_Match_4 LDX #$AAAA ; Match Byte Offset LZ4_Match_5 MVN $BB,$BB ; Copy Match Bytes from unpacked data buffer PHK ; X and Y are auto incremented PLB PLX BRA LZ4_ReadToken *---------------- LZ4_GetLengthLit LDA #$000F ; Compute Variable Length (Literal or Match) LZ4_GetLengthMat STA LZ4_GetLength_2+1 LZ4_GetLength_1 LDAL $AA0000,X ; Read Length Byte INX AND #$00FF CMP #$00FF BNE LZ4_GetLength_3 CLC LZ4_GetLength_2 ADC #$000F STA LZ4_GetLength_2+1 BRA LZ4_GetLength_1 LZ4_GetLength_3 ADC LZ4_GetLength_2+1 RTS *---------------- LZ4_End sty lenDATA ; Y = length of unpacked data jmp resumeMUSIC *--- lenDATA ds 4 *----------------------------------- * SAVE THE SHR SCREEN *----------------------------------- saveBACK _HideCursor ldx #$8000-2 ]lp ldal $e12000,x saveBACK1 stal $008000,x dex dex bpl ]lp exitBACK _ShowCursor rts *----------------------------------- * RESTORE THE SHR SCREEN *----------------------------------- loadBACK _HideCursor ldx #$8000-2 loadBACK1 ldal $008000,x stal $012000,x stal $e12000,x dex dex bpl loadBACK1 bmi exitBACK *---------------------------- * nowWAIT * Wait A seconds * * Entry: * A: nb of seconds to wait * * Exit: * A/X: scrambled * *---------------------------- nowWAIT dec tax lda #0 ]lp clc adc #60 cpx #0 beq nowWAIT1 dex bra ]lp nowWAIT1 pha ]lp ldal RDVBLBAR-1 bpl ]lp ]lp ldal RDVBLBAR-1 bmi ]lp pla dec bne nowWAIT1 sec rts *---------------------------------------- * DATA *---------------------------------------- *----------------------- Fenetres wiMAIN ds 4 *----------------------- Memory manager myID ds 2 myDP ds 2 SStopREC ds 4 ptrIMAGE ds 4 ; where a scene image is loaded ptrUNPACK ds 4 ; where the background picture is laoded ptrICONS adrl $8000 ; where the icons are stored (ptrBACKGROUND+$8000) fgLOAD ds 2 fgSAVE ds 2 temp ds 2 *----------------------- Tool locator verSTR1 str 'System 6.0.1 Required!' verSTR2 str 'Press a key to quit' tolSTR1 str 'Error while loading tools' memSTR1 str 'Cannot allocate memory' filSTR1 str 'Cannot load file' errSTR1 str 'Quit' errSTR2 str '' *----------------------- Window manager taskREC ds 2 ; wmWhat +0 taskMESSAGE ds 4 ; wmMessage +2 taskWHEN ds 4 ; wmWhen +6 taskWHERE ds 4 ; wmWhere +10 taskMODIFIERS ds 2 ; wmModifiers +14 taskDATA ds 4 ; wmTaskData +16 adrl $001fffff ; wmTaskMask +20 ds 4 ; wmLastClickTick +24 ds 2 ; wmClickCount +28 ds 4 ; wmTaskData2 +30 ds 4 ; wmTaskData3 +34 ds 4 ; wmTaskData4 +38 ds 4 ; wmLastClickPt +42 taskTBL da doNOT ; Null da doNOT ; mouseDownEvt da doMOUSEUP ; mouseUpEvt da doKEYDOWN ; keyDownEvt da doNOT da doNOT ; autoKeyEvt da doNOT ; updateEvt da doNOT da doNOT ; activateEvt da doNOT ; switchEvt da doNOT ; deskAccEvt da doNOT ; driverEvt da doNOT ; app1Evt da doNOT ; app2Evt da doNOT ; app3Evt da doNOT ; app4Evt da doNOT ; wInDesk da doNOT ; wInMenuBar da doNOT ; wCLickCalled da doNOT ; wInContent - was doCONTENT da doNOT ; wInDrag da doNOT ; wInGrow da doNOT ; wInGoAway da doNOT ; wInZoom da doNOT ; wInInfo da doNOT ; wInSpecial da doNOT ; wInDeskItem da doNOT ; wInFrame da doNOT ; wInactMenu da doNOT ; wInClosedNDA da doNOT ; wInCalledSysEdit da doNOT ; wInTrackZoom da doNOT ; wInHitFrame da doCONTROL ; wInControl da doNOT ; wInControlMenu ctrlTBL da doNOT da doNOT da doNOT da doNOT da doNOT da doNOT da doNOT da doNOT da doNOT da doNOT da doNOT da doNOT da doNOT da doNOT da doNOT da doNOT da doNOT da doNOT da doNOT da doNOT da doNOT da doNORD da doSUD da doGAUCHE da doDROITE da doMAIN da doOEIL da doBOUCHE da doCOPYRIGHT da doSAVE da doLOAD *---------------------------------------- * STD FILE *---------------------------------------- *--- strLOADFILE str 'Charger quelle partie ?' strSAVEFILE str 'Enregistrer sous...' typeLIST hex 01 hex 5d ; Game/Edu files replyPTR ds 2 ; 0 good ds 2 ; 2 fileType ds 2 ; 4 auxFileType namePATH hex 06 ; 6 fileName namePATH1 asc 'Partie' ; 7 fileName (16 normally) ds 9 loadPATH ds 1 ; 22 fullPathname (string length) loadPATH1 ds 129 ; 23 fullPathname (128 normally) *---------------------------------------- * GS/OS *---------------------------------------- loadFILE sta proOPEN+4 ; filename sty proREAD+4 ; RAM pointer low stx proREAD+6 ; RAM pointer high loadFILE1 stz proERR jsl GSOS dw $2010 adrl proOPEN bcs loadERR lda proOPEN+2 sta proREAD+2 sta proCLOSE+2 lda proEOF sta proREAD+8 lda proEOF+2 sta proREAD+10 jsl GSOS dw $2012 adrl proREAD bcs loadERR loadFILE2 jsl GSOS dw $2014 adrl proCLOSE ldy proREAD+12 ; length read ldx proREAD+14 rts loadERR jsr loadFILE2 ldy #0 tyx sec rts *--- GS/OS data proERR ds 2 *--- For the game party proCREATEGAME dw 7 ; pcount adrl pGAME ; pathname dw $c3 ; access_code dw $5d ; file_type adrl $801b ; aux_type ds 2 ; storage_type ds 4 ; eof ds 4 ; resource_eof proDESTROYGAME dw 1 ; pcount adrl pGAME ; pathname proOPENGAME dw 2 ds 2 adrl pGAME proREADGAME dw 4 ; 0 - pcount ds 2 ; 2 - ref_num adrl pGAME ; 4 - data_buffer ds 4 ; 8 - request_count ds 4 ; C - transfer_count proWRITEGAME dw 5 ; 0 - pcount ds 2 ; 2 - ref_num adrl pGAME ; 4 - data_buffer (we are in same bank) ds 4 ; 8 - request_count ds 4 ; C - transfer_count dw 1 ; cache_priority *--- For the game images proOPEN dw 12 ds 2 adrl pIMAGE ds 2 ds 2 ds 2 ds 2 ds 4 ds 2 ds 8 ds 8 ds 4 proEOF ds 4 proREAD dw 4 ; 0 - nb parms ds 2 ; 2 - file id ds 4 ; 4 - pointer ds 4 ; 8 - length ds 4 ; C - length read proCLOSE dw 1 ds 2 proQUIT dw 2 ; pcount ds 4 ; pathname ds 2 ; flags proVERS dw 1 ; pcount ds 2 ; version *--- offset to image number is +10 pIMAGE strl '1/data/p00.lz4' pICONS strl '1/data/icons.lz4' pGAME strl '0/ ' *---------------------------------------- * LES AUTRES FICHIERS *---------------------------------------- put datafr.asm put roomfr.asm put midi.s *---