(My original message to cctech has yet to appear.  I thought I might try the
cctalk list).

  While Motorola never shipped the MC6839 [1] the binary is available [2]
and I've been playing around with it [3].  While it's not producing the
exact same results as I get on a more modern machine, it appears to be
"close enough" for me to be happy with it.  But I am having one issue that I
can't figure out.

  The documentation for the FMOV operation says:

        FMOV    Move (or convert) arg1 -> arg2.  This function is useful for
                changing precisions (e.g. single to double) with full
                exception processing for possible overflow and underflow.

  Okay.  And to call it [4]:

        
------------------------------------------------------------------------------
        |Function|Opcode|  Register entry conditions   | Stack entry conditions
        
------------------------------------------------------------------------------
        | FMOV   | $1A  | U =  precision parameter word| push arg
        |        |      | Y -> argument                | push precision param 
word
        |        |      | D -> fpcb                    | push ptr to fpcb
        |        |      | X -> result                  | call FPO9
        |        |      |                              | pull result
        
------------------------------------------------------------------------------

        For moves, U contains a parameter word describing the size of the
        source and destination arguments.  The bits are as follows, where
        the size is as defined in the fpcb control byte

        Bits 0-2  : Destination size
        Bits 3-7  : unused
        Bits 8-10 : Source size
        Bits 11-15: unused

  And the size bits are defined as:

        111 = reserved
        110 = reserved
        101 = reserved
        100 = extended - round result to double
        011 = extended - round result to single
        010 = extended - no forced rounding
        001 = double
        000 = single

  It appears that to convert from single to double, I would set U to $0001,
but the results are *so* far out of whack it's not even funny.  I've tried
setting U to point to the value $0001 and that doesn't work. I've tried
shifting the bits (because in the FPCB they're the upper three bits) and
that doesn't work.  I've tried reversing the registers and that doesn't
work.  Does anyone have the actual source code [4]?  Or know what I might be
doing wrong?

  -spc

[1]     A ROM with position independent 6809 object code that conforms (to
        what I can find) with IEEE 754 Draft 8.

[2]     Available in the file fpo9.lzh here
        https://ftplike.com/browser/os9archive.rtsi.com/OS9/OS9_6X09/PROG/

[3]     Using a 6809 emulator library I wrote: https://github.com/spc476/mc6809
        Not much documentation I'm afraid.

[4]     Register entry: ROM base address + $003D
        Stack entry:    ROM base address + $003F

[5]     I'm lead to believe that Motorola release the code into the public
        domain.

Reply via email to