I tried to copy the exact behavior of chilly willy mode 1 program in my own (in assembly) and it doesn't work, like the cd sub cpu is not running my sub program
Code: Select all
dc.l $01000000 ; Stack
dc.l _Start
dc.l _Error,_Error,_Error,_Error,_Error,_Error,_Error,_Error,_Error,_Error,_Error
dc.l _Error,_Error,_Error,_Error,_Error,_Error,_Error,_Error,_Error,_Error,_Error
dc.l _Error,_INT,_EXTINT,_INT,_HINT,_INT,_VINT,_INT
dc.l _INT,_INT,_INT,_INT,_INT,_INT,_INT,_INT
dc.l _INT,_INT,_INT,_INT,_INT,_INT,_INT,_INT
dc.l _INT,_INT,_INT,_INT,_INT,_INT,_INT,_INT
dc.l _INT,_INT,_INT,_INT,_INT,_INT,_INT,_INT
dc.b "SEGA MEGA DRIVE " ; Console Name
dc.b "<=- Orion_ =-> " ; Copyright
dc.b "SAMPLE PROGRAM " ; Game Name
dc.b "SAMPLE PROGRAM " ; Overseas Name
dc.b "GM 00000000-00" ; Serial
dc.w $0000 ; Checksum
dc.b "J " ; IO Support
dc.l $00000000 ; Rom Start
dc.l $00010000 ; Rom End
dc.l $00FF0000 ; Backup RAM Start
dc.l $00FFFFFF ; Backup RAM End
dc.b " " ; "RA" for Backup RAM
dc.w $0000 ; $F820 for Backup RAM on odd bytes
dc.l $00200000 ; SRAM Start
dc.l $002001FF ; SRAM End
dc.b " " ; Modem
dc.b "DEMONSTRATION PROGRAM " ; Note
dc.b "JUE " ; Country
VDP_DATA equ $C00000
VDP_CTRL equ $C00004
MAINCPU_CMD equ $A1200E
SUBCPU_CMD equ $A1200F
; VRam Mapping (from VDPtable configuration)
VRAM_TILE equ $0000 ; 44k
VRAM_WINDOW equ $B000 ; 2k
VRAM_HSCROLL equ $B800 ; 1k
VRAM_SPRITE equ $BC00 ; 1k
VRAM_LAYER_A equ $C000 ; 8k
VRAM_LAYER_B equ $E000 ; 8k
;---------------------------------------->
_Start:
move #$2700,sr
tst.l $A10008
bne.s SkipJoyDetect
tst.w $A1000C
SkipJoyDetect:
bne.s SkipSetup
; Sega Security Code (SEGA)
move.b $A10001,d0
andi.b #$0F,d0
beq.s WrongVersion
move.l #'SEGA',$A14000
WrongVersion:
SkipSetup:
move.w #$8104,$C00004 ; display off, vblank disabled
move.w $C00004,d0
; Clear RAM
lea $ff0000,a0
moveq #0,d0
move.w #((1<<16)/4)-1,d1 ; 64k of RAM
ClearRam:
move.l d0,(a0)+
dbra d1,ClearRam
;----
_CDStart:
lea $1000000,a7
; Clear VRAM
moveq #0,d0
bsr SetVramAddress
lea VDP_DATA,a1
moveq #0,d0
move.w #((1<<16)/2)-1,d1 ; 64k of VRAM
ClearVRam:
move.w d0,(a1)
dbra d1,ClearVRam
;----
move.w #$0100,d0
move.w d0,$A11100 ; Z80 Bus Request
move.w d0,$A11200 ; Z80 Request Reset
;----
lea $A10000,a0 ; Joypad 1&2 Init
moveq #$40,d0
move.b d0,$9(a0)
move.b d0,$B(a0)
move.b d0,$3(a0)
move.b d0,$5(a0)
;----
; Init VDP
lea VDPregs,a0
lea $C00004,a1
moveq #19-1,d0
move.w #$8000,d1
VDPiLoop:
move.b (a0)+,d1 ; Reg Value from Table
move.w d1,(a1) ; Send to VDP
add.w #$0100,d1 ; Reg++
dbra d0,VDPiLoop
move.w #VRAM_HSCROLL,d0
bsr SetVramAddress
move.w #0,VDP_DATA ; HScroll = 0
move.w #$0000,d0 ; VScroll
bsr SetVSramAddress
move.w #0,VDP_DATA ; = 0
;---------------------------------------->
; move #$2000,sr
;---------------------------------------->
; Main Code
; Reset the Gate Array
move.w #$FF00,$A12002
move.b #3,$A12001
move.b #2,$A12001
move.b #0,$A12001
; Reset the Sub-CPU, Request bus
lea $A12001,a0
moveq #2,d1
.waitack:
move.b d1,(a0)
move.b (a0),d0
and.b d1,d0
beq.s .waitack
; Decompress Sub-CPU BIOS to Program RAM at 0x00000
move.w #2,$A12002 ; no write-protection, bank 0, 2M mode, Word RAM assigned to Sub-CPU
lea $420000,a0
move.w #($20000/4)-1,d1
moveq #0,d0
.clrpram:
move.l d0,(a0)+
dbra d1,.clrpram
move.l $416000,a0
lea $420000,a1
bsr Kos_Decomp
lea Sub_CPU_Prg,a0
lea $426000,a1
move.w #((Sub_CPU_PrgE-Sub_CPU_Prg)/2)-1,d0
.subcpucopy:
move.w (a0)+,(a1)+
dbra d0,.subcpucopy
move.b #0,$A1200E ; clear main comm port
move.b #$2A,$A12002 ; write-protect up to 0x05400
; clear bus request, deassert reset - allow CD Sub-CPU to run
; and Wait Ack
lea $A12001,a0
moveq #1,d1
.waitack2:
move.b d1,(a0)
move.b (a0),d0
and.b d1,d0
beq.s .waitack2
move.l #gen_lvl2,VBLptr
move #$2000,sr
;------>
Loop:
moveq #10,d0 ; X
moveq #6,d1 ; Y
moveq #0,d2
move.b SUBCPU_CMD,d2
bsr PrintHex
bsr WaitVBL
jmp Loop
gen_lvl2:
movem.l d0/a0,-(a7)
lea $A12000,a0
move.w (a0),d0
ori.w #$0100,d0
move.w d0,(a0)
movem.l (a7)+,d0/a0
rte
;---------------------------------------->
; Utils
;------>
WaitVBL:
lea VDP_CTRL,a0
.wait: move.w (a0),d0
andi.w #8,d0
bne.s .wait
rts
[.... extra sub routines ...]
;---------------------------------------->
; Interrupts
_Error:
rte
_INT:
rte
_EXTINT:
rte
_HINT: ; Should be enabled in VDP Register 0 ($10)
rte
_VINT: ; Should be enabled in VDP Register 1 ($20)
move.l VBLptr,-(a7)
beq.s .noptr
rts
.noptr: addq.l #4,a7
rte
;---------------------------------------->
; Datas
VDPregs: dc.b $04,$7C,$30,$2C,$07,$5E,$00,$00,$00,$00,$01,$00,$81,$2E,$00,$02,$11,$00,$FF
even
include "kos.s"
even
Sub_CPU_Prg: incbin "subcpu.bin"
Sub_CPU_PrgE:
; 64k ROM Padding
org $00010000
; BSS in RAM
VBLptr equ $FF0000