Skip to content

Commit a97adff

Browse files
committed
[poseidon] add bootable Poseidon USB from ROM
1 parent 669175b commit a97adff

File tree

13 files changed

+320
-2
lines changed

13 files changed

+320
-2
lines changed

build_rom.sh

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
#!/bin/bash
2-
romtool -v build -o replay.rom -t ext -s 64 -e f00000 -a f00010 -r 01.04 bootrom/bootrom.bin addmem/AddReplayMem rtc/battclock.resource usb/usb_eth.autoconfig usb/replayusb.device
2+
set -e
3+
4+
romtool -v build -o replay.rom -t ext -s 64 -e f00000 -a f00010 -r 01.05 -f bootrom/bootrom.bin addmem/AddReplayMem poseidon/PoseidonLoader rtc/battclock.resource usb/usb_eth.autoconfig usb/replayusb.device
35
printf "000001: 11" | xxd -r - replay.rom
4-
#romtool info replay.rom
6+
romtool copy -c replay.rom replay.rom
7+
romtool info replay.rom
58
romtool scan replay.rom
69
#romtool dump replay.rom | less
10+
11+
romtool -v build -o poseidon.rom -t ext -s 512 -e 3f80000 -a 3f80000 -r 01.00 -f poseidon/hid.class poseidon/hub.class poseidon/input.device poseidon/massstorage.class poseidon/poseidon.library poseidon/PsdStackloader
12+
romtool scan poseidon.rom
13+
romtool info poseidon.rom

poseidon.rom

512 KB
Binary file not shown.

poseidon/Makefile

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
VASM_FLAGS := -quiet -Fhunkexe -kick1hunks -nosym -m68000 -no-opt
2+
3+
TARGET := PoseidonLoader
4+
SOURCE := loader.s
5+
INCLUDES := kprintf.i
6+
LISTFILE := $(addsuffix .txt,$(basename $(TARGET)))
7+
8+
all: $(TARGET)
9+
@echo ""
10+
11+
$(TARGET): Makefile | buildenv
12+
$(TARGET): $(INCLUDES)
13+
$(TARGET): $(SOURCE)
14+
$(VASM) $< -o $@ -L $(LISTFILE) $(VASM_FLAGS) -I $(INC_ASM)
15+
16+
clean:
17+
rm -rf $(TARGET) $(LISTFILE)
18+
19+
.PHONY: clean
20+
21+
include ../Makefile.build

poseidon/PoseidonLoader

492 Bytes
Binary file not shown.

poseidon/PsdStackloader

1.93 KB
Binary file not shown.

poseidon/hid.class

135 KB
Binary file not shown.

poseidon/hub.class

10.9 KB
Binary file not shown.

poseidon/input.device

5.41 KB
Binary file not shown.

poseidon/kprintf.i

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
;
2+
; WWW.FPGAArcade.COM
3+
;
4+
; REPLAY Retro Gaming Platform
5+
; No Emulation No Compromise
6+
;
7+
; PoseidonLoader - pre-boot loader for a Poseidon USB ROM, located at $03f8.0000 (512KB)
8+
; Copyright (C) Erik Hemming
9+
;
10+
; This software is licensed under LPGLv2.1 ; see LICENSE file
11+
;
12+
;
13+
14+
kprintf MACRO
15+
IFD ENABLE_KPRINTF
16+
17+
ifnc "","\9"
18+
move.l \9,-(sp)
19+
endc
20+
ifnc "","\8"
21+
move.l \8,-(sp)
22+
endc
23+
ifnc "","\7"
24+
move.l \7,-(sp)
25+
endc
26+
ifnc "","\6"
27+
move.l \6,-(sp)
28+
endc
29+
ifnc "","\5"
30+
move.l \5,-(sp)
31+
endc
32+
ifnc "","\4"
33+
move.l \4,-(sp)
34+
endc
35+
ifnc "","\3"
36+
move.l \3,-(sp)
37+
endc
38+
ifnc "","\2"
39+
move.l \2,-(sp)
40+
endc
41+
42+
jsr _kprintf
43+
44+
dc.b \1,0
45+
even
46+
47+
adda.w #(NARG-1)*4,sp
48+
49+
.skip\@
50+
ENDC
51+
ENDM
52+
53+
IFD ENABLE_KPRINTF
54+
bra.b _kprintf_end
55+
_kprintf: movem.l d0-d1/a0-a3/a6,-(sp)
56+
move.l $4.w,a6
57+
move.l 28(sp),a0
58+
lea 32(sp),a1
59+
lea .putch(pc),a2
60+
move.l a6,a3
61+
jsr -522(a6) ; _LVORawDoFmt
62+
63+
move.l 28(sp),a0
64+
.end: move.b (a0)+,d0
65+
bne.b .end
66+
move.l a0,d0
67+
addq.l #1,d0
68+
and.l #$fffffffe,d0
69+
move.l d0,28(sp)
70+
movem.l (sp)+,d0-d1/a0-a3/a6
71+
rts
72+
73+
.putch: movem.l d0-d1/a0-a1/a6,-(sp)
74+
move.l $4.w,a6
75+
jsr -516(a6) ; _LVORawPutChar (execPrivate9)
76+
movem.l (sp)+,d0-d1/a0-a1/a6
77+
rts
78+
_kprintf_end:
79+
ENDC
80+

poseidon/loader.s

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
;
2+
; WWW.FPGAArcade.COM
3+
;
4+
; REPLAY Retro Gaming Platform
5+
; No Emulation No Compromise
6+
;
7+
; PoseidonLoader - pre-boot loader for a Poseidon USB ROM, located at $03f8.0000 (512KB)
8+
; Copyright (C) Erik Hemming
9+
;
10+
; This software is licensed under LPGLv2.1 ; see LICENSE file
11+
;
12+
;
13+
14+
EXT_ROM_START = $03f80000
15+
EXT_ROM_END = $04000000
16+
MAX_ROM_TAGS = 32
17+
18+
;ENABLE_KPRINTF
19+
20+
include exec/exec.i
21+
include exec/nodes.i
22+
include exec/resident.i
23+
include exec/libraries.i
24+
include lvo/exec_lib.i
25+
include kprintf.i
26+
27+
28+
jmp S
29+
moveq.l #-1,d0
30+
rts
31+
32+
VERSION = 1
33+
REVISION= 0
34+
35+
dc.b 0,'$VER: Poseidon ROM Loader 1.0 (4.2.2020) Replay USB',0
36+
even
37+
VERSTRING dc.b 'Poseidon ROM Loader 1.0 (4.2.2020) Replay USB',13,10,0
38+
even
39+
40+
cnop 0,4
41+
romtag: dc.w RTC_MATCHWORD
42+
dc.l romtag
43+
dc.l end
44+
dc.b RTF_SINGLETASK
45+
dc.b VERSION
46+
dc.b NT_UNKNOWN
47+
dc.b 106
48+
dc.l tagname
49+
dc.l VERSTRING
50+
dc.l S
51+
52+
tagname: dc.b 'USB.ROM.init',0
53+
even
54+
cnop 0,4
55+
tagname_end:
56+
57+
S:
58+
kprintf "INIT: %s",#VERSTRING
59+
60+
movem.l d0-a6,-(sp)
61+
62+
move.l $4.w,a6
63+
64+
lea $40100304,a0 ; $4000.0000 (USB/ETH base) + $0010.0000 (MACH_USBREGS) + $0304 (ISP_CHIPID)
65+
66+
kprintf <" Check USB ChipID ... (addr $%08lx, value $%08lx)",10>,a0,(a0)
67+
68+
cmp.l #$00011761,(a0) ; $0001.1761 == Valid Chip ID
69+
bne .exit
70+
71+
lea EXT_ROM_START,a4 ; 1MB ROM max
72+
lea EXT_ROM_END,a5 ; End of DDR
73+
74+
kprintf <" Check ROM @ %08lx ... (%08lx)",10>,a4,(a4)
75+
76+
cmp.l #$11144ef9,(a4)
77+
bne .exit ; ROM header not found.
78+
79+
kprintf " Validate ROM checksum (%08lx) -> ",(EXT_ROM_END-$18)
80+
81+
movea.l a4,a0
82+
moveq #0,d4
83+
moveq #0,d5
84+
moveq.l #(((EXT_ROM_END-EXT_ROM_START)/4)-1)>>16,d6
85+
moveq.l #-1,d7
86+
87+
.checksum:
88+
add.l (a0)+,d5
89+
addx.l d4,d5
90+
dbf d7,.checksum
91+
dbf d6,.checksum
92+
93+
kprintf <"%08lx (should be FFFFFFFF)",10>,d5
94+
95+
not.l d5
96+
bne .exit ; checksum failed
97+
98+
kprintf <" Current KickMem/KickTag/KickSum = [ %08lx, %08lx, %08x ]",10>,KickMemPtr(a6),KickTagPtr(a6),KickCheckSum(a6)
99+
100+
CALLLIB _LVOSumKickData
101+
cmp.l KickCheckSum(a6),d0
102+
bne .invalid
103+
104+
kprintf <" Search KickMemPtr for %08lx ...",10>,a4
105+
106+
move.l KickMemPtr(a6),d2
107+
108+
.next_memlist
109+
tst.l d2
110+
beq .notfound
111+
movea.l d2,a2
112+
113+
kprintf <" Found memlist %08lx (%s)",10>,a2,LN_NAME(a2)
114+
115+
move.l LN_SUCC(a2),d2
116+
lea ML_NUMENTRIES(a2),a2
117+
move.w (a2)+,d7
118+
bra.b .findmem_start
119+
.findmem
120+
kprintf <" Entry : addr %08lx, size %08lx",10>,ME_ADDR(a2),ME_LENGTH(a2)
121+
cmp.l (a2)+,a4
122+
beq .exit
123+
add.w #4,a2
124+
.findmem_start
125+
dbf d7,.findmem
126+
bra .next_memlist
127+
128+
129+
.invalid
130+
kprintf <" KickCheckSum is invalid - clear it",10>
131+
132+
clr.l KickMemPtr(a6)
133+
clr.l KickTagPtr(a6)
134+
135+
.notfound
136+
137+
move.l #ML_SIZE+ME_SIZE+MAX_ROM_TAGS*4,d0
138+
kprintf " Create KickMemPtr (%ld bytes) ",d0
139+
suba.l d0,a5
140+
141+
lea (a5),a1 ; MemList
142+
143+
kprintf <" @ %08lx",10>,a1
144+
145+
move.l KickMemPtr(a6),d0
146+
beq.b .nokickmem
147+
move.l d0,a0
148+
149+
ADDHEAD (a0,a1)
150+
151+
bra.b .createmem
152+
153+
.nokickmem
154+
move.l a1,KickMemPtr(a6)
155+
156+
157+
.createmem
158+
kprintf <" KickMemPtr(a6) = %08lx",10>,KickMemPtr(a6)
159+
160+
lea tagname(pc),a0
161+
clr.l (a1)+ ; LN_SUCC
162+
clr.l (a1)+ ; LN_PRED
163+
clr.w (a1)+ ; LN_TYPE + LN_PRI
164+
move.l a0,(a1)+ ; LN_NAME
165+
move.w #1,(a1)+ ; ML_NUMENTRIES
166+
move.l a4,(a1)+ ; ME_ADDR
167+
move.l #EXT_ROM_END-EXT_ROM_START,(a1)+ ; ME_LENGTH
168+
move.l a1,a2
169+
170+
.scan
171+
cmp.w #RTC_MATCHWORD,(a4)+
172+
bne.b .cont
173+
lea -2(a4),a0
174+
move.l (a4)+,d2
175+
cmp.l d2,a0
176+
bne.b .cont
177+
178+
move.l a0,a4
179+
180+
move.l a4,(a1)+
181+
kprintf " ROMTAG @ %08lx (end : %08lx) : %s / %s",a4,RT_ENDSKIP(a4),RT_NAME(a4),RT_IDSTRING(a4)
182+
183+
move.l RT_ENDSKIP(a4),a4
184+
185+
.cont cmp.l a5,a4
186+
blt.b .scan
187+
188+
move.l KickTagPtr(a6),d0
189+
beq.b .notags
190+
bset #31,d0
191+
.notags move.l d0,(a1)+
192+
193+
move.l a2,KickTagPtr(a6)
194+
kprintf <" New KickTagPtr = %08lx",10>,KickTagPtr(a6)
195+
196+
kprintf <" Calculate KickCheckSum ...",10>
197+
198+
CALLLIB _LVOSumKickData
199+
move.l d0,KickCheckSum(a6)
200+
kprintf <" New KickCheckSum = %08lx",10>,KickCheckSum(a6)
201+
202+
CALLLIB _LVOCacheClearU
203+
204+
kprintf <" CacheFlushed",10>
205+
206+
.exit kprintf <"DONE!",10>
207+
movem.l (sp)+,d0-a6
208+
rts
209+
210+
end:

0 commit comments

Comments
 (0)