10 REM *** PUT2DEC.BAS
15 REM *** LOU-N2MIY - JUNE 2013
20 REM
25 REM *** THIS PROGRAM READS IN RL02 PACK IMAGES FORMATTED FOR USE IN
30 REM *** THE PUTR.EXE PROGRAM AND CONVERTS THEM TO REINHARD HEUBERGER'S
35 REM *** .DEC FORMAT USED BY HIS RL02 SIMULATOR.
40 REM
45 REM *** THE PUTR FORMAT IS BLOCK 0-39, HEAD 0-1, CYLINDER 0-511 ORDER
50 REM *** WITH 256 BYTE BLOCKS IN SEQUENCE (THE DATA PORTION OF AN RL02
55 REM *** PACK ONLY) WHILE .DEC IS SIMILAR TO A REAL RL02 PACK (INCLUDING
60 REM *** FORMATTING AND CHECKSUMS)
65 REM
70 REM *** THIS PROGRAM TAKES THE BLOCK DATA AND CREATES THE SECTOR HEADER
75 REM *** BEFORE THE DATA AND THE BLOCK DATA CHECKSUM FOR AFTER. THE LAST
77 REM *** TRACK (BAD BLOCK RECORD) IS A FAKE TO SATISFY THE RLO2 EMUATOR.
80 REM *** THE INPUT IS A .RL2 FILE AND THE OUTPUT IS A .DEC FILE. THE
85 REM *** INPUT FILENAME IS KEYED IN AT THE BEGINNING OF EXECUTION.
90 REM
95 REM
100 REM *** VARIABLE DECLARATIONS
110 DIM BIN AS STRING * 256
112 DIM BOUT AS STRING * 288
114 DIM LBL(0 TO 255)
116 DIM LBH(0 TO 255)
118 DIM SDCL AS STRING * 1
120 DIM SDCH AS STRING * 1
122 DIM SDC AS STRING * 2
124 DIM SLSA AS STRING * 1
126 DIM SMSA AS STRING * 1
128 DIM SA AS STRING * 4
130 DIM SHP AS STRING * 12
132 DIM SDP AS STRING * 276
134 DIM SHCL AS STRING * 1
136 DIM SHCH AS STRING * 1
138 DIM SHC AS STRING * 2
140 DIM ONES AS STRING * 256
144 LET ONES = CHR$(&H3) + CHR$(&H28) + CHR$(&H54) + CHR$(&H19) + STRING$(4, 0) + STRING$(248, 255)
150 REM *** LOAD CHECKSUM CALCULATION CONSTANTS
155 FOR L = 0 TO 255
160 READ LBL(L)
165 NEXT L
170 FOR L = 0 TO 255
175 READ LBH(L)
180 NEXT L
200 REM *** MAIN PROGRAM
210 PRINT "PUTR RL02 IMAGE FILENAME TO BE CONVERTED? (XXXXXXXX.RL2)"
220 INPUT F$
230 OPEN F$ + ".RL2" FOR BINARY AS #1
240 OPEN F$ + ".DEC" FOR BINARY AS #2
250 PRINT "RUNNING"
300 REM *** READ BLOCKS FROM INPUT FILE
305 FOR CYLINDER = 1 TO 512
310 FOR HEAD = 1 TO 2
320 FOR BLOCK = 1 TO 40
330 LET RECORD& = (((CYLINDER - 1) * 80) + ((HEAD - 1) * 40) + BLOCK) * 256 - 255
340 IF (CYLINDER + HEAD) = 514 THEN LET BIN = ONES ELSE GET #1, RECORD&, BIN
400 REM *** CALCULATE BLOCK DATA CHECKSUM (CRC-16 LUT METHOD)
405 LET DCL = 0
410 LET DCH = 0
420 FOR BN = 1 TO 256
430 LET BD = ASC(MID$(BIN, BN, 1))
440 LET BT = BD XOR DCL
450 LET DCL = LBL(BT) XOR DCH
460 LET DCH = LBH(BT)
470 NEXT BN
475 LET SDCL = CHR$(DCL)
480 LET SDCH = CHR$(DCH)
485 LET SDC = SDCL + SDCH
500 REM *** CALCULATE ADDRESS WORD
510 LET MSA = (CYLINDER - 1) \ 2
515 LET CYLSB = 128 * ((CYLINDER - 1) AND 1)
520 LET HB = (HEAD - 1) * 64
525 LET LSA = CYLSB + HB + (BLOCK - 1)
530 LET SMSA = CHR$(MSA)
535 LET SLSA = CHR$(LSA)
540 LET SA = SLSA + SMSA + CHR$(0) + CHR$(0)
600 REM *** CALCULATE ADDRESS CHECKSUM (CRC-16 LUT METHOD)
605 LET HCL = 0
610 LET HCH = 0
620 FOR BN = 1 TO 4
630 LET BD = ASC(MID$(SA, BN, 1))
640 LET BT = BD XOR HCL
650 LET HCL = LBL(BT) XOR HCH
660 LET HCH = LBH(BT)
670 NEXT BN
675 LET SHCL = CHR$(HCL)
680 LET SHCH = CHR$(HCH)
685 LET SHC = SHCL + SHCH
700 REM *** ASSEMBLE SECTOR HEADER PORTION (12 BYTES)
710 REM *** 00 00 00 80 [SA] [SHC] 00 00
720 LET SHP = CHR$(0) + CHR$(0) + CHR$(0) + CHR$(128) + SA + SHC + CHR$(0) + CHR$(0)
750 REM *** ASSEMBLE SECTOR DATA PORTION (276 BYTES)
760 REM *** 00 00 00 80 [BIN] [SDC] 00 00 00 00 00 00 00 00 00 00 00 00
770 LET SDP = CHR$(0) + CHR$(0) + CHR$(0) + CHR$(0) + CHR$(0) + CHR$(128) + BIN + SDC + CHR$(0) + CHR$(0) + CHR$(0) + CHR$(0) + CHR$(0) + CHR$(0) + CHR$(0) + CHR$(0) + CHR$(0) + CHR$(0) + CHR$(0) + CHR$(0)
800 REM *** ASSEMBLE AND WRITE COMPLETE SECTOR CONTENTS TO OUTPUT FILE
810 LET BOUT = SHP + SDP
830 LET RECORD& = (((CYLINDER - 1) * 80) + ((HEAD - 1) * 40) + BLOCK) * 288 - 287
840 PUT #2, RECORD&, BOUT
850 IF BLOCK = 1 AND HEAD = 1 THEN PRINT "PROCESSING CYLINDER: "; CYLINDER - 1
900 REM *** LOOP UNTIL EVERY BLOCK IS PROCESSED
910 NEXT BLOCK
930 NEXT HEAD
960 NEXT CYLINDER
990 CLOSE #1
995 CLOSE #2
999 PRINT "COMPLETE"
1000 END
20000 REM *** LOW BYTE DATA LOOKUP TABLE
20010 DATA &H00,&HC1,&H81,&H40,&H01,&HC0,&H80,&H41
20020 DATA &H01,&HC0,&H80,&H41,&H00,&HC1,&H81,&H40
20030 DATA &H01,&HC0,&H80,&H41,&H00,&HC1,&H81,&H40
20040 DATA &H00,&HC1,&H81,&H40,&H01,&HC0,&H80,&H41
20050 DATA &H01,&HC0,&H80,&H41,&H00,&HC1,&H81,&H40
20060 DATA &H00,&HC1,&H81,&H40,&H01,&HC0,&H80,&H41
20070 DATA &H00,&HC1,&H81,&H40,&H01,&HC0,&H80,&H41
20080 DATA &H01,&HC0,&H80,&H41,&H00,&HC1,&H81,&H40
20090 DATA &H01,&HC0,&H80,&H41,&H00,&HC1,&H81,&H40
20100 DATA &H00,&HC1,&H81,&H40,&H01,&HC0,&H80,&H41
20110 DATA &H00,&HC1,&H81,&H40,&H01,&HC0,&H80,&H41
20120 DATA &H01,&HC0,&H80,&H41,&H00,&HC1,&H81,&H40
20130 DATA &H00,&HC1,&H81,&H40,&H01,&HC0,&H80,&H41
20140 DATA &H01,&HC0,&H80,&H41,&H00,&HC1,&H81,&H40
20150 DATA &H01,&HC0,&H80,&H41,&H00,&HC1,&H81,&H40
20160 DATA &H00,&HC1,&H81,&H40,&H01,&HC0,&H80,&H41
20170 DATA &H01,&HC0,&H80,&H41,&H00,&HC1,&H81,&H40
20180 DATA &H00,&HC1,&H81,&H40,&H01,&HC0,&H80,&H41
20190 DATA &H00,&HC1,&H81,&H40,&H01,&HC0,&H80,&H41
20200 DATA &H01,&HC0,&H80,&H41,&H00,&HC1,&H81,&H40
20210 DATA &H00,&HC1,&H81,&H40,&H01,&HC0,&H80,&H41
20220 DATA &H01,&HC0,&H80,&H41,&H00,&HC1,&H81,&H40
20230 DATA &H01,&HC0,&H80,&H41,&H00,&HC1,&H81,&H40
20240 DATA &H00,&HC1,&H81,&H40,&H01,&HC0,&H80,&H41
20250 DATA &H00,&HC1,&H81,&H40,&H01,&HC0,&H80,&H41
20260 DATA &H01,&HC0,&H80,&H41,&H00,&HC1,&H81,&H40
20270 DATA &H01,&HC0,&H80,&H41,&H00,&HC1,&H81,&H40
20280 DATA &H00,&HC1,&H81,&H40,&H01,&HC0,&H80,&H41
20290 DATA &H01,&HC0,&H80,&H41,&H00,&HC1,&H81,&H40
20300 DATA &H00,&HC1,&H81,&H40,&H01,&HC0,&H80,&H41
20310 DATA &H00,&HC1,&H81,&H40,&H01,&HC0,&H80,&H41
20320 DATA &H01,&HC0,&H80,&H41,&H00,&HC1,&H81,&H40
20500 REM *** HIGH BYTE DATA LOOKUP TABLE
20510 DATA &H00,&HC0,&HC1,&H01,&HC3,&H03,&H02,&HC2
20520 DATA &HC6,&H06,&H07,&HC7,&H05,&HC5,&HC4,&H04
20530 DATA &HCC,&H0C,&H0D,&HCD,&H0F,&HCF,&HCE,&H0E
20540 DATA &H0A,&HCA,&HCB,&H0B,&HC9,&H09,&H08,&HC8
20550 DATA &HD8,&H18,&H19,&HD9,&H1B,&HDB,&HDA,&H1A
20560 DATA &H1E,&HDE,&HDF,&H1F,&HDD,&H1D,&H1C,&HDC
20570 DATA &H14,&HD4,&HD5,&H15,&HD7,&H17,&H16,&HD6
20580 DATA &HD2,&H12,&H13,&HD3,&H11,&HD1,&HD0,&H10
20590 DATA &HF0,&H30,&H31,&HF1,&H33,&HF3,&HF2,&H32
20600 DATA &H36,&HF6,&HF7,&H37,&HF5,&H35,&H34,&HF4
20610 DATA &H3C,&HFC,&HFD,&H3D,&HFF,&H3F,&H3E,&HFE
20620 DATA &HFA,&H3A,&H3B,&HFB,&H39,&HF9,&HF8,&H38
20630 DATA &H28,&HE8,&HE9,&H29,&HEB,&H2B,&H2A,&HEA
20640 DATA &HEE,&H2E,&H2F,&HEF,&H2D,&HED,&HEC,&H2C
20650 DATA &HE4,&H24,&H25,&HE5,&H27,&HE7,&HE6,&H26
20660 DATA &H22,&HE2,&HE3,&H23,&HE1,&H21,&H20,&HE0
20670 DATA &HA0,&H60,&H61,&HA1,&H63,&HA3,&HA2,&H62
20680 DATA &H66,&HA6,&HA7,&H67,&HA5,&H65,&H64,&HA4
20690 DATA &H6C,&HAC,&HAD,&H6D,&HAF,&H6F,&H6E,&HAE
20700 DATA &HAA,&H6A,&H6B,&HAB,&H69,&HA9,&HA8,&H68
20710 DATA &H78,&HB8,&HB9,&H79,&HBB,&H7B,&H7A,&HBA
20720 DATA &HBE,&H7E,&H7F,&HBF,&H7D,&HBD,&HBC,&H7C
20730 DATA &HB4,&H74,&H75,&HB5,&H77,&HB7,&HB6,&H76
20740 DATA &H72,&HB2,&HB3,&H73,&HB1,&H71,&H70,&HB0
20750 DATA &H50,&H90,&H91,&H51,&H93,&H53,&H52,&H92
20760 DATA &H96,&H56,&H57,&H97,&H55,&H95,&H94,&H54
20770 DATA &H9C,&H5C,&H5D,&H9D,&H5F,&H9F,&H9E,&H5E
20780 DATA &H5A,&H9A,&H9B,&H5B,&H99,&H59,&H58,&H98
20790 DATA &H88,&H48,&H49,&H89,&H4B,&H8B,&H8A,&H4A
20800 DATA &H4E,&H8E,&H8F,&H4F,&H8D,&H4D,&H4C,&H8C
20810 DATA &H44,&H84,&H85,&H45,&H87,&H47,&H46,&H86
20820 DATA &H82,&H42,&H43,&H83,&H41,&H81,&H80,&H40