home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 13
/
AACD13.ISO
/
AACD
/
Games
/
WHDLoad
/
Extra
/
RawDIC17.lha
/
Examples
/
Mercenary2save.islave.asm
< prev
next >
Wrap
Assembly Source File
|
1999-03-02
|
4KB
|
151 lines
; Mercenary 2 - Damocles savegame imager
; A track contains $1800 bytes of data.
; The format is singlesided, both sides contain the same data.
; track format description:
; sync ($4489)
; 4 unused bytes ($12345678)
; 1 byte track number
; $1800 bytes data
; 1 word checksum
; The checksum is calculated by adding all data bytes to a word variable
; which is rotated to the left every step.
; The MFM decoding is done by skipping all odd bits in the bitstream.
; Similar formats: All other Novagen games on Amiga
incdir Includes:
include RawDIC.i
SLAVE_HEADER
dc.b 1 ; Slave version
dc.b 0 ; Slave flags
dc.l DSK_1 ; Pointer to the first disk structure
dc.l Text ; Pointer to the text displayed in the imager window
dc.b "$VER:"
Text: dc.b "Damocles savegame imager V1.0",10,"by John Selck on 02.03.1999",0
cnop 0,4
DSK_1: dc.l 0 ; Pointer to next disk structure
dc.w 1 ; Disk structure version
dc.w DFLG_SINGLESIDE|DFLG_ERRORS ; Disk flags
dc.l TL_1 ; List of tracks which contain data
dc.l 0 ; UNUSED, ALWAYS SET TO 0!
dc.l FL_NULL ; List of files to be saved
dc.l 0 ; Table of certain tracks with CRC values
dc.l 0 ; Alternative disk structure, if CRC failed
dc.l 0 ; Called before a disk is read
dc.l SaveFiles ; Called after a disk has been read
TL_1: TLENTRY 2,21,$1800,SYNC_INDEX,DMFM_NovagenSG
TLEND
DMFM_Novagen: ; Decoder for tracks in Novagens very own format.
moveq #0,d1
moveq #20,d2
.l0 bsr.b NextByte
lsl.l #8,d1
move.b d0,d1
cmp.l #$12345678,d1
dbeq d2,.l0
bsr.b NextByte ; skip track number
moveq #0,d2
move.w #$17ff,d1
.l1 bsr.b NextByte ; decode data
add.b d0,d2
rol.w #1,d2
move.b d0,(a1)+
dbra d1,.l1
bsr.b NextByte ; compare checksum on disk
move.b d0,d1 ; with calculated sum
bsr.b NextByte
lsl.w #8,d1
move.b d0,d1
rol.w #8,d1
cmp.w d1,d2
bne.b .error
moveq #IERR_OK,d0 ; no error
rts
.error moveq #IERR_CHECKSUM,d0 ; checksum error
rts
NextByte: move.w (a0)+,d0
BITSKIP_B d0
rts
; The sync-signal is $4489, but due to the most likely case
; that not all 10 savegame slots are used, the sync may not
; be present so DFLG_ERRORS has been set and rawdic_NextMFMword
; has been used to allow unformatted tracks.
DMFM_NovagenSG:
move.w d0,d6 ; track number
move.w #$4489,d0 ; sync signal
jsr rawdic_NextMFMword(a5)
bne.b .exit
bsr DMFM_Novagen
bne.b .exit ; error? no saved game...
subq.w #2,d6
move.w d6,d0
lsr.w #1,d0 ; calculate slot number
lea SlotFlags(pc),a0
subq.b #1,(a0,d0.w) ; track could be read, decrease SlotFlags
and.w #1,d6
bne.b .exit ; if track=even then check first 3 words
move.l -$1800(a1),d6
cmp.l #$45631405,d6
bne.b .in ; first 3 words have to be $456314054e75
move.w 4-$1800(a1),d6
cmp.w #$4e75,d6
beq.b .exit
.in addq.b #1,(a0,d0.w) ; no saved game!
.exit moveq #IERR_OK,d0 ; no error
; (always ok, because the checksum error may occur due to not used slot)
rts
SaveFiles:
moveq #9,d2
.l0 lea SlotFlags(pc),a0
tst.b (a0,d2.w)
bne.b .s0
move.b d2,d0
or.b #"0",d0
move.b d0,FNum
move.w d2,d0
mulu.w #$1800*2,d0
move.l #$1cd8,d1 ; length of a saved game
lea FName(pc),a0
jsr rawdic_SaveDiskFile(a5)
.s0 dbra d2,.l0
moveq #IERR_OK,d0
rts
SlotFlags: dcb.b 10,2 ; only if both tracks for a saved game
; could be read without errors, the
; SlotFlags value for the slot is 0.
FName: dc.b "Mercenary2.save"
FNum: dc.b "0",0