Executing Machine Code on the Tektronix 4051
Josh Dersch
derschjo at mail.msu.edu
Sun Feb 22 22:19:08 CST 2009
Small correction: The string "EXEC" takes does not seem to need to only
hexadecimal digits, the only requirement seems to be that it have a
non-zero, even length.
So I'm unsure of the encoding -- strings on the Tek are limited to 7-bit
ASCII, so using CHR() to build a string directly from 6800 machine codes
isn't going to work. Given that the call requires an even-length
string, clearly two characters are combined somehow to form one machine
code, but how isn't immediately obvious. I've played around with a few
simple combinations with no luck so far.
Josh
Josh Dersch wrote:
> Looks like your memory is not too bad... the documented method for
> calling ROM code (in expansion packs) is via the "CALL" command with a
> string that names the function to be called. (i.e. I have the EDITOR
> rom, and that's invoked by doing 'CALL "EDITOR"').
>
> Well, I just tried this:
>
> A$="ABCDEF"
> CALL "EXEC",A$
>
> And the machine immediately reset and gave me a system error :). So
> it seems evident that this was executing the string as machine code
> (and crashing horribly).
>
> Further experimentation reveals that the string can only contain
> hexadecimal digits (strings containing other characters returns an I/O
> error), so I'm wagering that the "EXEC" call does a simple translation
> from the hex string to bytecodes, then executes it.
>
> Now to work out various sundry details like calling conventions, where
> the code is in memory when it's executed (so I can do jumps) and then
> onto more fun things like doing something useful!
>
> Thanks!
> Josh
>
> Rick Bensene wrote:
>> I recall that there was a way to make the 4051 execute machine code. I
>> don't remember the exact method, but I remember that the bytes of 6800
>> machine code were encoded into a character string using the CHR$()
>> function. For example, hex 43 would turn into CHR$(67), or a "C". The
>> bytes were put into a string with the limit of program size being the
>> max. size of a character string. The next part is where my memory fails
>> me -- there was a way to cause the BASIC interpreter to branch to the
>> first character in the string, executing the code there. It involved
>> doing the transfer in such a way that it was if the code was branched to
>> with a "jump to subroutine" call, and when the code was complete, a
>> "return from subroutine" instruction would be in the code, and that
>> would cause a branch back to the BASIC interpreter. As I'm writing this,
>> a statement called EXEC$ or something along those lines pops into my
>> head.
>> I don't know if this is any help at all, but I really clearly remember
>> seeing 4051 programs (I worked at Tektronix from 1977 to 1990, and did a
>> lot of tinkering with 4051/2/4) that filled character strings with
>> hand-assembled machine code, and had a means to execute it. Hopefully
>> someone can find some docs that might substantiate these memories and
>> solve the mystery.
>>
>> Rick Bensene
>> The Old Calculator Museum
>> http://oldcalculatormuseum.com
>>
>>
>>
>>
>>
>>
>
>
More information about the cctech
mailing list