* * Lode Runner * (c) 1983, Broderbund Software * (s) 2014-2024, Brutal Deluxe Software * mx %00 *----------------------------------- Macros use 4/Ctl.Macs use 4/Desk.Macs use 4/Event.Macs use 4/Font.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 use LR.EQUATES *----------------------------------- * EQUATES *----------------------------------- GSOS = $e100a8 refIsPointer = 0 refIsHandle = 1 refIsResource = 2 *-------------- GUI ptr012000 = $012000 ptrE12000 = $e12000 *--- TRUE = 255 FALSE = 0 *----------------------------------- Entry point phk plb clc xce rep #$30 tdc sta myDP *--- Start tools... _TLStartUp pha _MMStartUp pla sta myID _MTStartUp *--- 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 meQUIT1 okTOOL PushWord #0 _GetMasterSCB pla bmi okSHADOW ; shadowing is on if bit 15 is set lda #^ptrE12000 ; shadowing is off, use slow RAM sta ptrSCREEN+2 sta iconToDestLocInfo+4 *--- Et la musique... okSHADOW pha _SoundToolStatus pla beq noSOUND inc fgSND noSOUND _HideMenuBar _HideCursor PushWord #0 PushWord #%11111111_11111111 PushWord #0 _FlushEvents pla *--- SHR on... jsr setBORDER lda #-1 jsr fadeOUT *----------------------------------- PushLong #0 PushLong #$8fffff PushWord myID PushWord #%11000000_00000000 PushLong #0 _NewHandle _DisposeHandle _CompactMem *--- 64K pour le buffer habituel jsr make64KB bcs koMEM sty ptrUNPACK stx ptrUNPACK+2 *--- 64K pour les images jsr make64KB bcs koMEM sty ptrIMAGE stx ptrIMAGE+2 stx ptrKEYS+2 *--- 64K pour le fond jsr make64KB bcc okMEM1 koMEM pha PushLong #memSTR1 PushLong #errSTR2 PushLong #errSTR1 PushLong #errSTR2 _TLTextMountVolume pla brl meQUIT1 okMEM1 sty bankHGR2 stx bankHGR2+2 *--- 64K pour le menu jsr make64KB bcs koMEM sty ptrMENU stx ptrMENU+2 stx ptrOPTIONS+2 stx iconToSourceLocInfo+4 *--- 64K pour les niveaux jsr make64KB bcs koMEM sty bankLEVELS stx bankLEVELS+2 *--- 64K pour les sons jsr make64KB bcs koMEM sty ptrSOUNDS stx ptrSOUNDS+2 *----------------------------------- Affiche le logo Tozai lda #pTOZAI ldx ptrUNPACK+2 ldy ptrUNPACK jsr loadFILE bcs koLOADTOZAI lda proEOF ldx #0 ldy #0 jsr unpackLZ4 ldx ptrIMAGE+2 ldy ptrIMAGE lda #-1 jsr fadeIN koLOADTOZAI *----------------------------------- The patch area 11/0000 lda bankLEVELS sta lvlPATCH1+1 sta lvlPATCH2+1 lda bankLEVELS+1 sta lvlPATCH1+2 sta lvlPATCH2+2 sta scorePATCH1+2 sta scorePATCH2+2 lda bankLEVELS clc adc #38400 sta scorePATCH1+1 sta scorePATCH2+1 *--- lda bankHGR2 sta Debut lda bankHGR2+2 sta Debut+2 ldy #0 ; on efface HGR2 tya ]lp sta [Debut],y iny iny bne ]lp *----------------------------------- Load file now lda #pSOUNDS ldx ptrSOUNDS+2 ldy ptrSOUNDS jsr loadFILE bcc okLOAD2 inc fgSND okLOAD2 lda #pMENU ldx ptrUNPACK+2 ldy ptrUNPACK jsr loadFILE bcc okLOAD3 inc fgMENU bra okLOADEND okLOAD3 lda proEOF ldx ptrMENU+2 ldy ptrMENU jsr unpackLZ4 lda #pOPTIONS ldx ptrUNPACK+2 ldy ptrUNPACK jsr loadFILE bcc okLOAD4 inc fgMENU bra okLOADEND okLOAD4 lda proEOF ldx ptrOPTIONS+2 ldy ptrOPTIONS jsr unpackLZ4 lda #pKEYS ldx ptrUNPACK+2 ldy ptrUNPACK jsr loadFILE bcc okLOAD5 inc fgMENU bra okLOADEND okLOAD5 lda proEOF ldx ptrKEYS+2 ldy ptrKEYS jsr unpackLZ4 okLOADEND *----------------------------------- Exit point ldx #256-2 ; efface la page directe ]lp stz $00,x dex dex bpl ]lp jsr checkJOYSTICK jsr find4PLAY ; do we have a 4play? jsr initMIDI ; MIDISynth vaincra jsr doMUSIK ; play muzak jsr set28SPEED ; slow down the IIgs * jsr ComputeGSSpeed lda #-1 jsr fadeOUT jsr setNATIVE ; exit 8-bit jsr initINTRO ; 1er appel pour initialiser les valeurs par défaut *--- MAIN LOOP loopPLEASE rep #$30 lda theLVL ; want a custom file cmp #indexCUSTOM beq lp_skip asl tax lda tblLVL,x jsr initLEVELS jsr loadLEVELS ; exit in 8-bit rep #$30 lp_skip lda fgMENU bne playNOMENU jsr doINTRO ; retourne le theme en A bcc playPLEASE brl meQUIT mx %11 playNOMENU sep #$30 ; we have no menu or no options lda #0 ; let's play directly playPLEASE cmp #0 beq introNATIVE jsr setVINTAGE bra introNEXT introNATIVE jsr setNATIVE introNEXT lda theLVL ; do we want to play cmp #indexCUSTOM ; custom levels? bne introCONTINUE ; no jsr doLOAD ; yes, player can select his levels bcs loopPLEASE ; if error/cancel, loop *--- Set the input device introCONTINUE ldx #chrP ; joypad = 0 lda theDEV beq foundDEV ldx #chrJ ; joystick = 1 cmp #1 beq foundDEV ldx #chrK ; keyboard = 2 foundDEV stx fgINPUT *--- Enter the game world mx %11 lda #refSPEED ; try to slow it down a bit sta theSPEED lda ptrSCREEN+2 sta ptrHGR1+2 jmp theGAME *----------------------------------- * AUTRES ROUTINES *----------------------------------- mx %00 ; The 16-bit world *----------------------------------- Init GS/OS data for LEVELS * A: pointer to filename initLEVELS sta proDESTROY+2 sta proCREATE+2 sta proOPEN+4 ldy bankLEVELS sty proREAD+4 ; where to put at the end sty proWRITE+4 ldx bankLEVELS+2 stx proREAD+6 stx proWRITE+6 lda #38400+256 ; length sta proREAD+8 stz proREAD+10 sta proWRITE+8 stz proWRITE+10 rts *----------------------------------- Open LEVELS doLOAD rep #$30 _ShowCursor PushWord #30 PushWord #43 PushLong #strLOADFILE PushLong #0 PushLong #typeLIST PushLong #replyPTR _SFGetFile _HideCursor lda replyPTR bne doLOAD1 sep #$30 sec rts mx %00 doLOAD1 jsr copyPATH lda #pLEVELS ; all files are linked to levels now jsr initLEVELS *--- loadLEVELS rep #$30 jsl GSOS dw $2010 adrl proOPEN bcs loadLEVELS9 lda proOPEN+2 sta proREAD+2 sta proCLOSE+2 jsl GSOS dw $2012 adrl proREAD php jsl GSOS dw $2014 adrl proCLOSE plp bcs loadLEVELS9 sep #$30 glong clc rts mx %00 loadLEVELS9 rep #$30 ldx #0 ; clear all levels txa lvlPATCH1 stal $bdbd,x ; **patched** inx inx cpx #38400 ; 150 x 256 bcc lvlPATCH1 ldx #256-2 ]lp lda scoreEMPTY,x sta scorebuf,x lvlPATCH2 stal $bdbd,x ; **patched** dex dex bpl ]lp sep #$30 sec rts mx %00 *----------------------------------- Save doSAVE rep #$30 _ShowCursor PushWord #25 PushWord #36 PushLong #strSAVEFILE PushLong #namePATH PushWord #15 PushLong #replyPTR _SFPutFile _HideCursor lda replyPTR bne doSAVE1 sep #$30 sec rts mx %00 doSAVE1 jsr copyPATH saveLEVELS rep #$30 jsl GSOS dw $2002 adrl proDESTROY jsl GSOS dw $2001 adrl proCREATE bcs doSAVE99 jsl GSOS dw $2010 adrl proOPEN bcs doSAVE99 lda proOPEN+2 sta proWRITE+2 sta proCLOSE+2 jsl GSOS dw $2013 adrl proWRITE jsl GSOS dw $2014 adrl proCLOSE sep #$30 clc rts doSAVE99 sep #$30 sec rts mx %00 *--- Recopie le filename du fichier de sauvegarde copyPATH sep #$20 ldx #16-1 ]lp lda namePATH1,x sta pLEVELS+4,x dex bpl ]lp lda namePATH inc ; add 2 chars inc ; for '0/' sta pLEVELS rep #$20 rts mx %00 *----------------------------------- Quit meQUIT rep #$30 jsr restoreSPEED jsr restoreBORDER jsr stopMIDI PushWord #refIsHandle PushLong SStopREC _ShutDownTools meQUIT1 PushWord myID _DisposeAll PushWord myID _MMShutDown _TLShutDown jsl GSOS dw $2029 adrl proQUIT brk $bd ; we never know! *---------------------------------------- * SET VINTAGE/NATIVE MODE *---------------------------------------- mx %00 setVINTAGE rep #$30 jsr setSTDPALETTE ; set the LR palette ldx #tblSPRITES ldy #$4444 bra setMODE setNATIVE rep #$30 jsr setLRPALETTE ; set the LR palette ldx #tblSPRITES2 ldy #$bbbb setMODE stx patchSPR1+1 ; the sprites table stx patchSPR2+1 stx patchSPR3+1 sty fondFRAME ; the border color sep #$30 lda #-1 ; we want sound fx sta fgSOUND rts *--- fondFRAME dw $4444 ; HGR: $4444, SHR: $BBBB *---------------------------------------- * SET LODE RUNNER / STANDARD 320 PALETTE *---------------------------------------- mx %00 setSTDPALETTE PushWord #0 PushLong #palette320 bra setPALETTE setLRPALETTE PushWord #0 PushLong #paletteLR setPALETTE _SetColorTable PushWord #0 _SetAllSCBs rts *---------------------------------------- * CHECK KEY PRESSED *---------------------------------------- mx %00 checkKEY phx phy rep #$30 jsr checkREPLAY ; restart muzak? pha PushWord #%00000000_00001000 PushLong #taskREC _GetNextEvent pla beq checkNOKEY lda taskREC ; une touche ? cmp #keyDownEvt bne checkNOKEY sep #$30 ply plx lda taskMESSAGE ; un nombre? ora #%1000_0000 cmp #"A" bcc checkedKEY and #maskUPPER ; lowercase support checkedKEY rts mx %00 checkNOKEY sep #$30 ply plx lda #0 rts mx %00 *---------------------------------------- * CHECK KEY & MOUSE UP *---------------------------------------- mx %00 checkKEYMOUSE rep #$30 ]lp jsr checkREPLAY ; restart muzak? pha PushWord #%00000000_00001110 PushLong #taskREC _GetNextEvent pla beq ]lp lda taskREC ; une touche ? cmp #keyDownEvt beq ckm_key cmp #mouseDownEvt bne ]lp pha PushWord #0 _WaitMouseUp pla beq ]lp sep #$30 ; un clic lda #0 rts ckm_key sep #$30 lda taskMESSAGE ; un nombre ? ora #%1000_0000 cmp #"A" bcc ckm_nonumber and #maskUPPER ; lowercase support ckm_nonumber rts mx %00 *---------------------------------------- * SPEED *---------------------------------------- *--- ComputeGSSpeed lda #16 ; SHR line 16 jsr WaitForSpot ldy #0 ; speed counter lda #32 ; SHR line 32 jsr WaitForSpot ]lp iny lda #64 ; SHR line 64 jsr WaitForSpot bne ]lp sty CGSS_Counter ldx #0 ; 0 = 1 MHz Apple IIgs cpy #$40 bcc CGSS_Code inx ; 1 = 2,8MHz Apple IIgs cpy #$70 bcc CGSS_Code inx ; 2 = Accelerated IIgs (7-16 MHz) cpy #$400 bcc CGSS_Code inx ; 3 = Full speed emulator CGSS_Code stx CGSS_SpeedCode rts *-------------- WaitForSpot sep #$20 lsr ora #$80 cmpl VERTCNT bne wfs_notok rep #$20 lda #0 rts wfs_notok rep #$20 lda #1 rts *-------------- mx %11 slowdownBUDDY lda CGSS_SpeedCode cmp #2 bcc noSPEED speedOUTER ldal RDVBLBAR bpl speedOUTER speedINNER ldal RDVBLBAR bmi speedINNER noSPEED rts mx %00 *-------------- CGSS_Counter ds 2 ; 1079-0820 = Full Speed Emulator, 0108-0129 = 8Mhz 39F = 16MHz, 005B = 2,8 Mhz, 0026 = 1 Mhz CGSS_SpeedCode ds 2 ; Speed Code : 0=1Mhz, 1=2.8Mhz, 2=Accelerator Card, 3=Emulator Unlimited *--- FL_IDLE = $e2000a FL_VERSION = $e2000c SET_SPEED = $e50000 GetCurISpeed = $bcff28 SetCurISpeed = $bcff2c *--- set28SPEED sep #$20 ; Check Applesqueezer ldal FL_IDLE and #$ff cmp #1 bne no_AS ldal SET_SPEED sta accSPEED lda #233 stal SET_SPEED rep #$20 lda #1 sta theACC rts mx %10 no_AS rep #$20 ; Check Transwarp IIgs ldal $bcff00 cmp #'TW' bne no_TW ldal $bcff02 cmp #'GS' bne no_TW jsl GetCurISpeed stx accSPEED ldx #1 jsl SetCurISpeed lda #2 sta theACC rts no_TW sep #$20 ; Check ZipGSX lda #$5a ; unlock stal SETAN1 stal SETAN1 stal SETAN1 stal SETAN1 ldal CLRAN0 eor #$f8 sta temp stal CLRAN0 ldal CLRAN0 cmp temp bne no_ACC eor #$f8 stal CLRAN0 * lda #%1010_0000 ; #$10-#$6th option (2.56MHz) * stal CLRAN2 ; set speed * stal CLRAN1 ; enable card lda #0 ; disable... set to 2.8MHz stal SETAN1 lda #$a5 ; lock stal SETAN1 lda #3 sta theACC no_ACC rep #$20 rts *--- restoreSPEED lda theACC ; Applesqueezer? cmp #1 bne check_TW sep #$20 lda accSPEED stal SET_SPEED rep #$20 rts check_TW cmp #2 ; Transwarp GS? bne check_ZIP ldx accSPEED jsl SetCurISpeed rts check_ZIP cmp #3 ; ZipGSX? bne check_NADA sep #$20 lda #$5a ; unlock stal SETAN1 stal SETAN1 stal SETAN1 stal SETAN1 lda #%0000_0000 ; any write to set fastest speed stal CLRAN2 stal CLRAN1 lda #$a5 ; lock stal SETAN1 rep #$20 check_NADA rts *--- theACC ds 2 ; 1:AS / 2:TW / 3:ZIP accSPEED ds 2 *---------------------------------------- * BORDER *---------------------------------------- *--- We want a black border setBORDER sep #$20 ldal CLOCKCTL pha and #%00001111 sta theSSBORDER pla and #%11110000 stal CLOCKCTL rep #$20 rts *--- We restore the border restoreBORDER sep #$20 ldal CLOCKCTL and #%11110000 ora theSSBORDER stal CLOCKCTL rep #$20 rts *--- Data theSSBORDER ds 2 *---------------------------------------- * 4PLAY *---------------------------------------- find4PLAY sep #$30 stz slot4PLAY ldx #$10 ]lp ldal $e0c080,x cmp #fpDFTVALUE bne next4PLAY ldal $e0c081,x cmp #fpDFTVALUE bne next4PLAY ldal $e0c082,x cmp #fpDFTVALUE bne next4PLAY ldal $e0c083,x cmp #fpDFTVALUE beq found4PLAY next4PLAY txa clc adc #$10 tax cpx #$80 ; until slot 8 bcc ]lp rep #$30 rts mx %11 found4PLAY txa ; set 4PLAY slot ora #$80 ; 10=>90, 20=>A0, 30=>B0... sta read4PLAY+1 sta slot4PLAY ; we have a 4Play lda #chrP sta fgINPUT rep #$30 rts *---------------------------------------- mx %11 read4PLAY ldal $e0C080 ; direct "fast" read and #%1101_1111 ; mask bit 5 sta the4PLAY rts *--- Data slot4PLAY ds 2 the4PLAY ds 2 mx %00 *----------------------------------- * CHECK JOYSTICK *----------------------------------- checkJOYSTICK sep #$30 php sei ldal CYAREG pha and #%0111_1111 stal CYAREG LDAL PTRIG nop nop LDX #$10 L87A7 LDAL PADDL0 ORAl PADDL1 BPL L87B9 DEY BNE L87A7 DEX BNE L87A7 lda fgINPUT ; on a déjà un device connecté bne L87B8 LDA #chrK ; no joystick means keyboard STA fgINPUT L87B8 stz fgJOYSTICK ; no joystick found L87B9 pla stal CYAREG plp rep #$30 RTS fgJOYSTICK dw 1 ; we have a joystick, by default *---------------------------- * unpackLZ4 * Unpacks a LZ4 file * Uses the two pointers: * - ptrUNPACK: packed img (MUST BE AT $0000) * - ptrIMAGE: temp unpack zone * * Entry: * A: packed data size * * Exit: * lenDATA: unpacked data size * *---------------------------- mx %00 unpackLZ4 sta LZ4_Limit+1 sty LZ4_pointer stx LZ4_pointer+2 sep #$20 lda ptrUNPACK+2 ; Source sta LZ4_Literal_3+2 sta LZ4_ReadToken+3 sta LZ4_Match_1+3 sta LZ4_GetLength_1+3 lda ptrIMAGE+2 ; Destination sta LZ4_Literal_3+1 sta LZ4_Match_5+1 sta LZ4_Match_5+2 rep #$20 *-- 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 LZ4_length ; Y = length of unpacked data lda LZ4_pointer ora LZ4_pointer+2 bne LZ4_copy rts LZ4_copy PushLong ptrIMAGE ; the best place PushLong LZ4_pointer ; to save picture PushLong LZ4_length _BlockMove rts *--- Data LZ4_pointer ds 4 LZ4_length ds 4 *---------------------------------------- * FADE IN & OUT *---------------------------------------- * X/Y: source picture address * A: 0: do not copy image data mx %00 fadeIN sty Debut stx Debut+2 ldy ptrSCREEN sty Arrivee ldx ptrSCREEN+2 stx Arrivee+2 cmp #0 beq fadeIN1 ldy #$7e00-2 ]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 *---------------------------------------- * A: 0: do not erase SHR screen fadeOUT pha lda ptrSCREEN clc adc #$7e00 sta Debut lda ptrSCREEN+2 adc #0 sta Debut+2 ldx #15 ]lp ldy #512-2 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 ]lp *--- On efface vraiment tout pla bne fadeOUT6 rts fadeOUT6 lda ptrSCREEN sta Debut lda ptrSCREEN+2 sta Debut+2 ldy #32768-2 lda #0 ]lp sta [Debut],y dey dey bpl ]lp rts *-------------------------------------- nextVBL ldal VERTCNT and #$7f cmp #75 blt nextVBL cmp #100 bge nextVBL waitVBL ldal RDVBLBAR-1 bpl waitVBL rts *---------------------------------------- * 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 *---------------------------------------- * SOUND EFFECTS *---------------------------------------- mx %11 playSOUND sta saveA stx saveX sty saveY lda theTHEME ; 16-bit mode? bne playSOUND0 ; no, exit lda fgSOUND ; is sound on or off? beq playSOUND0 ; it is on lda fgSND ; can play 16-bit sound? beq playSOUND1 ; 0 means yes playSOUND0 sep #$30 ldy saveY ldx saveX lda saveA rts playSOUND1 rep #$30 lda saveA ; reprend l'instrument and #$ff ; clear high byte sta saveA cmp #isndBARRE ; 0 et 1 n'existent pas bcc playSOUND0 cmp #isndTOMBE bne playSOUND2 cmp oldA beq playSOUND0 playSOUND2 sta oldA asl tay ; on a maintenant l'index dans Y lda fgMIDIPLAY ; is no MIDI, no constraint beq playSOUND3 ; play all sound fx lda sndEXIT,y ; if MIDI playing, limit to bne playSOUND9 ; some sound fx only playSOUND3 lda sndADDRESS,y clc adc ptrSOUNDS sta waveSTART lda #0 adc ptrSOUNDS+2 sta waveSTART+2 lda sndPAGE,y sta wavePAGE lda fgMIDIPLAY ; midi playing beq playSOUND4 ; nope _MSSuspend playSOUND4 PushWord #%0000_0000_1000_0000 _FFStopSound PushWord #$0701 ; Gen 7 is THE generator to use PushLong #waveSTART _FFStartSound lda fgMIDIPLAY ; midi playing beq playSOUND9 ; nope _MSResume playSOUND9 sep #$30 ldy saveY ldx saveX lda saveA rts mx %00 *--- Data * 0 1 2 3 4 5 6 7 8 9 10 sndEXIT dw $0001,$0001,$0001,$0001,$0001,$0001,$0000,$0001,$0000,$0000,$0000 sndADDRESS dw $0000,$0000,$0000,$0500,$1700,$1A00,$2100,$4900,$5000,$6000,$6900 sndPAGE dw $0000,$0000,$0005,$0012,$0003,$0007,$0028,$0007,$0010,$0009,$0043 waveSTART ds 4 ; waveStart wavePAGE ds 2 ; waveSize dw 209 ; freqOffset ($D1) dw $FE00 ; docBuffer dw $0000 ; bufferSize ds 4 ; nextWavePtr dw 255 ; volSetting oldA ds 2 saveA ds 2 saveX ds 2 saveY ds 2 * 0 %00000000 0 0 0 0000 * INTRO 1 %00111111 32768 0 0 0000 * BARRE 2 %00011011 16384 1280 5 0000 * CREUSE 3 %00100100 4096 4608 18 0500 * ESCALIER 4 %00010010 1024 768 3 1700 * MARCHE 5 %00011011 2048 1792 7 1A00 * NOMORECHEST 6 %00110110 16384 10240 40 2100 * TOMBE 7 %00011011 2048 1792 7 4900 * TRESOR 8 %00100100 4096 4096 16 5000 * TROU 9 %00100100 4096 2304 9 6000 * YOUWIN 10 %00111111 32768 17152 67 6900 * AC00 *---------------------------------------- * GS/OS *---------------------------------------- loadFILE sta proOPEN+4 ; filename sty proREAD+4 ; where to put at the end stx proREAD+6 loadFILE1 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 jsl GSOS dw $2014 adrl proCLOSE clc rts loadERR jsl GSOS dw $2014 adrl proCLOSE sec rts mx %00 *---------------------------------------- * DATA *---------------------------------------- fgSND ds 2 fgMENU ds 2 temp ds 2 *----------------------- Tool locator tolSTR1 str 'Error while loading tools' memSTR1 str 'Cannot allocate memory' filSTR1 str 'Cannot load file' errSTR1 str 'Quit' errSTR2 str '' errSTR3 str 'Continue' *----------------------- Memory manager myDP ds 2 myID ds 2 ; app ID SStopREC ds 4 ptrSCREEN adrl ptr012000 bankHGR2 ds 4 bankLEVELS ds 4 ptrSOUNDS ds 4 ptrUNPACK ds 4 ; the usual scratch area ptrIMAGE ds 4 ; where a pic is unpacked ptrKEYS adrl $8000 ; change keys ptrMENU ds 4 ; menu du jeu ptrOPTIONS adrl $8000 ; les options possibles *----------------------- QuickDraw II palette320 dw $0000,$0777,$0841,$072C,$000F,$0080,$0F70,$0D00 dw $0FA9,$0FF0,$00E0,$04DF,$0DAF,$078F,$0CCC,$0FFF * black was grey: $0000 vs $0445 paletteLR dw $0000,$0000,$0FFF,$0952,$00BB,$01DD,$0FF0,$0A1A dw $0C0C,$0FCB,$0A10,$0C30,$0E50,$0666,$0AAA,$0FFF *----------------------- Event 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 *----------------------- GS/OS *--- LEVELS proCREATE dw 7 ; pcount adrl pLEVELS ; pathname dw $c3 ; access_code dw $5d ; file_type adrl $8022 ; aux_type ds 2 ; storage_type adrl 38400+256 ; eof ds 4 ; resource_eof proDESTROY dw 1 ; pcount adrl pLEVELS ; pathname proOPEN dw 12 ds 2 adrl pLEVELS 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 proWRITE dw 5 ; 0 - pcount ds 2 ; 2 - ref_num ds 4 ; 4 - data_buffer ds 4 ; 8 - request_count ds 4 ; C - transfer_count dw 1 ; cache_priority *--- Global proCLOSE dw 1 ds 2 proQUIT dw 2 ; pcount ds 4 ; pathname ds 2 ; flags proVERS dw 1 ; pcount ds 2 ; version *---------- Files pTOZAI strl '1/data/images/tozai.lz4' pMENU strl '1/data/images/menu.lz4' pOPTIONS strl '1/data/images/options.lz4' pKEYS strl '1/data/images/keys.lz4' pSOUNDS strl '1/data/musiques/sounds' pCLASSIC strl '1/levels/classic' pCHAMPIONSHIP strl '1/levels/championship' pMSX strl '1/levels/msx' pLEVELS strl '0/ ' *----------------------- Standard File Toolset strLOADFILE str 'Load which file?' strSAVEFILE str 'Save as...' typeLIST hex 01 hex 5d ; Game/Edu files replyPTR ds 2 ; 0 good ds 2 ; 2 fileType ds 2 ; 4 auxFileType namePATH hex 07 ; 6 fileName namePATH1 asc 'Niveaux' ; 7 fileName (16 normally) ds 8 loadPATH ds 1 ; 22 fullPathname (string length) loadPATH1 ds 129 ; 23 fullPathname (128 normally) *---------------------------------------- * LES AUTRES FICHIERS *---------------------------------------- put LR.MIDI.s put LR.Intro.s put sprite1.s put sprite2.s put sprite3.s put sprite4.s put sprite5.s put sprite6.s put sprite7.s put sprite8.s put LR.Code.s put LR.Data.s put LR.Tables.s put LR.Sprites.s ; 8-bits sprites put LR.Sprites2.s ; 16-col sprites *--- asc 8d8d asc "Lode Runner IIgs"8d asc 8d asc "Antoine Vignau & Olivier Zardini"8d asc "(c) 2024, Brutal Deluxe Software"8d asc "(c) 2024 Tozai Games"8d8d