Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Lode Runner (partial) original assembly source

902 views
Skip to first unread message

Michael 'AppleWin Debugger Dev'

unread,
Apr 21, 2018, 10:02:18 AM4/21/18
to
Another Br0derbund product with a snippet of the original assembly source!

Memory: $9E00

- - - 8< - - -
QU $1C35
ytable EQU $1C51
bytable EQU $1C62
bitable EQU $1C7E
xbytable EQU $1C9A
xbitable EQU $1D26
boot EQU $1DB2
scorebuff EQU $1F00
chardata EQU $AD00
rwtsparm EQU $B7E8
rwtsvolm EQU $B7EB
rwtstrck EQU $B7EC
rwtssect EQU $B7ED
rwtsbuff EQU $B7F0
rwtscmn
- - - 8< - - -

NOTE: The entire Data Disk Boot Sector is located at Mem $1DB2.

DSK: broderbund_loderunner_4play_revA.dsk
T11,SE

DSK: LodeRunner Corrupt Computing Crack.dsk
T18,SE

DSK: lode_runner1.po
T0D,S9,@07 - T0D,S8,@00
NOTE: Disk is non-original DOS 3.3 game collection


I'll provide a proper "Apple Games Disassembly Project" for Lode Runner
at some point but here are some interesting memory locations in the mean time:

zPlayerX EQU $00 ; Read @ GetPlayerFrame = 6B85
zPlayerY EQU $01 ; Read @ GetPlayerFrame = 6B85
zPlayerH EQU $02 ; Read @ GetPlayerFrame = 6B85, INC Horizontal Frame @ 6681
zPlayerV EQU $03 ; Read @ GetPlayerFrame = 6B85, DEC Vertical Frame @ 672D
zPlayerState EQU $04 ; Inc @ 6BF4
zEnemyX EQU $12 ; Read @ 74DF
zEnemyY EQU $13 ; Read @ 74DF
zEnemyState EQU $14
zEnemyH EQU $17 ; Read @ 74DF Horizontal Frame
zEnemyV EQU $18 ; Read @ 74DF Vertical Frame
zGoldLeft EQU $93 ; Amount of gold left in level
zDemoState EQU $A7 ; 0=Title, 1=Demo, 2=HighScore/Playing
zTempSprite EQU $DF ; 3 byte (cols) x 12 rows = 36 bytes ($21)

DemoStart EQU $609F ; Start of next demo level
DemoMain EQU $60E4 ; Main loop when demo active
MapNoGold EQU $60F2 ; Player has picked up all gold $93
ErasePlayer EQU $6600 ; See DrawPlayer @ 6C02
PickUpGold EQU $6BBD ; Player picked up gold

DrawPlayer EQU $6C02 ; See ErasePlayer @ 6600
GetPlayerFrame EQU $6B85 ; Similiar to GetEnemyFrame @ 74DF
GetEnemyFrame EQU $74DF ; Similiar to GetPlayerFrame @ 6B85
EnemyGotGold EQU $7538 ; Bungling picked up gold

EraseSprite EQU $8336 ; Erase TempSprite at $DF
DrawSprite1 EQU $8376
DrawSprite2 EQU $83A7 ; Draw TempSprite at $DF


P.S.
I guess someone should add "Lode Runner" to: The Cutting Room Floor
https://tcrf.net/

And make sure it is added to the Category: Lode Runner
https://tcrf.net/Category:Lode_Runner_series

Antoine Vignau

unread,
Apr 21, 2018, 11:55:27 AM4/21/18
to
I once disassembled Lode Runner, I'll try to find my "source code" and upload it,
av

Antoine Vignau

unread,
Apr 21, 2018, 12:01:38 PM4/21/18
to
On Saturday, April 21, 2018 at 5:55:27 PM UTC+2, Antoine Vignau wrote:
> I once disassembled Lode Runner, I'll try to find my "source code" and upload it,
> av

Available at http://www.brutaldeluxe.fr/public/

av

Michael 'AppleWin Debugger Dev'

unread,
Apr 21, 2018, 1:34:02 PM4/21/18
to
WOW! Thanks Antoine!! This will definitely speed things up!!!

On one hand this kind of takes the "fun" out of it, but on the other side it DOES free me up to work on other games! ;-)

How did you generate the disassembly by the way?


I see you don't have the two cheat codes documented -- you'll want to update your notes:

File: LR.CODE.S

L6B67 DA L6A56-1 ; 9E CTRL-^ / Cheat Next Level
DA L6A61-1 ; 80 CTRL-@ / Cheat Extra Life


*--- CTRL-^ / Cheat Next Level
*--- CTRL-@ / Cheat Extra Life


Here is some additional info. that you will probably be of interest:

Lode Runner's sprite render is over-engineered, IMHO, because it re-uses sprite data in order to save memory. (I still need to work out what the total number of bytes would be for the uncompressed sprite data would be.)

The data at $A900 is the raw tile (sprite) data -- your DW should be replaced with DB because the data is accessed via *over-lapping* bytes and stored into the TempSprite (3x12 -- yes three!?) at $DF with the CopySprite function at $8438.

The data at $AD00 is in SoA (Structure of arrays) format where each array has $68 elements (i.e. 847C and 84AF: ADC #$68). It should be converted from HEX format to DB format.

#define NUM_SPRITES 104

struct SpriteScanlineIndex
{
char sprite_0a[ NUM_SPRITES ]; // $AD00
char sprite_0b[ NUM_SPRITES ]; // $AD68

char sprite_1a[ NUM_SPRITES ]; // $ADD0
char sprite_1b[ NUM_SPRITES ]; // $AE38

char sprite_2a[ NUM_SPRITES ]; // $AEA0
char sprite_2b[ NUM_SPRITES ]; // $AF08

char sprite_3a[ NUM_SPRITES ]; // $AF70
char sprite_3b[ NUM_SPRITES ]; // $AFD8

char sprite_4a[ NUM_SPRITES ]; // $B040
char sprite_4b[ NUM_SPRITES ]; // $B0A8

char sprite_5a[ NUM_SPRITES ]; // $B110
char sprite_5b[ NUM_SPRITES ]; // $B178

char sprite_6a[ NUM_SPRITES ]; // $B1E0
char sprite_6b[ NUM_SPRITES ]; // $B248

char sprite_7a[ NUM_SPRITES ]; // $B2B0
char sprite_7b[ NUM_SPRITES ]; // $B318

char sprite_8a[ NUM_SPRITES ]; // $B380
char sprite_8b[ NUM_SPRITES ]; // $B3E8

char sprite_9a[ NUM_SPRITES ]; // $B450
char sprite_9b[ NUM_SPRITES ]; // $B4B8

char sprite_Aa[ NUM_SPRITES ]; // $B520
char sprite_Ab[ NUM_SPRITES ]; // $B588
} // $B5EF end


i.e.

1. Boot the game, wait for title to appear
2. AppleWin: F7
3. BPM A900
4. MD1 DF
5. The copy sprite code is self-modifying.

i.e.
846D: LDA $A900 ; SELF-MODIFIED @ 8469,
8474: LDA $A901 ; SELF-MODIFIED @ 846C

$A900 -> $DF ; Read @ 846F ($0A = $AD00)
$A901 -> $E0 ; Read @ 8474
$A900 OR $E0 -> $E0 ; Read @ 84A0
$A901 -> $E1 ; Read @ 84A7

$A900 -> $E2 ; Read @ 846F ($0A = $AD68)
$A901 -> $E3 ; Read @ 8474
$A900 OR $E0 -> $E3 ; Read @ 84A0
$A901 -> $E4 ; Read @ 84A7

* Do you mind if I use this as a base to build off and replace all the L#### pseudo-symbols with descriptive function names? :-)
* Do you mind if I throw this up on GitHub?

Cheers
Michael

Antoine Vignau

unread,
Apr 21, 2018, 2:37:24 PM4/21/18
to
Great info, Michael!
Do whatever you want with that :-)
I did the disassembly with The Flaming Bird Disassembler after I cracked the game.

Antoine

dowo...@gmail.com

unread,
Jun 2, 2020, 7:17:21 AM6/2/20
to
Did this ever get posted to Github? I would be very interested in looking through the code.

Michael 'AppleWin Debugger Dev'

unread,
Jun 3, 2020, 2:04:35 PM6/3/20
to
Sadly, not yet. I'll add it to my "projects queue".

John Faulkenbury

unread,
Jul 5, 2023, 11:51:31 PM7/5/23
to
On Wednesday, June 3, 2020 at 1:04:35 PM UTC-5, Michael 'AppleWin Debugger Dev' wrote:
> Sadly, not yet. I'll add it to my "projects queue".

Bump for adding it to github! Also Antoine's source is gone from the Brutal Deluxe directory as well.

Antoine Vignau

unread,
Jul 8, 2023, 12:36:16 PM7/8/23
to
Oops, here it is on github @ https://github.com/antoinevignau/source/tree/main/loderunner

Antoine

John Faulkenbury

unread,
Jul 8, 2023, 5:26:49 PM7/8/23
to
Thank you!

Ant

unread,
Jul 8, 2023, 8:50:41 PM7/8/23
to
Antoine Vignau <ntn.v...@gmail.com> wrote:
> On Thursday, July 6, 2023 at 5:51:31???AM UTC+2, John Faulkenbury wrote:
> > On Wednesday, June 3, 2020 at 1:04:35???PM UTC-5, Michael 'AppleWin Debugger Dev' wrote:
> > > Sadly, not yet. I'll add it to my "projects queue".
> > Bump for adding it to github! Also Antoine's source is gone from the Brutal Deluxe directory as well.

> Oops, here it is on github @ https://github.com/antoinevignau/source/tree/main/loderunner

> Antoine

Wow, was this leaked or was it legally released?
--
"'Woe to me!' [Isaiah] cried. 'I am ruined! For I am a man of unclean lips, and I live among a people of unclean lips, and my eyes have seen the King, the Lord Almighty.'" --Isaiah 6:5. Quieter days after crazy days, but 2 much Z & pooping! :/
Note: A fixed width font (Courier, Monospace, etc.) is required to see this signature correctly.
/\___/\ Ant(Dude) @ http://aqfl.net & http://antfarm.home.dhs.org.
/ /\ /\ \ Please nuke ANT if replying by e-mail.
| |o o| |
\ _ /
( )
0 new messages