CHDK Wiki
(added link to Canon BASIC setup)
(yet another digic 4+ start address)
(9 intermediate revisions by 6 users not shown)
Line 1: Line 1:
 
__TOC__
 
__TOC__
==Note : read this first : [http://chdk.wikia.com/wiki/Canon_Basic/Card_Setup Canon_Basic Card_Setup]==
+
{{Notice|read this first : [http://chdk.wikia.com/wiki/Canon_Basic/Card_Setup Canon_Basic Card_Setup]}}
   
 
==Universal dumper==
 
==Universal dumper==
 
VxWorks and dryos compatible dumper. Log file records status, start and OS. Shows how to safely call event procs that might not be registered. If this doesn't work on your camera, you can try the original.
 
VxWorks and dryos compatible dumper. Log file records status, start and OS. Shows how to safely call event procs that might not be registered. If this doesn't work on your camera, you can try the original.
   
'''note''' This script attempts to display status messages on the screen, however, they may not be visible depending on the colors used by the camera and the image displayed when the camera is run. The status messages are also logged to CBDUMPER.LOG in the root directory of the SD card. After running the script, inspect the root directory for CBDUMPER.LOG and PRIMARY.BIN
+
'''IMPORTANT:''' While this script attempts to display status messages on the screen, the text message may not be visible. '''If the camera appears not to respond to the script, check the card'''. If the script ran, status will be recorded in CBDUMPER.LOG and if the dump was successful, the ROM image will be saved in PRIMARY.BIN
   
  +
  +
Append this script to the file extend.m on your card.
   
 
<source lang="thinbasic">
 
<source lang="thinbasic">
Line 32: Line 34:
 
if memcmp(0xFF810004,"gaonisoy",8) = 0 then
 
if memcmp(0xFF810004,"gaonisoy",8) = 0 then
 
startaddr = 0xFF810000
 
startaddr = 0xFF810000
  +
os = "dry"
  +
exit sub
  +
end if
  +
if memcmp(0xFF820004,"gaonisoy",8) = 0 then
  +
startaddr = 0xFF820000
 
os = "dry"
 
os = "dry"
 
exit sub
 
exit sub
Line 42: Line 49:
 
if memcmp(0xFF000004,"gaonisoy",8) = 0 then
 
if memcmp(0xFF000004,"gaonisoy",8) = 0 then
 
startaddr = 0xFF000000
 
startaddr = 0xFF000000
  +
os = "dry"
  +
exit sub
  +
end if
  +
if memcmp(0xFF020004,"gaonisoy",8) = 0 then
  +
startaddr = 0xFF020000
  +
os = "dry"
  +
exit sub
  +
end if
  +
if memcmp(0xFC020004,"gaonisoy",8) = 0 then
  +
startaddr = 0xFC020000
 
os = "dry"
 
os = "dry"
 
exit sub
 
exit sub

Revision as of 16:59, 27 March 2014

Notice

read this first : Canon_Basic Card_Setup


Universal dumper

VxWorks and dryos compatible dumper. Log file records status, start and OS. Shows how to safely call event procs that might not be registered. If this doesn't work on your camera, you can try the original.

IMPORTANT: While this script attempts to display status messages on the screen, the text message may not be visible. If the camera appears not to respond to the script, check the card. If the script ran, status will be recorded in CBDUMPER.LOG and if the dump was successful, the ROM image will be saved in PRIMARY.BIN


Append this script to the file extend.m on your card.

' dump ROM to A/PRIMARY.BIN 
' log to A/CBDUMPER.LOG
 
DIM startaddr=0
DIM os="unk"
DIM lcdmsg=0
DIM msgstr=0
 
' detect start address and OS
' order must be from highest to lowest, since accessing outside of ROM may trigger an exception
private sub GetStart()
	if memcmp(0xFFC00004,"gaonisoy",8) = 0 then
		startaddr = 0xFFC00000
		os = "dry"
		exit sub
	end if
	if memcmp(0xFFC00008,"Copyrigh",8) = 0 then
		startaddr = 0xFFC00000
		os = "vx"
		exit sub
	end if
	if memcmp(0xFF810004,"gaonisoy",8) = 0 then
		startaddr = 0xFF810000
		os = "dry"
		exit sub
	end if
	if memcmp(0xFF820004,"gaonisoy",8) = 0 then
		startaddr = 0xFF820000
		os = "dry"
		exit sub
	end if
	if memcmp(0xFF810008,"Copyrigh",8) = 0 then
		startaddr = 0xFF810000
		os = "vx"
		exit sub
	end if
	if memcmp(0xFF000004,"gaonisoy",8) = 0 then
		startaddr = 0xFF000000
		os = "dry"
		exit sub
	end if
	if memcmp(0xFF020004,"gaonisoy",8) = 0 then
		startaddr = 0xFF020000
		os = "dry"
		exit sub
	end if
	if memcmp(0xFC020004,"gaonisoy",8) = 0 then
		startaddr = 0xFC020000
		os = "dry"
		exit sub
	end if
end sub
 
private sub RegisterProcs()
	' Newest cams (Dryos rel 43 and later) only have System.Create()
	' on older dryos cams SystemEventInit is an alias for System.Create()
	' ExecuteEventProcedure does is not registered by default on vx, 
	' but calling an unregistered is not fatal
	if System.Create() = -1 then
		SystemEventInit()
	end if
	if ExecuteEventProcedure("UI_RegistDebugEventProc") = -1 then
		ExecuteEventProcedure("UI.CreatePublic")
	end if
end sub
 
private sub InitMsg()
	lcdmsg = ExecuteEventProcedure("LCDMsg_Create")
	msgstr = AllocateMemory(80)
	' truncate log
	msgfile = Fopen_Fut("A/CBDUMPER.LOG","w")
	if msgfile <> 0 then
		Fclose_Fut(msgfile)
	end if
end sub
 
private sub PutMsg(msg)
	if lcdmsg >= 0 then
		LCDMsg_SetStr(lcdmsg,msg)
	end if
	msgfile = Fopen_Fut("A/CBDUMPER.LOG","a")
	if msgfile <> 0 then
		Fwrite_Fut(msg,strlen(msg),1,msgfile)
		Fwrite_Fut("\n",1,1,msgfile)
		Fclose_Fut(msgfile)
	end if
end sub
 
private sub Initialize()
	RegisterProcs()
	InitMsg()
	PutMsg("Started")
 
	GetStart()
 
	if startaddr <> 0 then
		sprintf(msgstr,"%0X %s",startaddr,os)
		PutMsg(msgstr)
		romsize = 0xFFFFFFFC - startaddr
		dumpfile = Fopen_Fut("A/PRIMARY.BIN","w")
		if dumpfile <> 0 then
			Fwrite_Fut(startaddr,romsize,1,dumpfile)
			Fclose_Fut(dumpfile)
			Wait(500)
			PutMsg("done")
		else
			PutMsg("file error")
		end if
	else
		PutMsg("not found!")
	end if
	FreeMemory(msgstr)
end sub

Original simple dumper

dim f,a,startadr=0,romsize
 
private sub Initialize()
	UI.CreatePublic()
	a=LCDMsg_Create()
	LCDMsg_SetStr(a,"Running")
	System.Create()
 
	if memcmp(0xFFC00004,"gaonisoy",8) = 0 then
		startadr = 0xFFC00000
		LCDMsg_SetStr(a,"FFC00000")
	else
		if memcmp(0xFF810004,"gaonisoy",8) = 0 then
			startadr = 0xFF810000
			LCDMsg_SetStr(a,"FF810000")
		else
			LCDMsg_SetStr(a,"start not found!")
			Wait(1000)
		end if
	end if
 
	if startadr <> 0 then
		romsize = 0xFFFFFFFC - startadr
		f=Fopen_Fut("A/PRIMARY.BIN","w")
		Fwrite_Fut(startadr,romsize,1,f)
		Fclose_Fut(f)
		LCDMsg_SetStr(a,"done")
	end if
end sub