; This is designed to be serial-line downloaded to cdcode. ; ; Our memory map: ; ; [8c000000,8c010000) Stack (r15 set by cdcode) ; [8c010000,8c01????) cdcode ; [8c020000,8c02????) Us debug = 1 .include "regs.s" G2RTC_BASE = 0xa0710000 ; adapted from NetBSD's sys/arch/dreamcast/dev/g2/g2rtc.c G2DRAIN_ADDR = 0xa05f688c ; taken from NetBSD's sys/arch/dreamcast/dev/g2/g2bus_bus_mem.c G2DRAIN_BIT = 0x20 ; taken from NetBSD's sys/arch/dreamcast/dev/g2/g2bus_bus_mem.c .include "maple-bits.s" . = 0x8c020000 .sz any .pr any SETS.L #main,r0 jmp @r0 nop SETCONST ; Our "data segment". ; Currently empty. ; 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. .align 2 main: .if debug bsr putchar2 mov #'A,r1 .endif bsr init_hw nop 1: bsr fetch_state nop .if debug bsr putchar2 mov #'B,r1 .endif bsr print_state nop bsr nbgetchar nop cmp/pz r0 bf 1b bsr putchar mov #13,r1 bsr putchar mov #10,r1 lds r11,pr rts nop init_hw: rts nop ; The NetBSD code for this is ; for (old = 0;;) { ; for (i = 0; i < 3; i++) { ; new = g2rtc_read(sc->sc_bt, sc->sc_bh); ; if (new != old) ; break; ; } ; if (i < 3) ; old = new; ; else ; break; ; } ; where g2rtc_read is ; return ((bus_space_read_4(bt, bh, 0) & 0xffff) << 16) ; | (bus_space_read_4(bt, bh, 4) & 0xffff); fetch_state: .if debug sts.l pr,@-r15 .endif SETS.L #G2DRAIN_ADDR,r4 SETS.L #G2DRAIN_BIT,r2 1: mov.l @r4,r0 tst r2,r0 .if debug bt 1f bsr putchar2 mov #'a,r1 bra 1b nop 1: .else bf 1b .endif SETS.L #G2RTC_BASE,r9 SETS.L #0,r8 ; old 2: SETS.L #3,r7 ; i (well, 3-i) 1: mov.l @r9,r4 mov.l @(4,r9),r2 SHLL #16,r4,r0 extu.w r2,r2 or r2,r4 ; new .if debug bsr printhex8 mov r4,r1 bsr putchar mov #13,r1 bsr putchar mov #10,r1 .endif cmp/eq r4,r8 bf 1f dt r7 bf 1b .if debug bsr putchar2 mov #'c,r1 .endif 1: tst r7,r7 bf/s 2b mov r4,r8 1: .if debug bsr putchar2 mov #'d,r1 lds.l @r15+,pr .endif rts mov r4,r6 print_state: bsr printhex8 mov r6,r1 bsr putchar mov #13,r1 lds.l @r15+,pr rts nop printhex8: mov #8,r0 printhexN: mov.l r4,@-r15 mov r0,r4 add #-8,r0 neg r0,r0 SHLL #2,r0 shld r0,r1 mov.l r3,@-r15 mov.l r2,@-r15 sts.l pr,@-r15 mova 9f,r0 mov r0,r3 mov r1,r2 1: mov r2,r0 SHLR #28,r0 SHLL #4,r2 add r3,r0 bsr putchar mov.b @r0,r1 dt r4 bf 1b lds.l @r15+,pr mov.l @r15+,r2 mov.l @r15+,r3 rts mov.l @r15+,r4 .align 4 9: .ascii "0123456789abcdef" .align 2 putchar2: sts.l pr,@-r15 bsr putchar mov.l r1,@-r15 mov.l @r15+,r1 lds.l @r15+,pr putchar: ldc r14,gbr 1: mov.w @(SCFDR2-SCIF_BASE,gbr),r0 SHXR #SCFDR2_TX_SHIFT,r0 and #SCFDR2_TX_MASK,r0 cmp/eq #16,r0 bt 1b mov r1,r0 mov.b r0,@(SCFTDR2-SCIF_BASE,gbr) 1: mov.w @(SCFDR2-SCIF_BASE,gbr),r0 SHXR #SCFDR2_TX_SHIFT,r0 tst #SCFDR2_TX_MASK,r0 bf 1b rts nop nbgetchar: ldc r14,gbr mov.w @(SCFDR2-SCIF_BASE,gbr),r0 SHXR #SCFDR2_RX_SHIFT,r0,r1 tst #SCFDR2_RX_MASK,r0 bt 1f mov.b @(SCFRDR2-SCIF_BASE,gbr),r0 extu.b r0,r1 mov.w @(SCLSR2-SCIF_BASE,gbr),r0 mov #0,r0 mov.w r0,@(SCLSR2-SCIF_BASE,gbr) rts mov r1,r0 1: rts mov #-1,r0 SETCONST