Difference between revisions of "Videocart dumper"

From veswiki
Jump to: navigation, search
(Created page with "Sean Riddle built a dumper for the Videocarts to be able to lure the code out without damaging the cartridges. A portable version was shipped over the world to collect rare d...")
 
Line 2: Line 2:
 
A portable version was shipped over the world to collect rare data from even rarer cartridges.  
 
A portable version was shipped over the world to collect rare data from even rarer cartridges.  
  
This page is a work in progress, for now I only present the Pic BASIC Pro code I modified from Sean's original 20MHz PIC16F84 version - as I only had a PIC16C84 at home...
 
  
Will complete this with hardware information and compiled code as well.
+
Sean Riddle's original code (recommended)
 +
<PRE>
 +
;Fairchild Channel F cart dumper version 2
  
<PRE>
+
;2/10/2004 Sean Riddle seanriddle@cox.net
  
;   Fairchild Channel F cart dumper version 2
+
; slight modifications by e5frog 15/08/2009
;  2/10/2004 Sean Riddle seanriddle@cox.net
 
;  Edited from 16f84 to 16c84 by Fredric Blåholtz 03/08/2009
 
;  Pic BASIC Pro
 
  
;    1/5 speed, the nop:s are half as many.
+
  
 
INCLUDE "modedefs.bas"
 
INCLUDE "modedefs.bas"
  
@ device pic16c84, hs_osc, wdt_off
+
@ device pic16f84, hs_osc, wdt_off
 +
 
  
DEFINE   OSC     4        ;4 MHz oscillator
+
DEFINE OSC 20 ;20 MHz oscillator
DEFINE   NO_CLRWDT   1         ;watchdog is off
+
DEFINE NO_CLRWDT 1 ;watchdog is off
  
DEFINE   DEBUG_REG   PORTA         ;serial output on A.0
+
DEFINE DEBUG_REG PORTA ;serial output on A.0
DEFINE   DEBUG_BIT   0
+
DEFINE DEBUG_BIT 0
DEFINE   DEBUG_BAUD   9600
+
DEFINE DEBUG_BAUD 9600 ; (was 4800) set terminal program to 9600 8-N-1, log input binary, dump and save the log.
 +
DEFINE  DEBUG_MODE 1 ; for direct output from PIC to serial port (signal to pin 2, GND to pin 5)(no MAX232)
 
' Set Debug mode: 0 = true, 1 = inverted
 
' Set Debug mode: 0 = true, 1 = inverted
DEFINE  DEBUG_MODE  1
 
  
k      VAR      WORD        ;another
 
rom      VAR      BYTE        ;buffer to store ROM
 
  
f8phi      VAR      PORTA.1      ;clock signal
+
BUFSIZE CON 16 ;16-byte buffer
f8write    VAR      PORTA.2      ;write signal
 
f8romc3    VAR      PORTA.3      ;ROMC3 signal
 
  
;   CMCON=7               ;turn off comparators
+
i VAR BYTE ;general register
OPTION_REG.7=0               ;weak pull ups on port B
+
k VAR WORD ;another
TRISB=$FF                 ;port B is all input
+
 
 +
buf VAR BYTE ;buffer pointer
 +
rom VAR BYTE[BUFSIZE] ;buffer to store ROM
 +
 
 +
f8phi VAR PORTA.1 ;clock signal
 +
f8write VAR PORTA.2 ;write signal
 +
f8romc3 VAR PORTA.3 ;ROMC3 signal
 +
 
 +
; CMCON=7 ;turn off comparators
 +
OPTION_REG.7=0 ;weak pull ups on port B
 +
TRISB=$FF ;port B is all input
  
 
Low f8phi
 
Low f8phi
Line 43: Line 48:
 
Low f8romc3
 
Low f8romc3
  
  Debug "Dumping starts in two seconds..."
+
; Debug "start..."
 +
 
 +
Pause 2000 ;wait a couple of seconds after reset
 +
 
 +
; what I do:
 +
; clear PC0 with ROMC state 8
 +
; loop 1024 times (was 256)
 +
; fetch 16 bytes into buffer with ROMC state 0
 +
; dump buffer to serial port
 +
 
  
Pause 2000                  ;wait 2 seconds after reset
+
f8phi=1
 +
f8write=1
  
;   what I do:
+
@ nop ;NOPs used to create square waves
;  clear PC0 with ROMC state 8
+
@ nop
;  loop 16384 times
+
@ nop
;  fetch 4 bytes into buffer with ROMC state 0
+
@ nop
;  dump buffer to serial port
 
;  clear PC0
 
  
      f8phi=1
+
f8phi=0
      f8write=1
 
  
      f8phi=0
+
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
  
      @ nop
+
f8write=0
 +
f8phi=1
 +
f8romc3=0
  
      f8phi=1
+
@ nop
      f8write=0
+
@ nop
 +
@ nop
 +
@ nop
  
      f8phi=0
+
f8phi=0
  
      f8romc3=1
+
@ nop
                  ;ROMC state 8, clear PC0.
+
@ nop
      f8phi=1
+
@ nop
 +
@ nop
  
      @ nop
+
f8romc3=0
 +
f8phi=1
 +
f8romc3=1 ; this puts us in ROMC state 8 - clear PC0
  
      f8phi=0
+
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
  
      @ nop
+
f8phi=0
  
      f8phi=1
+
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
  
      @ nop
+
f8romc3=1
 +
f8phi=1
 +
f8romc3=1
  
      f8phi=0
+
@ nop
     
+
@ nop
      @ nop
+
@ nop
       
+
@ nop
      f8phi=1
 
  
      @ nop
+
f8phi=0
     
 
      f8phi=0
 
  
      f8romc3=0
+
@ nop
 +
@ nop
 +
@ nop
  
For k=0 TO 16383
 
  
 +
;;;
 +
 +
 +
f8phi=1
 +
f8write=1
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
f8romc3=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
f8romc3=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
f8romc3=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
 +
For k=1 TO 1024  ; was 256
  
 +
For i=0 TO BUFSIZE-1
  
      f8phi=1
+
f8phi=1
      f8write=1
+
f8write=1
  
      f8phi=0
+
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
  
      @ nop
+
f8phi=0
  
      f8phi=1
+
@ nop
      f8write=0
+
@ nop
 +
@ nop
 +
@ nop
  
      f8phi=0
+
f8write=0
 +
f8phi=1
 +
f8romc3=0
  
      @ nop
+
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
  
      f8phi=1
+
f8phi=0
                  ;ROMC state 0, fetch instruction
 
      @ nop
 
  
      f8phi=0
+
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
  
      @ nop
+
f8write=0
 +
f8phi=1
 +
f8romc3=0 ;ROMC state 0, fetch instruction
  
      f8phi=1
+
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
  
      @ nop
+
f8phi=0
  
      f8phi=0
+
@ nop
     
+
@ nop
      @ nop
+
@ nop
       
+
@ nop
      f8phi=1
 
  
      rom=PORTB         ;read databus into buffer
+
f8write=0
     
+
f8phi=1
      f8phi=0
+
rom[i]=PORTB ;read databus into buffer
 +
f8phi=0
  
      Debug rom
+
Next i
  
 +
For i=0 TO BUFSIZE-1 ;dump the buffer to the serial port
 +
Debug rom[i]
 +
Next i
 
Next k
 
Next k
  
Line 139: Line 256:
  
 
End
 
End
 +
</PRE>
 +
 +
 +
 +
Added needed changes for the PIC16F628 (which is what can be bought today).
 +
 +
<pre>; Fairchild Channel F cart dumper version 2
 +
; 2/10/2004 Sean Riddle seanriddle@cox.net
 +
; Evolved from 16f84 to 16F628A by Fredric Blåholtz 03/08/2009
 +
; Pic BASIC Pro
 +
 +
INCLUDE "modedefs.bas"
 +
 +
@ device pic16f628, protect_off, cpd_off, lvp_off, bod_on, mclr_on, pwrt_on, wdt_off, hs_osc
 +
 +
DEFINE OSC 20 ; 20 MHz oscillator
 +
DEFINE NO_CLRWDT 1 ; watchdog is off
 +
 +
DEFINE DEBUG_REG PORTA ; serial output on A.0
 +
DEFINE DEBUG_BIT 0
 +
DEFINE DEBUG_BAUD 4800
 +
 +
BUFSIZE CON 16 ; 16-byte buffer
 +
 +
i VAR BYTE ; general register
 +
j VAR BYTE ; 2nd general reg
 +
k VAR WORD ; another
 +
 +
buf VAR BYTE ; buffer pointer
 +
rom VAR BYTE[BUFSIZE] ; buffer to store ROM
 +
 +
f8phi VAR PORTA.1 ; clock signal
 +
f8write VAR PORTA.2 ; write signal
 +
f8romc3 VAR PORTA.3 ; ROMC3 signal
 +
 +
CMCON = 7 ; Port A = digital I/O
 +
OPTION_REG.7= 0 ; weak pull ups on port B
 +
TRISB = $FF ; port B is all input
 +
VRCON = 0 ; Voltage reference disabled
 +
 +
Low f8phi
 +
Low f8write
 +
Low f8romc3
 +
 +
; Debug "start..."
 +
 +
Pause 2000 ; wait a couple of seconds after reset
 +
 +
; what I do:
 +
; clear PC0 with ROMC state 8
 +
; loop 256 times
 +
; fetch 16 bytes into buffer with ROMC state 0
 +
; dump buffer to serial port
 +
; clear PC0
 +
 +
f8phi=1
 +
f8write=1
 +
 +
@ nop ;NOPs used to create square waves
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
f8romc3=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8romc3=0
 +
f8phi=1
 +
f8romc3=1 ; this puts us in ROMC state 8 - clear PC0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8romc3=1
 +
f8phi=1
 +
f8romc3=1
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
 +
;;;
 +
 +
 +
f8phi=1
 +
f8write=1
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
f8romc3=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
f8romc3=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
f8romc3=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
 +
For k=1 TO 256
 +
 +
For i=0 TO BUFSIZE-1
 +
 +
f8phi=1
 +
f8write=1
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
f8romc3=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
f8romc3=0 ;ROMC state 0, fetch instruction
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
  
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
rom[i]=PORTB ;read databus into buffer
 +
f8phi=0
 +
 +
Next i
 +
 +
For i=0 TO BUFSIZE-1 ;dump the buffer to the serial port
 +
Debug rom[i]
 +
Next i
 +
Next k
 +
 +
 +
 +
End</pre>
 +
 +
 +
 +
 +
 +
 +
 +
 +
Attempt to run on a 4MHz PIC16C84, worked pretty well, didn't dump everything.
 +
<PRE>
 +
 +
; Fairchild Channel F cart dumper version 2
 +
; 2/10/2004 Sean Riddle seanriddle@cox.net
 +
; Edited from 16f84 to 16c84 by Fredric Blåholtz 03/08/2009
 +
; Pic BASIC Pro
 +
 +
INCLUDE "modedefs.bas"
 +
 +
@ device pic16c84, hs_osc, wdt_off
 +
 +
;DEFINE OSC 10 ;10 MHz oscillator
 +
;DEFINE OSC 3 ;3.58... MHz oscillator
 +
DEFINE OSC 4 ;4 MHz oscillator
 +
DEFINE NO_CLRWDT 1 ;don't insert wake up watchdog code
 +
 +
DEFINE DEBUG_REG PORTA ;serial output on A.0
 +
DEFINE DEBUG_BIT 0
 +
DEFINE DEBUG_BAUD 9600 ; can be changed to other baud-rates as well 9600-8-N-1
 +
' Set Debug mode: 0 = true, 1 = inverted
 +
DEFINE DEBUG_MODE 1 ; needed when dumping directly from pic to serial port pin 2 (pin 5 GND).
 +
 +
k VAR WORD ;variable for loop
 +
rom VAR BYTE ;buffer to store ROM
 +
 +
f8phi VAR PORTA.1 ;clock signal
 +
f8write VAR PORTA.2 ;write signal
 +
f8romc3 VAR PORTA.3 ;ROMC3 signal
 +
 +
OPTION_REG.7=0 ;weak pull ups on port B
 +
TRISB=$FF ;port B pins are all inputs
 +
 +
Low f8phi ; set all signals LOW at startup
 +
Low f8write
 +
Low f8romc3
 +
 +
Debug "Dumping starts in two seconds..." ; message on serial line - OPTIONAL
 +
 +
Pause 2000 ;wait 2 seconds after a reset
 +
 +
; what is done:
 +
; clear PC0 with ROMC state 8
 +
; fetch 1 byte into buffer with ROMC state 0
 +
; dump buffer to serial port
 +
; loop 16384 times
 +
 +
 +
 +
 +
f8phi=1
 +
f8write=1
 +
 +
@ nop ;NOPs used to create square waves
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
f8romc3=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8romc3=0
 +
f8phi=1
 +
f8romc3=1 ; this puts us in ROMC state 8 - clear PC0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8romc3=1
 +
f8phi=1
 +
f8romc3=1
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
@ nop ; forgotten in Sean's version?
 +
 +
;;;
 +
 +
 +
f8phi=1
 +
f8write=1
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
f8romc3=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
f8romc3=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
f8romc3=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
 +
For k=0 TO 16383
 +
 +
f8phi=1
 +
f8write=1
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
f8romc3=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
f8romc3=0 ;ROMC state 0, fetch instruction
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8phi=0
 +
 +
@ nop
 +
@ nop
 +
@ nop
 +
@ nop
 +
 +
f8write=0
 +
f8phi=1
 +
rom=PORTB ;read databus into buffer
 +
f8phi=0
 +
 +
Debug rom ;send byte over serial line
 +
 +
 +
Next k
 +
 +
 +
 +
End
 
</PRE>
 
</PRE>

Revision as of 21:09, 12 November 2013

Sean Riddle built a dumper for the Videocarts to be able to lure the code out without damaging the cartridges. A portable version was shipped over the world to collect rare data from even rarer cartridges.


Sean Riddle's original code (recommended)

;Fairchild Channel F cart dumper version 2

;2/10/2004 Sean Riddle seanriddle@cox.net

; slight modifications by e5frog 15/08/2009

 

INCLUDE "modedefs.bas"

@ device pic16f84, hs_osc, wdt_off


DEFINE	OSC		20			;20 MHz oscillator
DEFINE	NO_CLRWDT	1			;watchdog is off

DEFINE 	DEBUG_REG	PORTA			;serial output on A.0
DEFINE 	DEBUG_BIT	0
DEFINE 	DEBUG_BAUD	9600		; (was 4800) set terminal program to 9600 8-N-1, log input binary, dump and save the log.
DEFINE  DEBUG_MODE	1			; for direct output from PIC to serial port (signal to pin 2, GND to pin 5)(no MAX232)
' Set Debug mode: 0 = true, 1 = inverted


BUFSIZE 	CON		16			;16-byte buffer

i		VAR 		BYTE			;general register
k		VAR		WORD			;another

buf		VAR		BYTE			;buffer pointer
rom		VAR		BYTE[BUFSIZE]	;buffer to store ROM

f8phi		VAR		PORTA.1		;clock signal
f8write 	VAR		PORTA.2		;write signal
f8romc3 	VAR		PORTA.3		;ROMC3 signal

;	CMCON=7					;turn off comparators
OPTION_REG.7=0					;weak pull ups on port B
TRISB=$FF						;port B is all input

Low f8phi
Low f8write
Low f8romc3

;	Debug "start..."

Pause 2000						;wait a couple of seconds after reset

;	what I do:
;	clear PC0 with ROMC state 8
;	loop 1024 times (was 256)
;	fetch 16 bytes into buffer with ROMC state 0
;	dump buffer to serial port


	f8phi=1
	f8write=1

	@ nop						;NOPs used to create square waves
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8write=0
	f8phi=1
	f8romc3=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8romc3=0
	f8phi=1
	f8romc3=1					; this puts us in ROMC state 8 - clear PC0

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8romc3=1
	f8phi=1
	f8romc3=1

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop


;;;


	f8phi=1
	f8write=1

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8write=0
	f8phi=1
	f8romc3=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8write=0
	f8phi=1
	f8romc3=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8write=0
	f8phi=1
	f8romc3=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8write=0

 For k=1 TO 1024  ; was 256

	For i=0 TO BUFSIZE-1

		f8phi=1
		f8write=1

		@ nop
		@ nop
		@ nop
		@ nop

		f8phi=0

		@ nop
		@ nop
		@ nop
		@ nop

		f8write=0
		f8phi=1
		f8romc3=0

		@ nop
		@ nop
		@ nop
		@ nop

		f8phi=0

		@ nop
		@ nop
		@ nop
		@ nop

		f8write=0
		f8phi=1
		f8romc3=0				;ROMC state 0, fetch instruction

		@ nop
		@ nop
		@ nop
		@ nop

		f8phi=0

		@ nop
		@ nop
		@ nop
		@ nop

		f8write=0
		f8phi=1
		rom[i]=PORTB			;read databus into buffer
		f8phi=0

	Next i					 

	For i=0 TO BUFSIZE-1		;dump the buffer to the serial port
		Debug rom[i]
	Next i
Next k

 

End


Added needed changes for the PIC16F628 (which is what can be bought today).

;	Fairchild Channel F cart dumper version 2
;	2/10/2004 Sean Riddle seanriddle@cox.net
;	Evolved from 16f84 to 16F628A by Fredric Blåholtz 03/08/2009
;	Pic BASIC Pro 

INCLUDE "modedefs.bas"

@ device pic16f628, protect_off, cpd_off, lvp_off, bod_on, mclr_on, pwrt_on, wdt_off, hs_osc

DEFINE	OSC		20			; 20 MHz oscillator
DEFINE	NO_CLRWDT	1			; watchdog is off

DEFINE 	DEBUG_REG	PORTA			; serial output on A.0
DEFINE 	DEBUG_BIT	0
DEFINE 	DEBUG_BAUD	4800

BUFSIZE 	CON		16			; 16-byte buffer

i		VAR 		BYTE			; general register
j		VAR		BYTE			; 2nd general reg
k		VAR		WORD			; another

buf		VAR		BYTE			; buffer pointer
rom		VAR		BYTE[BUFSIZE]	; buffer to store ROM

f8phi		VAR		PORTA.1		; clock signal
f8write 	VAR		PORTA.2		; write signal
f8romc3 	VAR		PORTA.3		; ROMC3 signal

CMCON		=		7			; Port A = digital I/O
OPTION_REG.7=		0			; weak pull ups on port B
TRISB		=		$FF			; port B is all input
VRCON 	= 		0			; Voltage reference disabled

Low f8phi
Low f8write
Low f8romc3

;	Debug "start..."

Pause 2000						; wait a couple of seconds after reset

;	what I do:
;	clear PC0 with ROMC state 8
;	loop 256 times
;	fetch 16 bytes into buffer with ROMC state 0
;	dump buffer to serial port
;	clear PC0

	f8phi=1
	f8write=1

	@ nop						;NOPs used to create square waves
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8write=0
	f8phi=1
	f8romc3=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8romc3=0
	f8phi=1
	f8romc3=1					; this puts us in ROMC state 8 - clear PC0

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8romc3=1
	f8phi=1
	f8romc3=1

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop


;;;


	f8phi=1
	f8write=1

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8write=0
	f8phi=1
	f8romc3=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8write=0
	f8phi=1
	f8romc3=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8write=0
	f8phi=1
	f8romc3=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8write=0

 For k=1 TO 256

	For i=0 TO BUFSIZE-1

		f8phi=1
		f8write=1

		@ nop
		@ nop
		@ nop
		@ nop

		f8phi=0

		@ nop
		@ nop
		@ nop
		@ nop

		f8write=0
		f8phi=1
		f8romc3=0

		@ nop
		@ nop
		@ nop
		@ nop

		f8phi=0

		@ nop
		@ nop
		@ nop
		@ nop

		f8write=0
		f8phi=1
		f8romc3=0				;ROMC state 0, fetch instruction

		@ nop
		@ nop
		@ nop
		@ nop

		f8phi=0

		@ nop
		@ nop
		@ nop
		@ nop

		f8write=0
		f8phi=1
		rom[i]=PORTB			;read databus into buffer
		f8phi=0

	Next i					 

	For i=0 TO BUFSIZE-1		;dump the buffer to the serial port
		Debug rom[i]
	Next i
Next k

 

End





Attempt to run on a 4MHz PIC16C84, worked pretty well, didn't dump everything.


;	Fairchild Channel F cart dumper version 2
;	2/10/2004 Sean Riddle seanriddle@cox.net
;	Edited from 16f84 to 16c84 by Fredric Blåholtz 03/08/2009
;	Pic BASIC Pro 

INCLUDE "modedefs.bas"

@ device pic16c84, hs_osc, wdt_off

;DEFINE	OSC		10			;10 MHz oscillator
;DEFINE	OSC		3			;3.58... MHz oscillator
DEFINE	OSC		4			;4 MHz oscillator
DEFINE	NO_CLRWDT	1			;don't insert wake up watchdog code

DEFINE 	DEBUG_REG	PORTA			;serial output on A.0
DEFINE 	DEBUG_BIT	0
DEFINE 	DEBUG_BAUD	9600			; can be changed to other baud-rates as well 9600-8-N-1
' Set Debug mode: 0 = true, 1 = inverted
DEFINE	DEBUG_MODE	1			; needed when dumping directly from pic to serial port pin 2 (pin 5 GND).
 
k		VAR		WORD		;variable for loop
rom		VAR		BYTE		;buffer to store ROM

f8phi		VAR		PORTA.1		;clock signal
f8write 	VAR		PORTA.2		;write signal
f8romc3 	VAR		PORTA.3		;ROMC3 signal

OPTION_REG.7=0					;weak pull ups on port B
TRISB=$FF					;port B pins are all inputs

Low	f8phi					; set all signals LOW at startup
Low	f8write
Low	f8romc3

	Debug "Dumping starts in two seconds..." ; message on serial line - OPTIONAL

Pause 2000						;wait 2 seconds after a reset

;	what is done:
;	clear PC0 with ROMC state 8
;	fetch 1 byte into buffer with ROMC state 0
;	dump buffer to serial port
;	loop 16384 times




	f8phi=1
	f8write=1

	@ nop			;NOPs used to create square waves
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8write=0
	f8phi=1
	f8romc3=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8romc3=0
	f8phi=1
	f8romc3=1		; this puts us in ROMC state 8 - clear PC0

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8romc3=1
	f8phi=1
	f8romc3=1

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop

	@ nop			; forgotten in Sean's version?

;;;


	f8phi=1
	f8write=1

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8write=0
	f8phi=1
	f8romc3=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8write=0
	f8phi=1
	f8romc3=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8write=0
	f8phi=1
	f8romc3=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8phi=0

	@ nop
	@ nop
	@ nop
	@ nop

	f8write=0

 For k=0 TO 16383

		f8phi=1
		f8write=1

		@ nop
		@ nop
		@ nop
		@ nop

		f8phi=0

		@ nop
		@ nop
		@ nop
		@ nop

		f8write=0
		f8phi=1
		f8romc3=0

		@ nop
		@ nop
		@ nop
		@ nop

		f8phi=0

		@ nop
		@ nop
		@ nop
		@ nop

		f8write=0
		f8phi=1
		f8romc3=0		;ROMC state 0, fetch instruction

		@ nop
		@ nop
		@ nop
		@ nop

		f8phi=0

		@ nop
		@ nop
		@ nop
		@ nop

		f8write=0
		f8phi=1
		rom=PORTB		;read databus into buffer
		f8phi=0

		Debug rom		;send byte over serial line


Next k

 

End