program t1 ! Example to illustrate subroutines packtext77() and unpacktext77(). ! The mp_* routines do multiple-precision aritmetic ! Compile and execute as follows: ! gfortran -o t1 t1.f90 ! t1 "TNX JOE 73 GL" ! TNX BOB 73 GL ! 01100011111011011100111011100010101001001010111000000111111101010000000 ! TNX BOB 73 GL character*13 c13,c13a character*71 c71 if(iargc().ne.1) then print*,'Enter a 13-character message in quotes' go to 999 endif call getarg(1,c13) call packtext77(c13,c71) call unpacktext77(c71,c13a) print*,c13 print*,c71 print*,c13 999 end program t1 subroutine packtext77(c13,c71) character*13 c13,w character*71 c71 character*42 c character*1 qa(10),qb(10) data c/' 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+-./?'/ call mp_short_init qa=char(0) w=adjustr(c13) do i=1,13 j=index(c,w(i:i))-1 if(j.lt.0) j=0 call mp_short_mult(qb,qa(2:10),9,42) !qb(1:9)=42*qa(2:9) call mp_short_add(qa,qb(2:10),9,j) !qa(1:9)=qb(2:9)+j enddo write(c71,1010) qa(2:10) 1010 format(b7.7,8b8.8) return end subroutine packtext77 subroutine unpacktext77(c71,c13) integer*1 ia(10) character*1 qa(10),qb(10) character*13 c13 character*71 c71 character*42 c equivalence (qa,ia),(qb,ib) data c/' 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+-./?'/ qa(1)=char(0) read(c71,1010) qa(2:10) 1010 format(b7.7,8b8.8) do i=13,1,-1 call mp_short_div(qb,qa(2:10),9,42,ir) c13(i:i)=c(ir+1:ir+1) qa(2:10)=qb(1:9) enddo return end subroutine unpacktext77 subroutine mp_short_ops(w,u) character*1 w(*),u(*) integer i,ireg,j,n,ir,iv,ii1,ii2 character*1 creg(4) save ii1,ii2 equivalence (ireg,creg) entry mp_short_init ireg=256*ichar('2')+ichar('1') do j=1,4 if (creg(j).eq.'1') ii1=j if (creg(j).eq.'2') ii2=j enddo return entry mp_short_add(w,u,n,iv) ireg=256*iv do j=n,1,-1 ireg=ichar(u(j))+ichar(creg(ii2)) w(j+1)=creg(ii1) enddo w(1)=creg(ii2) return entry mp_short_mult(w,u,n,iv) ireg=0 do j=n,1,-1 ireg=ichar(u(j))*iv+ichar(creg(ii2)) w(j+1)=creg(ii1) enddo w(1)=creg(ii2) return entry mp_short_div(w,u,n,iv,ir) ir=0 do j=1,n i=256*ir+ichar(u(j)) w(j)=char(i/iv) ir=mod(i,iv) enddo return return end subroutine mp_short_ops