fun with ROMs (was Re: Video Fader)
Article: 8902 of alt.hackers From: Ralf Brown <ralf@telerama.lm.com> Newsgroups: alt.hackers Subject: fun with ROMs (was Re: Video Fader) Date: 20 Oct 1995 11:23:37 GMT Organization: Just me and my PC.... Lines: 184 Approved: :devorppA Message-ID: 308648a6@ralf NNTP-Posting-Host: b.gp.cs.cmu.edu Summary: :yrammuS Keywords: :sdrowyeK In-Reply-To: <4621gh$s2j@aim.et.iupui.edu> Originator: ralf@B.GP.CS.CMU.EDU Status: RO
In article <4621gh$s2j@aim.et.iupui.edu>, khorton@tech.iupui.edu
(Kevin Horton) wrote:
}Obhack: I'm trying to program my own game on the Coleco Vision. To
}program games on an essentially un-documented machine, you must first
}get to know it. I built an adapter that plugs into my EPROM programmer
}that allows me to read CV carts. It works great on my 'test carts',
} [using adapter to read CV BIOS ROM]
}Bingo! I have data! I successfully read the
}ROM out and replace it back into my CV. I then dis-assemble the code and
}found out all the interrupt vectors! ;-)
I just did something similar, but no hardware required, and I didn't even
have to open up the modem.
ObHack: disassembling the EPROM on my new Sportster Vi to find undocumented
AT commands.
Step 0: Some years ago, someone had mentioned a "poke" command
which turned
an older version of a Sportster into a Courier (same motherboard, different
price range...) -- ATGW<nnn>,<nn>. So I tried ATGR<nnn>
and got back 16
lines like
0000:0000 FF00 000F 0429 C000 10A7 C000 10AC C000
Hmm, segmented addresses.... Sure enough, ATGR1000:1000 and ATGR1100:0000
spit out the same values. ATI7 reports a 256K EPROM, so not suprisingly,
there is valid data from C000:0000 on up. And the hex dump sure looked
like 80x86 code, so I entered a few bytes into DEBUG and got back valid
code. All right, we've got an 8018x or 386EX in real mode! (The strings
in the ROM showed the processor to be an 80188)
Step 1: Copy the modem's RAM and ROM. Create a file with copy/paste and
search/replace (Emacs' narrow-to-region command came in very handy here)
with all the ATGR commands to output the first 64K of the address space
and C000:0000 to F000:FFFF. Stuff this to the modem using RBcomm's
"type"
command and log the results to a file.
Step 2: Massage the captured data. After a few passes of regex
search/replace, the data was in a format that could be fed into DEBUG.
Add the appropriate DEBUG commands to beginning and end of the file, then
DEBUG sportrom.rom <sportrom.txt >nul
Bingo! A binary of the modem's ROM.
Step 3: Start peeking at the ROM with "strings", Turbo Debugger, etc.
As it turns out, there is no way to alter the modem's memory, so it is no
longer possible to turn a Sportster into the more expensive Courier.
Step 4: post the list of undocumented commands :-)
Sportster Vi / Courier HST undocumented commands
================================================
AT commands:
g= [addr] : dump 100h memory locations starting at hex addr [0] (bytes)
gb [addr] : dump 100h I/O ports starting at hex address [0]
gi [addr] : read I/O port at hex addr [0] and return value in hex
gn : set ?? flag
go<addr>,<val> : output hex value to I/O port at hex address [0]
gr [addr] : dump 100h memory locations starting at hex addr [0] (words)
gu : nop
gx [addr]
gy [addr]
g<4 hex digits>
g<8 hex digits>
q3
r : set ?? flag
rs99? : print copyright string
usr : print out credits
y5 : [checks something on phone line]
y6 : same as ATI6
y7 : check signal quality (only while connected)
y8 : dump compression dictionary (receive)
y9 : dump compression dictionary (xmit)
y11 : prints "Freq Level", plus listing if connected
y12 : prints "Recv Xmit", plus listing if connected
y14 : prints "000,000,018,007,010,000"
-sto
-sip
-sic
-ssq
-sdt
-stm
-ser?
&J0
&J1
&J2
~S? : print serial number
~S= : set serial number (lost on next ATZ or power cycle)
#MFR? : print modem manufacturer's name
#MDL? : print modem model string
#REV? : print revision string
#VBQ? : print buffer sizes
#VCI? : print modem ID string
#VBT? :
#VBT=? : list valid values (0-40)
#VBT=<n> :
#BDR? :
#BDR=? : print valid values (0,1,2,4,8,16,24)
#BDR=<n> :
#VBS? :
#VBS=? : list valid values (2,3,4)
#VBS=<n> :
#VLS? :
#VLS=? : list valid values (0,1,2,3,4)
#VLS=<n> :
#VRA : NOP
#VRN : NOP
#VSD? :
#VSD=? : list valid values (0,1)
#VSD=<n> :
#VSK : NOP
#VSP? :
#VSP=? : list valid values (0-255)
#VSP=<n> :
#VSR? :
#VSR=? : list valid values (8000)
#VSR=<n> :
#CID? :
#CID=? : list valid values (0,1,2)
#CID=<n> :
#VSS? :
#VSS=? : list valid values (0,1,2,3)
#VSS=<n> :
#VTD? :
#VTD=? : list valid values (3F,3F,3F)
#VTD=<n> :
#VTM :
#VTS=[n,n] :
#VTS=[n,n,n] :
#VTS={n,n} :
#VTS={n,n,n} :
+fco
+fvo
+fdm
+fhs:
+fcs:
+fis:
+ftc:
+fpo
+fti:
+fpi:
+fnf:
+fns:
+fnc:
+fet:
+fps:
+fht:
+fhr:
+fci:
(must follow +fclass in same command?)
+fatx=
+farx=
+ftxd=
+ftxt=
+frxd=
+frxt=
+fpi="case-sensitive literal"
+fli="case-sensitive literal"
(disabled on Sportster, available on some other models)
c0 : disable transmitter (modem is receive-only)
c1 : enable transmitter
k0 : modem clock in call-duration mode
k1 : modem clock in real-time mode
&L0 : normal phone line (doc. for Courier)
&L1 : leased line (doc. for Courier)
&S2
&S3
&S4
&Xn
&ZC?
&ZC=<number>
--
My employer will | I'net: ralf@telerama.lm.com Fido: Ralf Brown 1:129/26.1
deny knowing of | "Man is the only kind of varmint sets his own trap,
baits
this message... | it, then steps in it." -- John Steinbeck,
_Sweet_Thursday_