!!%externalroutine transform(%bytearrayname pic(0:65535),
!!                                         %bytearrayname image(0:128*512))
!!%integer r,c,i,j,k,l,pix,x,y
!!{s}%integer time
!!{s}time = cputime
!!
!!%for r=0,1,127 %cycle
!!  %for c=0,1,31 %cycle
!!    k = (127-r)<<5+c
!!    %for j=7,-1,0 %cycle
!!      l=c<<3 + j
!!      %if pic(k)&(1<<j)#0 %then pix=1 %else pix=0
!!      y=r; x=l<<1+1
!!      %if (r&1=0 %and l&1=0) %or (r&1#0 %and l&1#0) %then %c
!!      y=y-1 %and x=x-3
!!      %if (x&1)=0 %then y=y+2
!!      i = y<<9+x
!!      image(i)=image(i)+pix %if 0<=x<=511 %and 0<=y<=127
!!    %repeat
!!  %repeat
!!%repeat
!!{s}printstring("Transform "); write(cputime-time, 5); newline
!!%end
!!
!******************************************************************************!
!                                  TRANSFORM                                   !
!******************************************************************************!
%externalroutine transform(%bytearrayname pic(0:65535),
                                         %bytearrayname image(0:128*512))
%integer r,c,i,j,k,l,pix,x,y
{s}%integer time
{s}time = cputime
    LEA     -36(A7),A7           : 4FEF FFDC
    JSR     cputime              : 4EAC 0002
    MOVE.L  D0,time              : 2F00

%for r=0,1,127 %cycle
    MOVEQ   #-1,D1               : 72FF
    MOVE.L  D1,r                 : 2F41 0024
L1  ADDQ.L  #1,r                 : 52AF 0024
  %for c=0,1,31 %cycle
    MOVEQ   #-1,D0               : 70FF
    MOVE.L  D0,c                 : 2F40 0020
L3  ADDQ.L  #1,c                 : 52AF 0020
    k = (127-r)<<5+c
    MOVEQ   #127,D0              : 707F
    SUB.L   r,D0                 : 90AF 0024
    LSL.L   #5,D0                : EB88
    ADD.L   c,D0                 : D0AF 0020
    MOVE.L  D0,k                 : 2F40 0014
    %for j=7,-1,0 %cycle
    MOVEQ   #8,D1                : 7208
    MOVE.L  D1,j                 : 2F41 0018
L5  SUBQ.L  #1,j                 : 53AF 0018
      l=c<<3 + j
    MOVE.L  c,D0                 : 202F 0020
    LSL.L   #3,D0                : E788
    ADD.L   j,D0                 : D0AF 0018
    MOVE.L  D0,l                 : 2F40 0010
      %if pic(k)&(1<<j)#0 %then pix=1 %else pix=0
    MOVE.L  j,D1                 : 222F 0018
    MOVEA.L pic,A0               : 206F 002C
    MOVE.L  k,D2                 : 242F 0014
    BTST.B  D1,0(A0,D2.L)        : 0330 2800
    BEQ     L8                   : 6700 0000
    MOVEQ   #1,D3                : 7601
    MOVE.L  D3,pix               : 2F43 000C
    BRA     L7                   : 6000 0000
L8  CLR.L   pix                  : 42AF 000C
L7
      y=r; x=l<<1+1
    MOVE.L  r,y                  : 2F6F 0024 0004
    LSL.L   #1,D0                : E388
    ADDQ.L  #1,D0                : 5280
    MOVE.L  D0,x                 : 2F40 0008
      %if (r&1=0 %and l&1=0) %or (r&1#0 %and l&1#0) %then %c
      y=y-1 %and x=x-3
    BTST.L  #0,r                 : 082F 0000 0027
    BNE     L10                  : 6600 0000
    BTST.L  #0,l                 : 082F 0000 0013
    BEQ     L9                   : 6700 0000
L10 BTST.L  #0,r                 : 082F 0000 0027
    BEQ     L8                   : 6700 0000
    BTST.L  #0,l                 : 082F 0000 0013
    BEQ     L8                   : 6700 0069
L9  SUBQ.L  #1,y                 : 53AF 0004
    SUBQ.L  #3,x                 : 57AF 0008
L8
      %if (x&1)=0 %then y=y+2
    BTST.L  #0,x                 : 082F 0000 000B
    BNE     L8                   : 6600 0000
    ADDQ.L  #2,y                 : 54AF 0004
L8
      i = y<<9+x
    MOVE.L  y,D0                 : 202F 0004
    MOVEQ   #9,D3                : 7609
    LSL.L   D3,D0                : E7A8
    ADD.L   x,D0                 : D0AF 0008
    MOVE.L  D0,i                 : 2F40 001C
      image(i)=image(i)+pix %if 0<=x<=511 %and 0<=y<=127
    MOVE.L  x,D0                 : 202F 0008
    BLT     L8                   : 6D00 0000
    CMP.L   #$01FF,D0            : B0BC 0000 01FF
    BGT     L8                   : 6E00 0085
    MOVE.L  y,D0                 : 202F 0004
    BLT     L8                   : 6D00 008A
    MOVEQ   #127,D4              : 787F
    CMP.L   D4,D0                : B084
    BGT     L8                   : 6E00 008E
    MOVEA.L image,A1             : 226F 0028
    MOVEA.L i,A2                 : 246F 001C
    MOVE.L  pix,D0               : 202F 000C
    ADD.B   D0,0(A1,A2.L)        : D131 A800
L8
    %repeat
L5  MOVE.L  j,D0                 : 202F 0018
    BNE     L5                   : 6600 003A
  %repeat
L3  MOVEQ   #31,D0               : 701F
    CMP.L   c,D0                 : B0AF 0020
    BNE     L3                   : 6600 002D
%repeat
L1  MOVEQ   #127,D0              : 707F
    CMP.L   r,D0                 : B0AF 0024
    BNE     L1                   : 6600 0028
{s}printstring("Transform "); write(cputime-time, 5); newline
    LEA     (PC),A0              : 41FA 0A80
    JSR     printstring          : 4EB8 3E6A
    JSR     cputime              : 4EAC 0002
    SUB.L   time,D0              : 9097
    MOVEQ   #5,D1                : 7205
    JSR     write                : 4EAC 0078
    BSR     newline              : 6100 00B5
%end
^   MOVE.L  A0,-(A7)             : 2F08
^   MOVE.L  A1,-(A7)             : 2F09
    LEA     48(A7),A7            : 4FEF 0030

!*****************************************************!
!         FILLIMAGE                                   !
!  Routine fills out blank values in image array.     !
!  If blank pixel has two or more neighbours set to 1 !
!  then set pixel to a 1 as well                      !
!*****************************************************!
!!%externalroutine fillimage(%bytearrayname image(0:128*512))
!!   %integer i,j,col,row,k,np
!!{s}%integer time
!!{s}time = cputime
!!   i=0;j=0
!!   %for col=1,1,511 %cycle
!!     %for row=2+i,2,124+i %cycle
!!       k=row<<9+col
!!       np=image(k-512)+image(k+512)
!!       %if j=0 %then np=np+image(k-1) %else np=np+image(k+1)
!!       %if np=2 %or np=3 %then image(k)=1 %else image(k)=0
!!     %repeat                          
!!     %if j=0 %then j=1 %elsestart
!!       %if i=1 %then i=0 %else i=1
!!       j=0
!!     %finish
!!   %repeat
!!{s}printstring("Fill image"); write(cputime-time, 5); newline
!!%end

%externalroutine fillimage(%bytearrayname image(0:128*512))
   %integer i,j,col,row,k,np
{s}%integer time
{s}time = cputime
    LEA     -24(A7),A7           : 4FEF FFE8
    JSR     cputime              : 4EAC 0002
    MOVE.L  D0,time              : 2F00
   i=0;j=0
    CLR.L   i                    : 42AF 0018
    CLR.L   j                    : 42AF 0014
   %for col=1,1,511 %cycle
    CLR.L   col                  : 42AF 0010
L1  ADDQ.L  #1,col               : 52AF 0010
     %for row=2+i,2,124+i %cycle
    MOVEQ   #124,D0              : 707C
    ADD.L   i,D0                 : D0AF 0018
    MOVE.L  D0,576               : 2F00
    MOVE.L  i,row                : 2F6F 001C 0010
L3  MOVE.L  row,D0               : 202F 0010
    CMP.L   576,D0               : B097
    BEQ     L4                   : 6700 0000
    ADDQ.L  #2,row               : 54AF 0010
       k=row<<9+col
    MOVE.L  row,D0               : 202F 0010
    MOVEQ   #9,D1                : 7209
    LSL.L   D1,D0                : E3A8
    ADD.L   col,D0               : D0AF 0014
    MOVE.L  D0,k                 : 2F40 000C
       np=image(k-512)+image(k+512)
    MOVEA.L image,A0             : 206F 0020
    LEA     -512(A0),A0          : 41E8 FE00
    MOVE.B  0(A0,D0.L),D4        : 1830 0800
    MOVE.L  D4,D2                : 2404
    MOVEA.L image,A0             : 206F 0020
    LEA     512(A0),A0           : 41E8 0200
    MOVE.B  0(A0,D0.L),D4        : 1830 0800
    ADD.L   D4,D2                : D484
    MOVE.L  D2,np                : 2F42 0008
       %if j=0 %then np=np+image(k-1) %else np=np+image(k+1)
    MOVE.L  j,D3                 : 262F 0018
    BNE     L6                   : 6600 0000
    MOVEA.L image,A0             : 206F 0020
    MOVE.B  -1(A0,D0.L),D4       : 1830 08FF
    ADD.L   D4,np                : D9AF 0008
    BRA     L5                   : 6000 0000
L6  MOVEA.L image,A0             : 206F 0020
    MOVE.B  1(A0,D0.L),D4        : 1830 0801
    ADD.L   D4,np                : D9AF 0008
L5
       %if np=2 %or np=3 %then image(k)=1 %else image(k)=0
    MOVEQ   #2,D2                : 7402
    CMP.L   np,D2                : B4AF 0008
    BEQ     L7                   : 6700 0000
    MOVEQ   #3,D4                : 7803
    CMP.L   np,D4                : B8AF 0008
    BNE     L6                   : 6600 0000
L7  MOVE.B  #1,0(A0,D0.L)        : 11BC 0001 0800
    BRA     L5                   : 6000 0000
L6  CLR.B   0(A0,D0.L)           : 4230 0800
L5
     %repeat                          
    BRA     L3                   : 6000 0034
L4  ADDQ.L  #4,A7                : 588F
     %if j=0 %then j=1 %elsestart
    MOVE.L  j,D1                 : 222F 0014
    BNE     L4                   : 6600 0000
    MOVEQ   #1,D2                : 7401
    MOVE.L  D2,j                 : 2F42 0014
    BRA     L3                   : 6000 0000
L4
       %if i=1 %then i=0 %else i=1
    MOVEQ   #1,D2                : 7401
    CMP.L   i,D2                 : B4AF 0018
    BNE     L6                   : 6600 0000
    CLR.L   i                    : 42AF 0018
    BRA     L5                   : 6000 0000
L6  MOVE.L  D2,i                 : 2F42 0018
L5
       j=0
    CLR.L   j                    : 42AF 0014
     %finish
L3
   %repeat
L1  CMPI.L  #$01FF,col           : 0CAF 0000 01FF 0010
    BNE     L1                   : 6600 002B
{s}printstring("Fill image"); write(cputime-time, 5); newline
    LEA     (PC),A0              : 41FA 0CB6
    JSR     printstring          : 4EB8 3E6A
    JSR     cputime              : 4EAC 0002
    SUB.L   time,D0              : 9097
    MOVEQ   #5,D1                : 7205
    JSR     write                : 4EAC 0078
    BSR     newline              : 6100 00B5
%end
^   MOVE.L  A0,-(A7)             : 2F08
    LEA     32(A7),A7            : 4FEF 0020

