#11 Article 695 Posted at 1987/12/11 11:08:55 by アカルイ ノウソン (MAP000) [PRG.X68]

Subject: HC6.BAS (for X68000)

100 /*
  110 /*        hc6 6bit encoder decoder for msc
  120 /*        by tam(asc10041) 860620
  130 /*        modified by y.tokugawa (asc11161) 860623
  140 /*        version 1.10 by tam (asc10041) 860623
  150 /*        for basic by calf (asc14245)
  160 /*          X-basic by BIG-X (pcs12107) 870707
  170 /*
  180 /*        encode:
  190 /*                  >filename[:number]
  200 /*
  210 /*        decode:
  220 /*                  >file.hc6
  230 /*        end       >.
  240 error off
  250 str defname$,opt$,c$
  260 str filename$[50],ofilename$[50],file$[50]
  270 str encbuf$[255] : dim char buffer(255)
  280 /*
  290 int fr=0,dl=0,sum=0
  300 offset = &H30
  310 defpakl = 56
  320 defname$ = "hc6.out"
  330 v100 = 100
  340 v110 = 110
  350 width 96:usage()
  360 /*
  370 /*func main()
  380 /*
  390 packetl = defpakl
  400 version = v110
  410 while 1
  420 print ">";
  430 linput filename$
  440 if filename$ = "" then usage() : continue
  450 if left$(filename$,1) = "." then break
  460 /*
  470 p = instr(1,filename$,":")
  480 if p <> 0 then {
  490  d = val(mid$(filename$,p+1,3))
  500  filename$ = left$(filename$,p-1)
  510  if 1 <= d and d <= 63 then packetl = d
  520 }
  530 p = instr(1,filename$,".")
  540 if p = 0 then file$ = filename$:opt$ = "":encode() else {
  550  file$ = left$(filename$,p-1)
  560  opt$ = mid$(filename$,p+1,3)
  570  if opt$ = "hc6" or opt$="HC6" then decode() else encode()
  580 }
  590 endwhile
  600 end
  610 /*
  620 /* ==========
  630 /*
  640 func encode()
  650 /*
  660 print : print "encode: ";filename$;"  =>  ";file$;".HC6"
  670 error_f = 0 :fi=fopen(filename$,"r") :    if fi<0  then e_open()
  680              fo=fopen(file$+".HC6","c") : if fo<0  then e_open()
  690 /*
  700 if version = v100 then error_f=fputc(chr$(34),fo) else error_f=fputc('#',fo)
  710 if error_f<0 then e_writes()
  720 if fwrites(filename$,fo)<0 then e_writes()
  730 fputc(13,fo):if fputc(10,fo)<0 then e_writes()
  740 /*
  750 while 1
  760 f_read()
  770 encbuf$ = ""
  780 if dl <> 0 then {
  790 sum = 0
  800 for i = 1 to dl
  810 sum = sum + buffer(i)
  820 next
  830 /*
  840 buffer(dl + 1) = sum mod 256
  850 dl = dl +1
  860 encd()
  870 /*
  880 if version <> v100 then {
  890 encbuf$ = chr$(fr + offset) + encbuf$
  900 fr = fr + 1
  910 if fr = 64 then fr = 0
  920 } }
  930 encbuf$ = chr$(dl + offset) + encbuf$
  940 if fwrites(encbuf$,fo)<0 then e_writes()
  950 fputc(13,fo):if fputc(10,fo)<0 then e_writes()
  960 if dl = 0 then break
  970 endwhile
  980 fcloseall()
  990 endfunc
 1000 /*
 1010 func f_read()
 1020 buffer(0)=0 : dl = 0
 1030 while (not feof(fi)) and ( dl < packetl)
 1040  dl = dl+1 : buffer(dl) = fgetc(fi)
 1050 endwhile
 1060 /*
 1070 endfunc
 1080 /*
 1090 func encd()
 1100 /*
 1110 c=0
 1120 for loop = 1 to dl
 1130 d = buffer(loop)
 1140 switch c
 1150   case 0:/* |765432|10xxxx|
 1160    encbuf$ = encbuf$ + chr$(d \ 4 + offset)
 1170    d1 = (d * 16) and &H30
 1180    c = 1
 1190    break
 1200   case 1:/* |xx7654|3210xx}
 1210    encbuf$ = encbuf$ + chr$(d \ 16 + d1 + offset)
 1220    d1 = (d *  4) and &H3C
 1230    c = 2
 1240    break
 1250   case 2:/* |xxxx76|543210|
 1260    encbuf$ = encbuf$ + chr$(d \ 64 + d1 + offset)
 1270    encbuf$ = encbuf$ + chr$((d and &H3F) + offset)
 1280    c = 0
 1290 endswitch
 1300 next
 1310 if c <> 0 then encbuf$ = encbuf$ + chr$(d1 + offset)
 1320 endfunc
 1330 /*
 1340 func decode()
 1350 /*
 1360 print : print "decode: ";filename$;
 1370 error_f = 0 :fi=fopen(filename$,"r") : if fi<0 then e_open()
 1380 lineno = 1
 1390 fr = 0
 1400 if freads(encbuf$,fi)<0 then e_reads()
 1410 c$ = left$(encbuf$,1)
 1420 if c$ = chr$(34) or c$ = "#" then {
 1430  if c$ = chr$(34) then version = v100
 1440  ofilename$ = mid$(encbuf$,2,50)
 1450  if freads(encbuf$,fi)<0 then e_reads()
 1460  lineno = lineno + 1
 1470 } else ofilename$ = defname$
 1480 /*
 1490 error_f = 0 :fo=fopen(ofilename$,"c") : if fo<0 then e_open()
 1500 print "  =>  ";ofilename$
 1510 /*
 1520 while(asc(left$(encbuf$,1)) <> offset)
 1530  dl = asc(mid$(encbuf$,1,1)) - offset
 1540  decd()
 1550  if version <> v100 then {
 1560   if asc(mid$(encbuf$,2,1)) - offset <> fr then print ofilename$;": frame error in line";lineno : break
 1570   fr = fr + 1
 1580   if fr = 64 then fr = 0
 1590 }
 1600  dl = dl - 1
 1610  sum = 0
 1620  for i = 1 to dl
 1630   sum = sum + buffer(i)
 1640  next
 1650  if buffer(dl+1) <> sum mod 256 then print ofilename$;": checksum error in line";lineno : break
 1660 /*
 1670  for i= 1 to dl
 1680   if fputc(buffer(i),fo) < 0 then e_writes()
 1690  next
 1700  lineno = lineno + 1
 1710  if freads(encbuf$,fi)<0 then e_reads()
 1720 endwhile
 1730 fcloseall()
 1740 endfunc
 1750 /*
 1760 func decd()
 1770 buffer(0)=0
 1780 if version = v100 then enc = 2 else enc = 3
 1790 /*
 1800 c = 0
 1810 for loop = 1 to dl
 1820 switch c
 1830   case 0:/* |765432|10xxxx|
 1840    d1 = asc(mid$(encbuf$,enc,1)) - offset
 1850    enc = enc + 1
 1860    d2 = asc(mid$(encbuf$,enc,1)) - offset
 1870    enc = enc + 1
 1880    d = (d1 * 4) + ((d2 \ 16) and &H3)
 1890    c = 1
 1900    break
 1910   case 1:/* |xx7654|3210xx|
 1920    d1 = asc(mid$(encbuf$,enc,1)) - offset
 1930    enc = enc + 1
 1940    d = ((d2 * 16) and &HFF) + ((d1 \ 4) and &HF)
 1950    c = 2
 1960    break
 1970   case 2:/* |xxxx76|543210|
 1980    d2 = asc(mid$(encbuf$,enc,1)) - offset
 1990    enc = enc + 1
 2000    d = ((d1 * 64) and &HC0) + d2
 2010    c = 0
 2020 endswitch
 2030 buffer(loop) = d
 2040 next
 2050 endfunc
 2060 /*
 2070 func usage()
 2080 /*
 2090 print "hc6: 6bit file converter version 1.10X"
 2100 print " encode:"
 2110 print "   >filename[:number]":print
 2120 print " decode:"
 2130 print "   >filename.hc6":print
 2140 print " end   :"
 2150 print "   >.":print
 2160 endfunc
 2170 /*
 2180 func e_open()
 2190  print "*** file open error ***"
 2200  abort()
 2210 endfunc
 2220 func e_writes()
 2230  print "*** file write error ***"
 2240  abort()
 2250 endfunc
 2260 func e_reads()
 2270  print "*** file read error ***"
 2280  abort()
 2290 endfunc
 2300 func abort()
 2310  print "*** program abort."
 2320  fcloseall():beep
 2330  end
 2340 endfunc