; This is designed to be serial-line downloaded to cdcode. ; ; Our memory map: ; ; [8c000000,8c010000) Stack (r15 set by cdcode) ; [8c010000,8c01????) cdcode ; [8c020000,8c030000) our data segment ; [8c030000,8c03????) our text segment .include "regs.s" BUS_RESET = 0xa05f6c8c BUS_RESET_VALUE = 0x6155404f BUS_RESET2 = 0xa05f6c10 BUS_RESET2_VALUE = 0 BUS_DMAADDR = 0xa05f6c04 BUS_ENABLE = 0xa05f6c14 BUS_ENABLE_VALUE = 1 BUS_STATE = 0xa05f6c18 BUS_STATE_GO = 1 BUS_STATE_RUNNING = 1 BUS_SPEED = 0xa05f6c80 DMA_ADDRMASK = 0x1fffffe0 SPEED_TIMEOUT_SHIFT = 16 SPEED_2MBPS = 0 CMD_DEVINFO = 1 CMD_EXTINFO = 2 CMD_RESET = 3 CMD_SHUTDOWN = 4 RESP_DEVINFO = 5 RESP_EXTINFO = 6 RESP_ACK = 7 RESP_DATA = 8 CMD_GETCOND = 9 CMD_GETMEMINFO = 10 CMD_BLOCKREAD = 11 CMD_BLOCKWRITE = 12 CMD_SETCOND = 14 ERR_NORESP = [256-1] ERR_FUNCUNSUPP = [256-2] ERR_UNKCMD = [256-3] ERR_SENDAGAIN = [256-4] ERR_FILEERR = [256-5] XDESC_LAST = 0x80000000 XDESC_PORTSHIFT = 16 XDESC_GUN = 0x00000200 XDESC_LENSHIFT = 0 ; These shift values look backwards; this is because frames are big-endian. FRAME_CRSHIFT = 0 FRAME_RSHIFT = 8 FRAME_SSHIFT = 16 FRAME_LENSHIFT = 24 ADDR_PORTSHIFT = 6 ADDR_MAIN = 0x20 ADDR_SUB5 = 0x10 ADDR_SUB4 = 0x08 ADDR_SUB3 = 0x04 ADDR_SUB2 = 0x02 ADDR_SUB1 = 0x01 .macro Frame cr, rport, rbits, sport, sbits, len .long [[$(cr)] << FRAME_CRSHIFT] | [[[[$(rport)] << ADDR_PORTSHIFT] | [$(rbits)]] << FRAME_RSHIFT] | [[[[$(sport)] << ADDR_PORTSHIFT] | [$(sbits)]] << FRAME_SSHIFT] | [[$(len)] << FRAME_LENSHIFT] .endm . = 0x8c020000 .align 32 cmds: .long [0 << XDESC_PORTSHIFT] | [0 << XDESC_LENSHIFT] .long resp0 & DMA_ADDRMASK Frame CMD_DEVINFO, 0, ADDR_MAIN, 0, 0, 0 .long [1 << XDESC_PORTSHIFT] | [0 << XDESC_LENSHIFT] .long resp1 & DMA_ADDRMASK Frame CMD_DEVINFO, 1, ADDR_MAIN, 0, 0, 0 .long [2 << XDESC_PORTSHIFT] | [0 << XDESC_LENSHIFT] .long resp2 & DMA_ADDRMASK Frame CMD_DEVINFO, 2, ADDR_MAIN, 0, 0, 0 .long XDESC_LAST | [3 << XDESC_PORTSHIFT] | [0 << XDESC_LENSHIFT] .long resp3 & DMA_ADDRMASK Frame CMD_DEVINFO, 3, ADDR_MAIN, 0, 0, 0 .align 32 respbeg: resp0: .space 1024 resp1: .space 1024 resp2: .space 1024 resp3: .space 1024 respend: . = 0x8c030000 ; The only things startup.s sets up that cdcode hasn't already done for ; us are (1) fpscr and (2) clearing bss. We don't have bss because we ; aren't linked by a conventional linker, and we don't use floating ; point so we don't care about fpscr. So we have nothing to do here. ; Just dive straight into the code. bsr putchar2 mov #'a,r1 bsr init_hw nop bsr putchar2 mov #'b,r1 bsr try_cmds nop bsr putchar2 mov #'c,r1 lds r11,pr rts nop init_hw: mova 9f,r0 1: mov.l @r0+,r1 tst r1,r1 bt 1f mov.l @r0+,r2 bra 1b mov.l r2,@r1 1: rts nop .align 4 9: .long BUS_RESET, BUS_RESET_VALUE .long BUS_RESET2, BUS_RESET2_VALUE .long BUS_SPEED, SPEED_2MBPS|[50000<