Skip to content

Commit 0284fbc

Browse files
authored
Merge pull request #13 from FPGAArcade/rtg-fixes
RTG driver v2.0
2 parents 10ac9a7 + c37166a commit 0284fbc

File tree

2 files changed

+263
-24
lines changed

2 files changed

+263
-24
lines changed

build_rom.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/bin/bash
22
set -e
33

4-
romtool -v build -o replay.rom -t ext -s 64 -e f00000 -a f00010 -r 01.06 -f bootrom/bootrom.bin addmem/AddReplayMem poseidon/PoseidonLoader rtc/battclock.resource usb/usb_eth.autoconfig usb/replayusb.device eth/replayeth.device
4+
romtool -v build -o replay.rom -t ext -s 64 -e f00000 -a f00010 -r 01.07 -f bootrom/bootrom.bin addmem/AddReplayMem poseidon/PoseidonLoader rtc/battclock.resource usb/usb_eth.autoconfig usb/replayusb.device eth/replayeth.device rtg/Replay.card
55
printf "000001: 11" | xxd -r - replay.rom
66
romtool copy -c replay.rom replay.rom
77
romtool info replay.rom

rtg/replay.card.asm

Lines changed: 262 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
;
1414
;
1515

16+
; 2.0 - Embed Replay.card inside replay.com
17+
; 1.26 - Set pixelclocks for 24bit TrueColor
18+
; 1.25 - Use mmu.library to set MMU cache mode (if available) (eriQue)
1619
; 1.24 - Fix fast mem alloc with 060db (eriQue)
1720
; Request MMU cache mode change (040/060)
1821
; 1.0.23 - Made compatible with ASM-One/AsmPro and PhxAss and vasm (eriQue)
@@ -66,6 +69,7 @@ SYSTEM_INCLUDES
6669
include exec/exec.i
6770
include libraries/expansionbase.i
6871
include hardware/intbits.i
72+
include utility/tagitem.i
6973
ENDC
7074

7175
;debug
@@ -147,8 +151,11 @@ bugprintf:
147151
movem.l (sp)+,d0-d1/a0-a3/a6
148152
rts
149153

150-
.putch: move.l a3,a6
151-
jmp -516(a6) ; _LVORawPutChar (execPrivate9)
154+
.putch: move.l a6,-(sp)
155+
move.l a3,a6
156+
jsr -516(a6) ; _LVORawPutChar (execPrivate9)
157+
move.l (sp)+,a6
158+
rts
152159
_bugprintf_end:
153160
rts
154161
ENDC
@@ -160,8 +167,8 @@ _bugprintf_end:
160167
dc.w RTC_MATCHWORD
161168
dc.l RomTag
162169
dc.l ProgEnd
163-
dc.b RTF_AUTOINIT ;RT_FLAGS
164-
dc.b 1 ;RT_VERSION
170+
dc.b RTF_AUTOINIT|RTF_AFTERDOS ;RT_FLAGS
171+
dc.b 2 ;RT_VERSION
165172
dc.b NT_LIBRARY ;RT_TYPE
166173
dc.b 0 ;RT_PRI
167174
dc.l ReplayCard
@@ -173,7 +180,7 @@ ReplayCard:
173180
dc.b 'Replay.card',0,0
174181
dc.b '$VER: '
175182
IDString:
176-
dc.b 'Replay.card 1.24 (30.01.2018)',0
183+
dc.b 'Replay.card 2.0 (15.3.2022)',0
177184
dc.b 0
178185
expansionLibName:
179186
dc.b 'expansion.library',0
@@ -198,7 +205,7 @@ DataTable:
198205
INITBYTE LN_PRI,206
199206
INITLONG LN_NAME,ReplayCard
200207
INITBYTE LIB_FLAGS,LIBF_SUMUSED|LIBF_CHANGED
201-
INITWORD LIB_VERSION,1
208+
INITWORD LIB_VERSION,2
202209
INITWORD LIB_REVISION,0
203210
INITLONG LIB_IDSTRING,IDString
204211
INITLONG CARD_NAME,CardName
@@ -446,10 +453,11 @@ DataTable:
446453

447454
move.l #113440000,PSSO_BoardInfo_MemoryClock(a2)
448455

456+
; Max pixel clocks (see PixelClockTable for indices)
449457
move.l #16,(PSSO_BoardInfo_PixelClockCount+0,a2)
450458
move.l #16,(PSSO_BoardInfo_PixelClockCount+4,a2)
451459
move.l #12,(PSSO_BoardInfo_PixelClockCount+8,a2)
452-
move.l #8,(PSSO_BoardInfo_PixelClockCount+12,a2)
460+
move.l #9,(PSSO_BoardInfo_PixelClockCount+12,a2)
453461
move.l #7,(PSSO_BoardInfo_PixelClockCount+16,a2)
454462
;- Planar
455463
;- Chunky
@@ -512,7 +520,18 @@ DataTable:
512520
move.l a1,PSSO_BoardInfo_SetSpriteColor(a2)
513521
ENDC
514522

523+
; Try to set memory region MMU flags via mmu.library first
524+
move.l PSSO_BoardInfo_MemoryBase(a2),a0
525+
move.l PSSO_BoardInfo_MemorySize(a2),d0
526+
move.l #MAPP_CACHEINHIBIT|MAPP_IMPRECISE|MAPP_NONSERIALIZED,d1
527+
move.l PSSO_BoardInfo_ExecBase(a2),a6
528+
bsr SetMMU
529+
cmp.l #-1,d0
530+
bne.b .skip
531+
532+
; mmu.library failed - let's try with the P96 flags
515533
ori.l #(1<<3),PSSO_BoardInfo_Flags(a2) ; BIF_CACHEMODECHANGE
534+
.skip
516535
move.l PSSO_BoardInfo_MemoryBase(a2),(PSSO_BoardInfo_MemorySpaceBase,a2)
517536
move.l PSSO_BoardInfo_MemorySize(a2),(PSSO_BoardInfo_MemorySpaceSize,a2)
518537

@@ -1069,22 +1088,22 @@ SecondUnionTable: ; clock generator select
10691088

10701089
PixelClockTable:
10711090

1072-
dc.l 7156250 ;28.625 div 4
1073-
dc.l 10000000 ;40 div 4
1074-
dc.l 12500000 ;50 div 4
1075-
dc.l 20000000 ;40 div 2
1076-
dc.l 25000000 ;50 div 2
1077-
dc.l 27000000 ;108 div 4
1078-
dc.l 28625000 ;28.625 div 1
1079-
dc.l 36000000 ;108 div 3
1080-
dc.l 40000000 ;40 div 1
1081-
dc.l 50000000 ;50 div 1
1082-
dc.l 54000000 ;108 div 2
1083-
dc.l 57250000 ;114.5 div 2
1084-
dc.l 74250000 ;74.25 div 1
1085-
dc.l 82000000 ;82 div 1
1086-
dc.l 108000000 ;108 div 1
1087-
dc.l 114500000 ;114.5 div 1
1091+
.1 dc.l 7156250 ;28.625 div 4
1092+
.2 dc.l 10000000 ;40 div 4
1093+
.3 dc.l 12500000 ;50 div 4
1094+
.4 dc.l 20000000 ;40 div 2
1095+
.5 dc.l 25000000 ;50 div 2
1096+
.6 dc.l 27000000 ;108 div 4
1097+
.7 dc.l 28625000 ;28.625 div 1
1098+
.8 dc.l 36000000 ;108 div 3
1099+
.9 dc.l 40000000 ;40 div 1
1100+
.10 dc.l 50000000 ;50 div 1
1101+
.11 dc.l 54000000 ;108 div 2
1102+
.12 dc.l 57250000 ;114.5 div 2
1103+
.13 dc.l 74250000 ;74.25 div 1
1104+
.14 dc.l 82000000 ;82 div 1
1105+
.15 dc.l 108000000 ;108 div 1
1106+
.16 dc.l 114500000 ;114.5 div 1
10881107

10891108

10901109
;------------------------------------------------------------------------------
@@ -1728,5 +1747,225 @@ Scale2X:
17281747

17291748
;==============================================================================
17301749

1750+
SetMMU ; ( addr:a0 size:d0 flags:d1 exec:a6 )
1751+
; returns old flags in d0/d1
1752+
; ( d0-d1/a0-a1 are scratch )
1753+
1754+
MAPP_CACHEINHIBIT equ (1<<6)
1755+
MAPP_COPYBACK equ (1<<13)
1756+
MAPP_IMPRECISE equ (1<<21)
1757+
MAPP_NONSERIALIZED equ (1<<29)
1758+
1759+
_LVOGetMapping EQU -36
1760+
_LVOReleaseMapping EQU -42
1761+
_LVOGetPageSize EQU -48
1762+
_LVOGetMMUType EQU -54
1763+
_LVOLockMMUContext EQU -72
1764+
_LVOUnlockMMUContext EQU -78
1765+
_LVOSetPropertiesA EQU -84
1766+
_LVOGetPropertiesA EQU -90
1767+
_LVORebuildTree EQU -96
1768+
_LVOSuperContext EQU -144
1769+
_LVODefaultContext EQU -150
1770+
_LVOLockContextList EQU -210
1771+
_LVOUnlockContextList EQU -216
1772+
_LVOSetPropertyList EQU -228
1773+
_LVORebuildTreesA EQU -360
1774+
1775+
movem.l d2-d7/a2-a5,-(sp)
1776+
1777+
movem.l d0/a0,-(sp) ; (sp),4(sp) = size,addr
1778+
move.l d1,a3 ; a3 = flags
1779+
1780+
; Only attempt mmu.library if it's already loaded (via SetPatch)
1781+
FORBID
1782+
1783+
lea LibList(a6),a0
1784+
.retry lea .mmuName(pc),a1
1785+
CALLLIB _LVOFindName
1786+
1787+
move.l d0,d2
1788+
beq.b .done
1789+
movea.l d0,a0
1790+
1791+
cmp.w #46,LIB_VERSION(a0)
1792+
blt.b .retry
1793+
1794+
.done
1795+
PERMIT
1796+
1797+
tst.l d2
1798+
bne.b .mmulib_ok
1799+
1800+
pea .exit(pc)
1801+
bra .failed
1802+
1803+
; Verify MMU presence
1804+
.mmulib_ok move.l d2,a6
1805+
CALLLIB _LVOGetMMUType
1806+
tst.b d0
1807+
bne.b .mmu_ok
1808+
1809+
pea .nommu(pc)
1810+
bra .failed
1811+
1812+
.mmu_ok
1813+
sub.b #'0',d0
1814+
1815+
; Get contexts
1816+
CALLLIB _LVODefaultContext
1817+
movea.l d0,a5 ; a5 = ctx
1818+
move.l d0,a0
1819+
CALLLIB _LVOSuperContext
1820+
movea.l d0,a4 ; a4 = sctx
1821+
1822+
move.l a5,d0
1823+
CALLLIB _LVOGetPageSize
1824+
move.l d0,d7 ; d7 = pagesize
1825+
1826+
move.l a4,d0
1827+
CALLLIB _LVOGetPageSize
1828+
cmp.l d0,d7
1829+
beq.b .page_ok
1830+
1831+
pea .nommu(pc)
1832+
bra .failed
1833+
1834+
.page_ok
1835+
; adjust address and size to match page size
1836+
movem.l (sp),d0/d1
1837+
1838+
move.l d7,d6
1839+
subq.l #1,d6
1840+
not.l d6
1841+
move.l d1,d2
1842+
and.l d6,d1
1843+
sub.l d1,d2
1844+
add.l d2,d0
1845+
add.l d7,d0
1846+
and.l d6,d0
1847+
1848+
movem.l d0/d1,(sp) ; (sp),4(sp) = adjusted size/addr
1849+
1850+
; Lock contexts
1851+
CALLLIB _LVOLockContextList
1852+
movea.l a5,a0
1853+
CALLLIB _LVOLockMMUContext (ctx)
1854+
movea.l a4,a0
1855+
CALLLIB _LVOLockMMUContext (sctx)
1856+
1857+
; Get mapping
1858+
move.l a5,a0
1859+
CALLLIB _LVOGetMapping (ctx)
1860+
move.l d0,d5 ; d5 = ctx mapping
1861+
bne.b .ctx_ok
1862+
1863+
pea .unlock(pc)
1864+
bra .failed
1865+
1866+
.ctx_ok move.l a4,a0
1867+
CALLLIB _LVOGetMapping (sctx)
1868+
move.l d0,d4 ; d4 = ctx mapping
1869+
bne.b .sctx_ok
1870+
1871+
pea .release(pc)
1872+
bra .failed
1873+
1874+
.sctx_ok movem.l (sp),d6/d7 ; d6 = size, d7 = addr
1875+
1876+
move.l a5,a0
1877+
move.l d7,a1
1878+
lea .tagDone,a2
1879+
CALLLIB _LVOGetPropertiesA (ctx,from,TAG_DONE)
1880+
move.l d0,(sp) ; (sp) = old flags (ctx)
1881+
1882+
move.l a5,a0
1883+
move.l a3,d1
1884+
move.l #MAPP_CACHEINHIBIT|MAPP_IMPRECISE|MAPP_NONSERIALIZED|MAPP_COPYBACK,d2
1885+
move.l d6,d0
1886+
move.l d7,a1
1887+
lea .tagDone(pc),a2
1888+
CALLLIB _LVOSetPropertiesA (ctx,flags,mask,from,size,TAG_DONE)
1889+
tst.b d0
1890+
beq .revert
1891+
1892+
move.l a4,a0
1893+
move.l d7,a1
1894+
movem.l (sp),d0/a1
1895+
lea .tagDone,a2
1896+
CALLLIB _LVOGetPropertiesA (sctx,from,TAG_DONE)
1897+
move.l d0,4(sp) ; 4(sp) = old flags (sctx)
1898+
1899+
move.l a4,a0
1900+
move.l a3,d1
1901+
move.l #MAPP_CACHEINHIBIT|MAPP_IMPRECISE|MAPP_NONSERIALIZED|MAPP_COPYBACK,d2
1902+
move.l d6,d0
1903+
move.l d7,a1
1904+
lea .tagDone(pc),a2
1905+
CALLLIB _LVOSetPropertiesA (sctx,flags,mask,from,size,TAG_DONE)
1906+
tst.b d0
1907+
beq .revert
1908+
1909+
sub.w #4*3,sp
1910+
move.l a5,(sp)
1911+
move.l a4,4(sp)
1912+
clr.l 8(sp)
1913+
move.l sp,a0
1914+
CALLLIB _LVORebuildTreesA (ctx,sctx,NULL)
1915+
add.w #4*3,sp
1916+
tst.b d0
1917+
bne .success
1918+
1919+
.revert
1920+
pea .cleanup(pc)
1921+
move.l a5,a0
1922+
move.l d5,a1
1923+
CALLLIB _LVOSetPropertyList (ctx,ctxl)
1924+
move.l a4,a0
1925+
move.l d4,a1
1926+
CALLLIB _LVOSetPropertyList (sctx,sctxl)
1927+
1928+
.failed
1929+
moveq.l #-1,d0
1930+
move.l d0,4(sp) ; set return values
1931+
move.l d0,8(sp)
1932+
rts
1933+
1934+
.success
1935+
1936+
.cleanup
1937+
move.l a4,a0
1938+
move.l d4,a1
1939+
CALLLIB _LVOReleaseMapping (sctx,sctxl)
1940+
1941+
.release
1942+
move.l a5,a0
1943+
move.l d5,a1
1944+
CALLLIB _LVOReleaseMapping (ctx,ctxl)
1945+
1946+
.unlock
1947+
1948+
; Unlock contexts
1949+
movea.l a4,a0
1950+
CALLLIB _LVOUnlockMMUContext (sctx)
1951+
movea.l a5,a0
1952+
CALLLIB _LVOUnlockMMUContext (ctx)
1953+
CALLLIB _LVOUnlockContextList
1954+
1955+
.nommu
1956+
1957+
move.l a6,a1
1958+
move.l 4.w,a6
1959+
CALLLIB _LVOCloseLibrary
1960+
1961+
.exit:
1962+
movem.l (sp)+,d0/d1
1963+
movem.l (sp)+,d2-d7/a2-a5
1964+
rts
1965+
1966+
.mmuName dc.b "mmu.library",0
1967+
even
1968+
.tagDone dc.l TAG_DONE
1969+
17311970
ProgEnd:
17321971
end

0 commit comments

Comments
 (0)