Stardust.asm (16,348 bytes)
2012-03-21 19:31
;*---------------------------------------------------------------------------
; :Program. Stardust.asm
; :Contents. Slave for "Stardust" from Bloodhouse
; :Author. Mr.Larmer of Wanted Team, Bored Seal, Wepl
; :Id. $Id: Stardust.asm 1.10 2009/08/09 23:21:22 wepl Exp wepl $
; :History. 27.03.2000 - first release (Mr Larmer)
; (Bored Seal) 29.11.2000 - asteroids and menu access faults removed
; - highscore is saved to file now
; 02.12.2000 - disk access removed
; - password feature
; 10.12.2000 - tunnel 1 faults removed
; - tunnel 2 faults removed
; - tunnel 3 faults removed
; 11.12.2000 - tunnel 4 faults removed
; - special missions fixed
; 13.12.2000 - access fault in outro fixed
; - quit routine for outro added
; 19.12.2000 - intro - blitter waits added
; - boot - cacr+vbr access removed
; - skip intro option added (custom1)
; 09.01.2001 - my bug in loader removed (intro sound works now)
; - outro quit routine removed - useless
; - game - 4x blitter waits added
; 25.06.2006 Wepl
; termination of taglist for resload_Control fixed to
; work with WHDLoad v16.6
; uses 'data' subdir
; 03.05.2009 Wepl
; version checks for intro and main added
; loader/stack relocated to fast mem
; :Requires. -
; :Copyright. Public Domain
; :Language. 68000 Assembler
; :Translator. Devpac 3.14
; :To Do.
;---------------------------------------------------------------------------*
INCDIR Include:
INCLUDE whdload.i
INCLUDE whdmacros.i
IFD BARFLY
OUTPUT "wart:st/stardust/Stardust.Slave"
BOPT O+ ;enable optimizing
BOPT OG+ ;enable optimizing
BOPT ODd- ;disable mul optimizing
BOPT ODe- ;disable mul optimizing
BOPT w4- ;disable 64k warnings
SUPER
ENDC
base
SLAVE_HEADER ;ws_Security + ws_ID
dc.w 10 ;ws_Version
dc.w WHDLF_NoError|WHDLF_EmulTrap|WHDLF_NoKbd
dc.l $100000 ;ws_BaseMemSize
dc.l 0 ;ws_ExecInstall
dc.w Start-base ;ws_GameLoader
dc.w _dir-base ;ws_CurrentDir
dc.w 0 ;ws_DontCache
_keydebug dc.b 0 ;ws_keydebug = none
_keyexit dc.b $59 ;ws_keyexit
_expmem dc.l $2000 ;ws_ExpMem
dc.w _name-base ;ws_name
dc.w _copy-base ;ws_copy
dc.w _info-base ;ws_info
IFD BARFLY
DOSCMD "WDate >T:date"
ENDC
_dir dc.b "data",0
_name dc.b "Stardust",0
_copy dc.b "1993 Bloodhouse",0
_info dc.b "installed & fixed by Mr.Larmer/Bored Seal/Wepl",10
dc.b "V1.5 "
IFD BARFLY
INCBIN "T:date"
ENDC
dc.b 0
_savename dc.b 'Highs',0
_password dc.b 'Password',0
EVEN
Start lea _resload,a1
move.l a0,(a1)
move.l a0,a2
; move.l #CACRF_EnableI,d0
; move.l d0,d1
; jsr (resload_SetCACR,a2)
lea (_tags,pc),a0
jsr (resload_Control,a2)
move.l _expmem,a6
lea ($400,a6),a7
add.w #$800,a6
move.l a6,usp
move #0,sr
move.l a6,a0
move.l #$136,d0
move.l #$1370-$136,d1
moveq #1,d2
jsr (resload_DiskLoad,a2)
lea $78000+$12d2,a0 ;copper list
move.l #$12d2,d0
move.l #$1366-$12dc,d1
jsr (resload_DiskLoad,a2)
;relocate the loader manually
lea .relocs,a0
move.l a6,d0
sub.l #$78000,d0
bra .relin
.rel sub.w #$136,d1
add.l d0,(a6,d1.w)
.relin move.w (a0)+,d1
bne .rel
;skip intro
move.l _c1,d0
beq .1
move.b #$60,($18e-$136,a6)
.1
;patch
lea _pl_boot,a0
move.l a6,a1
jsr (resload_Patch,a2)
move.l #$80000,d7 ; ext mem
jmp (a6)
.relocs dc.w $13c,$14e,$154,$1c2,$1dc,$1e6,$24e,$308,$30e,$314,$31a,$320,$326,$3a6,$3ac,0
_pl_boot PL_START
PL_PS $144-$136,.ec
PL_S $158-$136,$2e ;disk access (to $186)
; PL_BELL $226-$136,100
PL_PS $22a-$136,PatchIntro
PL_PS $256-$136,.ec
PL_P $29c-$136,PatchGame
PL_P $686-$136,Load
PL_W $12d4-$136,$1200 ;bplcon1
PL_END
.ec move.l (a7),a0
move.l (-6-8,a0),a0
lea $78000,a1
lea _custom,a6
move.l a1,(cop1lc,a6)
.ec_cpy move.l (a0)+,(a1)+
bpl .ec_cpy
tst.w (copjmp1,a6)
move.w #DMAF_SETCLR|DMAF_COPPER,(dmacon,a6)
addq.l #2,(a7)
rts
PatchIntro movem.l a0-a3,-(a7)
bsr _getcrc
cmp.w #$ac57,d0
bne _wrongver
lea _pl_intro,a0
move.l a5,a1
jsr (resload_Patch,a6)
movem.l (a7)+,_MOVEMREGS
jmp (a5)
_pl_intro PL_START
PL_PS $23ba,.b1
PL_PS $2752,.p1
PL_END
.b1 bsr _bw
move.l #$9f00012,$dff040
addq.l #4,(a7)
rts
.p1 move.w #INTF_BLIT|INTF_INTEN|INTF_SETCLR,_custom+intena
addq.l #2,(a7)
_bw BLITWAIT
rts
_getcrc lea $80000,a5
clr.l -(a7)
move.l a5,-(a7)
pea WHDLTAG_DBGADR_SET
move.l a7,a0
move.l _resload,a6
jsr (resload_Control,a6)
add.w #12,a7
move.l #$1000,d0
move.l a5,a0
jmp (resload_CRC16,a6)
_wrongver pea TDREASON_WRONGVER
jmp (resload_Abort,a6)
PatchGame bsr _getcrc
lea _pl_main_v1,a0
cmp.w #$e3f1,d0 ;v1
beq .vok
lea _pl_main_v2,a0
cmp.w #$2e64,d0 ;v2
bne _wrongver
.vok move.l a5,a1
jsr (resload_Patch,a6)
move.w #$F080,$4404(a5) ;remove access faults
move.w #$F084,$1778(a5)
move.w #$F084,$2e74(a5)
move.w #$f088,d0
move.w d0,$e816c
move.w d0,$e824a
move.w d0,$e82d2
move.w d0,$e835a
move.w d0,$e8446
move.w d0,$e8522
move.w d0,$e85aa
move.w d0,$e8632
move.w d0,$e86b4
move.w d0,$e86ea
move.w d0,$e87c6
move.w d0,$e88ba
move.w d0,$e893c
move.w d0,$e8972
move.w d0,$e8a4e
move.w d0,$e8b42
move.w d0,$e8bc4
move.w d0,$e8c1e
move.w d0,$e8cc0
move.w d0,$e8d08
move.w d0,$e8d9a
move.w d0,$e8dc6
move.w #$96,$19a0(a5)
move.w #$f09a,d0
move.w d0,$1224(a5)
move.w d0,$11b0(a5)
move.w d0,$11e8(a5)
move.w #$4ef9,d0
move.w d0,$57C(a5)
pea Load
move.l (sp)+,$57E(a5)
move.w d0,$ED41A
pea LoadSaveHighs
move.l (sp)+,$ED41C
move.w d0,$6668(a5)
move.w d0,$ec7d0
pea GetAdr
move.l (sp),$ec7d2
move.l (sp)+,$666a(a5)
move.w #$4e75,$4016(a5) ;no cartridge check
move.l a5,a1 ;80000
lea $f0000,a2
move.w #$4a2e,d1
move.w #$be02,d2
moveq #2,d3
bsr Replace
moveq #$e,d1
bsr Replace
move.w d3,$6522(a5)
move.w #$ac40,d1
moveq #$40,d3
bsr Repl2cod
move.w #$be42,d1
moveq #$42,d3
bsr Repl2cod
move.w #$e648,d1
moveq #$48,d3
bsr Repl2cod
move.w #$d44c,d1
moveq #$4c,d3
bsr Repl2cod
move.w #$c250,d1
moveq #$50,d3
bsr Repl2cod
move.w #$f854,d1
moveq #$54,d3
bsr Repl2cod
move.w d3,$60ae(a5)
move.w d3,$68b4(a5)
move.w d3,$7b48(a5)
move.w #$f458,d1
moveq #$58,d3
bsr Repl2cod
move.w d3,$60b4(a5)
move.w d3,$68b8(a5)
move.w d3,$87b4c
move.w #$ae60,d1
moveq #$60,d3
bsr Repl2cod
move.w #$bc62,d1
moveq #$62,d3
bsr Repl2cod
move.w #$9a64,d1
moveq #$64,d3
bsr Repl2cod
move.w #$b266,d1
moveq #$66,d3
bsr Repl2cod
move.w d3,$87b44
move.w d3,$60a8(a5)
move.w d3,$68b0(a5)
move.w #$f458,d1
move.w #$9a64,d2
move.w #$ae60,d3
move.w #$bc62,d4
move.w #$b266,d5
move.w #$ac40,d6
move.w #$be42,d7
bsr Replace2
move.w #$2d7c,d1
move.w #$ea44,d2
moveq #$44,d3
bsr Replace3
move.w #$c250,d2
moveq #$50,d3
bsr Replace3
move.w #$f854,d2
moveq #$54,d3
bsr Replace3
move.w #$2d79,d1
move.w #$e648,d2
moveq #$48,d3
bsr Replace3
move.w #$f854,d2
moveq #$54,d3
bsr Replace3
move.w d3,$e908a
move.w #$750,d1
move.w #$00df,d2
move.w #$f080,d3
bsr Replace4
move.w #$88c,d1
move.w #$00df,d2
move.w #$f080,d3
bsr Replace4
move.w #$6006,$8ac2c ;disk access
bsr LoadPass
move.l #$4e714eb9,d0
move.l d0,$e8224
pea PatchTun1
move.l (sp)+,$e8228
move.l d0,$e84fc
pea PatchTun2
move.l (sp)+,$e8500
move.l d0,$e87a0
pea PatchTun3
move.l (sp)+,$e87a4
move.l d0,$e8a28
pea PatchTun4
move.l (sp)+,$e8a2c
move.w d0,$e8ca0
pea PatchSM
move.l (sp)+,$e8ca2
move.l d0,$90bec
move.l d0,$88264
pea BlitFix3
move.l (sp),$90bf0
move.l (sp)+,$88268
move.l d0,$83ccc
move.l d0,$842cc
pea BlitFix4
move.l (sp),$83cd0
move.l (sp)+,$842d0
move.w #$4ef9,$12e(a5)
pea PatchOutro
move.l (sp)+,$130(a5)
; move.w #$4ef9,$9e(a5) ;enable outro
; move.l #$8011a,$a0(a5)
jmp (a5)
_pl_main_v1 PL_START
PL_P $340,Decrunch
PL_END
_pl_main_v2 PL_START
PL_END
PatchSM movem.l a0-a4/d0-d5,-(sp)
move.w #$96,$8f4
move.w #$f050,$30b0
move.w #$f058,$30b6
move.w #$40,$3094
move.w #$42,$309a
move.w #$64,$30a0
move.w #$66,$30a6
move.w #$54,$30e2
lea $178e,a1 ;access fault fixes
lea $5000,a2
moveq #$e,d1
move.w #$802,d2
moveq #2,d3
bsr Replace
move.w #$2d7c,d1
move.w #$e44,d2
moveq #$44,d3
bsr Replace3
movem.l (sp)+,a0-a4/d0-d5
move.w $e8bf2,d3
jmp (a5)
PatchOutro move.w #2,$1358 ;fix access fault
jmp $7d4
PatchTun4 movem.l a0-a4/d0-d5,-(sp)
move.w #$6006,$1dde
lea $db0,a1 ;access fault fixes
lea $6460,a2
move.w #$4a6d,d1
move.w #$602,d2
moveq #2,d3
bsr Replace
moveq #$e,d1
bsr Replace
move.w d3,$3de8
move.w d3,$45da
move.w #$440,d1
moveq #$40,d3
bsr Repl2cod
move.w #$642,d1
moveq #$42,d3
bsr Repl2cod
move.w #$848,d1
moveq #$48,d3
bsr Repl2cod
move.w #$84c,d1
moveq #$4c,d3
bsr Repl2cod
move.w #$650,d1
moveq #$50,d3
bsr Repl2cod
move.w #$a54,d1
moveq #$54,d3
bsr Repl2cod
move.w d3,$63e4
move.w #$e58,d1
moveq #$58,d3
bsr Repl2cod
move.w #$c60,d1
moveq #$60,d3
bsr Repl2cod
move.w #$e66,d1
moveq #$66,d3
bsr Repl2cod
move.w #$e58,d1
move.w #$a64,d2
move.w #$c60,d3
move.w #$c62,d4
move.w #$e66,d5
move.w #$642,d6
move.w #$440,d7
bsr Replace2
move.w #$2b7c,d1
move.w #$444,d2
moveq #$44,d3
bsr Replace3
move.w d3,$5e36
move.w d3,$63de
bra RunIt
PatchTun3 movem.l a0-a4/d0-d5,-(sp)
move.w #$6006,$181a
lea $d40,a1 ;access fault fixes
lea $6470,a2
move.w #$4a6d,d1
move.w #$202,d2
moveq #2,d3
bsr Replace
moveq #$e,d1
bsr Replace
move.w d3,$3d48
move.w d3,$460c
move.w #$c40,d1
moveq #$40,d3
bsr Repl2cod
move.w #$442,d1
moveq #$42,d3
bsr Repl2cod
move.w #$e48,d1
moveq #$48,d3
bsr Repl2cod
move.w #$64c,d1
moveq #$4c,d3
bsr Repl2cod
move.w #$250,d1
moveq #$50,d3
bsr Repl2cod
move.w #$c54,d1
moveq #$54,d3
bsr Repl2cod
move.w d3,$641e
move.w #$a58,d1
moveq #$58,d3
bsr Repl2cod
move.w #$260,d1
moveq #$60,d3
bsr Repl2cod
move.w #$866,d1
moveq #$66,d3
bsr Repl2cod
move.w #$a58,d1
move.w #$664,d2
move.w #$260,d3
move.w #$462,d4
move.w #$866,d5
move.w #$442,d6
move.w #$c40,d7
bsr Replace2
move.w #$2b7c,d1
move.w #$244,d2
moveq #$44,d3
bsr Replace3
move.w d3,$5e70
move.w d3,$6418
bra RunIt
PatchTun2 movem.l a0-a4/d0-d5,-(sp)
move.w #$6006,$11e4 ;disk access
lea $d30,a1 ;access fault fixes
lea $6390,a2
move.w #$4a6d,d1
move.w #$202,d2
moveq #2,d3
bsr Replace
moveq #$e,d1
bsr Replace
move.w d3,$3d30
move.w d3,$454a
move.w #$840,d1
moveq #$40,d3
bsr Repl2cod
move.w #$e42,d1
moveq #$42,d3
bsr Repl2cod
move.w #$648,d1
moveq #$48,d3
bsr Repl2cod
move.w #$44c,d1
moveq #$4c,d3
bsr Repl2cod
move.w #$250,d1
moveq #$50,d3
bsr Repl2cod
move.w #$854,d1
moveq #$54,d3
bsr Repl2cod
move.w d3,$6358
move.w #$258,d1
moveq #$58,d3
bsr Repl2cod
move.w #$e60,d1
moveq #$60,d3
bsr Repl2cod
move.w #$866,d1
moveq #$66,d3
bsr Repl2cod
move.w #$258,d1
move.w #$a64,d2
move.w #$e60,d3
move.w #$e62,d4
move.w #$866,d5
move.w #$e42,d6
move.w #$840,d7
bsr Replace2
move.w #$2b7c,d1
move.w #$444,d2
moveq #$44,d3
bsr Replace3
move.w d3,$5dac
move.w d3,$6352
bra RunIt
PatchTun1 move.w #$6006,$5832 ;disk access
movem.l a0-a4/d0-d5,-(sp)
lea $7d0,a1 ;access fault fixes
lea $bd28,a2
move.w #$4a6d,d1
move.w #$602,d2
moveq #2,d3
bsr Replace
move.w d3,$35f8
move.w d3,$3db4
moveq #$e,d1
bsr Replace
move.w #$0440,d1
moveq #$0040,d3
bsr Repl2cod
move.w #$0c40,d1
bsr Repl2cod
move.w #$be42,d1
moveq #$42,d3
bsr Repl2cod
move.w #$0242,d1
bsr Repl2cod
move.w #$848,d1
moveq #$48,d3
bsr Repl2cod
move.w #$84c,d1
moveq #$4c,d3
bsr Repl2cod
move.w #$650,d1
moveq #$50,d3
bsr Repl2cod
move.w #$654,d1
moveq #$54,d3
bsr Repl2cod
move.w d3,$5cf2
move.w #$e58,d1
moveq #$58,d3
bsr Repl2cod
move.w #$c60,d1
moveq #$60,d3
bsr Repl2cod
move.w #$a62,d1
moveq #$62,d3
bsr Repl2cod
move.w #$264,d1
moveq #$64,d3
bsr Repl2cod
move.w #$e66,d1
moveq #$66,d3
bsr Repl2cod
move.w #$e58,d1
move.w #$264,d2
move.w #$c60,d3
move.w #$a62,d4
move.w #$e66,d5
move.w #$440,d6
move.w #$242,d7
bsr Replace2
move.w #$2b7c,d1
move.w #$444,d2
moveq #$44,d3
bsr Replace3
move.w d3,$5426
move.w d3,$5cec
RunIt movem.l (sp)+,a0-a4/d0-d5
movea.w $ed406,a4
jmp (a5)
GetAdr lea $dff000,a6
rts
Repl2cod move.l a1,a0 ;opravuje $xxxxd1d1 => $xxxxd3d3
Hunt0 move.w (a0),d5
cmp.w d1,d5
bne skip0
move.w -2(a0),d5
cmp.w #$2b40,d5
blt skip0
cmp.w #$3d50,d5
bgt skip0
cmp.w #$3001,d5
beq skip0
cmp.w #$303a,d5
beq skip0
cmp.w #$3404,d5
beq skip0
move.w d3,(a0)
skip0 lea 2(a0),a0
cmp.l a2,a0
ble Hunt0
rts
Replace move.l a1,a0 ;opravuje $D1D1D2D2 -> $D1D1D3D3
Hunt move.w (a0)+,d5
cmp.w d1,d5
bne skip
move.w (a0),d5
cmp.w d2,d5
bne skip
move.w d3,(a0)
skip cmp.l a2,a0
ble Hunt
rts
Replace2 move.l a1,a0 ;opravuje $3bxxXXXX0558
Hunt1 cmp.w #$3b7c,(a0)
beq ast
cmp.w #$3b7a,(a0)
beq ast
cmp.w #$3d7c,(a0)
bne skip1
ast move.w 4(a0),d0
cmp.w d1,d0
beq and4
cmp.w d2,d0
beq and4
cmp.w d3,d0
beq and4
cmp.w d4,d0
beq and4
cmp.w d5,d0
beq and4
cmp.w d6,d0
beq and4
cmp.w d7,d0
bne skip1
and4 and.w #$00FF,d0
move.w d0,4(a0)
skip1 lea 2(a0),a0
cmp.l a2,a0
ble Hunt1
rts
Replace3 move.l a1,a0 ;D1D1xxxxXXXXD2D2 => D1D1xxxxXXXXD3D3
Hunt2 move.w (a0)+,d5
cmp.w d1,d5
bne skip2
move.w 4(a0),d5
cmp.w d2,d5
bne skip2
move.w d3,4(a0)
skip2 cmp.l a2,a0
ble Hunt2
rts
Replace4 move.l a1,a0 ;$D1D1D2D2xxxx => D1D1D2D2D3D3
Hunt4 move.w (a0)+,d5
cmp.w d1,d5
bne skip4
move.w (a0),d5
cmp.w d2,d5
bne skip4
move.w d3,2(a0)
skip4 cmp.l a2,a0
ble Hunt4
rts
Decrunch pea ($10,a0) ;start
move.l (6,a0),-(a7) ;length
move.l _expmem,a2
jsr ($800+$446-$136,a2)
move.l (a7)+,a1 ;length
move.l (a7)+,a0 ;start
add.l a0,a1
.loop cmp.l #$48E7E040,(a0)
bne.b .next
cmp.l #$34197000,4(a0)
bne.b .next
move.w #$4EF9,(a0)
pea Load
move.l (sp)+,2(a0)
.next cmp.l #$5C882218,(a0)
bne.b .next2
cmp.w #$2418,4(a0)
bne.b .next2
move.w #$4EB9,(a0)
pea Decrunch
illegal
move.l (sp)+,2(a0)
.next2 addq.l #2,a0
cmp.l a0,a1
bne.b .loop
movem.l (a7)+,d2-d7/a0-a4 ;original
moveq #0,d0 ;original
rts
; .w disk number (0..2)
; .3 offset (custom track is $1830, therefore +$230)
; .3 length
Load movem.l d0/d2-a6,-(sp)
moveq #0,d2
move.w (a1)+,d2
addq.b #1,d2
move.l (a1),d0
lsr.l #8,d0
sub.l #$230,d0
move.l 2(a1),d1
and.l #$FFFFF,d1
move.l d1,-(sp)
move.l _resload,a2
jsr resload_DiskLoad(a2)
move.l (sp)+,d1
movem.l (sp)+,d0/d2-a6
rts
LoadPass movem.l d0-a6,-(sp)
bsr Params
lea _password,a0
move.l a0,a5
jsr (resload_GetFileSize,a2)
tst.l d0
beq NoPass
move.l a5,a0
lea $ece6c,a1
jsr (resload_LoadFile,a2)
NoPass movem.l (sp)+,d0-a6
rts
LoadSaveHighs movem.l d0-a6,-(sp)
tst.w $ED414
bne .save
move.l a0,a5
bsr Params
jsr (resload_GetFileSize,a2)
tst.l d0
beq end
bsr Params
move.l a5,a1
jsr (resload_LoadFile,a2)
bra end
.save moveq #$4a,d0 ;len
lea (a0),a1 ;address
bsr Params
jsr (resload_SaveFile,a2)
lea _password,a0
lea $ece6c,a1
moveq #12,d0
jsr (resload_SaveFile,a2)
end movem.l (sp)+,d0-a6
moveq #0,d0
rts
Params lea _savename,a0
move.l _resload,a2
rts
BlitFix bsr BlitWait
move.l $86ef0,$dff054
rts
BlitFix2 move.w #$202c,$dff058
BlitWait btst #6,$dff002
bne BlitWait
rts
BlitFix3 bsr BlitWait
move.l #$ffff0000,$44(a6)
rts
BlitFix4 bsr BlitWait
move.w d1,$42(a6)
ori.w #$fca,d1
rts
_tags dc.l WHDLTAG_CUSTOM1_GET
_c1 dc.l 0
dc.l 0
_resload dc.l 0