home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 8 / amigaformatcd08.iso / in_the_mag / emulation / ql / qdos4amiga3.lha / CPU_TRICKS_bas < prev    next >
Text File  |  1995-09-20  |  12KB  |  376 lines

  1. 100 REMark CPUTEST_BAS SNG v0.36 October 1994
  2. 105 REMark with WARP ENGINE refinements
  3. 110 REMark Uses various TK2 extensions
  4. 120 :
  5. 130 STOP
  6. 290 :
  7. 300 DEFine PROCedure S
  8. 310 SAVE_O FLP1_CPUTEST_BAS
  9. 320 END DEFine S
  10. 330 :
  11. 340 REMark Access control for 68040 series processors - SNG
  12. 350 REMark EC chips support all these except MMU_ON, REMAP
  13. 360 REMark and MMU_OFF. COPYBACK uses the ATU/TTU globally
  14. 370 REMark so it should not be used with fast RAM re-mapped.
  15. 380 :
  16. 390 DEFine PROCedure COPYBACK
  17. 400 x=ALCHP(20)
  18. 410 POKE_W x,20032:REMark SV mode
  19. 420 POKE_W x+2,8764:REMark Load D1
  20. 430 POKE_W x+4,HEX("00FF"):REMark all memory
  21. 440 POKE_W x+6,HEX("C000"):REMark Copyback cache
  22. 450 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
  23. 460 POKE_W x+10,HEX("1006"):REMark Move D1 to DTT0
  24. 470 POKE_W x+12,636:REMark User mode
  25. 480 POKE_W x+14,-9985
  26. 490 POKE_W x+16,HEX("7000")
  27. 500 POKE_W x+18,HEX("4E75")
  28. 510 CALL x
  29. 520 RECHP x
  30. 530 END DEFine COPYBACK
  31. 540 :
  32. 550 DEFine PROCedure CACHE_ON
  33. 560 x=ALCHP(22)
  34. 570 POKE_W x,20032:REMark SV mode
  35. 580 POKE_W x+2,HEX("F4D8"):REMark CINVA ic/dc
  36. 590 POKE_W x+4,8764:REMark Load D1
  37. 600 POKE_W x+6,HEX("8000"):REMark Data on
  38. 610 POKE_W x+8,HEX("8000"):REMark Code on
  39. 620 POKE_W x+10,BIN("0100111001111011"):REMark MOVEC
  40. 630 POKE_W x+12,HEX("1002"):REMark Move D1 to CCR
  41. 640 POKE_W x+14,636:REMark User mode
  42. 650 POKE_W x+16,-9985
  43. 660 POKE_W x+18,HEX("7000")
  44. 670 POKE_W x+20,HEX("4E75")
  45. 680 CALL x
  46. 690 RECHP x:REMark Phew
  47. 700 END DEFine CACHE_ON
  48. 710 :
  49. 720 DEFine PROCedure MMU_OFF
  50. 730 REMark Not applicable to 68EC040
  51. 740 x=ALCHP(20)
  52. 750 POKE_W x,20032:REMark SV mode
  53. 760 POKE_W x+2,8764:REMark Load D1
  54. 770 POKE_W x+4,HEX("0000"):REMark Disable MMU
  55. 780 POKE_W x+6,HEX("0000")
  56. 790 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
  57. 800 POKE_W x+10,HEX("1003"):REMark Move D1 to TCR
  58. 810 POKE_W x+12,636:REMark User mode
  59. 820 POKE_W x+14,-9985
  60. 830 POKE_W x+16,HEX("7000")
  61. 840 POKE_W x+18,HEX("4E75")
  62. 850 CALL x
  63. 860 RECHP x
  64. 870 END DEFine MMU_OFF
  65. 880 :
  66. 890 DEFine PROCedure WRITE_THROUGH
  67. 900 REMark Amiga 4000 fast RAM only
  68. 910 x=ALCHP(20)
  69. 920 POKE_W x,20032:REMark SV mode
  70. 930 POKE_W x+2,8764:REMark Load D1
  71. 940 REMark POKE_W x+4,HEX("07F8"):REMark From 07000000 up for std. A4000 'fast'
  72. 945 POKE_W x+4,HEX("08F7"):REMark From 08000000 up for WARP 4..16 very fast RAM
  73. 950 POKE_W x+6,HEX("C020"):REMark Write-through cache
  74. 960 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
  75. 970 POKE_W x+10,HEX("1006"):REMark Move D1 to DTT0
  76. 980 POKE_W x+12,636:REMark User mode
  77. 990 POKE_W x+14,-9985
  78. 1000 POKE_W x+16,HEX("7000")
  79. 1010 POKE_W x+18,HEX("4E75")
  80. 1020 CALL x
  81. 1030 RECHP x
  82. 1040 END DEFine WRITE_THROUGH
  83. 1050 :
  84. 1060 DEFine PROCedure CACHE_OFF
  85. 1070 x=ALCHP(22)
  86. 1080 POKE_W x,20032:REMark SV mode
  87. 1090 POKE_W x+2,8764:REMark Load D1
  88. 1100 POKE_L x+4,0:REMark Data off, code off
  89. 1110 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
  90. 1120 POKE_W x+10,HEX("1002"):REMark Move D1 to CCR
  91. 1130 POKE_W x+12,HEX("F4F8"):REMark CPUSH ic/dc
  92. 1140 POKE_W x+14,636:REMark User mode
  93. 1150 POKE_W x+16,-9985
  94. 1160 POKE_W x+18,HEX("7000")
  95. 1170 POKE_W x+20,HEX("4E75")
  96. 1180 CALL x
  97. 1190 RECHP x:REMark Phew
  98. 1200 END DEFine CACHE_OFF
  99. 1210 :
  100. 1220 DEFine PROCedure SERIALIZE
  101. 1230 REMark Amiga 4000 fast RAM only
  102. 1240 x=ALCHP(20)
  103. 1250 POKE_W x,20032:REMark SV mode
  104. 1260 POKE_W x+2,8764:REMark Load D1
  105. 1270 REMark POKE_W x+4,HEX("07F8"):REMark From 07000000 up for Motherboard RAM
  106. 1275 POKE_W x+4,HEX("08F7"):REMark From 08000000 up for WARP 4..16 very fast RAM
  107. 1280 POKE_W x+6,HEX("C040"):REMark Serialized, no cache
  108. 1290 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
  109. 1300 POKE_W x+10,HEX("1006"):REMark Move D1 to DTT0
  110. 1310 POKE_W x+12,636:REMark User mode
  111. 1320 POKE_W x+14,-9985
  112. 1330 POKE_W x+16,HEX("7000")
  113. 1340 POKE_W x+18,HEX("4E75")
  114. 1350 CALL x
  115. 1360 RECHP x
  116. 1370 END DEFine SERIALIZE
  117. 1380 :
  118. 1390 DEFine PROCedure ACRS_OFF
  119. 1400 REMark Disables all four ACR/TTR registers
  120. 1405 REMark NEEDS the code CACHE to be OFF!
  121. 1410 LOCal r,x
  122. 1420 x=ALCHP(20)
  123. 1430 POKE_W x,20032:REMark SV mode
  124. 1440 POKE_W x+2,8764:REMark Load D1
  125. 1450 POKE_W x+4,HEX("00FF"):REMark All of memory
  126. 1460 POKE_W x+6,0:REMark Turn it off
  127. 1470 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
  128. 1480 POKE_W x+10,HEX("1006"):REMark Move D1 to DTT0 etc
  129. 1490 POKE_W x+12,636:REMark User mode
  130. 1500 POKE_W x+14,-9985
  131. 1510 POKE_W x+16,HEX("7000")
  132. 1520 POKE_W x+18,HEX("4E75")
  133. 1530 FOR r=4 TO 7:POKE x+11,r:CALL x
  134. 1540 RECHP x
  135. 1550 END DEFine ACRS_OFF
  136. 1560 :
  137. 1570 DEFine FuNction GETC(n)
  138. 1580 LOCal x:REMark r
  139. 1590 IF n<0 OR n>4095 : PRINT #0;"Bad CR " & n : STOP
  140. 1600 x=ALCHP(20)
  141. 1610 POKE_W x,20032:REMark SV mode
  142. 1620 POKE_W x+2,BIN("0100111001111010"):REMark MOVEC
  143. 1630 POKE_W x+4,4096+n:REMark Move CR to D1
  144. 1640 POKE_W x+6,636:REMark User mode
  145. 1650 POKE_W x+8,-9985
  146. 1660 POKE_W x+10,HEX("41FA") :REMark LEA x,A0
  147. 1670 POKE_W x+12,-12
  148. 1680 POKE_W x+14,HEX("2081") :REMark MOVE.L D1,(A0)
  149. 1690 POKE_W x+16,HEX("7000") :REMark MOVEQ #0,D0
  150. 1700 POKE_W x+18,HEX("4E75") :REMark RTS
  151. 1710 CALL x
  152. 1720 r=PEEK_L(x)
  153. 1730 RECHP x
  154. 1740 RETurn r
  155. 1750 END DEFine GETC
  156. 1760 :
  157. 1770 DEFine FuNction PAGE(q,size)
  158. 1780 RETurn INT(q/size)*size
  159. 1790 END DEFine PAGE
  160. 1800 :
  161. 1810 DEFine PROCedure SHOW_MMU
  162. 1820 REMark Uses TK2 PRINT_USING
  163. 1830 CLS
  164. 1840 PRINT "Logical",,"Physical","Mode",,"State"
  165. 1850 root=GETC(2055)
  166. 1860 SHOW_PTRS root,1
  167. 1870 END DEFine SHOW_MMU
  168. 1880 :
  169. 1890 DEFine PROCedure SHOW_PTRS(base,level)
  170. 1900 LOCal b,i,j,k,m
  171. 1910 m=0
  172. 1920 FOR i=base TO base+127*4 STEP 4
  173. 1930   j=PEEK_L(i)
  174. 1940   IF level=1
  175. 1950     PRINT m & ".." & (m+31) & " Mb ",
  176. 1960     k=PAGE(j,512)
  177. 1970     m=m+32
  178. 1980   ELSE 
  179. 1990     PRINT ,"+ " & m & ".." & (m+255) & " Kb   ";
  180. 2000     k=PAGE(j,128):REMark Assume 8K pages, 256 if 4K
  181. 2010     m=m+256
  182. 2020   END IF 
  183. 2030   b=j-k
  184. 2040   IF b && 2
  185. 2050     PRINT_USING "##########",k
  186. 2060     IF b && 4
  187. 2070       PRINT ,"READ ONLY",
  188. 2080     ELSE 
  189. 2090       PRINT ,"read/write",
  190. 2100     END IF 
  191. 2110     IF b && 64
  192. 2120       PRINT"serialized",
  193. 2130     ELSE 
  194. 2140       PRINT "cacheable",
  195. 2150     END IF 
  196. 2160     PRINT "in use"
  197. 2170     IF level=1: SHOW_PTRS k,2
  198. 2180   ELSE 
  199. 2190     PRINT "unused"
  200. 2200   END IF 
  201. 2210 END FOR i
  202. 2220 END DEFine SHOW_PTRS
  203. 2230 :
  204. 2240 DEFine PROCedure REMAP
  205. 2250 REMark For 8K pages, tested with 2 Mb chip, 4 and 8 Mb fast RAM;
  206. 2260 REMark allocates tables to put 4..8 megs fast RAM just after chip
  207. 2270 REMark Copyright 1994 Simon N Goodwin, version 0.36, WARP ENGINE
  208. 2280 REMark Written for clarity and easy tweaks rather than efficiency
  209. 2290 :
  210. 2300 MMU_OFF:REMark Run this from 2 meg chip Qdos
  211. 2310 PATCH_ACRS_OFF:REMark Stop ROM using ACRS
  212. 2320 REMark root=HEX("08000000")-32768:REMark 32K below top of A4000 motherboard 'fast' RAM
  213. 2325 root=HEX("08800000")-32768:REMark 32K below top of Warp Engine 8 Meg very fast RAM
  214. 2330 REMark change this if your fast RAM is anywhere else
  215. 2340 xtra=512:REMark 8192 byte FAST page count beyond 4Mb e.g. 512 for 8Mb
  216. 2350 REMark MMU Descriptor bit patterns
  217. 2360 resident=3          :REMark this memory exists
  218. 2370 serialized=2^6      :REMark non-cacheable memory
  219. 2380 write_protect=2^2   :REMark read-only memory
  220. 2390 :
  221. 2400 REMark Clear the entire root table
  222. 2410 FOR i=root TO root+127*4 STEP 4
  223. 2420   POKE_L i,0 :REMark Mark section as invalid
  224. 2430 END FOR i
  225. 2440 :
  226. 2450 REMark Make room for the pointer table
  227. 2460 pointers=root+128*4 :REMark Table for 00000000 to 01FFFFFF logical
  228. 2470 POKE_L root+0*4,pointers+resident :REMark Turn the first 32 Mb on
  229. 2480 :
  230. 2490 REMark Set up pointer table entries for each 256K area
  231. 2500 pages=pointers+128*4 :REMark Base of area for 64 page tables
  232. 2510 REMark The first 10 Mb is resident RAM
  233. 2520 FOR table=0 TO 39
  234. 2530   POKE_L pointers+table*4,pages+table*32*4+resident
  235. 2540 END FOR table
  236. 2550 REMark Map 6 megs from A00000 to 16 Mb as serialized for I/O
  237. 2560 FOR table=40 TO 63
  238. 2570   POKE_L pointers+table*4,pages+table*32*4+resident
  239. 2580 END FOR table
  240. 2590 REMark Clear the second half of the 32 Mb pointer-level table
  241. 2600 FOR i=pointers+64*4 TO pages-1 STEP 4
  242. 2610   POKE_L i,0
  243. 2620 END FOR i
  244. 2630 :
  245. 2640 REMark Map the first 256K (32 x 8K pages)
  246. 2650 base=0
  247. 2660 REMark The first 48K is NOT YET write-protected
  248. 2670 FOR i=pages TO pages+5*4 STEP 4
  249. 2680   POKE_L i,base+resident:REMark +write_protect
  250. 2690   base=base+8192
  251. 2700 END FOR i
  252. 2710 :
  253. 2720 REMark The next 16K allows read/write
  254. 2730 POKE_L pages+6*4,base+resident
  255. 2740 POKE_L pages+7*4,base+8192+resident
  256. 2750 base=base+2*8192
  257. 2760 :
  258. 2770 REMark Then comes 64K of serialized non-cacheable I/O area
  259. 2780 FOR i=pages+8*4 TO pages+15*4 STEP 4
  260. 2790   POKE_L i,base+serialized+resident
  261. 2800   base=base+8192
  262. 2810 END FOR i
  263. 2820 :
  264. 2830 REMark Sort out the first 128K of 'real' Qdos RAM
  265. 2840 FOR i=pages+16*4 TO pages+31*4 STEP 4
  266. 2850    POKE_L i,base+resident
  267. 2860    base=base+8192
  268. 2870 END FOR i
  269. 2880 :
  270. 2890 REMark That's the first 256K of chip mapped;
  271. 2900 REMark the remaining 1.75 megs is orthogonal
  272. 2910 FOR i=pages+32*4 TO pages+255*4 STEP 4
  273. 2920   POKE_L i,base+resident
  274. 2930   base=base+8192
  275. 2940 END FOR i
  276. 2950 :
  277. 2960 REMark Fast RAM starts thereafter
  278. 2970 base=HEX("08000000"):REMark Warp Engine 1..128 Mb FAST
  279. 2975 REMark base=HEX("07C00000")-xtra*8192:REMark A4000, 4Mb+
  280. 2980 FOR i=pages+256*4 TO pages+(256+xtra+512-1-4)*4 STEP 4
  281. 2990   POKE_L i,base+resident
  282. 3000   base=base+8192
  283. 3010 END FOR i
  284. 3020 :
  285. 3030 REMark The last 32K of RAM is reserved for mapping
  286. 3040 REMark It is read-only with cacheing disabled (?)
  287. 3050 FOR i=pages+(256+512+xtra-4)*4 TO pages+(256+xtra+512-1)*4 STEP 4
  288. 3060   POKE_L i,base+resident+write_protect+serialized
  289. 3070   base=base+8192
  290. 3080 END FOR i
  291. 3090 IF NOT xtra
  292. 3100   FOR i=pages+(256+512+xtra)*4 TO pages+(256+512+512-1)*4 STEP 4
  293. 3110     POKE_L i,0 :REMark Mark as absent
  294. 3120   END FOR i
  295. 3130 END IF 
  296. 3140 :
  297. 3150 REMark Echo the 6 megs of 68000 I/O space
  298. 3160 base=HEX("A00000")
  299. 3170 FOR i=pages+(256+512+512)*4 TO pages+2047*4 STEP 4
  300. 3180   POKE_L i,base+resident+serialized
  301. 3190   base=base+8192
  302. 3200 END FOR i
  303. 3210 :
  304. 3220 ACRS_OFF
  305. 3230 SET_MMU_BASES root
  306. 3240 CACHE_OFF
  307. 3250 MMU_ON
  308. 3260 WRITE_THROUGH :REMark Echo fast RAM in old place
  309. 3275 CACHE_ON
  310. 3280 REMark Set limit of QDOS to remapped RAMtop-64K
  311. 3290 REMark here, reset to contiguous 6 Mb Qdos setup
  312. 3295 PRINT "Fast RAM remapped, resetting..."
  313. 3297 PAUSE 100
  314. 3300 RESET_TOP 2^21,3*(2^21)-2^16
  315. 3310 END DEFine REMAP
  316. 3320 :
  317. 3330 DEFine PROCedure MMU_ON
  318. 3340 REMark Not applicable to 68EC040
  319. 3350 x=ALCHP(20)
  320. 3360 POKE_W x,20032:REMark SV mode
  321. 3370 POKE_W x+2,8764:REMark Load D1
  322. 3380 POKE_W x+4,HEX("0000"):REMark Enable MMU
  323. 3390 POKE_W x+6,HEX("C000")
  324. 3400 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
  325. 3410 POKE_W x+10,HEX("1003"):REMark Move D1 to TCR
  326. 3420 POKE_W x+12,636:REMark User mode
  327. 3430 POKE_W x+14,-9985
  328. 3440 POKE_W x+16,HEX("7000")
  329. 3450 POKE_W x+18,HEX("4E75")
  330. 3460 CALL x
  331. 3470 RECHP x
  332. 3480 END DEFine MMU_ON
  333. 3490 :
  334. 3500 DEFine PROCedure SET_MMU_BASES(here)
  335. 3510 REMark Not applicable to 68EC040
  336. 3520 x=ALCHP(20)
  337. 3530 POKE_W x,20032:REMark SV mode
  338. 3540 POKE_W x+2,8764:REMark Load D1
  339. 3550 POKE_L x+4,here
  340. 3560 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
  341. 3570 POKE_W x+10,HEX("1806"):REMark Move D1 to URP
  342. 3580 POKE_W x+12,636:REMark User mode
  343. 3590 POKE_W x+14,-9985
  344. 3600 POKE_W x+16,HEX("7000")
  345. 3610 POKE_W x+18,HEX("4E75")
  346. 3620 CALL x
  347. 3630 POKE x+11,7:REMark Change URP to SRP
  348. 3640 CALL x
  349. 3650 RECHP x
  350. 3660 END DEFine SET_MMU_BASES
  351. 3670 :
  352. 3680 DEFine PROCedure TIMER
  353. 3690 time=DATE+1:REPeat l:IF time=DATE:EXIT l
  354. 3700 FOR i=1 TO 20000 : REMark Wait!
  355. 3710 time=DATE-time
  356. 3720 PRINT time;" seconds for 100,000 FOR loops"
  357. 3730 END DEFine TIMER
  358. 3740 :
  359. 3750 DEFine PROCedure CREPORT
  360. 3760 REMark OPEN_NEW #3,scr
  361. 3765 REMark INK #3,7
  362. 3770 FOR i=0 TO 7,2048 TO 2055
  363. 3780   IF i<>2050
  364. 3790     PRINT i,HEX$(GETC(i),32),GETC(i)
  365. 3800   END IF :REMark Skip CAAR, 020 & 030 only
  366. 3810 END FOR i
  367. 3820 REMark CLOSE #3
  368. 3830 END DEFine CREPORT
  369. 3840 :
  370. 4080 DEFine PROCedure MAP_MEGS
  371. 4085 mb=2^20
  372. 4090 FOR i=1 TO 256
  373. 4100   PRINT i,:PRINT PEEK(i*mb)
  374. 4110 END FOR i
  375. 4120 END DEFine MAP_MEGS
  376.