rem Este ejemplo muestra el funcionamiento del algoritmo
rem CCITT Fax4 , a partir de este documento:
rem www.gwg.nga.mil/ntb/baseline/docs/188_196/196n1.pdf
rem con Google: "data organization of a two" ... dimensionally ...
rem El documento tiene un par de pequeños errores en la última página
rem Este ejemplo se limita a lo que aparece en esa página,
rem pero puede ser ampliado con las tablas y datos que completan
rem el algoritmo. Se supone que están bien, pero además se pueden
rem encotrar en koders y otras webs, como libtiff.

rem codificado para Liberty Basic. Colgado aquí el 11-11-2007

mainwin 25 20
dim bla$(65),neg$(65)
eol$="00000000001"
  WindowWidth = 50
  WindowHeight = 110
button #ctrl.exit, "Exit", [fuera], UL, 10, 10
open "control" for window as #ctrl
restore [white]
for i=0 to 16: read a$: bla$(i)=a$: next
restore [black]
for i=0 to 16: read a$: neg$(i)=a$: next
restore [verti]
for i=0 to 6: read a$: vert$(i)=a$: next

hm$="001": pass$="0001"
restore [100]
read ref$, cod$
b=instr(cod$,"1"): if b=0 then enc$="1" else enc$=""
'primera
n=1:l=len(cod$)

[rehm]
scan
enc$=enc$+hm$: print hm$;" hm"
b=instr(cod$,"1",n): i=b-n: enc$=enc$+bla$(i): print bla$(i);" ";i;"b"
n=instr(cod$,"0",b): i=n-b
if i<0 then i=i+l+1
enc$=enc$+neg$(i):  print neg$(i);" ";i;"n" ' ;"  n=";n
if n<>0 then goto [rehm]
a0=0

[segu]
scan
print "----segu---"
ref$=cod$: read cod$

[mas]
j=j+1: if j>8 then [fuera]
if a1>l or a2>l then [eol]
if a0=0 then same$=left$(cod$,1) else same$=mid$(cod$,a0,1)
if a0=0 then same$="0"
if same$="0" then opp$="1" else opp$="0"
print same$;" ";opp$
a1=instr(cod$,opp$,a0):if a1=0 then a1=l+1
a2=instr(cod$,same$,a1):if a2=0 then a2=l+1
cha$=mid$(cod$,a0,1):if a0=0 then cha$="0"
if cha$="0" then ocha$="1" else ocha$="0"
b1=instr(ref$,ocha$,a0+1)
cha$=mid$(ref$,b1,1): if a0=0 then print "cero"
if cha$="1" then b2=instr(ref$,"0",b1): goto [deb2]
print "busco 1"
b2=instr(ref$,"1",b1)

[deb2]
if b2=0 then b2=l+1
print "c";a0;" c";a1;" c";a2;" r";b1;" r";b2;" ";cha$;" ";ocha$
if b2>=a1 then [nopass]
'  pass mode
enc$=enc$+pass$: a0=b2
print pass$;" pass": goto [mas]

[nopass]
v=b1-a1+3
if v<0 then [horiz]
if v<7 then [vert]

[horiz]
print "horiz"
n=a0: enc$=enc$+hm$: print hm$;" hm";" b=";b;" n=";n
b=instr(cod$,"1",n): if b=0 then b=25
i=b-n: enc$=enc$+bla$(i): print bla$(i);" ";i;"b"
n=instr(cod$,"0",b): i=n-b
if i<0 then i=i+l+1
enc$=enc$+neg$(i):  print neg$(i);" ";i;"n" ' ;"  n=";n
a0=a2
print "-----"
goto [mas]

[vert]
if v<0 then print " v<0": goto [fuera]
enc$=enc$+vert$(v): print vert$(v);" v";v-3
a0=a1: print "a1=";a1,mid$(cod$,a1,1)
goto [mas]

[eol]
enc$=enc$+eol$+eol$+eol$: l=len(enc$):t=8*(int(l/8)-1): print l,t
enc$=left$(enc$,t): print enc$

[fuera]
close #ctrl
end

[100]
data "000000000000000000000000"

data "011001100011000000001111"
data "010000000111000111100000"
data "000000000000000000000000"

[white]
data "00110101"
data "000111"
data "0111"
data "1000"
data "1011"
data "1100"
data "1110"
data "1111"
data "10011"
data "10100"
data "00111"
data "01000"
data "001000"
data "000011"
data "110100"
data "110101"
data "101010"
[black]
data "0000110111"
data "010"
data "11"
data "10"
data "011"
data "0011"
data "0010"
data "00011"
data "000101"
data "000100"
data "0000100"
data "0000101"
data "0000111"
data "00000100"
data "00000111"
data "00001100 0"
data "00000101 11"

[verti]
data "0000011"
data "000011"
data "011"
data "1"
data "010"
data "000010"
data "0000010"