1
0
mirror of https://github.com/aap/pdp6.git synced 2026-01-13 15:27:46 +00:00

emu: some progress on the 340; fixed normalize return

This commit is contained in:
aap 2019-03-22 03:54:34 +01:00
parent eacf915bfb
commit 42644740f9
6 changed files with 623 additions and 4596 deletions

View File

@ -613,6 +613,15 @@ setreq(IOBus *bus, int dev, u8 pia)
}
}
}
void
setreq2(IOBus *bus, int dev, u8 req)
{
req &= 0177;
if(bus && bus->dev[dev].req != req){
bus->dev[dev].req = req;
recalc_req(bus);
}
}
void
recalc_cpa_req(Apr *apr)
@ -1214,7 +1223,7 @@ defpulse(blt_t0)
apr->fsf1 || apr->fpf1 || apr->faf2 ? apr->c.ar>>27 & 0777 : \
apr->fpf2 || apr->faf1 ? apr->c.mb>>27 & 0777 : 0)
#define SC_PAD apr->sc ^= SC_DATA
#define SC_CRY apr->sc += (~apr->sc & SC_DATA) << 1
#define SC_CRY apr->sc = (apr->sc + ((~apr->sc & SC_DATA) << 1))&0777
// 6-7
#define SHC_ASHC (apr->inst == ASHC || apr->nrf2 || apr->faf3)
#define SHC_DIV ((IR_DIV || IR_FDV) && !apr->nrf2)
@ -1900,7 +1909,8 @@ defpulse(ds_div_t0)
defpulse(nrt6)
{
pulse(apr, &et10, 0); // 5-5
/* HACK: fake delay so values will settle */
pulse(apr, &et10, 1); // 5-5
}
defpulse(nrt5a)
@ -1918,7 +1928,7 @@ defpulse(nrt5)
defpulse(nrt4)
{
apr->n.ar |= apr->n.ar&0400777777777 | ((word)apr->sc&0377)<<27; // 6-4, 6-9
apr->n.ar = apr->n.ar&0400777777777 | ((word)apr->sc&0377)<<27; // 6-4, 6-9
pulse(apr, &nrt6, 0); // 6-27
}

563
emu/chargen.inc Normal file
View File

@ -0,0 +1,563 @@
enum {
I = 020,
R = 010,
L = 014,
U = 02,
D = 03
};
static int char_na[] = {
I, U|I, U|I, U|I, U|I, U|I, U|I,
R|I, D|I, D|I, D|I, D|I, D|I, D|I,
R|I, U|I, U|I, U|I, U|I, U|I, U|I,
R|I, D|I, D|I, D|I, D|I, D|I, D|I,
R|I, U|I, U|I, U|I, U|I, U|I, U|I,
D|R, D|R, D|R, D, D, D,
0
};
static int char_A[] = {
I, U|I, U|I, U|I, U|I, U|I, U|R|I,
R|I, R|I, R|D|I, D|I, L, L, L|D|I,
R|I, R|I, R|I, D|I, D|I, D|I, R, R, R,
0
};
static int char_B[] = {
I, U|I, U|I, U|I, U|I, U|I, U|I, R|I,
R|I, R|I, R|D|I, D|I, L|D|I, L|I, L|I,
D, D, D|I, R|I, R|I, U|R|I, U|I,
D|R, D|R, R,
0
};
static int char_C[] = {
U|I, U|I, U|I, U|I, U|I, U|R|I, R|I, R|I, D|R|I,
D|L, D|L, D|L, D, D|I,
R|I, R|I, U|R|I, D|R, R, R,
0
};
static int char_D[] = {
I, U|I, U|I, U|I, U|I, U|I, U|I,
R|I, R|I, R|I, R|D|I, D|I, D|I, D|I, D|I,
L, L, L|D|I, R|I, R|I, R, R, R, R,
0
};
static int char_E[] = {
I, U|I, U|I, U|I, U|I, U|I, U|I,
R|I, R|I, R|I, R|I,
D|L, D|L, D|L|I,
R|I, R|I, R|I,
D|L, D|L, D|L|I,
R|I, R|I, R|I, R, R, R,
0
};
static int char_F[] = {
I, U|I, U|I, U|I, U|I, U|I, U|I,
R|I, R|I, R|I, R|I,
D|L, D|L, D|L|I,
R|I, R|I, R|I,
D|L, D|L, D|L,
R, R, R, R, R, R,
0
};
static int char_G[] = {
U|I, U|I, U|I, U|I, U|I,
U|R|I, R|I, R|I, D|R|I,
D, D|I, L|I, L|I, D|L, D,
D|I, R|I, R|I, U|R|I, U|I, D|R, D|R, R,
0
};
static int char_H[] = {
I, U|I, U|I, U|I, U|I, U|I, U|I,
D|R, D, D|I, R|I, R|I,
U, U, U|R|I,
D|I, D|I, D|I, D|I, D|I, D|I, R, R, R,
0
};
static int char_I[] = {
U, U, U, U, U, U|R|I,
R|I, R|I, D|L|I,
D|I, D|I, D|I, D|I, D|L|I,
R|I, R|I, R, R, R, R,
0
};
static int char_J[] = {
U|I, D|R|I, R|I, R|I,
U|R|I, U|I, U|I, U|I, U|I, U|I,
D|R, D|R, D|R, D, D, D,
0
};
static int char_K[] = {
I, U|I, U|I, U|I, U|I, U|I, U|I,
R, R, R, R|I,
D|L|I, D|L|I, D|L|I,
D|R|I, D|R|I, D|R|I, R, R, R,
0
};
static int char_L[] = {
I, U|I, U|I, U|I, U|I, U|I, U|I,
D|R, D, D, D, D, D|I,
R|I, R|I, R|I, R, R, R,
0
};
static int char_M[] = {
I, U|I, U|I, U|I, U|I, U|I, U|I,
D|R|I, D|R|I, U|R|I, U|R|I,
D|I, D|I, D|I, D|I, D|I, D|I, R, R, R,
0
};
static int char_N[] = {
I, U|I, U|I, U|I, U|I, U|I, U|I,
D|R|I, D|R|I, D|R|I,
U, U, U|R|I,
D|I, D|I, D|I, D|I, D|I, D|I, R, R, R,
0
};
static int char_O[] = {
U|I, U|I, U|I, U|I, U|I,
U|R|I, R|I, R|I,
D|R|I, D|I, D|I, D|I, D|I,
L, L, D|L|I, R|I, R|I, R, R, R, R,
0
};
static int char_P[] = {
I, U|I, U|I, U|I, U|I, U|I, U|I,
R|I, R|I, R|I,
D|R|I, D|I,
D|L|I, L|I, L|I,
D|R, D|R, D|R, R, R, R,
0
};
static int char_Q[] = {
U|I, U|I, U|I, U|I, U|I,
U|R|I, R|I, R|I,
D|R|I, D|I, D|I, D|I,
L, L|I, D|L, D|I,
R|I, R|I, U|I, R|I, D|I, R, R, R,
0
};
static int char_R[] = {
I, U|I, U|I, U|I, U|I, U|I, U|I,
R|I, R|I, R|I,
D|R|I, D|I,
D|L|I, L|I, L|I,
D|R|I, D|R|I, D|R|I, R, R, R,
0
};
static int char_S[] = {
U|I, D|R|I, R|I, R|I, U|R|I, U|I,
U|L|I, L|I, L|I, U|L|I, U|I,
U|R|I, R|I, R|I, D|R|I, D|R, D|R, D|R, D, D,
0
};
static int char_T[] = {
U, U, U, U, U, U|I,
R|I, R|I, R|I, R|I,
D|L, L|I,
D|I, D|I, D|I, D|I, D|I,
R, R, R, R, R,
0
};
static int char_U[] = {
U|I, U|I, U|I, U|I, U|I, U|I,
R, R, R, R|I,
D|I, D|I, D|I, D|I, D|I,
L, L, L|D|I, R|I, R|I, R, R, R, R,
0
};
static int char_V[] = {
R, R|I, U|L|I, U|L|I, U|I, U|I, U|I, U|I,
R, R, R, R|I,
D|I, D|I, D|I, D|I, D|L|I, D|L|I, R, R, R, R, R,
0
};
static int char_W[] = {
I, U|I, R|I, U|R|I, L, L|I, U|I, U|I, U|I, U|I,
R, R, R, R|I,
D|I, D|I, D|I, D|I, D|I, L|I, D|R|I, R, R, R,
0
};
static int char_X[] = {
I, U|R|I, U|R|I, U|I, U|I, U|L|I, U|L|I,
R, R, R, R|I,
D|L|I, D, D, D, D|I, D|R|I, R, R, R,
0
};
static int char_Y[] = {
U, U, U, U, U, U|I,
R, R, R, R|I, D|L|I,
L, L|I,
D|R|I, D|I, D|I, D|I, D|I, R, R, R, R, R,
0
};
static int char_Z[] = {
I, U|I, U|R|I, U|I, L|I,
U, U, U|I,
R|I, R|I, R|I, R|I,
D|I, D|L|I, D|R|I, L|I, L|I,
D, D, D|L|I,
R|I, R|I, R|I, R, R, R,
0
};
static int char_null[] = {
U, U|I, U|I, R|I, U|L|I,
U|R|I, R|I, D|I, U|R|I,
D|R|I, D|I, L|I, D|R|I,
L, L|I, D|L|I, R|I, R|I, D|R, R, R, R,
0
};
static int char_ex[] = {
R, R|I, U, U|I, U|I, U|I, U|I, U|I,
D|R, D|R, D|R, D|R, D|R, D,
0
};
static int char_dq[] = {
U, U, U, U|R|I, U|I, U|I,
R, R|I, D|I, D|I, D|R, D|R, D|R, D,
0
};
static int char_sh[] = {
R, R|I, U|I, U|I, L|I, U|R|I, U|I, L|I, U|R|I, U|I,
R, R|I, D|I, D|R|I, L|I, L|I, D|R|I, D|R|I,
L|I, L|I, D|R|I, D|I, R, R, R, R,
0
};
static int char_dl[] = {
U|I, D|R|I, R|I, U|I, D|R|I, U|R|I, U|I,
U|L|I, D|L|I, U|I, U|I, D|L|I, U|L|I, U|I,
U|R|I, R|I, D|I, U|R|I, D|R|I, D|R, D|R, D|R, D, D,
0
};
static int char_pr[] = {
I, U|I, U|R|I, U|R|I, U|R|I, U|R|I, U|I,
L|I, L|I, L|I, L|I, D|I, R|I,
D|R, D|R, D,
D|I, R|I, D|L|I, R|I, R, R, R,
0
};
static int char_et[] = {
R|I, U|L|I, U|I, U|R, U|R|I, U|I, U|L|I,
D|L|I, D|I, D|R|I, D|R|I, D|I, D|I, U|R|I, U|R|I,
D, D|I, R, R, R,
0
};
static int char_sq[] = {
U, U, U, U, U|R|I, U|I,
R|I, D|I, D|I, D|R, D|R, D|R, D|R, R,
0
};
static int char_lp[] = {
R, R|I, U|L|I, U|L|I, U|I, U|I, U|R|I, U|R|I,
D|R, D|R, D|R, D|R, D|R, D,
0
};
static int char_rp[] = {
U, U, U, U, U|R, U|R|I,
D|R|I, D|R|I, D|I, D|I, D|L|I, D|L|I,
R, R, R, R, R,
0
};
static int char_as[] = {
U|I, U|R|I, U|I, L|I, U|R|I, U|L|I, R,
R|I, R, R|I, D|L|I, L|I, D|I, R|I, R|I,
D|L|I, L|I, D|I, R, R|I, D|R, R, R,
0
};
static int char_pl[] = {
U, U, U|I, R|I, U|R|I, U|I,
D|R, D|R|I, L|I, L|I, D|I, D|I,
D|R, R, R, R, R,
0
};
static int char_cm[] = {
U|R|I, U|I, R|I, D|I, D|I, R, R, R, R, R,
0
};
static int char_mi[] = {
U, U, U|I, R|I, R|I, R|I, R|I, D|R, D|R, D|R,
0
};
static int char_pe[] = {
R|I, U|I, R|I, D|I, R, R, R, R, R,
0
};
static int char_sl[] = {
U|I, U|R|I, U|R|I, U|R|I, U|R|I,
D|R, D|R, D|R, D, D,
0
};
static int char_0[] = {
U|I, U|R|I, L|I, U|I, U|I, U|I,
U|R|I, R|I, R|I, D|R|I, D|I, L|I, D|L|I,
R, R|I, D|I, D|I, D|L|I, L|I, L|I,
R, R, R, R, R, R,
0
};
static int char_1[] = {
U, U, U, U, U|R|I, U|R|I, D|I,
D|I, D|I, D|I, D|I, D|L|I, R|I, R|I, R,
R, R, R,
0
};
static int char_2[] = {
U, U, U, U, U|I, U|R|I, R|I, R|I,
D|R|I, D|I, D|L|I, L|I, L|I, D|L|I, D|I, D|I,
R|I, R|I, R|I, R|I, R, R, R,
0
};
static int char_3[] = {
U|I, D|R|I, R|I, R|I, U|R|I, U|I, U|L|I,
U|R|I, U|I, U|L|I, L|I, L|I, D|L|I,
D|R, D|R|I, D|R, D|R, D|R, R, R,
0
};
static int char_4[] = {
U, U, U|I, R|I, R|I, U|L|I, U|R|I, U|R|I,
D|I, D|I, D|R|I, L|I, D|I, D|I, D|I, R, R, R, R,
0
};
static int char_5[] = {
U|I, D|R|I, R|I, R|I, U|R|I, U|I, U|L|I, L|I, L|I,
U|L|I, U|I, U|I, R|I, R|I, R|I, R|I,
D|R, D|R, D|R, D, D, D,
0
};
static int char_6[] = {
R|I, U|L|I, U|I, U|R|I, L|I, U|I, U|I,
U|R|I, R|I, R|I, D|R|I, D|L, D|L|I, R|I,
D|R|I, D|I, L, D|L|I, R|I, R, R, R, R,
0
};
static int char_7[] = {
I, U|I, U|R|I, U|L, U, U|I, U|I,
R|I, R|I, R|I, R|I, D|I, D|L|I, D|L|I,
D|R, D|R, D|R, R, R,
0
};
static int char_8[] = {
R|I, U|L|I, U|I, U|R|I, U|L|I, U|I, U|R|I,
R|I, R|I, D|R|I, D|I, L, D|L|I, R|I, D|R|I,
D|I, L, D|L|I, R|I, R, R, R, R,
0
};
static int char_9[] = {
U|I, D|R|I, R|I, R|I, U|R|I, U|I, U|I, U|I, U|I,
U|L|I, L|I, L|I, D|L|I, D|I, D|R|I, R|I, R|I,
D|R, D|R, D|R, R,
0
};
static int char_cl[] = {
U, U, U, U|R|I, R|I, D|I, L|I,
D, D|I, R|I, D|L|I, R|I, R, R, R, R, R,
0
};
static int char_sm[] = {
U, U, U, U, U|R|I, R|I, D|I, L|I,
D, D|I, R|I, D|L|I, R|I, D|I, R, R, R, R, R,
0
};
static int char_la[] = {
R, R, R|I, U|L|I, U|L|I, U|L|I,
U|R|I, U|R|I, U|R|I,
D|R, D|R, D|R, D|R, D, D,
0
};
static int char_eq[] = {
U, U|I, U, U|I, R|I, D, D|I,
R|I, U, U|I, R|I, D, D|I, R|I,
U, U|I, D|R, D|R, D|R, D,
0
};
static int char_ra[] = {
R|I, U|R|I, U|R|I, U|R|I,
U|L|I, U|L|I, U|L|I,
D|R, D|R, D|R, D|R, D|R, D|R,
0
};
static int char_qs[] = {
U, U, U, U, U|I, U|R|I, R|I, R|I,
D|R|I, D|I, D|L|I, L|I,
D|I, D|I, D|I, R, R, R, R, R,
0
};
static int char_bar[] = {
R, R|I, U|I, U|I, U|I, U|I, U|I, U|I,
D|R, D|R, D|R, D|R, D|R, D,
0
};
static int char_bs[] = {
U, U, U, U, U|I,
D|R|I, D|R|I, D|R|I, D|R|I,
D|R, R, R,
0
};
static int char_Lb[] = {
I, R|I, R|I, U|L, L|I,
U|I, U|I, U|I, U|I, U|I,
R|I, R|I, D|R, D|R, D|R, D|R, D|R, D,
0
};
static int char_Rb[] = {
R|U, R|U, U, U, U, U|I, R|I, R|I,
D|I, D|I, D|I, D|I, D|L, D|L|I,
R|I, R|I, U|I, D|R, R, R,
0
};
static int char_LB[] = {
R, R|I, U|L|I, U|I, U|L|I, U|R|I, U|I, U|R|I,
D|R, D|R, D|R, D|R, D|R, D,
0
};
static int char_RB[] = {
U|R, U|R, U, U, U, U|I,
D|R|I, D|I, D|R|I, D|L|I, D|I, D|L|I,
R, R, R, R, R,
0
};
static int char_Ra[] = {
U, U, U|I, R|I, R|I, U, U|I,
D|R|I, D|R|I, L|I, D|I, D|L|I,
D|R, R, R, R, R,
0
};
static int char_La[] = {
R, U|R|I, L|U|I, L|U|I, R|I, U|I, R|U|I,
D, D|I, R|I, R|I, D|R, D|R, D|R,
0
};
static int char_Da[] = {
U, U|I, D|R|I, D|R|I, U|I, U|I, U|I, U|I, U|I, U|I,
D|R, D|R, D, D|I, D|L|I, D|R, R, R, R,
0
};
/*
static int char_Ua[] = {
R, R|I, U|I, U|I, U|I, U|I, R, R|I,
U|L|I, L|I, U|I, D|L|I, D|L|I,
D, D, D, D,
0
};
*/
static int char_Ua[] = {
R, R|I, U|I, U|I, U|I, U|I, L, L|I,
U|R|I, R|I, U|I, D|R|I, D|R|I,
D|R, D|R, D|R, D,
0
};
static int char_tl[] = {
U, U, U, U, U|I, U|R|I, D|R|I, D|R|I, U|R|I,
D|R, D|R, D|R, D, D,
0
};
static int char_tk[] = {
U, U, U, U, U, U|R|I, D|R|I, D|R|I,
D|L, D|L, D|L, D,
0
};
static int char_dn[] = {
D, D,
0
};
static int char_up[] = {
U, U,
0
};
static int char_sp[] = { R, R, R, R, R, R, R, 0 };
static int char_lf[] = { D, D, D, D, D, D, D, D, D, D, D, 0 };
static int char_cr[] = { 0100, 0 };
static int char_esc[] = { 040 };
static int char_si[] = { 0200 };
static int char_so[] = { 0400 };
static int *chars[] = {
char_null, char_A, char_B, char_C, char_D, char_E, char_F, char_G,
char_H, char_I, char_J, char_K, char_L, char_M, char_N, char_O,
char_P, char_Q, char_R, char_S, char_T, char_U, char_V, char_W,
char_X, char_Y, char_Z, char_lf, char_cr, char_si, char_so, char_esc,
char_sp, char_ex, char_dq, char_sh, char_dl, char_pr, char_et, char_sq,
char_lp, char_rp, char_as, char_pl, char_cm, char_mi, char_pe, char_sl,
char_0, char_1, char_2, char_3, char_4, char_5, char_6, char_7,
char_8, char_9, char_cl, char_sm, char_la, char_eq, char_ra, char_qs,
/* TODO: lower case. some of the unknowns */
char_null, char_na, char_na, char_na, char_na, char_na, char_na, char_na,
char_na, char_na, char_na, char_na, char_na, char_na, char_na, char_na,
char_na, char_na, char_na, char_na, char_na, char_na, char_na, char_na,
char_na, char_na, char_na, char_lf, char_cr, char_si, char_so, char_esc,
char_sp, char_na, char_na, char_tl, char_na, char_na, char_Ua, char_Ra,
char_Da, char_La, char_bs, char_Lb, char_Rb, char_LB, char_RB, char_na,
char_na, char_na, char_bar, char_na, char_na, char_na, char_tk, char_Ua,
char_na, char_na, char_na, char_dn, char_na, char_na, char_na, char_up,
};

View File

@ -1,7 +1,7 @@
#include "pdp6.h"
#include <SDL2/SDL.h>
#define JUSTTESTING
//#define JUSTTESTING
char *dis_ident = DIS_IDENT;
@ -67,7 +67,7 @@ static word list[] = {
PARAM_W(XYM, 0, 0, 07, 0),
XYM_W(1, XYM, 0, 0, 950),
XYM_W(0, CM, 0, 0, 0),
034<<12 | 034<<6 | 040,
036<<12 | 034<<6 | 040,
01<<12 | 02<<6 | 03,
04<<12 | 05<<6 | 06,
07<<12 | 010<<6 | 011,
@ -166,6 +166,7 @@ struct Dis340
/* 342 char gen */
int cgstate; /* 0 - inactive
* 1 - drawing character */
int shift;
int *cp; /* current char pointer */
/* simulated tube */
@ -201,6 +202,8 @@ initiate(Dis340 *dis)
dis->intdelay = 0;
dis->cgstate = 0;
dis->shift = 0;
dis->lp_enable = 0; // TODO: not in schematics?
dis->lp_find = 0;
dis->lp_flag = 0;
@ -215,7 +218,6 @@ read_to_mode(Dis340 *dis)
dis->mode = LDB(13, 3, dis->br);
if((dis->br & 0010000) == 0010000)
dis->lp_enable = !!(dis->br & 04000);
//printf("setting mode %o %o\n", dis->mode, dis->lp_enable);
}
static void
@ -306,11 +308,11 @@ cg_count(Dis340 *dis)
if(pnt == 0){
/* end of character */
end:
nextchar(dis);
return;
}
// TODO shift in/out
if(pnt & 040){
/* escape from char */
dis->cgstate = 0;
@ -320,6 +322,14 @@ cg_count(Dis340 *dis)
}
if(pnt & 0100)
dis->x = 0;
if(pnt & 0200){
dis->shift = 0;
goto end;
}
if(pnt & 0400){
dis->shift = 64;
goto end;
}
r = (pnt & 014) == 010;
l = (pnt & 014) == 014;
u = (pnt & 003) == 002;
@ -374,7 +384,7 @@ idp(Dis340 *dis)
case CM:
/* Tell CG to start */
dis->cp = chars[LDB(12, 6, dis->chrs)];
dis->cp = chars[LDB(12, 6, dis->chrs) + dis->shift];
dis->cgstate = 1;
break;
@ -881,14 +891,17 @@ static void
recalc_dis_req(Dis340 *dis)
{
int data, spec;
u8 req_data, req_spec;
// TODO: what about RFD?
data = dis->ibc == 0 && dis->rfd;
spec = dis->lp_flag ||
dis->hef || dis->vef ||
dis->stop && dis->br&01000;
setreq(dis->bus, DIS, data ? dis->pia_data : 0);
setreq(dis->bus, DIS, spec ? dis->pia_spec : 0);
req_data = data ? 0200 >> dis->pia_data : 0;
req_spec = spec ? 0200 >> dis->pia_spec : 0;
setreq2(dis->bus, DIS, req_data | req_spec);
}
static void
@ -999,9 +1012,10 @@ makedis(int argc, char *argv[])
dis->dev.type = dis_ident;
/* dunno about the frequency here */
t = (Task){ nil, discycle, dis, 5, 0 };
t = (Task){ nil, discycle, dis, 50, 0 };
addtask(t);
/* There's a race somewhere here */
threadcreate(renderthread, dis);
return &dis->dev;

4587
emu/mem_0

File diff suppressed because it is too large Load Diff

View File

@ -298,6 +298,7 @@ struct IOBus
Busdev dev[128];
};
void setreq(IOBus *bus, int dev, u8 pia);
void setreq2(IOBus *bus, int dev, u8 req);
/* A pulse modeled as a function, and a name for debugging */

View File

@ -155,7 +155,12 @@ void
decompdbl(double d, int *s, word *e, uint64_t *m)
{
uint64_t x;
x = *(uint64_t*)&d;
union {
uint64_t i;
double d;
} u;
u.d = d; x = u.i;
*s = !!(x & 0x8000000000000000);
*e = (x >> 52) & 0x7FF;
*m = x & 0xFFFFFFFFFFFFF;
@ -170,12 +175,17 @@ dtopdp(double d)
uint64_t x, e, m;
int sign;
word f;
union {
uint64_t i;
double d;
} u;
sign = 0;
if(d < 0.0){
sign = 1;
d *= -1.0;
}
x = *(uint64_t*)&d;
u.d = d; x = u.i;
/* sign is guaranteed to be 0 now */
e = (x >> 52) & 0x7FF;
m = x & 0xFFFFFFFFFFFFF;
@ -200,6 +210,11 @@ double
pdptod(word f)
{
uint64_t x, s, e, m;
union {
uint64_t i;
double d;
} u;
s = 0;
if(f & 0400000000000){
f = -f & 0777777777777;
@ -219,7 +234,8 @@ pdptod(word f)
x = m;
x |= (e & 0x7FF) << 52;
x |= s << 63;
return *(double*)&x;
u.i = x;
return u.d;
}
/* map ascii to radix50/squoze, also map lower to upper case */