Within my LC475 there is 70ns onboard RAM and a 60ns RAM SIMM and a programmable ROM module.
Due to speed reasons I like to disable the onboard RAM.
Prefered solution is changing the code in ROM so the onboard RAM is no longer used.
I am quite sure that I found the place in ROM that initialize all the RAM.
In my understanding I need to change 408A01D2: MOVEQ #$00,D6 to MOVEQ #$F0
This is shifted to least significant nibble in 408A01DC: ROR.L #4,D6
This (should) set all lanes of first memory block set to bad and is not reset in "CheckByteLanes"
As all lanes are set to bad, 408A0204: EOR.B D3,D6 reset the bits in D6 but leave the size of block as zero in D5 (size not called)
Rest of routine should work as before.
Unfortunately after the start-up chime I get two other chimes that I interpret as "Bad memory". Device does not start.
Anyone any clue what is wrong?
;SizeBanks
408A01C0: SIZEMEMORYPATCH+$01C0: MOVEA.L A1,A5 ; pointer to product info table
408A01C2: SIZEMEMORYPATCH+$01C2: ADDA.L $0004(A5),A5 ; point to the ram bank map info
;Continue
408A01C6: SIZEMEMORYPATCH+$01C6: MOVEQ #$00,D0 ; clear total RAM size
408A01C8: SIZEMEMORYPATCH+$01C8: SUBA.L A3,A3 ; initialize the "bank 8-15" information (that does not exist in 475)
408A01CA: SIZEMEMORYPATCH+$01CA: SUBQ.L #1,A3 ; ... to an improbable bank config value ($FFFFFFFF)
;SizeBanks2
408A01CC: SIZEMEMORYPATCH+$01CC: MOVEA.L A5,A7 ; keep running copy in a7
408A01CE: SIZEMEMORYPATCH+$01CE: ADDQ.L #4,A7 ; skip over chunk size
408A01D0: SIZEMEMORYPATCH+$01D0: MOVEQ #$00,D5 ; clear bank size nibbles
408A01D2: SIZEMEMORYPATCH+$01D2: MOVEQ #$00,D6 ; clear error bits
408A01D4: SIZEMEMORYPATCH+$01D4: MOVE.L #$54696E61,D1 ; setup signature 'Tina'
;nextBank
408A01DA: SIZEMEMORYPATCH+$01DA: ROR.L #4,D5 ; make room for next bank size nibble
408A01DC: SIZEMEMORYPATCH+$01DC: ROR.L #4,D6 ; make room for next bank error nibble
408A01DE: SIZEMEMORYPATCH+$01DE: MOVEA.L (A7)+,A0 ; get start of bank (or terminator)
408A01E0: SIZEMEMORYPATCH+$01E0: MOVE.L A0,D2 ; end of table?
408A01E2: SIZEMEMORYPATCH+$01E2: CMPI.L #$53616D42,D2 ; at end of 1st table? 'SamB'
408A01E8: SIZEMEMORYPATCH+$01E8: BEQ.S ^$408A0212 ; -> yes, check for errs then continue SIZEMEMORYPATCH+$212 = checkErr
408A01EA: SIZEMEMORYPATCH+$01EA: ADDQ.L #1,D2
408A01EC: SIZEMEMORYPATCH+$01EC: BEQ.S ^$408A0212 ; yes, check for any errors and quit SIZEMEMORYPATCH+$212 = checkErr
408A01EE: SIZEMEMORYPATCH+$01EE: MOVEA.L (A7)+,A1 ; get end+1 of bank
; any byte lanes valid at start?
408A01F0: SIZEMEMORYPATCH+$01F0: LEA ^$408A01F8,A6 ; SIZEMEMORYPATCH+$1F8 Load return address
408A01F4: SIZEMEMORYPATCH+$01F4: JMP ^$408A0282 ; SIZEMEMORYPATCH+$282 Gosub CheckByteLanes
408A01F8: SIZEMEMORYPATCH+$01F8: MOVEQ #$0F,D3 ; byte lane mask
408A01FA: SIZEMEMORYPATCH+$01FA: AND.B D6,D3 ; all byte lanes good here?
408A01FC: SIZEMEMORYPATCH+$01FC: BEQ.S ^$408A0208 ; yes, try next bank SIZEMEMORYPATCH+$208 = size
408A01FE: SIZEMEMORYPATCH+$01FE: CMPI.B #$0F,D3 ; were all byte lanes bad?
408A0202: SIZEMEMORYPATCH+$0202: BNE.S ^$408A01DA ; no, leave mask with bad bits SIZEMEMORYPATCH+$1DA = nextBank
408A0204: SIZEMEMORYPATCH+$0204: EOR.B D3,D6 ; yes, clear out bit mask
408A0206: SIZEMEMORYPATCH+$0206: BRA.S ^$408A01DA ; and go to SIZEMEMORYPATCH+$1DA = nextBank
;size
; find size of this bank
408A0208: SIZEMEMORYPATCH¹+$0208: LEA ^$408A0210,A6 ; SIZEMEMORYPATCH+$210 Load return address
408A020C: SIZEMEMORYPATCH¹+$020C: JMP ^$408A0240 ; SIZEMEMORYPATCH+$240 Gosub SizeBank
408A0210: SIZEMEMORYPATCH¹+$0210: BRA.S ^$408A01DA ; now size next bank... SIZEMEMORYPATCH+$1DA = nextBank
;checkErr
408A0212: SIZEMEMORYPATCH¹+$0212: MOVE.L A7,D2 ; Save A7
408A0214: SIZEMEMORYPATCH¹+$0214: SUB.L A5,D2 ; (table end + 8) - table start
408A0216: SIZEMEMORYPATCH¹+$0216: SUBQ.L #8,D2 ; #entries * 8
408A0218: SIZEMEMORYPATCH¹+$0218: LSR.W #1,D2 ; / 8 * 4 = # of nibbles to roll
408A021A: SIZEMEMORYPATCH¹+$021A: ROL.L D2,D5 ; d5 = ....dcba
408A021C: SIZEMEMORYPATCH¹+$021C: ROL.L D2,D6 ; d6 = ....dcba
408A021E: SIZEMEMORYPATCH¹+$021E: TST.L D6 ; any errors?
408A0220: SIZEMEMORYPATCH¹+$0220: BNE.S ^$408A023E ; -> Yes, return now SIZEMEMORYPATCH+$23E = badBanks
408A0222: SIZEMEMORYPATCH¹+$0222: MOVE.L A0,D2 ; get the terminator or extend flag in D2
408A0224: SIZEMEMORYPATCH¹+$0224: CMPI.L #$53616D42,D2 ; Extended flag? 'SamB'
408A022A: SIZEMEMORYPATCH¹+$022A: BNE.S ^$408A0232 ; -> Nope, we're done SIZEMEMORYPATCH¹+$232 = stitchEm
408A022C: SIZEMEMORYPATCH¹+$022C: MOVEA.L D5,A3 ; We have more to do, save D5 in A3
408A022E: SIZEMEMORYPATCH¹+$022E: MOVEA.L A7,A5 ; Point A5 at the 2nd half of RAMInfo
408A0230: SIZEMEMORYPATCH¹+$0230: BRA.S ^$408A01CC ; -> make the second pass SIZEMEMORYPATCH¹+$1CC = SizeBanks2
Due to speed reasons I like to disable the onboard RAM.
Prefered solution is changing the code in ROM so the onboard RAM is no longer used.
I am quite sure that I found the place in ROM that initialize all the RAM.
In my understanding I need to change 408A01D2: MOVEQ #$00,D6 to MOVEQ #$F0
This is shifted to least significant nibble in 408A01DC: ROR.L #4,D6
This (should) set all lanes of first memory block set to bad and is not reset in "CheckByteLanes"
As all lanes are set to bad, 408A0204: EOR.B D3,D6 reset the bits in D6 but leave the size of block as zero in D5 (size not called)
Rest of routine should work as before.
Unfortunately after the start-up chime I get two other chimes that I interpret as "Bad memory". Device does not start.
Anyone any clue what is wrong?
;SizeBanks
408A01C0: SIZEMEMORYPATCH+$01C0: MOVEA.L A1,A5 ; pointer to product info table
408A01C2: SIZEMEMORYPATCH+$01C2: ADDA.L $0004(A5),A5 ; point to the ram bank map info
;Continue
408A01C6: SIZEMEMORYPATCH+$01C6: MOVEQ #$00,D0 ; clear total RAM size
408A01C8: SIZEMEMORYPATCH+$01C8: SUBA.L A3,A3 ; initialize the "bank 8-15" information (that does not exist in 475)
408A01CA: SIZEMEMORYPATCH+$01CA: SUBQ.L #1,A3 ; ... to an improbable bank config value ($FFFFFFFF)
;SizeBanks2
408A01CC: SIZEMEMORYPATCH+$01CC: MOVEA.L A5,A7 ; keep running copy in a7
408A01CE: SIZEMEMORYPATCH+$01CE: ADDQ.L #4,A7 ; skip over chunk size
408A01D0: SIZEMEMORYPATCH+$01D0: MOVEQ #$00,D5 ; clear bank size nibbles
408A01D2: SIZEMEMORYPATCH+$01D2: MOVEQ #$00,D6 ; clear error bits
408A01D4: SIZEMEMORYPATCH+$01D4: MOVE.L #$54696E61,D1 ; setup signature 'Tina'
;nextBank
408A01DA: SIZEMEMORYPATCH+$01DA: ROR.L #4,D5 ; make room for next bank size nibble
408A01DC: SIZEMEMORYPATCH+$01DC: ROR.L #4,D6 ; make room for next bank error nibble
408A01DE: SIZEMEMORYPATCH+$01DE: MOVEA.L (A7)+,A0 ; get start of bank (or terminator)
408A01E0: SIZEMEMORYPATCH+$01E0: MOVE.L A0,D2 ; end of table?
408A01E2: SIZEMEMORYPATCH+$01E2: CMPI.L #$53616D42,D2 ; at end of 1st table? 'SamB'
408A01E8: SIZEMEMORYPATCH+$01E8: BEQ.S ^$408A0212 ; -> yes, check for errs then continue SIZEMEMORYPATCH+$212 = checkErr
408A01EA: SIZEMEMORYPATCH+$01EA: ADDQ.L #1,D2
408A01EC: SIZEMEMORYPATCH+$01EC: BEQ.S ^$408A0212 ; yes, check for any errors and quit SIZEMEMORYPATCH+$212 = checkErr
408A01EE: SIZEMEMORYPATCH+$01EE: MOVEA.L (A7)+,A1 ; get end+1 of bank
; any byte lanes valid at start?
408A01F0: SIZEMEMORYPATCH+$01F0: LEA ^$408A01F8,A6 ; SIZEMEMORYPATCH+$1F8 Load return address
408A01F4: SIZEMEMORYPATCH+$01F4: JMP ^$408A0282 ; SIZEMEMORYPATCH+$282 Gosub CheckByteLanes
408A01F8: SIZEMEMORYPATCH+$01F8: MOVEQ #$0F,D3 ; byte lane mask
408A01FA: SIZEMEMORYPATCH+$01FA: AND.B D6,D3 ; all byte lanes good here?
408A01FC: SIZEMEMORYPATCH+$01FC: BEQ.S ^$408A0208 ; yes, try next bank SIZEMEMORYPATCH+$208 = size
408A01FE: SIZEMEMORYPATCH+$01FE: CMPI.B #$0F,D3 ; were all byte lanes bad?
408A0202: SIZEMEMORYPATCH+$0202: BNE.S ^$408A01DA ; no, leave mask with bad bits SIZEMEMORYPATCH+$1DA = nextBank
408A0204: SIZEMEMORYPATCH+$0204: EOR.B D3,D6 ; yes, clear out bit mask
408A0206: SIZEMEMORYPATCH+$0206: BRA.S ^$408A01DA ; and go to SIZEMEMORYPATCH+$1DA = nextBank
;size
; find size of this bank
408A0208: SIZEMEMORYPATCH¹+$0208: LEA ^$408A0210,A6 ; SIZEMEMORYPATCH+$210 Load return address
408A020C: SIZEMEMORYPATCH¹+$020C: JMP ^$408A0240 ; SIZEMEMORYPATCH+$240 Gosub SizeBank
408A0210: SIZEMEMORYPATCH¹+$0210: BRA.S ^$408A01DA ; now size next bank... SIZEMEMORYPATCH+$1DA = nextBank
;checkErr
408A0212: SIZEMEMORYPATCH¹+$0212: MOVE.L A7,D2 ; Save A7
408A0214: SIZEMEMORYPATCH¹+$0214: SUB.L A5,D2 ; (table end + 8) - table start
408A0216: SIZEMEMORYPATCH¹+$0216: SUBQ.L #8,D2 ; #entries * 8
408A0218: SIZEMEMORYPATCH¹+$0218: LSR.W #1,D2 ; / 8 * 4 = # of nibbles to roll
408A021A: SIZEMEMORYPATCH¹+$021A: ROL.L D2,D5 ; d5 = ....dcba
408A021C: SIZEMEMORYPATCH¹+$021C: ROL.L D2,D6 ; d6 = ....dcba
408A021E: SIZEMEMORYPATCH¹+$021E: TST.L D6 ; any errors?
408A0220: SIZEMEMORYPATCH¹+$0220: BNE.S ^$408A023E ; -> Yes, return now SIZEMEMORYPATCH+$23E = badBanks
408A0222: SIZEMEMORYPATCH¹+$0222: MOVE.L A0,D2 ; get the terminator or extend flag in D2
408A0224: SIZEMEMORYPATCH¹+$0224: CMPI.L #$53616D42,D2 ; Extended flag? 'SamB'
408A022A: SIZEMEMORYPATCH¹+$022A: BNE.S ^$408A0232 ; -> Nope, we're done SIZEMEMORYPATCH¹+$232 = stitchEm
408A022C: SIZEMEMORYPATCH¹+$022C: MOVEA.L D5,A3 ; We have more to do, save D5 in A3
408A022E: SIZEMEMORYPATCH¹+$022E: MOVEA.L A7,A5 ; Point A5 at the 2nd half of RAMInfo
408A0230: SIZEMEMORYPATCH¹+$0230: BRA.S ^$408A01CC ; -> make the second pass SIZEMEMORYPATCH¹+$1CC = SizeBanks2

