Old rule of thumb: if it's less than 350 bytes, just assemble it by hand... ;) ok, I made that up.
Connect a wire from the right side of the LED (D8, on the side towards the battery) to a standard 9-pin serial port, pin 2 (or pin 3 on a 25-pin port). Configure for 19200 buad, 8N1, and you're set! Be careful not to connect to the wrong pin - you might put -12v on the camera, which probably isn't too good.
If output lines overlap, you may need to turn on CR->CR/LF translation, or save it to a text file and open with a text editor.
The output is really pretty:
...
0090:E0 00 C8 1C F7 E0 00 C8
0098:1B F7 E6 00 E7 00 17 BF
...
I wrote this code using only a multimeter and a stopwatch :)
// Initialize the output port (I assume it's a direction register):
0xe0, 0x00, //0090: e0 32 +23 LDI R0,#$00
0xc8, 0x1c, 0xf7, //0092: c8 2bf7 +24 STA R0,$f72b ;($f71c) = $00
0xe0, 0x00, //0095: e0 01 +15 LDI R0,#$00 00=LED off, 0v at right side of LED, mark, data=1
0xc8, 0x1b, 0xf7, //0097: c8 02f7 +11 STA R0,$f71b
// Initialize address counter (R7:R6) to 0000
0xe6, 0x00, //009a: e0 32 +23 LDI R6,#$00
0xe7, 0x00, //009c: e0 32 +23 LDI R7,#$00
// start of a line:
0x17, //009e: TX0 R7
0xbf, 0xcc, 0x01, //-- call hexout
0x16, //00a2: TX0 R6
//0xbc, 0xfb, 0, //jump to end-of-loop
0xbf, 0xcc, 0x01, //-- call hexout
0xe0, 0x3a, //00a6: e0 32 +23 LDI R0,#$3a (':')
0xbf, 0x03, 0x01, //-- call charout @ 0x0103
0xf6, //00ab: LDX R6
0xc6, //00ac: UPP R6
0xbf, 0xcc, 0x01, //-- call hexout
0xe0, 0x20, //00b0: e0 32 +23 LDI R0,#$20 (' ')
0xbf, 0x03, 0x01, //-- call charout @ 0x0103
0xf6, //00b5: LDX R6
0xc6, //00ac: UPP R6
0xbf, 0xcc, 0x01, //-- call hexout
0xe0, 0x20, //00b0: e0 32 +23 LDI R0,#$20 (' ')
0xbf, 0x03, 0x01, //-- call charout @ 0x0103
0xf6, //00bf: LDX R6
0xc6, //00ac: UPP R6
0xbf, 0xcc, 0x01, //-- call hexout
0xe0, 0x20, //00b0: e0 32 +23 LDI R0,#$20 (' ')
0xbf, 0x03, 0x01, //-- call charout @ 0x0103
0xf6, //00c9: LDX R6
0xc6, //00ac: UPP R6
0xbf, 0xcc, 0x01, //-- call hexout
0xe0, 0x20, //00b0: e0 32 +23 LDI R0,#$20 (' ')
0xbf, 0x03, 0x01, //-- call charout @ 0x0103
0xf6, //00d3: LDX R6
0xc6, //00ac: UPP R6
0xbf, 0xcc, 0x01, //-- call hexout
0xe0, 0x20, //00b0: e0 32 +23 LDI R0,#$20 (' ')
0xbf, 0x03, 0x01, //-- call charout @ 0x0103
0xf6, //00dd: LDX R6
0xc6, //00ac: UPP R6
0xbf, 0xcc, 0x01, //-- call hexout
0xe0, 0x20, //00b0: e0 32 +23 LDI R0,#$20 (' ')
0xbf, 0x03, 0x01, //-- call charout @ 0x0103
0xf6, //00e7: LDX R6
0xc6, //00ac: UPP R6
0xbf, 0xcc, 0x01, //-- call hexout
0xe0, 0x20, //00b0: e0 32 +23 LDI R0,#$20 (' ')
0xbf, 0x03, 0x01, //-- call charout @ 0x0103
0xf6, //00f1: LDX R6
0xc6, //00ac: UPP R6
0xbf, 0xcc, 0x01, //-- call hexout
0xe0, 0x0D, //00b0: e0 32 +23 LDI R0,#$0d ('\r')
0xbf, 0x03, 0x01, //-- call charout @ 0x0103
0xe0, 0x01, //00fb: LDI R0,#$01 value used to reset watchdog timer
0xc8, 0x16, 0xf7, //00fd: c8 02f7 +11 STA R0,$f716 - Reset watchdog timer
0xbc, 0x9e, 0x00, //0100: JMP L009e
//------------------
#define DATA0 0xe2, 0x08, 0xca, 0x1b, 0xf7, // Uses R2 5 bytes
#define DATA1 0xe2, 0x00, 0xca, 0x1b, 0xf7, // Uses R2 5 bytes
#define BITDELAY 0xe2, 0x35, 0xe3, 0x01, 0x42, 0x99, 0xFD, 0x43, 0x99, 0xFA, // Uses R3,R2 10 bytes
//------------------
// 0x0103: COUT routine (input: R0=character to output)
DATA0 BITDELAY // 0x0103: start bit (15 bytes)
// Send D0: (20 bytes)
0xe2, 0x08, // 0112: LDI R2,#$08 // assume DATA0
0x38, // 0114: ROR R0
0x91, 0x02, // BNC LABEL1 // we were correct
0xe2, 0x00, // LDI R2,#$08 // wrong - it was DATA1
0xca, 0x1b, 0xf7, // LABEL1: STA R2,$f71b
BITDELAY // 10 bytes
// Send D1: (20 bytes)
0xe2, 0x08, // 0126: LDI R2,#$08 // assume DATA0
0x38, // ROR R0
0x91, 0x02, // BNC LABEL1 // we were correct
0xe2, 0x00, // LDI R2,#$08 // wrong - it was DATA1
0xca, 0x1b, 0xf7, // LABEL1: STA R2,$f71b
BITDELAY
// Send D2: (20 bytes)
0xe2, 0x08, // 013a: LDI R2,#$08 // assume DATA0
0x38, // ROR R0
0x91, 0x02, // BNC LABEL1 // we were correct
0xe2, 0x00, // LDI R2,#$08 // wrong - it was DATA1
0xca, 0x1b, 0xf7, // LABEL1: STA R2,$f71b
BITDELAY
// Send D3: (20 bytes)
0xe2, 0x08, // LDI R2,#$08 // assume DATA0
0x38, // ROR R0
0x91, 0x02, // BNC LABEL1 // we were correct
0xe2, 0x00, // LDI R2,#$08 // wrong - it was DATA1
0xca, 0x1b, 0xf7, // LABEL1: STA R2,$f71b
BITDELAY
// Send D4: (20 bytes)
0xe2, 0x08, // 0162: LDI R2,#$08 // assume DATA0
0x38, // ROR R0
0x91, 0x02, // BNC LABEL1 // we were correct
0xe2, 0x00, // LDI R2,#$08 // wrong - it was DATA1
0xca, 0x1b, 0xf7, // LABEL1: STA R2,$f71b
BITDELAY
// Send D5: (20 bytes)
0xe2, 0x08, // LDI R2,#$08 // assume DATA0
0x38, // ROR R0
0x91, 0x02, // BNC LABEL1 // we were correct
0xe2, 0x00, // LDI R2,#$08 // wrong - it was DATA1
0xca, 0x1b, 0xf7, // LABEL1: STA R2,$f71b
BITDELAY
// Send D6: (20 bytes)
0xe2, 0x08, // 018a: LDI R2,#$08 // assume DATA0
0x38, // ROR R0
0x91, 0x02, // BNC LABEL1 // we were correct
0xe2, 0x00, // LDI R2,#$08 // wrong - it was DATA1
0xca, 0x1b, 0xf7, // LABEL1: STA R2,$f71b
BITDELAY
// Send D7: (20 bytes)
0xe2, 0x08, // 019e: LDI R2,#$08 // assume DATA0
0x38, // ROR R0
0x91, 0x02, // BNC LABEL1 // we were correct
0xe2, 0x00, // LDI R2,#$08 // wrong - it was DATA1
0xca, 0x1b, 0xf7, // LABEL1: STA R2,$f71b
BITDELAY
DATA1 BITDELAY // 01b2: stop bit (15 bytes)
BITDELAY // 01c1: stop bit (10 bytes)
0xb9, // 01cb: RTS
//------------------
// 0x01cc: HEXOUT routine (input: R0=byte to output)
0x71, // 01cc: T0X R1 save it..
0x38, // 01cd: ROR R0
0x38, // ROR R0 shift high nibble into lower
0x38, // ROR R0
0x38, // 01d0: ROR R0
0xe2, 0x0F, // 01d1: LDI R2,#$0F
0x22, // 01d3: AND R2
0xbf, 0xdb, 0x01, // 01d4: call xdigitout @ 0x0103
0x11, // 01d7: TX0 R1 get saved byte
0xe2, 0x0F, // 01d8: LDI R2,#$0F
0x22, // 01da: AND R2
// fall into xdigitoout & return
//------------------
// 0x01db: XDIGITOUT (input: R0=nibble to output)
0xe2, 0x30, // 01d8: LDI R2,#$30 - make a digit
0x52, // 01da: ADD R2
0xe2, 0x3A, // 01d8: LDI R2,#$3A
0x7a, // 01da: CMP R2
0x91, 0x03, // 01db: BNC ISDIGIT
0xe2, 0x07, // 01dd: LDI R2,#$07 - make a letter ('A'-'0' - 10)
0x52, // 01df: ADD R2
0xbc, 0x03, 0x01, // 01e0: ISDIGIT: jump to charout @ 0x0103
Could you post the ready to assemble code? <edit> never mind, after three years I think I figured it out.
; bbSerial dumps Ram to bit-banged serial using LED on camera
;Connect a wire from the right side of the LED (D8, on the side towards the battery) to a standard 9-pin serial port, pin 2 (or pin 3 on a 25-pin port). Configure for 19200 buad, 8N1, and you're set! Be careful not to connect to the wrong pin - you might put -12v on the camera, which probably isn't too good.
;If output lines overlap, you may need to turn on CR->CR/LF translation, or save it to a text file and open with a text editor.
;The output is really pretty:
;...
;0090:E0 00 C8 1C F7 E0 00 C8
;0098:1B F7 E6 00 E7 00 17 BF
;...
;**{--------------------------------------------- B3A916B8.00090 ----
;** ;entry point
;**}-----------------------------------------------------------------
.ORG $90
L0090: LDI R0,#$00 ;Initialize the output port
STA R0,$f71c
LDI R0,#$00
STA R0,$f71b ;00=LED off, 0v at right side of LED, mark, data=1
LDI R6,#$00
LDI R7,#$00 ;Initialize address counter (R7:R6) to $0000
LOOPTOP: TX0 R7
JSR HEXOUT
TX0 R6
JSR HEXOUT
LDI R0,#$3a ;(':')
JSR COUT
LDX R6
UPP R6
JSR HEXOUT
LDI R0,#$20 ;(' ')
JSR COUT
LDX R6
UPP R6
JSR HEXOUT
LDI R0,#$20 ;(' ')
JSR COUT
LDX R6
UPP R6
JSR HEXOUT
LDI R0,#$20 ;(' ')
JSR COUT
LDX R6
UPP R6
JSR HEXOUT
LDI R0,#$20 ;(' ')
JSR COUT
LDX R6
UPP R6
JSR HEXOUT
LDI R0,#$20 ;(' ')
JSR COUT
LDX R6
UPP R6
JSR HEXOUT
LDI R0,#$20 ;(' ')
JSR COUT
LDX R6
UPP R6
JSR HEXOUT
LDI R0,#$20 ;(' ')
JSR COUT
LDX R6
UPP R6
JSR HEXOUT
LDI R0,#$0d ;(carriage return)
JSR COUT
LDI R0,#$01
STA R0,$f716 ;Reset watchdog timer
JMP LOOPTOP
;**{--------------------------------------------- B4F1551A.00103 ----
;** ;character output on LED as bit banged serial port
;**}-----------------------------------------------------------------
COUT: LDI R2,#$08 ;DATA0
STA R2,$f71b ;($f71b) = $08
LDI R2,#$35 ;BITDELAY
LDI R3,#$01 ;R3:R2 = $0135
L010C: DEC R2
BRC L010C
DEC R3
BRC L010C
;Send Bit D0:
LDI R2,#$08 ;assume DATA0
ROR R0
BNC L0119 ;branch if we were correct
LDI R2,#$00 ;else it was DATA1
L0119: STA R2,$f71b ;($f71b) = $00
LDI R2,#$35 ;BITDELAY
LDI R3,#$01 ;R3:R2 = $0135
L0120: DEC R2
BRC L0120
DEC R3
BRC L0120
;Send Bit D1:
LDI R2,#$08 ;assume DATA0
ROR R0
BNC L012D ;branch if we were correct
LDI R2,#$00 ;else it was DATA1
L012D: STA R2,$f71b ;($f71b) = $00
LDI R2,#$35 ;BITDELAY
LDI R3,#$01 ;R3:R2 = $0135
L0134: DEC R2
BRC L0134
DEC R3
BRC L0134
;Send Bit D2:
LDI R2,#$08 ;assume DATA0
ROR R0
BNC L0141 ;branch if we were correct
LDI R2,#$00 ;else it was DATA1
L0141: STA R2,$f71b ;($f71b) = $00
LDI R2,#$35 ;BITDELAY
LDI R3,#$01 ;R3:R2 = $0135
L0148: DEC R2
BRC L0148
DEC R3
BRC L0148
;Send Bit D3:
LDI R2,#$08 ;assume DATA0
ROR R0
BNC L0155 ;branch if we were correct
LDI R2,#$00 ;else it was DATA1
L0155: STA R2,$f71b ;($f71b) = $00
LDI R2,#$35 ;BITDELAY
LDI R3,#$01 ;R3:R2 = $0135
L015C: DEC R2
BRC L015C
DEC R3
BRC L015C
;Send Bit D4:
LDI R2,#$08 ;assume DATA0
ROR R0
BNC L0169 ;branch if we were correct
LDI R2,#$00 ;else it was DATA1
L0169: STA R2,$f71b ;($f71b) = $00
LDI R2,#$35 ;BITDELAY
LDI R3,#$01 ;R3:R2 = $0135
L0170: DEC R2
BRC L0170
DEC R3
BRC L0170
;Send Bit D5:
LDI R2,#$08 ;assume DATA0
ROR R0
BNC L017D ;branch if we were correct
LDI R2,#$00 ;else it was DATA1
L017D: STA R2,$f71b ;($f71b) = $00
LDI R2,#$35 ;BITDELAY
LDI R3,#$01 ;R3:R2 = $0135
L0184: DEC R2
BRC L0184
DEC R3
BRC L0184
;Send Bit D6:
LDI R2,#$08 ;assume DATA0
ROR R0
BNC L0191 ;branch if we were correct
LDI R2,#$00 ;else it was DATA1
L0191: STA R2,$f71b ;($f71b) = $00
LDI R2,#$35 ;BITDELAY
LDI R3,#$01 ;R3:R2 = $0135
L0198: DEC R2
BRC L0198
DEC R3
BRC L0198
;Send Bit D7:
LDI R2,#$08 ;assume DATA0
ROR R0
BNC L01A5 ;branch if we were correct
LDI R2,#$00 ;else it was DATA1
L01A5: STA R2,$f71b ;($f71b) = $00
LDI R2,#$35 ;BITDELAY
LDI R3,#$01 ;R3:R2 = $0135
L01AC: DEC R2
BRC L01AC
DEC R3
BRC L01AC
;Send Stop Bit
LDI R2,#$00 ;DATA1
STA R2,$f71b ;($f71b) = $00
LDI R2,#$35 ;BITDELAY
LDI R3,#$01 ;R3:R2 = $0135
L01BB: DEC R2
BRC L01BB
DEC R3
BRC L01BB
LDI R2,#$35 ;BITDELAY
LDI R3,#$01 ;R3:R2 = $0135
L01C5: DEC R2
BRC L01C5
DEC R3
BRC L01C5
RTS
;**{--------------------------------------------- 4C3EE027.001CC ----
;** ;hexout routine (input: R0=byte to output)
;**}-----------------------------------------------------------------
HEXOUT: T0X R1 ;save it..
ROR R0
ROR R0
ROR R0 ;shift high nibble into lower
ROR R0
LDI R2,#$0f
AND R2
JSR XDIGITOUT
TX0 R1
LDI R2,#$0f
AND R2
;fall into xdigitout & return
XDIGITOUT: ;(input: R0=nibble to output)
LDI R2,#$30 ;- make a digit
ADD R2 ;R0 += $30
LDI R2,#$3a
CMP R2
BNC L01E6
LDI R2,#$07 ;- make a letter ('A'-'0' - 10)
ADD R2 ;R0 += $07
L01E6: JMP COUT