5

I have a cople of HP BASIC (HP9000) files that have been saved in a non-ASCII format (HFSLIF?). Does anyone know of a conversion utility to get the code readable? The files are already on a win7 machine and I just want to read the content, not execute it.

Thanks in advance!

Regards, Staffan

New contributor
Staffan is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.
4

Ok I tried to load some files from HP9000 searies column of the table in

It looks like the programs are already in ASCII for example here is a chunk from VERIFY_6XE:

1    ! RE-STORE "VERIFY_6XE"
2    ! RE-SAVE "VERIFY_6XE.ascii"
3    !-----------------------------------------------------------------------
4    !-----------------------------------------------------------------------
5    !
6    ! PROGRAM VERIFY_6XE: HP 8560 E-SERIES OPERATION VERIFICATION  REV E.00.01
7    ! Revision also appears in Draw_alpha_hdr and Header_prnt
8    ! 050525:0848 BDT
9    ! REV E.00.01 Fixed Flatness specification for 8562E
10   ! REV E.00.00 Added support for 856xEC models.
11   !             Changed "HPIB" and "HP-IB" to "GPIB"
12   !             Fixed TIMEOUT bugs in Noise_sidebands test
13   ! REV D.02.02 Fixed bug in "USER CAL" of power meter driver.
14   ! REV D.02.01 Added No_data_flag in Test_Band0 to fix bug with 8560E
15   ! REV D.02.00 Added spec improvements for Noise Sidebands and Frequency
16   !               Response over a limited range.
17   !             Changed serial prefix breaks for DANL & SHD improvements for
18   !               8563E to 3645A and for 8564E/65E to 3641A.
19   ! REV D.01.00 Changes serial prefix break for DANL & SHD improvements to
20   !             9999A for 8563E/64E/65E and to 3632A for 8560E.
21   ! REV D.00.00 Fixes bug in Frequency Response test (applies to 8565E only
22   !             Fixes bug in DANL test (8564E/65E w/ Opt 006 only)
23   !             Adds support for Opt EMI; tests 1M & 100k RBW 6dB BW
24   !                (characteristic only)
25   !             Added Op Ver revision to printed header information
26   !             Adds support for 8562E and DANL and SHI improvements for
27   !                8560E, 8563E, 8564E, and 8565E
28   !             Adds support for Opt H13, which retrofits DANL & SHD
29   !                improvements into older 8560E/63E/64E/65E
30   !             Adds support for 535x microwave frequency counter
31   ! REV C.01.00 Loosens Log Fidelity spec for RBW >=300 Hz for ALL 856xEs,
32   !             not just newer ones as was done with REV B.00.00.
33   !             Added audible prompts using Beeper
34   !             Fixed bug in Noise Sidebands test
35   ! REV C.00.00 Adds support for 8564E/65E
36   ! REV B.01.00 Reflects change to low freq limit on SHD
37   ! REV B.00.00 Adds support of Option 007, Digitized Fast Time Domain Sweeps
38   !             Also supports Log Fidelity change for RBW >= 300 Hz
39   ! REV A.01.01 Fixes a defect in the DANL test for 8563E Opt 006
40   ! REV A.01.00 Supports looser DANL spec in Band 0 of 8563E
41   ! Leveraged from VERIFY_62, Rev D.01.04 (for 8560A/61A/61B/62A/62B/63A)
42   !
43    COM /Equipment/Present(1:20),Power_mtr_avail,Counter_avail,Sensor_avail(1:20),Source_avail(1:20),Source2_avail(1:20),Enough_equip(1:20)
44    COM /Test_flags/Test_number,Sequence_type,Last_test
45    COM /Sensor/Current_channel,Sensor(1:2),Cal_time(1:2),Cal_data(1:2,1:65)
46    COM /Io_paths/@Dut,@Printer,@Pwr_mtr,@Counter
47    COM /Sum_errors/Sum_error$[128]
48    COM /Conditions/Conditions$(0:44,1:2)[160]  ! Rev D.00.00 Changed "0:26"
49                                                !             to "0:44"
50    COM /Tests/Tests$(0:128,1:2)[37],Short_name$(1:128)[16],Conn_check(1:128)

I am not familiar with HP9000 BASIC but I see no tokenization (the commands and numbers are readable) so I am assuming the code is fully decoded into ASCII. Occasional special characters might be just different character in font on my PC ...

At the same column are also some firmwares with HFSLIF signature at start like this one:

€ HFSLIF                      7                                                                                                                                                                                                                WS_FILE   éP      5      €   €          ˙˙                                                                                                                                                                                                                        ˙˙˙˙  4´@      ˙˙˙˙ËL    ş   1  ¤  4€  RR  4Š *  R O  2    € ˙˙˙¸   0  z  @      € ˙˙˙°  $ ˙˙˙^ $ 0  ŕ˙ý :0  ę˙ů V€ ˙˙˙V5> Ü0  –źú ` ˙˙˙ & l ˙˙ţ˛  p ˙˙ţ`  x ˙˙ţ   €0  )ôÔl0  "zźú Ś0  "Đźú ”0  #,źú   ˙˙ýĽ  ¬€ ˙˙ý´ 
 H0  %Z?ý ľ ˙˙ýb  Ę ˙˙ý  Î ˙˙üľ " Ô€ ˙˙ü¶" ö0  *  č!˙˙üR   ,0  2r˙ŕ^0   9z:€ ˙˙üJü ü0  *Č˙ďj€ ˙˙üBýH€ ˙˙ü:ýT0  '¬?t¤!˙˙ű 
| ˙˙űp  ˛0  ®Y|Ü0  !dµ>€ ˙˙űhý΀ ˙˙ű`9zŠ0  )˙ý0€ ˙˙űXýŔ ˙˙űD (€ ˙˙ű<  0  '_ŕ
@    ,.ŕć€ ˙˙ű45>DP ˙˙˙˙˙ý0  (L˙ŕ$0  8_ýb ˙˙úv˙˙´0  \˙ý.€ ˙˙ún &@$˙˙ů¸ 1ú€ ˙˙úfŕr€ ˙˙ú^9|~@    7 R0  +‚˙ ˙˙úV –@    :  @      <€ ˙˙úN  ˘@    = ¨0  &4n˛€ ˙˙úF 
Ľ@    @     Ć0    Đ@ ˙˙˙ľ  Ú0  ’ ŕ@    DT`ć@    E 
ň@    F  ţ@    G  
0  - 
@ ˙˙˙· 
&nder_prefix Prefix$Aa    Suffax Good_mgdel$  EPrefix Enter_prefix Prefix$I    Suffix Good_model$  Enter_suffix Min_ser_num  Main     Enter_modelQ$ Model$ Option$Serial$    Load_idLoad_serialVerify_loadMdl$ Opt$       
Load_error Id$Ser$ Suffix$Temp       Enter_serial Week Found      Data$
Check_cntr             Cntr   Leave      
Enter_options
First_year  Max_weeks
Option_mix Create_cntr      Good_option$ Max_ser_num  Verify_dataPrt_gd_options @Path_1    
Mdls_per_line
Opts_per_lineReenter_prefix                               
Prt_gd_models            
Get_models Get_options        First_prefix                 Reenter_suffix 
Num_models Num_options
Over_three 
Usage_fail Quit             Ask_again   Load_fail           Try_again      Halt                                                   
Intro_screens                                            HX  
¶ŽM RE-STORE "/srmux/USERS/TORR/PORT/RETROFIT_SW/A2_FW/REV_B0000/FW_UPGRADE:HFS"ł@JX ¶Ž> ******************** PROGRAM FW_UPGRADE *********************łŽ@JJ ¶Ž> *************************************************************łŽ@JJ (¶Ž> * Program to load the SERIAL NUMBER and ID of an HP 8560    *łŽ@JJ 2¶Ž> * E-Series portable spectrum analyzer. This version for use *łŽ@JJ <¶Ž> * only with the A2 Controller Assembly Replacement Kit and  *łŽ@JJ F¶Ž> * Firmware Upgrade Kit.                                     *łŽ@JJ P¶Ž> *

To decode them the easiest is to use emulator. However to do this on your own we need either decoding table + fileformat description or binary+ASCII of the same program so we can infer the file format.

At the end of HP9000 BASIC 5.0 Language Reference Vol2 (thx to wizzwizz4) I found this table of BASIC keywords supported by HP9000:

ABORT  CALL  COUNT  DROUND  FIND 
ABORTIO  CASE  CREATE  DUMP  FN 
ABS  CAT  CRT  DVAL  FNEND 
ACK  CAUSE  CSIZE  DVAL$  FOR 
ACS  CDIAL  CSUM  FORMAT 
ACSH  CHANGE  CYCLE  ECHO  FRACT 
ALL  CHECKREAD  EDGE  FRAME 
ALLOCATE  CHGRP  DATA  EDIT  FRENCH 
ALPHA  CHOWN  DATE  ELSE  FROM 
AND  CHR  DATE$  ENABLE  FUNCTIONS 
AREA  CHR$  DDC  END 
ARG  CHRX  DEALLOCATE  ENTER  GCLEAR 
ASCII  CHRY  DEF  EOL  GERMAN 
ASN  CLEAR  DEG  EOR  GESCAPE 
ASNH  CLIP  DEL  EOT  GET 
ASSIGN  CLS  DELAY  ERRDS  GINIT 
ATN  CM  DELETE  ERRL  GLOAD 
ATNH  CMD  DELIM  ERRLN  GO 
AXES  CMODE  DELSUB  ERRM$  GOSUB 
CMPLEX  DES  ERRN  GOTO 
BASE  COLOR  DESTROY  ERROR  GRAPHICS 
BDAT  COM  DET  EVEN  GRID 
BEEP  COMPLEX  DEVICE  EXD  GROUP 
BIN  CONDITIONAL  DIGITIZE  EXEC  GSEND 
BINAND  CONFIGURE  DIM  EXECUTE  GSTORE 
BINCMP  CONJG  DIR  EXIT 
BINEOR  CONT  DISABLE  EXOR  HEADER 
BINIOR  CONTROL  DISP  EXP  HEIGHT 
BIT  CONVERT  DISPLAY  EXPANDED  HIL 
BREAK  COPY  DIV  EXT  HILBUF 
BUFFER  COPYLINES  DKA  EXTEND 
BY  COS  DOT  IDD 
BYTE  COSH  DRAW  FILL  IDN      
IDRAW  LISTEN  NOT  PRT  RST 
IF  LL  NPAR  PURGE  RSUM 
IMAG  LN  NUM  RUN 
IMAGE  LOAD  NV  QUIT 
IMOVE  LOADSUB  SAVE 
IN  LOC  ODD  RAD  SB 
INDENT  LOCAL  OFF  RANDOMIZE  SC 
INDEX  LOCATE  ON  RANK  SCALE 
INITIALIZE  LOCATOR  ONE  RATIO  SCRATCH 
INPUT  LOCK  OPTION  RE  SCREEN 
INT  LOCKOUT  OPTIONAL  READ  SEARCH 
INTEGER  LOG  OR  READIO  SEC 
INTENSITY  LOOP  ORDER  REAL  SECURE 
INTERACTIVE  LORG  OTHER  RECALL  SELECT 
INTR  LWC$  OUT  RECORDS  SEND 
INV  OUTPUT  RECOVER  SEPARATE 
10  MAIN  OWNER  RECTANGLE  SET 
IPLOT  MANAGER  REDIM  SF 
IS  MAP  PAIRS  REM  SGN 
IVAL  MASK  PARITY  REMOTE  SHIFT 
IVAL$  MASS  PASS  REN  SHOW 
MAT  PAUSE  RENAME  SIGNAL 
KBD  MAX  PDIR  REORDER  SIN 
KBD$  MAXLEN  PEN  REPEAT  SINH 
KEY  MAXREAL  PENUP  REQUEST  SIZE 
KEYS  MERGE  PERMIT  RES  SKIP 
KNOB  MIN  PI  RESET  SORT 
KNOBX  MINREAL  PIVOT  RESPONSE  SOUND 
KNOBY  MLA  PLOT  RESTORE  SPANISH 
MOD  PLOTTER  RE-STORE  SPOLL 
LABEL  MODE  POLYGON  RESUME  SQR 
LABELS  MODULO  POLYLINE  RETAIN  SQRT 
LDIR  MOVE  POS  RETURN  STANDARD 
LEN  MOVELINES  PPOLL  REV$  STATUS 
LET  MSI  PRINT  RND  STEP 
LEXICAL  MTA  PRINTALL  RNM  STOP 
LGT  PRINTER  ROTATE  STORAGE 
LINE  NAMES  PRIORITY  RPLOT  STORE 
LINK  NEXT  PRM  RPT$  SUB 
LINPUT  NF  PROTECT  RRG  SUB END 
LIST  NO  PROUND  RSC  SUBEXIT 
SUM  TALK  TRACK  UNT  WHERE 
SUSPEND  TAN  TRANSFER  UNTIL  WHILE 
SV  TANH  TRIGGER  UPC$  WIDTH 
SWEDISH  THEN  TRIM$  USER  WINDOW 
SYMBOL  TIME  TRN  USING  WORD 
SYSBOOT  TIME$  TYPE  WRG 
SYSTEM  TIMED ATE  VAL  WRITE 
SYSTEM$  TIMEOUT  UN  VAL$  WRITEIO 
TIMEZONE  UNCONFIGURE  VIEWPORT 
TAB  TO  UNL  XREF 
TABXY  TRACE  UNLOCK  WAIT 
ZERO 

Sadly without the tokenisation codes :( so a cross-match or inferring is needed (some commands are recognizable like PRINT,REM others need some reversing or pairing with known BASIC ASCII source ...

After some googling I found this:

see there the part Background: The LIF File System it looks like the files you linked matches their fileformat description. Here start of FW_UPGRADE in hex:

00000000: | 80 00 48 46 53 4c 49 46 00 00 00 01 10 00 00 00 | € HFSLIF   

so:

8000         magic
4846534c4946 volume label "HFSLIF"
00000001     directory start
1000         LIF ID
0000         unused
...

So now its just the matter of decoding the DISC/file image into binary and try to detokenize. btw at the same page is also their utility to do this for download...

So the non ASCII files are DISC images not files !!! I tried the hpdir utility from the previous link and this:

hpdir -c -extract FW_UPGRADE.htm

will extract the PROG file from DISC image into file WS_FILE.PROG which is a bit smaller than the original DISC image.

However It looks like there is absolutely no tool to convert the binary into ASCII (all just extract files from the DISC images) nor I can find any TOKEN code table anywhere (with codes not just Keyword listing) so the only way now would be to reverse engineer the encoding. For that its necessary to have ASCII and Binary files of the same program containing all the Keywords and data representations (integer,float,string ...) Without it its a guessing game and only a few keywords can be safely inferred form unknown binary encoding... so I feel confident that strings, PRINT,REM and line numbers could be decoded easily and rest must be fitted in time ... I think such task is more suited for reverseengineering site.

Btw if anyone have the HT Basic binaries or BIOS or where ewer its stored it would greatly help as the tokenization table would be most likely directly visible in there as the Keyword listing in the order of the token codes (instead of alphabetically sorted)

[edit3] some more info

After some small elaboration and hex viewing I found out that that are two formats (16 and 32 bit) in the files you linked. Lines are encoded like this in hex:

 ID `40,48` or `C8` for valid line start
 unknown 2 Bytes
 `07`
 linenum 4 Bytes (32 bit) or 2 Bytes (16 bit)
 usually `B68E07` but not always

so to detect start of line just search for 40/48/C8 followed by 07 after 2 Byte gap. This will detect some invalid lines at the start of file as there is some kind of different data not program...

Also at the start of file is some kind of header starting with:

//  16 bit: 0000 FFFF size 4000 0007 00     00C2     00C2
//  32 bit: 0000 FFFF size 4000 0007 00 000000C2 000000C2

where size is smaller than file size itself but not too much (the difference can be used to skip the start of the file) and the C2 pattern can be used to detect between formats. The size difference is not constant hinting additional stuff than just code is present in the file (BASIC config variables may be? from its start code is last)

here small C++/VCL decoder:

BYTE *dat=NULL,c;
int adr0,adr,siz,hnd,i,n,_hex,_16bit=0,_32bit=0;
DWORD dw;
AnsiString lin,txt;
// load file to memory
hnd=FileOpen("WS_FILE0.PROG",fmOpenRead);   // open source file
siz=FileSeek(hnd,0,2);          // get its length
    FileSeek(hnd,0,0);          // and point to start again
dat=new BYTE[siz];              // create buffer
FileRead(hnd,dat,siz);          // load to file into it
FileClose(hnd);                 // close file
// detect 16/32 bit
dw= dat[17]; dw<<=8;
dw+=dat[18]; dw<<=8;
dw+=dat[19]; dw<<=8;
dw+=dat[20];
_16bit=(dw==0x00C200C2);
_32bit=(dw==0x000000C2);

// skip start
dw= dat[ 8]; dw<<=8;
dw+=dat[ 9]; dw<<=8;
dw+=dat[10]; dw<<=8;
dw+=dat[11];
adr=siz-dw; if (adr<12) adr=12; adr0=0;
// decode it to string
for (txt="",lin="";adr<siz;adr++)
    {
    /*--------  Line begin ----------------------
    ID 40/48/C8 for valid line start
    unknown 2 Bytes
    07
    linenum 2 Bytes (16 bit) or 4 Bytes (32 bit)
    usually B68E07 but not always
    -------------------------------------------*/
    if (dat[adr]==0x07)
        {
        c=dat[adr-3];
        if ((c!=0x40)&&(c!=0x48)&&(c!=0xC0)) continue;
        if (adr0)
            {
            // line number
            if (_16bit)
                {
                dw= dat[adr0+1]; dw<<=8;
                dw+=dat[adr0+2]; adr0+=2;
                lin=AnsiString().sprintf("%5u ",dw);
                }
            if (_32bit)
                {
                dw= dat[adr0+1]; dw<<=8;
                dw+=dat[adr0+2]; dw<<=8;
                dw+=dat[adr0+3]; dw<<=8;
                dw+=dat[adr0+4]; adr0+=4;
                lin=AnsiString().sprintf("%10u ",dw);
                }
            // line text
            for (_hex=0;adr0<adr-3;adr0++)
                {
                c=dat[adr0];
                if ((c<32)||(c>127))    // non ASCII character
                    {
                    if (!_hex){ _hex=1; lin+="["; } else lin+=" ";
                    lin+=AnsiString().sprintf("%02X",c);
                    }
                else{                   // ASCII character
                    if (_hex){ _hex=0; lin+="]"; }
                    lin+=char(c);
                    }
                }
            if (_hex){ _hex=0; lin+="]"; }
            txt+=lin+"\r\n";
            }
        adr0=adr;
        }
    }
mm_text->Text=txt; // just to see the file in my apps memo
// save as text file
hnd=FileCreate("out.txt");
FileWrite(hnd,txt.c_str(),txt.Length());
FileClose(hnd);
delete[] dat;

result is in txt string ... And here preview of partially decoded 001_005.hpi firmware disk up to line 1500 (as I hit the 30K limit, the numbers like [07 A3] are non characters so I can see what is inside and better identify tokens):

    10 [0A B6 8E 07]8 RE-STORE "/users/torr/srm/USERS/TORR/PORT/RETROFIT:HFS"[B3 8E 8E 8E]
    20 [14 B6 8E 07]F ============================= RETROFIT ==============================[B3 8E]
    30 [1E B6 8E 07]E This program will add or delete Option 001, 2nd IF OUTPUT, or Option[B3 8E 8E]
    40 ([B6 8E 07]F 005, Alternate Sweep Output, from an HP 8560 E-Series ID string. This[B3 8E]
    50 2[B6 8E 07]D software is used in conjunction with the K10 and K05 retrofit kits.[B3 8E 8E 8E]
    60 <[B6 8E 07 00 B3 8E 8E 8E]
    70 F[B6 8E 07]C This program may be used a maximum of three times. If a successful[B3]
    80 P[B6 8E 07]A download is not possible in three attempts, the analyzer must be[B3 8E 8E]
    90 Z[B6 8E 07]F sent to an HP Customer Service Center to have the ID string modified.[B3 8E]
   100 d[B6 8E 07 00 B3 8E 8E 8E]
   110 n[B6 8E 07]0 This program is available as SECURED CODE ONLY.[B3 8E 8E 8E]
   120 x[B6 8E 07]F =====================================================================[B3 8E]
   130 [82 B6 8E 07 00 B3 8E 8E 8E]
   140 [8C BC 03 8E 8E FF FF FF FF 03 00 80 A4 B3 8E 8E 8E]
   150 [96 C0 04 05 D9 9E B5]"[8E 00 02 FF]K[9F A5 B3 8E]
   160 [A0 00 BD]1[B5]1[8E 02 CE BD],[00 BD]2[B3 8E 8E]
   170 [AA BC 05 0F]@[00 00 00 FF A4 B6 1A 1B] Original ID$ from analyzer[B3]
   180 [B4 BC 05 10]@[00 00 00 FF A4 B6 1A 15] New ID$ to be loaded[B3 8E 8E]
   190 [BE BC 05 1E]@[00 00 00 FF A4 B6 1A]% Model string read back from analyzer[B3 8E 8E]
   200 [C8 BC 05 02]@[00 00 00 0A A4 B6 1A 1E] Analyzer serial number string[B3 8E]
   210 [D2 BC 05 0E]@[00 00 00 0A A4 B6 1A 1B] General input query string[B3]
   220 [DC 11 B5]`[8E]A,[17 A0 00 00 00 00 90 B6 1A]$ Datecode of original 856xE Firmware[B3 8E 8E 8E]
   230 [E6 0D B5]A[8E 0C EE 90 B6 1A]' 3310A is first prefix with FADC Option[B3 8E 8E]
   240 [F0]#[80 90 B6 1A]- Flag to denote failure in download; 1 = Fail[B3]
   250 [FA 01 80 90 B6 1A]) Flag to denote if program used > 3 times[B3]
   260 [04 14 B5]2[8E 00 04],001[90 B6 1A 1D] Option 001 for 2nd IF Output[B3]
   270 [0E 1C B5]2[8E 00 04],005[90 B6 1A]" Option 005 Alternate Sweep Output[B3 8E 8E 8E]
   280 [18 B6 8E 07 00 B3 8E 8E 8E]
   290 "[05 95 B3 8E]
   300 ,[13 95 B3 8E]
   310 6[01 B7 8E 8E 00 00 09]n[1A 96 B3 8E C8 05 05 11 00 00 01]@[00 00 00]&[B6 8E 11 00 B3 8E 8E 8E]
   330 J[04 95 B3 8E]
   340 T[10 0F 90 B6 1A]2 Set ID$s equal; will add to New_id$ if necessary.[B3 8E 8E 8E]
   350 ^[12 95 B3 8E]
   360 h[1B 95 B3 8E]
   370 r[1D 95 B3 8E]
   380 |[06 B7 8E 8E 00 00 09 F4 1A 98 B3 8E]
   390 [86]#[B7 8E 8E 00 00 0A 04]&[98 B3 8E]
   400 [90 B6 8E 07 00 B3 8E 8E 8E C8 05 04 0C 00 00 01 9A 00 00 00 1A B6 8E 0C 00 B3 8E 8E 8E]
   420 [A4 9B A5 B3 8E]
   430 [AE 9B A5 B3 8E]
   440 [B8 9B B5]2[8E 00 1A]        Program Terminated[A4 B3 8E 8E]
   450 [C2 BD 1C B3 8E]
   460 [CC B6 8E 07 00 B3 8E 8E 8E C8 05 04 13 00 00 01 D6 00 00 00 04 B6 8E 13 00 B3 8E 8E 8E]
   480 [E0 00 D9 9E B5]"[8E 00 04]ID?;[A4 B3 8E 8E]
   490 [EA 00 DB 9E 0F A4 B3 8E 8E]
   500 [F4 00 D9 9E B5]"[8E 00 05]SER?;[A4 B3 8E]
   510 [FE 00 DB 9E 02 A4 B3 8E 8E]
   520 [08 00 D9 9E B5]"[8E 00 05]REV?;[A4 B3 8E]
   530 [12 00 DB 9E 0B A4 B3 8E 8E]
   540 [1C 07 02 BF 13 90 B3 8E 8E]
   550 &[08 02 86 85 FE BF 13 90 B3 8E 8E 8E]
   560 0[BA 00 B3 8E]
   570 :[B6 8E 07 00 B3 8E 8E 8E C8 05 04 17 00 00 02]D[00 00 00 12 B6 8E 17 00 B3 8E 8E 8E]
   590 N[B6 8E 07 00 B3 8E 8E 8E]
   600 X[BD 09 B5]2[00]FIs Option 001, 2nd IF OUTPUT, installed or being retrofitted? (Y or N)[BD 01 0E A4 B3 8E 8E 8E]
   610 b[0E 81 81 FE C0 04 14 B5 12 8E 00 01]Y[F1 0C D3 B5 12 00 03]001[D5 0F D5 B2 02 FA F7 8E B7 00 00 00 01 10 10 14 FB 90 B3 8E 8E]
   620 l[0E 81 81 FE C0 04 14 B5 12 8E 00 01]N[F1 0C D3 B5 12 00 03]001[D5 0F D5 B2 02 F7 B7 8E 8E 00 00 00 01]$[D1 14 D5 10 D5 B2 02 B3 8E 8E 8E]
   630 v[B6 8E 07 00 B3 8E 8E 8E]
   640 [80 BD 09 B5]2[00]OIs Option 005, Alternate Sweep Output, installed or being retrofitted? (Y or N)[BD 01 0E A4 B3 8E 8E]
   650 [8A 0E 81 81 FE C0 04 14 B5 12 8E 00 01]Y[F1 0C D3 B5 12 00 03]005[D5 0F D5 B2 02 FA F7 8E B7 00 00 00 01 10 10 1C FB 90 B3 8E 8E]
   660 [94 0E 81 81 FE C0 04 14 B5 12 8E 00 01]N[F1 0C D3 B5 12 00 03]005[D5 0F D5 B2 02 F7 B7 8E 8E 00 00 00 01]$[D1 1C D5 10 D5 B2 02 B3 8E 8E 8E]
   670 [9E B6 8E 07 00 B3 8E 8E 8E]
   680 [A8 B6 8E 07]F Add Option 008, if not already present, if older unit with newer F/W.[B3 8E]
   690 [B2 B6 8E 07]Y IF NOT FNOption_present("008",New_id$) AND Prefix<Fadc_prefix AND Fw_rev>Old_fw_rev THEN[B3 8E 8E]
   700 [BC B6 8E 07 18] New_id$=New_id$&Sig_id$[B3 8E 8E 8E]
   710 [C6 B6 8E 07 07] END IF[B3]
   720 [D0 B6 8E 07 00 B3 8E 8E 8E C8 0B 04 12 00 00 02 DA 00 00 00 13 B6 8E 12 1B]   Prevents overuse of disc[B3]
   740 [E4 BD 0C 92 15 BD 13 00 B3]
   750 [EE 16 BD]1[B5]2[8E 00 0A]OPTIONLIST[BD]-[BD]2[B3 8E]
   760 [F8 16 DB 9E 17 A4 B3 8E 8E]
   770 [02 BD 0D B3 8E]
   780 [0C 16 BD]0[B3]
   790 [16 C0 04 05 D9 9E B5]2[8E 00 02 FF]K[9F A5 B3 8E]
   800  [17 83 F2 B7 00 00 0D DE 19 95 B3 8E]
   810 *[17 17 81 E8 90 B3 8E 8E]
   820 4[BA 00 B6 8E 13 10] from Check_cntr[B3 8E]
   830 >[B6 8E 07 00 B3 8E 8E 8E C8 0D 04 14 00 00 03]H[00 00 00 15 B6 8E 14]    Creates counter on first pass[B3 8E 8E 8E]
   850 R[17 81 90 B3]
   860 \[BD 0D B3 8E]
   870 f[B5]2[00 0A]OPTIONLIST[81 BE 0B 00 B3 8E]
   880 p[16 BD]1[B5]2[8E 00 0A]OPTIONLIST[BD]-[BD]2[B3 8E]
   890 z[16 D9 9E 17 A4 B3 8E 8E]
   900 [84 16 BD]0[B3]
   910 [8E BA 00 B6 8E 12 11] from Create_cntr[B3]H[04 08 08 00 00 03 98 B6 8E 08 00 B3 8E 8E 8E C8 0C 04 14 00 00 03 A2 00 00 00 1B B6 8E 14 1C]  Load New ID$ into analyzer[B3 8E 8E 8E]
   940 [AC B6 8E 07 00 B3 8E 8E 8E]
   950 [B6 00 D9 9E B5]2[8E 00 08]ZENTID '[9F 10 9F B5]2[8E 00 01]'[A4 B3 8E]
   960 [C0 BA 00 B6 8E 12 11] from Load_new_id[B3]
   970 [CA B6 8E 07 00 B3 8E 8E 8E C8 0C 04 13 00 00 03 D4 00 00 00 1D B6 8E 13 1C]  Checks for proper download[B3 8E 8E 8E]
   990 [DE 00 D9 9E B5]2[8E 00 04]ID?;[A4 B3 8E 8E]
  1000 [E8 00 DB 9E 1E A4 B3 8E 8E]
  1010 [F2 1E 10 F6 B7 00 00 0F D6 B3 8E 8E 8E]
  1020 [FC 9B 1E BF 09 A3 10 BF 09 A3 1E A3 10 A4 B3 8E 8E]H[03 06 09 00 00 04 06] [95 B3 8E]
  1040 [10 B8 8E 8E 8E 00 00 11]2[B3 8E 8E 8E]H[03 05 09 00 00 04 1A]#[80 90 B3]H[08 03 09 00 00 04]$[16 BD]1[B5]2[8E 00 0A]OPTIONLIST[BD]-[BD]2[B3 8E]H[04 08 09 00 00 04].[16 D9 9E 17 A4 B3 8E 8E]H[03 04 09 00 00 04]8[16 BD]0[B3]H[03 03 09 00 00 04]B[9B A5 B3 8E]H[03 03 09 00 00 04]L[9B A5 B3 8E]H[11 03 09 00 00 04]V[9B B5]2[8E 00]2  The new ID string was successfully downloaded ! [A4 B3 8E 8E]H[10 11 09 00 00 04]`[9B B5]2[8E 00]0  Set WR PROT/WR ENA jumper to WR PROT position.[A4 B3]H[0E 10 09 00 00 04]j[9B B5]2[8E 00]'  Cycle power on the spectrum analyzer.[A4 B3 8E]H[03 0E 09 00 00 04]t[9B A5 B3 8E]H[09 03 09 00 00 04]~[9B B5]2[8E 00 11]  Old ID String: [9F 0F A4 B3 8E]H[09 09 09 00 00 04 88 9B B5]2[8E 00 11]  New ID String: [9F 10 A4 B3 8E]
  1170 [92 B9 B3 8E 8E]
  1180 [9C BA 00 B6 8E 11 11] from Verify_load[B3]
  1190 [A6 B6 8E 07 00 B3 8E 8E 8E C8 10 04 14 00 00 04 B0 00 00 00] [B6 8E 14],  If ID string did not successfully download[B3 8E 8E 8E]
  1210 [BA]#[81 90 B3]
  1220 [C4 9B A5 B3 8E]
  1230 [CE 9B A5 B3 8E]
  1240 [D8 9B B5]2[8E 00]5  The new ID string did not download properly! Please[A4 B3 8E 8E 8E]
  1250 [E2 9B B5]2[8E 00]6  check the WR PROT/WR ENA jumper on the A2 Controller[A4 B3 8E 8E]
  1260 [EC 9B B5]2[8E 00 11]  board assembly.[A4 B3 8E 8E 8E]
  1270 [F6 9B A5 B3 8E]
  1280 [00 9B B5]B[8E 00 11]  Old ID String: [9F 0F A4 B3 8E]
  1290 [0A 9B B5]B[8E 00 11]  New ID String: [9F 10 A4 B3 8E]
  1300 [14 9B A5 B3 8E]
  1310 [1E 9B A5 B3 8E C8 05 03 11 00 00 05]([00 00 00 18 B6 8E 11 00 B3 8E 8E 8E]
  1330 2[BD 09 B5]B[00]&  Press 'Q' to QUIT or 'C' to CONTINUE[BD 01 0E A4 B3 8E 8E 8E]
  1340 <[0E 81 81 FE C0 04 14 B5 12 8E 00 01]Q[F1 8E B7 00 00 13]"[06 81 90 B3]
  1350 F[0E 81 81 FE C0 04 14 B5 12 8E 00 01]C[F1 8E B7 00 00 13]@[06 80 90 B3]
  1360 P[0E 81 81 FE C0 04 14 B5 12 8E 00 01]Q[F6 0E 81 81 FE C0 04 14 B5 12 8E 00 01]C[F6 F7 B7 8E 8E 00 00 13]l[18 98 B3 8E]
  1370 Z[BA 00 B6 8E 10 10] from Load_error[B3 8E]
  1380 d[B6 8E 07 00 B3 8E 8E 8E C8 0F 04 14 00 00 05]n[00 00 00 19 B6 8E 14])  Program halts if used more than 3 times[B3 8E 8E]
  1400 x[01 81 90 B3]
  1410 [82 C0 04 05 D9 9E B5]B[8E 00 02 FF]K[9F A5 B3 8E]
  1420 [8C 9B A5 B3 8E]
  1430 [96 9B A5 B3 8E]
  1440 [A0 9B B5]B[8E 00]:  This program has been used three times; it can no longer[A4 B3 8E 8E]
  1450 [AA 9B B5]B[8E 00];  be used. If you are having difficulty downloading the new[A4 B3 8E]
  1460 [B4 9B B5]B[8E 00]?  ID string, please contact your Hewlett-Packard representative[A4 B3 8E]
  1470 [BE 9B B5]B[8E 00]"  so they may contact the factory.[A4 B3 8E 8E]
  1480 [C8 BA 00 B6 8E 12 10] from Over_three[B3 8E]
  1490 [D2 B6 8E 07 00 B3 8E 8E 8E C8 05 04 15 00 00 05 DC 00 00 00 05 B6 8E 15 00 B3 8E 8E 8E]

So now its just matter of figuring out the internal format of string/number/token and the tokens codes.

  • wow! Many thanks for your effort and insights! I have looked around a bit and there seem to be people around with hp9000 systems that can create ascii versions of tokenized files. Comparing the two, files should at least provide the most important tokens. – Staffan Jul 11 at 12:26
  • I found what I guess is the source for Basic 5.1 by searching for “hpmuseum.net basic 5.1”. Just view the source? How do you know what token is associated with each command? – Staffan Jul 11 at 12:42
  • @Staffan I think I cracked it ... I updated the code and preview added start of file skipping, detection between 16/32 bit formats and changed the hex formating of non characters. So now the only thing left is to compare between binary and ASCII files of the same code ... once you obtain some such samples. – Spektre Jul 11 at 14:46
  • I’m sort of amazed... Hoping to get the ascii version of some files after the weekend (fingers crossed). Many many thanks! – Staffan Jul 12 at 5:36

Your Answer

Staffan is a new contributor. Be nice, and check out our Code of Conduct.

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.