Files
CDi_MiSTer/doc/bootup.md
Andre Zeps 74bff4c5ce Removed slave rom from FPGA bitstream
Added ioctl_download for slave rom
boot0.rom is expected to be the main cpu rom
boot1.rom is expected to be the slave rom
2024-08-18 20:02:33 +02:00

3.0 KiB

Bootup

We need to get the ROM into the SDRAM

How does PSX and the Mega CD do it?

Inside psx.cpp there is load_bios(). It is called by psx_mount_cd(). But who calls it? From menu.cpp? But why is it called?

Inside megacd.cpp there is mcd_set_image(). Inside MegaCD.sv there is

    wire rom_download = ioctl_download & (ioctl_index[5:0] <= 6'h01);

But where does this come from?

Ok, everything revolves around user_io_file_tx() It even says something like this

	// set index byte (0=bios rom, 1-n=OSD entry index)

How does the CD-i do it?

Experiment:

/media/fat/games/CD-i# hexdump  -C boot0.rom  | head
00000000  6a 85 25 11 57 cc fd 49  4a d1 56 82 01 29 fb 21  |j.%.W..IJ.V..).!|
00000010  91 02 3b 71 36 b1 71 d0  e7 17 52 db 19 fa e2 70  |..;q6.q...R....p|
00000020  97 29 33 00 9e 88 f6 86  3a b8 a5 6f 70 c0 17 09  |.)3.....:..op...|
00000030  02 68 9b 06 78 68 53 3d  55 37 24 b3 3b 33 f8 cc  |.h..xhS=U7$.;3..|
00000040  3d fa 13 98 76 72 54 5b  e3 8c a0 46 91 9f f8 4f  |=...vrT[...F...O|
00000050  71 39 9e e6 4b 57 47 8c  54 2c 6d 05 7a fe 4f 77  |q9..KWG.T,m.z.Ow|
00000060  b8 b7 96 0b 5f 6e fc 55  d1 01 7f cb e6 64 4a 81  |...._n.U.....dJ.|
00000070  57 da 80 0b 24 e5 66 8b  7d 5c 21 8a 9f d5 af b2  |W...$.f.}\!.....|
00000080  0c f0 9e 83 9b 71 51 bb  ea 14 da 1a 1c b8 f3 14  |.....qQ.........|
00000090  8a 99 58 aa bf e5 b1 c7  85 5a 98 98 ad 74 a6 e9  |..X......Z...t..|

/media/fat/games/CD-i# hexdump  -C boot1.rom  | head
00000000  00 00 15 00 00 40 04 b8  00 00 05 00 00 00 05 0a  |.....@..........|
00000010  00 00 05 14 00 00 05 1e  00 00 05 28 00 00 05 32  |...........(...2|
00000020  00 00 05 3c 00 00 05 46  00 00 05 50 00 00 05 5a  |...<...F...P...Z|
00000030  00 00 05 64 00 00 05 6e  00 00 05 78 00 00 05 82  |...d...n...x....|
00000040  00 00 05 8c 00 00 05 96  00 00 05 a0 00 00 05 aa  |................|
00000050  00 00 05 b4 00 00 05 be  00 00 05 c8 00 00 05 d2  |................|
00000060  00 00 05 dc 00 00 05 e6  00 00 05 f0 00 00 05 fa  |................|
00000070  00 00 06 04 00 00 06 0e  00 00 06 18 00 00 06 22  |..............."|
00000080  00 00 06 2c 00 00 06 36  00 00 06 40 00 00 06 4a  |...,...6...@...J|
00000090  00 00 06 54 00 00 06 5e  00 00 06 68 00 00 06 72  |...T...^...h...r|

Let's see!

ioctl_index[15:0] starts with 0000h. First data in word mode is 0x856a. Afterwards it is 0x1125. This means we have a little endian word here. Boot0.rom is transmitted.

Afterwards... ioctl_index[15:0] is set to 0040h. First data in word mode is 0. Afterwards it is 0x0015. This means we have a little endian word here. Boot1.rom is transmitted.

Can is use ioctl_index[6] to mark the slave worm data?

References

https://github.com/alanswx/Tutorials_MiSTer/tree/master/basic/lesson2/rtl https://github.com/alanswx/Tutorials_MiSTer/tree/master/basic/lesson2 https://mister-devel.github.io/MkDocs_MiSTer/developer/hps_io/#rom-and-file-loading-nvram-saving