I use standard hardware init code, it written as linear algorythm and use it as "include" at start of program.
Code: Select all
*Hardware init
move.l sp,a7
move.w #$2700,sr
tst.l $a10008.l
bne.s SkipJoyDetect
tst.w $a1000c.l
SkipJoyDetect:
Bne SkipTable
lea Table(pc),a5 *
movem.w (a5)+,d5-d7 *
movem.l (a5)+,a0-a4 *
move.b -$10ff(a1),d0 *Version number
andi.b #$0f,d0
beq.s WrongVersion
move.l #$53454741,$2f00(a1) *Security code (SEGA)
WrongVersion:
move.w (a4),d0
moveq #$00,d0
movea.l d0,a6
move a6,usp
moveq #$17,d1 *VDP register setup
FillLoop:
move.b (a5)+,d5
move.w d5,(a4)
add.w d7,d5
dbra d1,FillLoop
move.l (a5)+,(a4)
move.w d0,(a3)
move.w d7,(a1)
move.w d7,(a2)
L0250: btst d0,(a1)
bne.s L0250
moveq #$25,d2 *Init A00000
Filla: move.b (a5)+,(a0)+
dbra d2,Filla
move.w d0,(a2)
move.w d0,(a1)
move.w d7,(a2)
L0262: move.l d0,-(a6) *Erase RAM
dbra d6,L0262
move.l (a5)+,(a4)
move.l (a5)+,(a4)
moveq #$1f,d3 *Init C00000
Filc0: move.l d0,(a3)
dbra d3,Filc0
move.l (a5)+,(a4)
moveq #$13,d4 *Init C00000
Fillc1: move.l d0,(a3)
dbra d4,Fillc1
moveq #$03,d5 *Init C00011
Fillc2: move.b (a5)+,$0011(a3)
dbra d5,Fillc2
move.w d0,(a2)
movem.l (a6),d0-d7/a0-a6
move #$2700,sr
tst.w $00C00004
jmp SkipTable
Table: dc.w $8000,$3fff,$0100,$00a0,$0000,$00a1,$1100,$00a1
dc.w $1200,$00c0,$0000,$00c0,$0004,$0414,$302c,$0754
dc.w $0000,$0000,$0000,$812b,$0001,$0100,$00ff,$ff00
dc.w $0080,$4000,$0080,$af01,$d91f,$1127,$0021,$2600
dc.w $f977,$edb0,$dde1,$fde1,$ed47,$ed4f,$d1e1,$f108
dc.w $d9c1,$d1e1,$f1f9,$f3ed,$5636,$e9e9,$8104,$8f01
dc.w $c000,$0000,$4000,$0010,$9fbf,$dfff
SkipTable:
I believe this 3 lines can be placed after "WrongVersion" label, but maybe VDP hardware required some delay after startup?