This part is about my attempt to modify the firmware to "fix" the problem of weird intial setup: a -160MHz offset and a resolution set to 5 digits.
In the previous part, we figured some probable spots in the firware where these default setup configurations might be set.
In order to be able to modify the content od the firmware without generating an error at startup, we must understand how checksum are computed.
The Service Manual for the 578B does not explain how it is computed. The one for the 545A gives a clue but is not valid for the 545B: in the Option 2 (power meter) calibration procedure, since the "power vs. power" and "power vs. frequency" calibration tables are stored in the EPROM, the checksum must be computed when a calibration is performed. For this unit, the value at address 0x02F6 must be set so that the sum modulo 256 of all bytes of the EPROM is equal to 0xFF.
So the checksum is just a matter of sum modulo 256, but on the 545B, each EPROM chip has its content verified, as can be deduced by the fact there are 3 error codes (31, 32 and 33), one for each EPROM chip.
I found the part of the initialisation code that compute this checksum:
; Test PROM bank i (i in 1,2,3); ; M000C: start address ; M000E: i 6041 Z6041 CLRA ;4F 6042 LDY #Z4000 ;10 8E 40 00 6046 LDX Z000C ;9E 0C 6048 Z6048 ADDA ,X+ ;AB 80 604A LEAY -$01,Y ;31 3F 604C BNE Z6048 ;26 FA 604E STX >Z000C ;BF 00 0C 6051 LDB >Z000E ;F6 00 0E 6054 CMPB #$03 ;C1 03 6056 BEQ Z605E ;27 06 6058 DECB ;5A 6059 LDX #MFFEA ;8E FF EA 605C ADDA B,X ;AB 85 605E Z605E COMA ;43 605F RTS ;39
This chunck of code is called with the start address in 0x000C (set to 0x4000 on normal initial execution), and EPROM 'bank' in byte 0x000E (can be 1, 2 or 3). Once again, during normal init execution, this function is called with the value 1 in this memory cell.
So when i = 1 or 2, the sum if computed (in register A), and the result is compared to the value stored at 0xFFEA (first EPROM) and 0xFFEB (second EPROM).
For the third one (in which those checksum values are), no comparison is made, the sum is expected to be 0xFF, which can be achieved by modifying the value of byte 0xFFEC.
As explained before, the frequency offset initial value seems to be set in the chunck of code around 0x6118-0x6125:
6118 LDX #M0276 ;8E 02 76 611B LDA #$01 ;86 01 611D STA ,X ;A7 84 611F STA $02,X ;A7 02 6121 LDA #$60 ;86 60 6123 STA $03,X ;A7 03
So the easiest way to remove this is to replace this code by NOPs. I've tried this, computed the checksums and burnt a pair of EPROMs (only bank 1 and 3 are modified).
And it worked! Mostly. The offset set to 0 as expected, but the "Offset" indicator remains on. I can live with that, but I'll try to figure out how to fix this also, if possible.
The chuck of initialisation code related to this setup is:
6125 LDX #M005D ;8E 00 5D 6128 LDA #$0D ;86 0D 612A STA $01,X ;A7 01 612C LDA #$05 ;86 05 612E STA >M0045 ;B7 00 45
At least the last 3 lines are directly related to this resolutin setup. So I've tried to replace these few opcodes with NOPs.
And the result is a partial success: all the digits are displayed when I power the device on, but the frequency counter still computes only 5 digits, the other ones stay zero. The gating is not modified. Not very useful as is... More digging required!