* * Lode Runner * (c) 1983, Broderbund Software * (s) 2014, 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 *----------------------------------- Constantes ext ptrUNPACK ext ptrBACKGND ext ptrIMAGE ext ptrTITLE ext ptrLEVELS ext ptrSCORES ext HGR2 *-------------- Softswitches RDVBLBAR = $e0c019 GSOS = $e100a8 *-------------- GUI alertQUIT = $0100 alertRESTART = $0200 refIsPointer = 0 refIsHandle = 1 refIsResource = 2 appleKey = $0100 mouseDownEvt = $0001 mouseUpEvt = $0002 keyDownEvt = $0003 ptr012000 = $012000 ptrE12000 = $e12000 *--- TRUE = 255 FALSE = 0 *----------------------------------- Entry point phk plb clc xce rep #$30 _TLStartUp pha _MMStartUp pla sta mainID ora #$0100 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 *--- Compacte la mémoire okVERS PushLong #0 PushLong #$8fffff PushWord myID PushWord #%11000000_00000000 PushLong #0 _NewHandle _DisposeHandle _CompactMem *--- Chargement des outils pha pha PushWord mainID PushWord #refIsResource PushLong #1 _StartUpTools PullLong SStopREC bcc okTOOL pha PushLong #tolSTR1 PushLong #errSTR2 PushLong #errSTR1 PushLong #errSTR2 _TLTextMountVolume pla brl meQUIT1 *--- Test default shadowing... 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 *--- Et la musique... okSHADOW pha _SoundToolStatus pla bne noSOUND lda #1 sta fgSND noSOUND _HideMenuBar _InitCursor _HideCursor PushWord #0 PushWord #%11111111_11111111 PushWord #0 _FlushEvents pla PushLong #0 PushWord #5 ; SetDeskPat PushWord #$4000 PushWord #$0000 _Desktop pla pla *----------------------------------- Exit point ldx #256-2 ; efface la page directe ]lp stz $00,x dex dex bpl ]lp jsr find4PLAY ; do we have a 4play? lda #0 beq noPATCH jsr setLRPALETTE ; set the LR palette lda #tblSPRITES2 sta patchSPR1+1 sta patchSPR2+1 sta patchSPR3+1 noPATCH jsr loadLEVELS ; exit 8-bit mx %11 lda #refSPEED ; try to slow it down a bit sta theSPEED lda ptrSCREEN+2 sta ptrHGR1+2 brl theGAME mx %00 ; The 16-bit world *----------------------------------- * AUTRES ROUTINES *----------------------------------- *----------------------------------- Open LEVELS doLOAD clc xce rep #$30 * jsr saveBACK _ShowCursor PushWord #30 PushWord #43 PushLong #strLOADFILE PushLong #0 PushLong #typeLIST PushLong #replyPTR _SFGetFile * jsr loadBACK _HideCursor lda replyPTR bne doLOAD1 sep #$30 sec rts mx %00 doLOAD1 jsr copyPATH loadLEVELS clc xce 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 clc rts mx %00 loadLEVELS9 rep #$30 ldx #0 ; clear all levels txa ]lp stal ptrLEVELS,x inx inx cpx #38400 ; 150 x 256 bcc ]lp ldx #256-2 ]lp lda scoreEMPTY,x sta scorebuf,x stal ptrSCORES,x dex dex bpl ]lp sep #$30 sec rts mx %00 *----------------------------------- Save doSAVE clc xce rep #$30 * jsr saveBACK _ShowCursor PushWord #25 PushWord #36 PushLong #strSAVEFILE PushLong #namePATH PushWord #15 PushLong #replyPTR _SFPutFile _HideCursor * jsr loadBACK lda replyPTR bne doSAVE1 sep #$30 sec rts mx %00 doSAVE1 jsr copyPATH saveLEVELS clc xce 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 PushWord #refIsHandle PushLong SStopREC _ShutDownTools meQUIT1 PushWord myID _DisposeAll PushWord mainID _DisposeAll PushWord mainID _MMShutDown _TLShutDown jsl GSOS dw $2029 adrl proQUIT brk $bd *---------------------------------------- * GFX *---------------------------------------- *---------------------------- * 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 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 lenDATA ; Y = length of unpacked data rts *--- lenDATA ds 4 mx %00 *----------------------------------- * SAVE THE SHR SCREEN *----------------------------------- saveBACK _HideCursor PushLong ptrSCREEN PushLong #ptrBACKGND PushLong #32768 _BlockMove _ShowCursor rts *----------------------------------- * RESTORE THE SHR SCREEN *----------------------------------- loadBACK _HideCursor PushLong #ptrBACKGND PushLong ptrSCREEN PushLong #32768 _BlockMove * _ShowCursor rts *---------------------------------------- * SET STANDARD 320 PALETTE *---------------------------------------- setSTDPALETTE PushWord #0 PushLong #palette320 _SetColorTable rts *---------------------------------------- * SET LODE RUNNER 320 PALETTE *---------------------------------------- setLRPALETTE PushWord #0 PushLong #paletteLR _SetColorTable rts *---------------------------------------- * CHECK KEY PRESSED *---------------------------------------- checkKEY phx phy rep #$30 pha PushWord #%00000000_00001000 PushLong #taskREC _GetNextEvent pla beq checkNOKEY lda taskREC ; une touche ? cmp #keyDownEvt bne checkNOKEY sep #$30 ply plx lda taskMESSAGE stal $300 ora #%1000_0000 ; set bit 7 rts mx %00 checkNOKEY sep #$30 ply plx lda #0 rts mx %00 *---------------------------------------- * 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 rep #$30 rts *---------------------------------------- mx %11 read4PLAY ldal $e0C080 ; direct "fast" read sta the4PLAY rts mx %00 *---------- Data *---------------------------------------- * DATA *---------------------------------------- fgSND 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 '' errSTR3 str 'Continue' *----------------------- Memory manager mainID ds 2 ; app ID myID ds 2 ; user ID myDP ds 2 SStopREC ds 4 ptrSCREEN adrl ptr012000 *----------------------- QuickDraw II palette320 dw $0000,$0777,$0841,$072C,$000F,$0080,$0F70,$0D00 dw $0FA9,$0FF0,$00E0,$04DF,$0DAF,$078F,$0CCC,$0FFF paletteLR dw $0445,$0000,$0FFF,$0952,$00BB,$01DD,$0FF0,$0A1A dw $0C0C,$0FCB,$0A10,$0C30,$0E50,$0666,$0AAA,$0FFF *----------------------- Event / 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 *----------------------- 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 2 ds 2 adrl pLEVELS proREAD dw 4 ; 0 - nb parms ds 2 ; 2 - file id adrl ptrLEVELS ; 4 - pointer adrl 38400+256 ; 8 - length ds 4 ; C - length read proWRITE dw 5 ; 0 - pcount ds 2 ; 2 - ref_num adrl ptrLEVELS ; 4 - data_buffer adrl 38400+256 ; 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 pLEVELS strl '0/levels/loderunner' *----------------------- 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 06 ; 6 fileName namePATH1 asc 'Levels' ; 7 fileName (16 normally) ds 9 loadPATH ds 1 ; 22 fullPathname (string length) loadPATH1 ds 129 ; 23 fullPathname (128 normally) *---------------------------------------- * LES AUTRES FICHIERS *---------------------------------------- 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 0d asc "----------------"0d asc " "0d asc " LODE RUNNER "0d asc " "0d asc " Antoine Vignau "0d asc "Olivier Zardini"0d asc " "0d asc " Paques 2024 "0d asc " "0d asc "----------------"0d