661 lines
11 KiB
ArmAsm
661 lines
11 KiB
ArmAsm
.section .text.sg_ini
|
|
.global _text_sg_ini_start
|
|
|
|
_text_sg_ini_start:
|
|
mov.l label_18,r0 /* 8d000000 → end of system ram */
|
|
mov r0,r15
|
|
nop
|
|
nop
|
|
mov.l label_1c,r0 /* 8c00d820 → label_2020 */
|
|
jmp @r0
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
|
|
label_18:
|
|
.long 0x8d000000
|
|
label_1c:
|
|
.long 0x8c00d820
|
|
label_20:
|
|
.fill 0x2000,1,0x00
|
|
|
|
label_2020:
|
|
/* function that processes the list of addresses/values at label_2284 */
|
|
mov.l label_204c,r0 /* 8c00d940 → label_2140 */
|
|
mov #0,r1
|
|
jsr @r0
|
|
nop
|
|
|
|
/* ???? possibly jump to boot menu? */
|
|
mov.l label_2050,r0 /* 8c00d900 → label_2100 */
|
|
jsr @r0
|
|
nop
|
|
|
|
/* possibly jump to boot menu? */
|
|
mov.l label_2054,r0 /* 8c00d888 → label_2088 */
|
|
jsr @r0
|
|
nop
|
|
|
|
/* check for Windows CE? */
|
|
mov.l label_2058,r0 /* 8c00dae0 → label_22e0 */
|
|
jsr @r0
|
|
nop
|
|
|
|
mov.l label_205c,r0 /* 8c00db40 → label_2340 */
|
|
jsr @r0
|
|
nop
|
|
|
|
nop
|
|
mov.l label_2060,r0 /* 8c00d86c → label_206c */
|
|
jmp @r0
|
|
nop
|
|
|
|
nop
|
|
nop
|
|
|
|
label_204c:
|
|
.long 0x8c00d940
|
|
label_2050:
|
|
.long 0x8c00d900
|
|
label_2054:
|
|
.long 0x8c00d888
|
|
label_2058:
|
|
.long 0x8c00dae0
|
|
label_205c:
|
|
.long 0x8c00db40
|
|
label_2060:
|
|
.long 0x8c00d86c
|
|
|
|
.ascii "INI90405"
|
|
|
|
label_206c:
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
mov.l label_2084,r0 /* 8c00e000 */
|
|
jmp @r0
|
|
nop
|
|
label_2084:
|
|
.long 0x8c00e000 /* aip */
|
|
|
|
label_2088:
|
|
sts.l pr,@-r15
|
|
mov.l label_20a4,r0 /* 8c000048 */
|
|
mov.l @r0,r0 /* r0 ← 1 */
|
|
cmp/eq #6,r0
|
|
bt label_209e
|
|
cmp/eq #7,r0
|
|
bt label_209e
|
|
cmp/eq #9,r0
|
|
bt label_209e
|
|
rts
|
|
lds.l @r15+,pr
|
|
label_209e:
|
|
mov.l label_20a8,r1 /* 8c00d8ac → label_20ac */
|
|
jmp @r1
|
|
nop
|
|
label_20a4:
|
|
.long 0x8c000048
|
|
label_20a8:
|
|
.long 0x8c00d8ac
|
|
|
|
/* jump back to boot menu? */
|
|
label_20ac:
|
|
mov.l label_20b4,r0 /* 8c0000e0 */
|
|
mov.l @r0,r0
|
|
jmp @r0
|
|
mov #1,r4
|
|
label_20b4:
|
|
.long 0x8c0000e0
|
|
|
|
label_20b8:
|
|
exts.b r4,r0
|
|
mov #57,r1 /* ascii '9' */
|
|
cmp/gt r1,r0
|
|
bf label_20c2
|
|
add #-7,r0
|
|
label_20c2:
|
|
rts
|
|
add #-48,r0
|
|
|
|
/* called from label_2100 and label_22e0 */
|
|
label_20c6:
|
|
xor r2,r2
|
|
sts.l pr,@-r15
|
|
mov.b @r4,r4 /* r4 ← (0x8c00803e) = 0x30 */
|
|
mov r4,r0 /* r0 ← 0x30 */
|
|
cmp/eq #0x20,r0 /* check for ascii space in 'Compatible peripherals' of systemid */
|
|
bt label_20e0 /* if it is space, return 0 */
|
|
bsr label_20b8 /* ascii 0-9 to integer */
|
|
nop
|
|
mov #1,r1
|
|
tst r1,r0 /* check for ascii '1' / "uses Windows CE" */
|
|
bt.s label_20e0 /* if not "uses Windows CE", take branch to label_20e0 */
|
|
xor r2,r2
|
|
mov #1,r2
|
|
label_20e0:
|
|
lds.l @r15+,pr
|
|
rts
|
|
mov r2,r0 /* return 1 if Windows CE, 0 if not */
|
|
.word 0xffff
|
|
label_20e8:
|
|
mov.l label_20fc,r1 ! 8c008024
|
|
mov.l label_20f8,r3 /* ascii ' MIL' ; 0x4c494d20 */
|
|
mov.l @r1,r2 /* r2 ← 0x2d444720 ' GD-' */
|
|
cmp/eq r3,r2
|
|
movt r0
|
|
rts
|
|
nop
|
|
nop
|
|
label_20f8:
|
|
.ascii " MIL" /* 4c494d20 */
|
|
label_20fc:
|
|
.long 0x8c008024
|
|
|
|
/* called from label_2020 */
|
|
label_2100:
|
|
sts.l pr,@-r15
|
|
mov.l label_212c,r3 /* 8c00d8c6 → label_20c6 */
|
|
mov.l label_213c,r4 /* 8c008000 */
|
|
jsr @r3
|
|
add #0x3e,r4 /* r4 ← 0x8c00803e */
|
|
tst r0,r0 /* check return value != 0 */
|
|
bf label_2126
|
|
|
|
/* check for ' MIL' CD */
|
|
mov.l label_2130,r3 /* 8c00d8e8 → label_20e8 */
|
|
jsr @r3
|
|
nop
|
|
tst r0,r0 /* check return value != 0 */
|
|
bf label_2126
|
|
|
|
mov.l label_2138,r3 ! 8c010000
|
|
mov.w @r3,r0
|
|
cmp/eq #34,r0 /* check for 'stc vbr,r0' ?? */
|
|
bf label_2126
|
|
mov.l label_2134,r1 /* 8c00d8ac → label_20ac */
|
|
jmp @r1
|
|
lds.l @r15+,pr
|
|
label_2126:
|
|
lds.l @r15+,pr
|
|
rts
|
|
nop
|
|
label_212c:
|
|
.long 0x8c00d8c6
|
|
label_2130:
|
|
.long 0x8c00d8e8
|
|
label_2134:
|
|
.long 0x8c00d8ac
|
|
label_2138:
|
|
.long 0x8c010000
|
|
label_213c:
|
|
.long 0x8c008000
|
|
|
|
/* function that processes the list of addresses/values at label_2284 */
|
|
label_2140:
|
|
mov.l r2,@-r15
|
|
mov.l r3,@-r15
|
|
mov.l r4,@-r15
|
|
mov.l r5,@-r15
|
|
sts.l pr,@-r15
|
|
mova label_2284,r0 /* 0x8c00da84 */
|
|
mov.w @(r0,r1),r1 /* 0x2 */
|
|
add r1,r0 /* 0x8c00da86 */
|
|
label_2150:
|
|
add #3,r0
|
|
shlr2 r0
|
|
shll2 r0 /* #1 r0 ← 0x8c00da88
|
|
#2 r0 ← 0x8c00da90 */
|
|
mov.w @r0+,r4 /* #1 r0 ← 0x8c00da8a ; r4 ← 2
|
|
#2 r4 ← 1 */
|
|
tst r4,r4 /* r4 & r4 != 0 → T unset */
|
|
bf label_2172 /* branch taken */
|
|
mov.w @r0+,r4
|
|
tst r4,r4
|
|
bf.s label_2150
|
|
add r4,r0
|
|
lds.l @r15+,pr
|
|
mov.l @r15+,r5
|
|
mov.l @r15+,r4
|
|
mov.l @r15+,r3
|
|
mov.l @r15+,r2
|
|
rts
|
|
sett
|
|
label_2172:
|
|
mov.w @r0+,r3 /* #1 0x8c00da8a ; r0 ← 0x8c00da8c ; r3 ← 0x6
|
|
#2 0x8c00da92 ; r0 ← 0x8c00da94 ; r3 ← 0x18
|
|
*/
|
|
mov.l label_2278,r1 /* ffff8000 */
|
|
and r3,r1 /* r1 ← 0 */
|
|
tst r1,r1 /* r1 & r1 == 0 → T set */
|
|
bt label_2180 /* branch taken */
|
|
xor r1,r3
|
|
bf label_2182
|
|
label_2180:
|
|
mov.l @r0+,r2 /* 0x8c00da8c ; r2 ← 0xff000038 */
|
|
label_2182:
|
|
mov.l label_227c,r1 /* r1 ← 6000 */
|
|
and r3,r1 /* r1 ← 0 */
|
|
tst r1,r1 /* T set */
|
|
bt label_21a0 /* branch taken */
|
|
xor r1,r3
|
|
add #12,r3
|
|
mov.l @r0+,r1
|
|
mov r0,r5
|
|
add r1,r0
|
|
label_2194:
|
|
bsrf r3
|
|
dt r4
|
|
bf.s label_2194
|
|
add #4,r2
|
|
bra label_2150
|
|
mov r5,r0
|
|
/* branch from label_2182 */
|
|
label_21a0:
|
|
bsrf r3 /* #1 0x06 ; PC ← 0x8c00d9aa (label_21aa)
|
|
#2 0x18 ; PC ← 0x8c00d9bc (label_2abc)
|
|
#3 0x0c ; PC ← 0x8c00d9b0 (label_21b0)
|
|
*/
|
|
dt r4 /* #1 r4 ← 1 ; T unset
|
|
#2 r4 ← 0 ; T set
|
|
#3 r4 ← 3 ; T unset
|
|
*/
|
|
bf.s label_21a0 /* #1 branch taken ; #2 branch not taken */
|
|
add #4,r2 /* 0xff000038 ; r2 ← 0xff00003c */
|
|
bt label_2150 /* branch taken */
|
|
label_21aa:
|
|
mov #0,r1
|
|
rts
|
|
mov.l r1,@r2
|
|
label_21b0:
|
|
mov #0,r1
|
|
rts
|
|
mov.w r1,@r2
|
|
mov #0,r1
|
|
rts
|
|
mov.b r1,@r2
|
|
label_21bc:
|
|
mov.l @r0+,r1 /* 0x8c00da98 ; r1 ← 0x12c0 */
|
|
rts
|
|
mov.l r1,@r2 /* 0xffa0002c ; CHCR2 ← 0x000012c0
|
|
DM: fixed
|
|
SM: incremented
|
|
RS: external request, single address mode
|
|
*/
|
|
label_21c2:
|
|
mov.w @r0+,r1
|
|
rts
|
|
mov.l r1,@r2
|
|
|
|
mov.l @r0+,r1
|
|
rts
|
|
mov.b r1,@r2
|
|
mov #-1,r1
|
|
rts
|
|
mov.l r1,@r2
|
|
mov.w @r0+,r1
|
|
rts
|
|
mov.w r1,@r2
|
|
mov.l @r0+,r1
|
|
rts
|
|
mov.w r1,@r2
|
|
nop
|
|
rts
|
|
mov.l @r2,r1
|
|
bra label_2228
|
|
nop
|
|
nop
|
|
xor r1,r1
|
|
sts.l pr,@-r15
|
|
mov.l r3,@-r15
|
|
label_21f2:
|
|
mov #8,r3
|
|
label_21f4:
|
|
mov.l r1,@r2
|
|
dt r3
|
|
bf.s label_21f4
|
|
add #4,r2
|
|
bsr label_2252
|
|
nop
|
|
dt r4
|
|
bf label_21f2
|
|
add #1,r4
|
|
add #-4,r2
|
|
mov.l @r15+,r3
|
|
lds.l @r15+,pr
|
|
rts
|
|
sett
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
label_2228:
|
|
sts.l pr,@-r15
|
|
mov.l r0,@-r15
|
|
mov.l r1,@-r15
|
|
mov.l r2,@-r15
|
|
mov.l r3,@-r15
|
|
mov.l r4,@-r15
|
|
mov.l r5,@-r15
|
|
mov.l r6,@-r15
|
|
jsr @r2
|
|
mov.l r7,@-r15
|
|
mov.l @r15+,r7
|
|
mov.l @r15+,r6
|
|
mov.l @r15+,r5
|
|
mov.l @r15+,r4
|
|
mov.l @r15+,r3
|
|
mov.l @r15+,r2
|
|
mov.l @r15+,r1
|
|
mov.l @r15+,r0
|
|
lds.l @r15+,pr
|
|
rts
|
|
sett
|
|
label_2252:
|
|
mov.l r0,@-r15
|
|
mov.l r1,@-r15
|
|
mov.l r2,@-r15
|
|
mov.l label_2270,r1 ! a05f688c
|
|
mov.l label_2274,r2 ! 1800
|
|
label_225c:
|
|
dt r2
|
|
bt label_2266
|
|
mov.l @r1,r0
|
|
tst #1,r0
|
|
bf label_225c
|
|
label_2266:
|
|
mov.l @r15+,r2
|
|
mov.l @r15+,r1
|
|
rts
|
|
mov.l @r15+,r0
|
|
nop
|
|
label_2270:
|
|
.long 0xa05f688c
|
|
label_2274:
|
|
.long 0x00001800
|
|
|
|
label_2278:
|
|
.long 0xffff8000
|
|
label_227c:
|
|
.long 0x00006000
|
|
|
|
.long 0xa05f8040 /* unused; VO_BORDER_COL */
|
|
label_2284:
|
|
.word 0x0002
|
|
label_2286:
|
|
.word 0x0009 /* unused garbage data? */
|
|
|
|
label_2288:
|
|
.word 0x0002
|
|
label_228a:
|
|
.word 0x0006 /* r3 */
|
|
label_228c:
|
|
.long 0xff000038 /* QACR0 ←
|
|
QACR1 ←
|
|
*/
|
|
|
|
label_2290:
|
|
.word 0x0001
|
|
label_2292:
|
|
.word 0x0018 /* r3 */
|
|
label_2294:
|
|
.long 0xffa0002c /* CHCR2 ← 0x000012c0 */
|
|
label_2298:
|
|
.long 0x000012c0
|
|
|
|
label_229c:
|
|
.word 0x0004
|
|
label_229e:
|
|
.word 0x000c
|
|
label_22a0:
|
|
.long 0xffd00000 /* ICR ← 0
|
|
IPRA ← 0
|
|
IPRB ← 0
|
|
IPRC ← 0
|
|
*/
|
|
label_22a4:
|
|
.word 0x0001 /* r4 */
|
|
label_22a6:
|
|
.word 0x0018 /* r3 → bsrf label_21bc */
|
|
label_22a8:
|
|
.long 0xff000024 /* r2
|
|
EXPEVT ← 0x00000020 */
|
|
label_22ac:
|
|
.long 0x00000020 /* r1 */
|
|
|
|
label_22b0:
|
|
.word 0x0002 /* r4 */
|
|
label_22b2:
|
|
.word 0x001e /* r3 → bsrf label_21c2 */
|
|
label_22b4:
|
|
.long 0xa05f7490 /* r2
|
|
SB_G1CRC ← 0x0222
|
|
SB_G1CWC ← 0x0222
|
|
*/
|
|
label_22b8:
|
|
.word 0x0222
|
|
label_22ba:
|
|
.word 0x0222
|
|
|
|
label_22bc:
|
|
.word 0x0002 /* r4 */
|
|
label_22be:
|
|
.word 0x001e /* r3 → bsrf label_21c2 */
|
|
label_22c0:
|
|
.long 0xa05f74a0 /* r2
|
|
SB_G1GDRC ← 0x2001
|
|
SB_G1GDWC ← 0x2001
|
|
*/
|
|
label_22c4:
|
|
.word 0x2001
|
|
label_22c6:
|
|
.word 0x2001
|
|
|
|
label_22c8:
|
|
.word 0x0002 /* r4 */
|
|
label_22ca:
|
|
.word 0x001e /* r3 → bsrf label_21c2 */
|
|
label_22cc:
|
|
.long 0xa05f7890 /* SB_G2DSTO ← 0x001b
|
|
SB_G2TRTO ← 0x0271
|
|
*/
|
|
label_22d0:
|
|
.word 0x001b
|
|
label_22d2:
|
|
.word 0x0271
|
|
|
|
label_22d4:
|
|
.word 0x0000
|
|
.word 0x0000
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
|
|
/* called from label_2020 */
|
|
label_22e0:
|
|
sts.l pr,@-r15
|
|
/* check systemid for "uses Windows CE" */
|
|
mov.l label_2330,r4 /* 8c008000 systemid */
|
|
mov.l label_2328,r3 /* 8c00d8c6 label_20c6 */
|
|
jsr @r3
|
|
add #0x3e,r4
|
|
tst r0,r0 /* r0 (1 if Windows CE) */
|
|
bt label_2320 /* if not Windows CE, return */
|
|
mov.l label_2334,r1 ! 8ce01010
|
|
mov.l @r1,r0
|
|
tst r0,r0
|
|
bt label_231a
|
|
mov.l label_233c,r2 ! a8
|
|
cmp/hi r2,r0
|
|
bt label_231a
|
|
dt r0
|
|
mov r0,r2
|
|
shll r2
|
|
add r0,r2
|
|
shll2 r2
|
|
add r2,r1
|
|
add #12,r1
|
|
mov.l @r1,r2
|
|
add #4,r1
|
|
mov.l @r1,r3
|
|
add r3,r2
|
|
mov.l label_2338,r0 /* a05f74f4 SB_GDSTARD */
|
|
mov.l @r0,r3
|
|
cmp/eq r3,r2
|
|
bt label_2320
|
|
label_231a:
|
|
mov.l label_232c,r1 ! 8c00d8ac
|
|
jmp @r1
|
|
lds.l @r15+,pr
|
|
label_2320:
|
|
lds.l @r15+,pr
|
|
rts
|
|
nop
|
|
nop
|
|
label_2328:
|
|
.long 0x8c00d8c6
|
|
label_232c:
|
|
.long 0x8c00d8ac
|
|
label_2330:
|
|
.long 0x8c008000
|
|
label_2334:
|
|
.long 0x8ce01010
|
|
label_2338:
|
|
.long 0xa05f74f4 /* SB_GDSTARD */
|
|
label_233c:
|
|
.long 0x000000a8
|
|
|
|
label_2340:
|
|
mov.l r14,@-r15
|
|
mov #-1,r14
|
|
sts.l pr,@-r15
|
|
add #-20,r15
|
|
mov r15,r3
|
|
mov r15,r5
|
|
mov.l r3,@(16,r15) /* copy stack pointer to stack */
|
|
add #16,r5
|
|
bsr label_23e0
|
|
mov #30,r4
|
|
|
|
mov r0,r4
|
|
tst r4,r4
|
|
bt label_2384
|
|
bsr label_2396
|
|
nop
|
|
tst r0,r0
|
|
bf label_2384
|
|
mov.l @(4,r15),r4
|
|
mov.l label_23d4,r3 ! ffff
|
|
cmp/hi r3,r4
|
|
bt label_2384
|
|
mov r15,r5
|
|
mov.w label_23d0,r1 ! e10
|
|
mov.l r1,@(4,r15)
|
|
bsr label_23e0
|
|
mov #31,r4
|
|
mov r0,r4
|
|
tst r4,r4
|
|
bt label_2384
|
|
bsr label_2396
|
|
nop
|
|
tst r0,r0
|
|
bf label_2384
|
|
mov #0,r14
|
|
label_2384:
|
|
tst r14,r14
|
|
bt label_238e
|
|
mov.l label_23d8,r2 ! 8c00d8ac
|
|
jsr @r2
|
|
nop
|
|
label_238e:
|
|
add #20,r15
|
|
lds.l @r15+,pr
|
|
rts
|
|
mov.l @r15+,r14
|
|
label_2396:
|
|
mov.l r14,@-r15
|
|
mov.l r13,@-r15
|
|
sts.l pr,@-r15
|
|
mov #0,r14
|
|
add #-16,r15
|
|
mov r4,r13
|
|
label_23a2:
|
|
bsr label_23f8
|
|
nop
|
|
mov r15,r5
|
|
bsr label_23ec
|
|
mov r13,r4
|
|
cmp/eq #-1,r0
|
|
bt label_23c4
|
|
cmp/eq #1,r0
|
|
bt label_23bc
|
|
cmp/eq #2,r0
|
|
bf label_23c4
|
|
bra label_23c6
|
|
mov #0,r0
|
|
label_23bc:
|
|
mov.l label_23dc,r4 ! 10000
|
|
add #1,r14
|
|
cmp/ge r4,r14
|
|
bf label_23a2
|
|
label_23c4:
|
|
mov #-1,r0
|
|
label_23c6:
|
|
add #16,r15
|
|
lds.l @r15+,pr
|
|
mov.l @r15+,r13
|
|
rts
|
|
mov.l @r15+,r14
|
|
label_23d0:
|
|
.word 0x0e10
|
|
.word 0xffff
|
|
label_23d4:
|
|
.long 0x0000ffff
|
|
label_23d8:
|
|
.long 0x8c00d8ac
|
|
label_23dc:
|
|
.long 0x00010000
|
|
|
|
label_23e0:
|
|
mov #0,r6
|
|
mov #0,r7
|
|
mov.l label_2404,r0 ! 8c0000bc
|
|
mov.l @r0,r0 /* r0 ← 0x8c001000 */
|
|
label_23e8:
|
|
jmp @r0
|
|
nop
|
|
label_23ec:
|
|
mov #0,r6
|
|
mov #1,r7
|
|
mov.l label_2404,r0 ! 8c0000bc
|
|
mov.l @r0,r0 /* r0 ← 0x8c001000 */
|
|
jmp @r0
|
|
nop
|
|
label_23f8:
|
|
mov #0,r6
|
|
mov #2,r7
|
|
mov.l label_2404,r0 ! 8c0000bc
|
|
mov.l @r0,r0 /* r0 ← 0x8c001000 */
|
|
jmp @r0
|
|
nop
|
|
label_2404:
|
|
.long 0x8c0000bc
|