* This program is used to read the memopad Book AM = CHAR(254) VM = CHAR(253) * OPEN "TEMP.DATA" TO TEMP.FILE ELSE STOP 201, "TEMP.DATA" * READ ADDRESS.DAT FROM TEMP.FILE, "MEMOPAD.DAT" ELSE STOP 202,"MEMOPAD.DAT" * * Read the tag fields POS = 1 GOSUB 1000 ; Tag1 = VALUE GOSUB 1000 ; Tag2 = VALUE GOSUB 2000 ; Tag3 = VALUE GOSUB 2000 ; Tag4 = VALUE PRINT "Tag field values are: " PRINT " Tag 1 =": Tag1 PRINT " Tag 2 =": Tag2 PRINT " Tag 3 =": Tag3 PRINT " Tag 4 =": Tag4 PRINT "Hit any key to continue to next field" INPUT JUNK * * Read the General Header fields GOSUB 1000 ; CLEN = VALUE GOSUB 3000 PRINT "General Header field values are: " PRINT " cslen =": CLEN PRINT " string =": VALUE PRINT "Hit any key to continue to next field" INPUT JUNK * * Read the Show Header Fields (if zero in first byte, NO show header) GOSUB 1000 ; CLEN = VALUE GOSUB 3000 PRINT "Show Header field values are: " PRINT " cslen =": CLEN PRINT " string =": VALUE PRINT "Hit any key to continue to next field" INPUT JUNK * * Read the Category Header Fields GOSUB 5000 ; MYLONG = VALUE PRINT "Category Header field values are: " PRINT " unknown =": VALUE GOSUB 5000 ; MYLONG = VALUE PRINT " # categories =": VALUE CATEGORIES = VALUE PRINT "Hit any key to continue to next field" INPUT JUNK * LOOP WHILE CATEGORIES > 0 DO CATEGORIES = CATEGORIES - 1 GOSUB 5000 ; PRINT " index =": VALUE GOSUB 5000 ; PRINT " id =": VALUE GOSUB 5000 ; PRINT " name dirty flg =": VALUE GOSUB 1000 ; CLEN = VALUE ; PRINT " cslen =": VALUE GOSUB 3000 ; PRINT " Short name =", VALUE GOSUB 1000 ; CLEN = VALUE ; PRINT " cslen =": VALUE GOSUB 3000 ; PRINT " Long name =": VALUE PRINT "Hit any key to continue to next field" INPUT JUNK REPEAT * * Read the Table Header (schema) fields GOSUB 5000 ; MYLONG = VALUE PRINT "Table Header field values are: " PRINT " resource id =": VALUE GOSUB 5000 ; MYLONG = VALUE PRINT " feidls per Row=": VALUE GOSUB 5000 ; MYLONG = VALUE PRINT " Rec Id Pos =": VALUE GOSUB 5000 ; MYLONG = VALUE PRINT " Rec Status Pos =": VALUE GOSUB 5000 ; MYLONG = VALUE PRINT " placement pos =": VALUE GOSUB 4000 ; MYLONG = VALUE PRINT " # fields =": VALUE TABLEENTRIES = VALUE PRINT "Hit any key to continue to next field" INPUT JUNK * IF TABLEENTRIES > 0 THEN FOR J = 1 TO TABLEENTRIES GOSUB 4000 ; MYLONG = VALUE PRINT " field ": J: " type =": VALUE * PRINT "Hit any key to continue to next field" * INPUT JUNK NEXT J END * * Read the Number of Entries field GOSUB 5000 ; MYLONG = VALUE PRINT "Number of Entries field values are: " PRINT " # entries * 6 =", VALUE MEMOENTRIES = VALUE / 6 PRINT " or ": MEMOENTRIES :" actual memo pad entries" PRINT "Hit any key to continue to the memo pad entries" INPUT JUNK * * Now iterate over the file reading the number of entries we found * above * IF memoentries > 0 THEN FOR j = 1 TO memoentries PRINT "** Memopad Entry #": J :" **" GOSUB 5000 ; mylong = VALUE PRINT " field type =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " record id =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " field type =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " status =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " field type =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " position =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " field type =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " always zero =": VALUE PRINT "Hit any key to continue to memo text field (may be long display)" INPUT JUNK GOSUB 1000 ; CLEN = VALUE ; PRINT " cslen =": VALUE GOSUB 3000 PRINT " Memo Text =": VALUE * STRING = "" GOSUB 8000 DEBUG PRINT "Hit any key to continue to next field" INPUT JUNK GOSUB 5000 ; mylong = VALUE PRINT " field type =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " private =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " field type =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " category =": VALUE PRINT "Hit any key to continue to next field" INPUT JUNK NEXT j END 900* STOP ****** *** SUBROUTINE ***** 1000* GetByte CHR = ADDRESS.DAT[POS,2] IF CHR = "FF" THEN VALUE = 255 END ELSE VALUE = SEQ(OCONV(CHR,"MY")) END POS = POS + 2 RETURN 2000* GetChar VALUE = OCONV(ADDRESS.DAT[POS,2],"MY") POS = POS + 2 RETURN 3000* Get CString IF CLEN = 255 THEN * use the Short String method GOSUB 4000 CLEN = VALUE END * IF CLEN = 0 THEN VALUE = "" END ELSE VALUE = OCONV(ADDRESS.DAT[POS,CLEN * 2],"MY") POS = POS + (CLEN * 2) END RETURN 4000* Get Short CString Length * Get a short, return the integer value of the short - shorts are * stored in low byte, high byte order * GOSUB 1000 ; LO = VALUE GOSUB 1000 ; HI = VALUE VALUE = (HI * 256) + LO RETURN 5000* Get Long CLength * Get a long, return the floating point value since it's potentially * such a large number. Qbasic will barf if we don't use doubles * note that a long is also stored in lowest to highest byte order * GOSUB 1000 ; LO = VALUE GOSUB 1000 ; LO1 = VALUE GOSUB 1000 ; LO2 = VALUE GOSUB 1000 ; HI = VALUE CSL1 = LO CSL2 = LO1 * 256 CSL3 = LO2 * 65536 CSL4 = HI * 16777216 VALUE = CSL1 + CSL2 + CSL3 + CSL4 RETURN 6000* Converts to Long 4-byte HI = INT(VALUE / 16777216) LO2 = VALUE - (HI * 1677216) LO2 = INT(LO2 / 65536) LO1 = VALUE - (HI * 1677216) - (LO2 * 65536) LO1 = INT(LO1 / 256) LO = VALUE - (HI * 1677216) - (LO2 * 65536) - (LO1 * 256) * STRING = STRING : OCONV(CHAR(LO) : CHAR(LO1) : CHAR(LO2) : CHAR(HI),"MX") RETURN 7000* Short Value * creates Short value HI = INT(VALUE / 256) LO = VALUE - (HI * 256) STRING = STRING : OCONV(CHAR(LO) : CHAR(HI),"MX") RETURN 8000* Create CString * Creates a new CString Value LENGTH = LEN(VALUE) IF LENGTH >= 256 THEN SAVE.VALUE = VALUE VALUE = LENGTH STRING = STRING : "FF" GOSUB 7000 STRING = STRING : OCONV(SAVE.VALUE,"MX") END ELSE STRING = STRING : OCONV(CHAR(LENGTH) : VALUE,"MX") END RETURN END * This program is used to read the memopad Book AM = CHAR(254) VM = CHAR(253) * OPEN "TEMP.DATA" TO TEMP.FILE ELSE STOP 201, "TEMP.DATA" * READ ADDRESS.DAT FROM TEMP.FILE, "MEMOPAD.DAT" ELSE STOP 202,"MEMOPAD.DAT" * * Read the tag fields POS = 1 GOSUB 1000 ; Tag1 = VALUE GOSUB 1000 ; Tag2 = VALUE GOSUB 2000 ; Tag3 = VALUE GOSUB 2000 ; Tag4 = VALUE PRINT "Tag field values are: " PRINT " Tag 1 =": Tag1 PRINT " Tag 2 =": Tag2 PRINT " Tag 3 =": Tag3 PRINT " Tag 4 =": Tag4 PRINT "Hit any key to continue to next field" INPUT JUNK * * Read the General Header fields GOSUB 1000 ; CLEN = VALUE GOSUB 3000 PRINT "General Header field values are: " PRINT " cslen =": CLEN PRINT " string =": VALUE PRINT "Hit any key to continue to next field" INPUT JUNK * * Read the Show Header Fields (if zero in first byte, NO show header) GOSUB 1000 ; CLEN = VALUE GOSUB 3000 PRINT "Show Header field values are: " PRINT " cslen =": CLEN PRINT " string =": VALUE PRINT "Hit any key to continue to next field" INPUT JUNK * * Read the Category Header Fields GOSUB 5000 ; MYLONG = VALUE PRINT "Category Header field values are: " PRINT " unknown =": VALUE GOSUB 5000 ; MYLONG = VALUE PRINT " # categories =": VALUE CATEGORIES = VALUE PRINT "Hit any key to continue to next field" INPUT JUNK * LOOP WHILE CATEGORIES > 0 DO CATEGORIES = CATEGORIES - 1 GOSUB 5000 ; PRINT " index =": VALUE GOSUB 5000 ; PRINT " id =": VALUE GOSUB 5000 ; PRINT " name dirty flg =": VALUE GOSUB 1000 ; CLEN = VALUE ; PRINT " cslen =": VALUE GOSUB 3000 ; PRINT " Short name =", VALUE GOSUB 1000 ; CLEN = VALUE ; PRINT " cslen =": VALUE GOSUB 3000 ; PRINT " Long name =": VALUE PRINT "Hit any key to continue to next field" INPUT JUNK REPEAT * * Read the Table Header (schema) fields GOSUB 5000 ; MYLONG = VALUE PRINT "Table Header field values are: " PRINT " resource id =": VALUE GOSUB 5000 ; MYLONG = VALUE PRINT " feidls per Row=": VALUE GOSUB 5000 ; MYLONG = VALUE PRINT " Rec Id Pos =": VALUE GOSUB 5000 ; MYLONG = VALUE PRINT " Rec Status Pos =": VALUE GOSUB 5000 ; MYLONG = VALUE PRINT " placement pos =": VALUE GOSUB 4000 ; MYLONG = VALUE PRINT " # fields =": VALUE TABLEENTRIES = VALUE PRINT "Hit any key to continue to next field" INPUT JUNK * IF TABLEENTRIES > 0 THEN FOR J = 1 TO TABLEENTRIES GOSUB 4000 ; MYLONG = VALUE PRINT " field ": J: " type =": VALUE * PRINT "Hit any key to continue to next field" * INPUT JUNK NEXT J END * * Read the Number of Entries field GOSUB 5000 ; MYLONG = VALUE PRINT "Number of Entries field values are: " PRINT " # entries * 6 =", VALUE MEMOENTRIES = VALUE / 6 PRINT " or ": MEMOENTRIES :" actual memo pad entries" PRINT "Hit any key to continue to the memo pad entries" INPUT JUNK * * Now iterate over the file reading the number of entries we found * above * IF memoentries > 0 THEN FOR j = 1 TO memoentries PRINT "** Memopad Entry #": J :" **" GOSUB 5000 ; mylong = VALUE PRINT " field type =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " record id =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " field type =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " status =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " field type =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " position =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " field type =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " always zero =": VALUE PRINT "Hit any key to continue to memo text field (may be long display)" INPUT JUNK GOSUB 1000 ; CLEN = VALUE ; PRINT " cslen =": VALUE GOSUB 3000 PRINT " Memo Text =": VALUE * STRING = "" GOSUB 8000 DEBUG PRINT "Hit any key to continue to next field" INPUT JUNK GOSUB 5000 ; mylong = VALUE PRINT " field type =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " private =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " field type =": VALUE GOSUB 5000 ; mylong = VALUE PRINT " category =": VALUE PRINT "Hit any key to continue to next field" INPUT JUNK NEXT j END 900* STOP ****** *** SUBROUTINE ***** 1000* GetByte CHR = ADDRESS.DAT[POS,2] IF CHR = "FF" THEN VALUE = 255 END ELSE VALUE = SEQ(OCONV(CHR,"MY")) END POS = POS + 2 RETURN 2000* GetChar VALUE = OCONV(ADDRESS.DAT[POS,2],"MY") POS = POS + 2 RETURN 3000* Get CString IF CLEN = 255 THEN * use the Short String method GOSUB 4000 CLEN = VALUE END * IF CLEN = 0 THEN VALUE = "" END ELSE VALUE = OCONV(ADDRESS.DAT[POS,CLEN * 2],"MY") POS = POS + (CLEN * 2) END RETURN 4000* Get Short CString Length * Get a short, return the integer value of the short - shorts are * stored in low byte, high byte order * GOSUB 1000 ; LO = VALUE GOSUB 1000 ; HI = VALUE VALUE = (HI * 256) + LO RETURN 5000* Get Long CLength * Get a long, return the floating point value since it's potentially * such a large number. Qbasic will barf if we don't use doubles * note that a long is also stored in lowest to highest byte order * GOSUB 1000 ; LO = VALUE GOSUB 1000 ; LO1 = VALUE GOSUB 1000 ; LO2 = VALUE GOSUB 1000 ; HI = VALUE CSL1 = LO CSL2 = LO1 * 256 CSL3 = LO2 * 65536 CSL4 = HI * 16777216 VALUE = CSL1 + CSL2 + CSL3 + CSL4 RETURN 6000* Converts to Long 4-byte HI = INT(VALUE / 16777216) LO2 = VALUE - (HI * 1677216) LO2 = INT(LO2 / 65536) LO1 = VALUE - (HI * 1677216) - (LO2 * 65536) LO1 = INT(LO1 / 256) LO = VALUE - (HI * 1677216) - (LO2 * 65536) - (LO1 * 256) * STRING = STRING : OCONV(CHAR(LO) : CHAR(LO1) : CHAR(LO2) : CHAR(HI),"MX") RETURN 7000* Short Value * creates Short value HI = INT(VALUE / 256) LO = VALUE - (HI * 256) STRING = STRING : OCONV(CHAR(LO) : CHAR(HI),"MX") RETURN 8000* Create CString * Creates a new CString Value LENGTH = LEN(VALUE) IF LENGTH >= 256 THEN SAVE.VALUE = VALUE VALUE = LENGTH STRING = STRING : "FF" GOSUB 7000 STRING = STRING : OCONV(SAVE.VALUE,"MX") END ELSE STRING = STRING : OCONV(CHAR(LENGTH) : VALUE,"MX") END RETURN END