[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: creating a new Apple IIgs ROM 03 checksum



retrogear <larrygr510@gmail.com> wrote:
> With the hopes of someday producing a ROM 03 source which could be
> modified, I decided to embark on the issue of how to create a new ROM
> checksum. What is required from Apple is the checksum must equal a magic
> value of $1234. A fudge value called 'tweak' is placed at address FF/FFF6
> to make the sum = $1234. I figured if I could do a checksum and skip the
> tweak then use a little algebra I could come up with a new tweak value. I
> derived the following subroutine from the checksum diagnostics source. It
> does a checksum calculation without the tweak value then calculates:
> tweak = $1234 - checksum. I reassembled the gsport emulator to not do any
> ROM patches, then ran my subroutine which returned the value $6250 which
> is the tweak value in the ROM !!! Verify with FF/FFF6.FFF7
> returns FF/FFF6: 50 62.  Here is the routine in Orca/m :
> 
>  	keep	checksum
> 	mcopy	prodos.mac
> 
> * this subroutine does a ROM 03 checksum calculation to determine
> * a 'tweak' value to place in ROM location $FF/FFF6.FFF7 which
> * will certify this ROM to pass onboard ROM diagnostics.
> * to be certified, the checksum of this ROM should = $1234
> 
> checksum	start
> 
> tweak	equ	$FFF6	;tweak value address
> 
> 	clc
> 	xce		;full native mode
> 	long	i,m
> 	longa	on
> 	longi	on
> 	lda	#0
> 	sta	chksum	;reset checksum
> 	pea	$FCFC	;start with bank $FC
> 	plb
> 	plb
> 	ldy	#$FFFF
> 	jsr	chksum1	;do checksum of bank $FC
> 	pea	$FDFD	;bank $FD
> 	plb
> 	plb
> 	dey
> 	jsr	chksum2	;do checksum of bank $FD
> 	pea	$FEFE                    ;bank $FE
> 	plb
> 	plb
> 	dey
> 	jsr	chksum2	;do checksum of bank $FE
> 	pea	$FFFF                    ;bank $FF
> 	plb
> 	plb
> 	dey
> 	jsr	chksum3	;do checksum of bank $FF
> 	pea	$0000
> 	plb
> 	plb
> 	sta	chksum                   ;ROM checksum minus 'tweak'
> 	lda	#$1234	;certified checksum from Apple
> 	sbc	chksum	;carry is pre-conditioned
> 	sta	chksum                   ;new tweak = $1234 minus checksum
> 	rtl                            ;return to caller
> chksum1	lda	#$0000
> 	clc
> chksum2	dey
> nxtchk	adc	($FD),y
> 	dey
> 	beq	chkend
> 	dey
> 	bne	nxtchk
> chkend	adc	($FD),y
> 	rts
> chksum3	dey
> ffnxtchk	php		;need to preserve carry flag
> 	cpy	#tweak	;check for tweak address
> 	bne	noskip
> 	plp		;restore carry
> 	bra	skip                     ;skip adding tweak into checksum
> noskip	plp		;restore carry
> 	adc	($FD),y
> skip	dey
> 	beq	ffchkend
> 	dey
> 	bne	ffnxtchk
> ffchkend	adc	($FD),y
> 	rts		;returns w/conditioned carry
> 
> chksum	ds	2	;will contain the new tweak value
> 
> 	end

This is essentially the same approach I took in creating the NadaBoot
ROM(s) for AppleCrate machines. 

Just once, load the original ROM file and compute its checksum, then for
each modification:

1. Load the new ROM file, with zero "twiddle"
2. Compute the checksum
3. Subtract new checksum from original ROM checksum
4. Poke difference into "twiddle"
5. Re-checksum to verify same as original

Of course, the "twiddle" value can be any unused location within the ROM. 

-michael - NadaNet 3.1 and AppleCrate II: http://home.comcast.net/~mjmahon