• Hello MLAers! We've re-enabled auto-approval for accounts. If you are still waiting on account approval, please check this thread for more information.

Variations in benchmark performance on LC475/Quadra 605 with 68040 CPUs and VRAM

As it is, you're likely running DRAM and VRAM faster than spec. The jumper may well be relaxing the timings similar to the jumper @Phipli found on Wombat boards, and reduced timing results in worse performance since you're slowing things down.
 
As it is, you're likely running DRAM and VRAM faster than spec. The jumper may well be relaxing the timings similar to the jumper @Phipli found on Wombat boards, and reduced timing results in worse performance since you're slowing things down.
I wonder if the jumper added, and relaxed timings, results in a more stable machine…. 🤔
 
for this part at least, I may have a hint: in the ROM there is code that decides how long to wait for a VRAM access (some number of cycles), I belive it only picks based on the machine ID
Are you able to give some information, where to find that code in ROM?

Based on the MEMCjr manual I assume it is changing bit 8-11 in Frame Buffer Configuration register.
This register is located at $F980 0010.
I was not able to find any place in ROM that contain $F980 0010 nor code that is acting relative to $F980 0000.

If you are right, there should be code that change this register to a value from a table based on GestaltID.

Missing GestaltID or table entry for 40MHz 475/605 might be the reason why changing resistors to 40MHz position does not work but software overclock does.
 
This gives me this code:

Macro
DAFBSpeedPI ; A2->DAFBBase,A6->PrimFrame.
Tst.b IsSlowClock(A6) ; If CPU is running “slow,”
Bne.s @EndDAFBSpeedPI ; then leave things alone.
Tst.b wombatDAFB(A6) ; If we’re on a Wombat,
Bne.s @WombatSpeedPI ; then do the Wombat setup.
Ori.l #dafb33MHzConfig,DAFB_Config(A2) ; Otherwise, setup for 33MHz operation.
Bra.s @EndDAFBSpeedPI ; (Skip Wombat setup.)
@WombatSpeedPI Andi.l #dafbNoInterleave,DAFB_Config(A2) ; For Wombat, vRAM interleaving is not possible.
Ori.l #dafb33MHzConfigW,DAFB_Config(A2) ; Set up for at least 33MHz operation.
Subq #2,Sp ; Make some room on the stack.
Move.w DAFBFlags+2(A2),(Sp) ; Get the DAFBFlags.
Andi.w #(1<<w40MHz),(Sp)+ ; If the 40MHz bit is not set,
Beq.s @EndDAFBSpeedPI ; then just go on.
Ori.l #dafb40MHzConfigW,DAFB_Config(A2) ; Otherwise, set up for 40MHz operation.
@EndDAFBSpeedPI
EndMacro

As I do not have a Wombat only this part is relevant:

Macro
DAFBSpeedPI ; A2->DAFBBase,A6->PrimFrame.
Tst.b IsSlowClock(A6) ; If CPU is running “slow,”
Bne.s @EndDAFBSpeedPI ; then leave things alone.
Ori.l #dafb33MHzConfig,DAFB_Config(A2) ; Otherwise, setup for 33MHz operation.
Bra.s @EndDAFBSpeedPI ; (Skip Wombat setup.)
@EndDAFBSpeedPI
EndMacro


DAFBBase = $F980 0000, DAFB_Config = $10, dafb33MHzConfig = $0000 0800

So the code above set bit 11 of Frame Buffer Config register, if it think that CPU is running not snow. Elsewhere do nothing.

That is not the appropriate setting based on MEMCjr manual (should be $0000 0A00)

Comments do only tell about 33MHz and 25Mhz. So what does it do in case of 40MHz?

This depends on IsSlowClock(A6)

IsSlowClock is set to 1 in PrimaryInit.a
So Tst.b IsSlowClock(A6) check if (PrimFrame + 1) contain 0 or something else.

To understand PrimFrame record I assume we need to read PrimaryInit.a
 
Ok, I did a mistake. Based on PrimaryInit.a address of IsSlowClock is not +1 but preset is 1.

PrimFrame RECORD {A6Link},DECREMENT
return DS.L 1 ; return address
A6Link DS.L 1 ; placeholder for link
spBlk DS SpBlock ; spBlock for generic use
sPRAMBlk DS.B SizesPRAMRec ; spRAMRec for generic use
VidDefBlk DS.B 2 ; parameter block for SetVideoDefault
IsSlowClock DS.B 1 ; if SlowClock CPU=1, else =0
saveMMUMode DS.B 1 ; save the entering MMU mode <4>
vidParamsPtr Ds.l 1 ; ptr to video params <10>
vRAMBaseAddr Ds.l 1 ; ptr to vRAM base address
monID Ds.b 1 ; saved monID <16>
has16bppACDC Ds.b 1 ; For DAFB, true when ACDC == AC842A.
hasLin16bppCLUT Ds.b 1 ; For DAFB, true when ACDC == Antelope.
wombatDAFB Ds.b 1 ; For DAFB, true when on a WombatDAFB.
clkSetup Ds.b 1 ; For DAFB, true when we don’t need to reset various clock bits.
sogSwitch Ds.b 1 ; For DAFB, true when we should leave sync-on-green alone.
altSenseEnb Ds.b 1 ; For DAFB, true if we were AltSenseing LAST reboot.
disableLCD Ds.b 1 ; For DBLite, true if we're in a docking station <H27>
LocalSize EQU * ;
ENDR

DT_Size Equ $08 ; Size (in bytes) of entries in DAFB table.
MT_Size Equ $04 ; Size (in bytes) of entries in Mode table.

BivTbl Record 0 ; Built-in Video BoxFlag/Offset table.
bivBox Ds.w 1 ; BoxFlag identifier.
bivOffset Ds.w 1 ; Offset to appropriate code.
Endr
 
Back
Top