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 >
Wrap
Text File
|
1995-09-20
|
12KB
|
376 lines
100 REMark CPUTEST_BAS SNG v0.36 October 1994
105 REMark with WARP ENGINE refinements
110 REMark Uses various TK2 extensions
120 :
130 STOP
290 :
300 DEFine PROCedure S
310 SAVE_O FLP1_CPUTEST_BAS
320 END DEFine S
330 :
340 REMark Access control for 68040 series processors - SNG
350 REMark EC chips support all these except MMU_ON, REMAP
360 REMark and MMU_OFF. COPYBACK uses the ATU/TTU globally
370 REMark so it should not be used with fast RAM re-mapped.
380 :
390 DEFine PROCedure COPYBACK
400 x=ALCHP(20)
410 POKE_W x,20032:REMark SV mode
420 POKE_W x+2,8764:REMark Load D1
430 POKE_W x+4,HEX("00FF"):REMark all memory
440 POKE_W x+6,HEX("C000"):REMark Copyback cache
450 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
460 POKE_W x+10,HEX("1006"):REMark Move D1 to DTT0
470 POKE_W x+12,636:REMark User mode
480 POKE_W x+14,-9985
490 POKE_W x+16,HEX("7000")
500 POKE_W x+18,HEX("4E75")
510 CALL x
520 RECHP x
530 END DEFine COPYBACK
540 :
550 DEFine PROCedure CACHE_ON
560 x=ALCHP(22)
570 POKE_W x,20032:REMark SV mode
580 POKE_W x+2,HEX("F4D8"):REMark CINVA ic/dc
590 POKE_W x+4,8764:REMark Load D1
600 POKE_W x+6,HEX("8000"):REMark Data on
610 POKE_W x+8,HEX("8000"):REMark Code on
620 POKE_W x+10,BIN("0100111001111011"):REMark MOVEC
630 POKE_W x+12,HEX("1002"):REMark Move D1 to CCR
640 POKE_W x+14,636:REMark User mode
650 POKE_W x+16,-9985
660 POKE_W x+18,HEX("7000")
670 POKE_W x+20,HEX("4E75")
680 CALL x
690 RECHP x:REMark Phew
700 END DEFine CACHE_ON
710 :
720 DEFine PROCedure MMU_OFF
730 REMark Not applicable to 68EC040
740 x=ALCHP(20)
750 POKE_W x,20032:REMark SV mode
760 POKE_W x+2,8764:REMark Load D1
770 POKE_W x+4,HEX("0000"):REMark Disable MMU
780 POKE_W x+6,HEX("0000")
790 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
800 POKE_W x+10,HEX("1003"):REMark Move D1 to TCR
810 POKE_W x+12,636:REMark User mode
820 POKE_W x+14,-9985
830 POKE_W x+16,HEX("7000")
840 POKE_W x+18,HEX("4E75")
850 CALL x
860 RECHP x
870 END DEFine MMU_OFF
880 :
890 DEFine PROCedure WRITE_THROUGH
900 REMark Amiga 4000 fast RAM only
910 x=ALCHP(20)
920 POKE_W x,20032:REMark SV mode
930 POKE_W x+2,8764:REMark Load D1
940 REMark POKE_W x+4,HEX("07F8"):REMark From 07000000 up for std. A4000 'fast'
945 POKE_W x+4,HEX("08F7"):REMark From 08000000 up for WARP 4..16 very fast RAM
950 POKE_W x+6,HEX("C020"):REMark Write-through cache
960 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
970 POKE_W x+10,HEX("1006"):REMark Move D1 to DTT0
980 POKE_W x+12,636:REMark User mode
990 POKE_W x+14,-9985
1000 POKE_W x+16,HEX("7000")
1010 POKE_W x+18,HEX("4E75")
1020 CALL x
1030 RECHP x
1040 END DEFine WRITE_THROUGH
1050 :
1060 DEFine PROCedure CACHE_OFF
1070 x=ALCHP(22)
1080 POKE_W x,20032:REMark SV mode
1090 POKE_W x+2,8764:REMark Load D1
1100 POKE_L x+4,0:REMark Data off, code off
1110 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
1120 POKE_W x+10,HEX("1002"):REMark Move D1 to CCR
1130 POKE_W x+12,HEX("F4F8"):REMark CPUSH ic/dc
1140 POKE_W x+14,636:REMark User mode
1150 POKE_W x+16,-9985
1160 POKE_W x+18,HEX("7000")
1170 POKE_W x+20,HEX("4E75")
1180 CALL x
1190 RECHP x:REMark Phew
1200 END DEFine CACHE_OFF
1210 :
1220 DEFine PROCedure SERIALIZE
1230 REMark Amiga 4000 fast RAM only
1240 x=ALCHP(20)
1250 POKE_W x,20032:REMark SV mode
1260 POKE_W x+2,8764:REMark Load D1
1270 REMark POKE_W x+4,HEX("07F8"):REMark From 07000000 up for Motherboard RAM
1275 POKE_W x+4,HEX("08F7"):REMark From 08000000 up for WARP 4..16 very fast RAM
1280 POKE_W x+6,HEX("C040"):REMark Serialized, no cache
1290 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
1300 POKE_W x+10,HEX("1006"):REMark Move D1 to DTT0
1310 POKE_W x+12,636:REMark User mode
1320 POKE_W x+14,-9985
1330 POKE_W x+16,HEX("7000")
1340 POKE_W x+18,HEX("4E75")
1350 CALL x
1360 RECHP x
1370 END DEFine SERIALIZE
1380 :
1390 DEFine PROCedure ACRS_OFF
1400 REMark Disables all four ACR/TTR registers
1405 REMark NEEDS the code CACHE to be OFF!
1410 LOCal r,x
1420 x=ALCHP(20)
1430 POKE_W x,20032:REMark SV mode
1440 POKE_W x+2,8764:REMark Load D1
1450 POKE_W x+4,HEX("00FF"):REMark All of memory
1460 POKE_W x+6,0:REMark Turn it off
1470 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
1480 POKE_W x+10,HEX("1006"):REMark Move D1 to DTT0 etc
1490 POKE_W x+12,636:REMark User mode
1500 POKE_W x+14,-9985
1510 POKE_W x+16,HEX("7000")
1520 POKE_W x+18,HEX("4E75")
1530 FOR r=4 TO 7:POKE x+11,r:CALL x
1540 RECHP x
1550 END DEFine ACRS_OFF
1560 :
1570 DEFine FuNction GETC(n)
1580 LOCal x:REMark r
1590 IF n<0 OR n>4095 : PRINT #0;"Bad CR " & n : STOP
1600 x=ALCHP(20)
1610 POKE_W x,20032:REMark SV mode
1620 POKE_W x+2,BIN("0100111001111010"):REMark MOVEC
1630 POKE_W x+4,4096+n:REMark Move CR to D1
1640 POKE_W x+6,636:REMark User mode
1650 POKE_W x+8,-9985
1660 POKE_W x+10,HEX("41FA") :REMark LEA x,A0
1670 POKE_W x+12,-12
1680 POKE_W x+14,HEX("2081") :REMark MOVE.L D1,(A0)
1690 POKE_W x+16,HEX("7000") :REMark MOVEQ #0,D0
1700 POKE_W x+18,HEX("4E75") :REMark RTS
1710 CALL x
1720 r=PEEK_L(x)
1730 RECHP x
1740 RETurn r
1750 END DEFine GETC
1760 :
1770 DEFine FuNction PAGE(q,size)
1780 RETurn INT(q/size)*size
1790 END DEFine PAGE
1800 :
1810 DEFine PROCedure SHOW_MMU
1820 REMark Uses TK2 PRINT_USING
1830 CLS
1840 PRINT "Logical",,"Physical","Mode",,"State"
1850 root=GETC(2055)
1860 SHOW_PTRS root,1
1870 END DEFine SHOW_MMU
1880 :
1890 DEFine PROCedure SHOW_PTRS(base,level)
1900 LOCal b,i,j,k,m
1910 m=0
1920 FOR i=base TO base+127*4 STEP 4
1930 j=PEEK_L(i)
1940 IF level=1
1950 PRINT m & ".." & (m+31) & " Mb ",
1960 k=PAGE(j,512)
1970 m=m+32
1980 ELSE
1990 PRINT ,"+ " & m & ".." & (m+255) & " Kb ";
2000 k=PAGE(j,128):REMark Assume 8K pages, 256 if 4K
2010 m=m+256
2020 END IF
2030 b=j-k
2040 IF b && 2
2050 PRINT_USING "##########",k
2060 IF b && 4
2070 PRINT ,"READ ONLY",
2080 ELSE
2090 PRINT ,"read/write",
2100 END IF
2110 IF b && 64
2120 PRINT"serialized",
2130 ELSE
2140 PRINT "cacheable",
2150 END IF
2160 PRINT "in use"
2170 IF level=1: SHOW_PTRS k,2
2180 ELSE
2190 PRINT "unused"
2200 END IF
2210 END FOR i
2220 END DEFine SHOW_PTRS
2230 :
2240 DEFine PROCedure REMAP
2250 REMark For 8K pages, tested with 2 Mb chip, 4 and 8 Mb fast RAM;
2260 REMark allocates tables to put 4..8 megs fast RAM just after chip
2270 REMark Copyright 1994 Simon N Goodwin, version 0.36, WARP ENGINE
2280 REMark Written for clarity and easy tweaks rather than efficiency
2290 :
2300 MMU_OFF:REMark Run this from 2 meg chip Qdos
2310 PATCH_ACRS_OFF:REMark Stop ROM using ACRS
2320 REMark root=HEX("08000000")-32768:REMark 32K below top of A4000 motherboard 'fast' RAM
2325 root=HEX("08800000")-32768:REMark 32K below top of Warp Engine 8 Meg very fast RAM
2330 REMark change this if your fast RAM is anywhere else
2340 xtra=512:REMark 8192 byte FAST page count beyond 4Mb e.g. 512 for 8Mb
2350 REMark MMU Descriptor bit patterns
2360 resident=3 :REMark this memory exists
2370 serialized=2^6 :REMark non-cacheable memory
2380 write_protect=2^2 :REMark read-only memory
2390 :
2400 REMark Clear the entire root table
2410 FOR i=root TO root+127*4 STEP 4
2420 POKE_L i,0 :REMark Mark section as invalid
2430 END FOR i
2440 :
2450 REMark Make room for the pointer table
2460 pointers=root+128*4 :REMark Table for 00000000 to 01FFFFFF logical
2470 POKE_L root+0*4,pointers+resident :REMark Turn the first 32 Mb on
2480 :
2490 REMark Set up pointer table entries for each 256K area
2500 pages=pointers+128*4 :REMark Base of area for 64 page tables
2510 REMark The first 10 Mb is resident RAM
2520 FOR table=0 TO 39
2530 POKE_L pointers+table*4,pages+table*32*4+resident
2540 END FOR table
2550 REMark Map 6 megs from A00000 to 16 Mb as serialized for I/O
2560 FOR table=40 TO 63
2570 POKE_L pointers+table*4,pages+table*32*4+resident
2580 END FOR table
2590 REMark Clear the second half of the 32 Mb pointer-level table
2600 FOR i=pointers+64*4 TO pages-1 STEP 4
2610 POKE_L i,0
2620 END FOR i
2630 :
2640 REMark Map the first 256K (32 x 8K pages)
2650 base=0
2660 REMark The first 48K is NOT YET write-protected
2670 FOR i=pages TO pages+5*4 STEP 4
2680 POKE_L i,base+resident:REMark +write_protect
2690 base=base+8192
2700 END FOR i
2710 :
2720 REMark The next 16K allows read/write
2730 POKE_L pages+6*4,base+resident
2740 POKE_L pages+7*4,base+8192+resident
2750 base=base+2*8192
2760 :
2770 REMark Then comes 64K of serialized non-cacheable I/O area
2780 FOR i=pages+8*4 TO pages+15*4 STEP 4
2790 POKE_L i,base+serialized+resident
2800 base=base+8192
2810 END FOR i
2820 :
2830 REMark Sort out the first 128K of 'real' Qdos RAM
2840 FOR i=pages+16*4 TO pages+31*4 STEP 4
2850 POKE_L i,base+resident
2860 base=base+8192
2870 END FOR i
2880 :
2890 REMark That's the first 256K of chip mapped;
2900 REMark the remaining 1.75 megs is orthogonal
2910 FOR i=pages+32*4 TO pages+255*4 STEP 4
2920 POKE_L i,base+resident
2930 base=base+8192
2940 END FOR i
2950 :
2960 REMark Fast RAM starts thereafter
2970 base=HEX("08000000"):REMark Warp Engine 1..128 Mb FAST
2975 REMark base=HEX("07C00000")-xtra*8192:REMark A4000, 4Mb+
2980 FOR i=pages+256*4 TO pages+(256+xtra+512-1-4)*4 STEP 4
2990 POKE_L i,base+resident
3000 base=base+8192
3010 END FOR i
3020 :
3030 REMark The last 32K of RAM is reserved for mapping
3040 REMark It is read-only with cacheing disabled (?)
3050 FOR i=pages+(256+512+xtra-4)*4 TO pages+(256+xtra+512-1)*4 STEP 4
3060 POKE_L i,base+resident+write_protect+serialized
3070 base=base+8192
3080 END FOR i
3090 IF NOT xtra
3100 FOR i=pages+(256+512+xtra)*4 TO pages+(256+512+512-1)*4 STEP 4
3110 POKE_L i,0 :REMark Mark as absent
3120 END FOR i
3130 END IF
3140 :
3150 REMark Echo the 6 megs of 68000 I/O space
3160 base=HEX("A00000")
3170 FOR i=pages+(256+512+512)*4 TO pages+2047*4 STEP 4
3180 POKE_L i,base+resident+serialized
3190 base=base+8192
3200 END FOR i
3210 :
3220 ACRS_OFF
3230 SET_MMU_BASES root
3240 CACHE_OFF
3250 MMU_ON
3260 WRITE_THROUGH :REMark Echo fast RAM in old place
3275 CACHE_ON
3280 REMark Set limit of QDOS to remapped RAMtop-64K
3290 REMark here, reset to contiguous 6 Mb Qdos setup
3295 PRINT "Fast RAM remapped, resetting..."
3297 PAUSE 100
3300 RESET_TOP 2^21,3*(2^21)-2^16
3310 END DEFine REMAP
3320 :
3330 DEFine PROCedure MMU_ON
3340 REMark Not applicable to 68EC040
3350 x=ALCHP(20)
3360 POKE_W x,20032:REMark SV mode
3370 POKE_W x+2,8764:REMark Load D1
3380 POKE_W x+4,HEX("0000"):REMark Enable MMU
3390 POKE_W x+6,HEX("C000")
3400 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
3410 POKE_W x+10,HEX("1003"):REMark Move D1 to TCR
3420 POKE_W x+12,636:REMark User mode
3430 POKE_W x+14,-9985
3440 POKE_W x+16,HEX("7000")
3450 POKE_W x+18,HEX("4E75")
3460 CALL x
3470 RECHP x
3480 END DEFine MMU_ON
3490 :
3500 DEFine PROCedure SET_MMU_BASES(here)
3510 REMark Not applicable to 68EC040
3520 x=ALCHP(20)
3530 POKE_W x,20032:REMark SV mode
3540 POKE_W x+2,8764:REMark Load D1
3550 POKE_L x+4,here
3560 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
3570 POKE_W x+10,HEX("1806"):REMark Move D1 to URP
3580 POKE_W x+12,636:REMark User mode
3590 POKE_W x+14,-9985
3600 POKE_W x+16,HEX("7000")
3610 POKE_W x+18,HEX("4E75")
3620 CALL x
3630 POKE x+11,7:REMark Change URP to SRP
3640 CALL x
3650 RECHP x
3660 END DEFine SET_MMU_BASES
3670 :
3680 DEFine PROCedure TIMER
3690 time=DATE+1:REPeat l:IF time=DATE:EXIT l
3700 FOR i=1 TO 20000 : REMark Wait!
3710 time=DATE-time
3720 PRINT time;" seconds for 100,000 FOR loops"
3730 END DEFine TIMER
3740 :
3750 DEFine PROCedure CREPORT
3760 REMark OPEN_NEW #3,scr
3765 REMark INK #3,7
3770 FOR i=0 TO 7,2048 TO 2055
3780 IF i<>2050
3790 PRINT i,HEX$(GETC(i),32),GETC(i)
3800 END IF :REMark Skip CAAR, 020 & 030 only
3810 END FOR i
3820 REMark CLOSE #3
3830 END DEFine CREPORT
3840 :
4080 DEFine PROCedure MAP_MEGS
4085 mb=2^20
4090 FOR i=1 TO 256
4100 PRINT i,:PRINT PEEK(i*mb)
4110 END FOR i
4120 END DEFine MAP_MEGS