13
13
;
14
14
;
15
15
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)
16
19
; 1.24 - Fix fast mem alloc with 060db (eriQue)
17
20
; Request MMU cache mode change (040/060)
18
21
; 1.0.23 - Made compatible with ASM-One/AsmPro and PhxAss and vasm (eriQue)
@@ -66,6 +69,7 @@ SYSTEM_INCLUDES
66
69
include exec/exec.i
67
70
include libraries/expansionbase.i
68
71
include hardware/intbits.i
72
+ include utility/tagitem.i
69
73
ENDC
70
74
71
75
;debug
@@ -147,8 +151,11 @@ bugprintf:
147
151
movem .l (sp )+,d0 -d1 /a0 -a3 /a6
148
152
rts
149
153
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
152
159
_bugprintf_end:
153
160
rts
154
161
ENDC
@@ -160,8 +167,8 @@ _bugprintf_end:
160
167
dc.w RTC_MATCHWORD
161
168
dc.l RomTag
162
169
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
165
172
dc.b NT_LIBRARY ;RT_TYPE
166
173
dc.b 0 ;RT_PRI
167
174
dc.l ReplayCard
@@ -173,7 +180,7 @@ ReplayCard:
173
180
dc.b 'Replay.card',0 ,0
174
181
dc.b '$VER: '
175
182
IDString:
176
- dc.b 'Replay.card 1 . 24 ( 30 . 01 . 2018 )',0
183
+ dc.b 'Replay.card 2 . 0 ( 15 . 3 . 2022 )',0
177
184
dc.b 0
178
185
expansionLibName:
179
186
dc.b 'expansion.library',0
@@ -198,7 +205,7 @@ DataTable:
198
205
INITBYTE LN_PRI,206
199
206
INITLONG LN_NAME,ReplayCard
200
207
INITBYTE LIB_FLAGS,LIBF_SUMUSED|LIBF_CHANGED
201
- INITWORD LIB_VERSION,1
208
+ INITWORD LIB_VERSION,2
202
209
INITWORD LIB_REVISION,0
203
210
INITLONG LIB_IDSTRING,IDString
204
211
INITLONG CARD_NAME,CardName
@@ -446,10 +453,11 @@ DataTable:
446
453
447
454
move.l #113440000 ,PSSO_BoardInfo_MemoryClock(a2 )
448
455
456
+ ; Max pixel clocks (see PixelClockTable for indices)
449
457
move.l #16 ,(PSSO_BoardInfo_PixelClockCount+0 ,a2 )
450
458
move.l #16 ,(PSSO_BoardInfo_PixelClockCount+4 ,a2 )
451
459
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 )
453
461
move.l #7 ,(PSSO_BoardInfo_PixelClockCount+16 ,a2 )
454
462
;- Planar
455
463
;- Chunky
@@ -512,7 +520,18 @@ DataTable:
512
520
move.l a1 ,PSSO_BoardInfo_SetSpriteColor(a2 )
513
521
ENDC
514
522
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
515
533
ori.l #(1 <<3 ),PSSO_BoardInfo_Flags(a2 ) ; BIF_CACHEMODECHANGE
534
+ .skip
516
535
move.l PSSO_BoardInfo_MemoryBase(a2 ),(PSSO_BoardInfo_MemorySpaceBase,a2 )
517
536
move.l PSSO_BoardInfo_MemorySize(a2 ),(PSSO_BoardInfo_MemorySpaceSize,a2 )
518
537
@@ -1069,22 +1088,22 @@ SecondUnionTable: ; clock generator select
1069
1088
1070
1089
PixelClockTable:
1071
1090
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
1088
1107
1089
1108
1090
1109
;------------------------------------------------------------------------------
@@ -1728,5 +1747,225 @@ Scale2X:
1728
1747
1729
1748
;==============================================================================
1730
1749
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
+
1731
1970
ProgEnd:
1732
1971
end
0 commit comments