home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 7 / FreshFishVol7.bin / bbs / comm / atob-4.0.lha / ATOB / BTOA.ASM < prev    next >
Assembly Source File  |  1994-10-13  |  7KB  |  467 lines

  1. *Amiga BTOA.ASM 941013
  2. *Randy Lilly N3ET
  3. *For non-commercial use only
  4. *Encodes Binary to ASCII for Ham Radio Packet transmission.
  5. *Use ATOB (ASCII to Binary) to decode .AB files.
  6.  
  7. *This source is complete - no LIB or INCLUDES needed.
  8. *Suggest STACK 8000
  9.  
  10. *To assemble and link;
  11. * ASMB BTOA.ASM -O BTOA.O
  12. * ALINK BTOA.O TO BTOA
  13.  
  14.  NOPAGE
  15.  
  16. _LVOClose       EQU -$24
  17. _LVOExit        EQU -$90
  18. _LVOInput       EQU -$36
  19. _LVOOpen        EQU -$1E
  20. _LVOOpenLibrary EQU -$198
  21. _LVOOutput      EQU -$3C
  22. _LVORead        EQU -$2A
  23. _LVOWrite       EQU -$30
  24. _AbsExecBase equ 4
  25.  
  26. MAXLIN EQU 76
  27. RSIZE EQU 512
  28. WSIZE EQU 512
  29.  
  30. DATAS EQU 0
  31. CCNT EQU -1 B
  32. BCNT EQU -2 B
  33. WCNT EQU -4 W
  34. CEOR EQU -8  LB
  35. CSUM EQU -12 L
  36. CROT EQU -16 L
  37. RPNT EQU -20 L
  38. RCNT EQU -22 W
  39. WORD EQU -26 L
  40. RFILE EQU -30 L
  41. WFILE EQU -34 L
  42. INHAN EQU -38 L
  43. OUTHN EQU -42 L
  44. DATAE EQU OUTHN
  45.  
  46. ABNAM EQU DATAE-80
  47. FNAME EQU ABNAM-80
  48. WBUFF EQU FNAME-WSIZE
  49. RBUFF EQU WBUFF-RSIZE
  50.  
  51. START
  52.  LINK   A4,#RBUFF
  53.  LEA    DATAE(A4),A0
  54.  MOVEQ  #DATAS-DATAE,D3
  55. 1$
  56.  CLR.B  (A0)+
  57.  DBRA   D3,1$
  58.  
  59.  MOVE.L _AbsExecBase,A6
  60.  LEA    DOSNAM(PC),A1
  61.  CLR.L  D0
  62.  JSR    _LVOOpenLibrary(A6)
  63.  MOVE.L D0,A6
  64.  JSR    _LVOInput(A6)
  65.  MOVE.L D0,INHAN(A4)
  66.  BEQ    ABORT
  67.  JSR    _LVOOutput(A6)
  68.  MOVE.L D0,OUTHN(A4)
  69.  BEQ    ABORT
  70.  
  71.  LEA    INFILE(PC),A0
  72.  BSR    GNAM_CON
  73.  MOVE.L A0,D1
  74.  MOVE.L #1005,D2
  75.  JSR    _LVOOpen(A6)
  76.  MOVE.L D0,RFILE(A4)
  77.  BEQ    NREAD
  78.  
  79. ANAME;
  80.  LEA    FNAME(A4),A0
  81. 18$
  82.  LEA    ABNAM(A4),A1
  83.  MOVEQ  #76,D3
  84. 20$
  85.  CMP.B  #':',(A0)+
  86.  BEQ.S  18$
  87.  SUBQ.L #1,A0
  88.  CMP.B  #'/',(A0)+
  89.  BEQ.S  18$
  90.  SUBQ.L #1,A0
  91.  MOVE.B (A0)+,(A1)+
  92.  DBEQ   D3,20$
  93.  LEA    MABNAM(PC),A0
  94.  BSR    PLIN_CON
  95.  LEA    ABNAM(A4),A0
  96.  BSR    PLIN_CON
  97.  BSR    YESNO           ;(Y/N)
  98.  BNE.S  WNAME
  99.  LEA    MABNAM(PC),A0
  100.  BSR    PLIN_CON
  101.  LEA    ABNAM(A4),A0
  102.  BSR    GLIN_CON
  103.  LEA    ABNAM(A4),A0
  104.  TST.W  D0
  105.  BEQ    ENDIT
  106.  CLR.B  0(A0,D0.W)
  107.  
  108. WNAME;
  109.  LEA    FNAME(A4),A0
  110.  MOVEQ  #76,D3
  111. 40$
  112.  TST.B  (A0)+
  113.  DBEQ   D3,40$
  114.  MOVE.B #'.',-1(A0)
  115.  MOVE.B #'A',(A0)+
  116.  MOVE.B #'B',(A0)+
  117.  MOVE.B #0,(A0)
  118.  LEA    OUTFIL(PC),A0
  119.  BSR    PLIN_CON
  120.  LEA    FNAME(A4),A0
  121.  BSR    PLIN_CON
  122.  BSR    YESNO           ;(Y/N)
  123.  BEQ.S  60$
  124.  LEA    FNAME(A4),A0
  125.  BRA.S  65$
  126. 60$
  127.  LEA    OUTFIL(PC),A0
  128.  BSR    GNAM_CON
  129. 65$
  130.  MOVE.L A0,D1
  131.  MOVE.L #1006,D2
  132.  JSR    _LVOOpen(A6)
  133.  MOVE.L D0,WFILE(A4)
  134.  BEQ    NWRITE
  135.  
  136. CONVERT;
  137.  LEA    HEADER(PC),A0 ;xbtoa Begin
  138.  BSR    PLIN_FIL
  139.  LEA    ABNAM(A4),A0
  140.  BSR    PLIN_FIL
  141.  MOVEQ  #$A,D7
  142.  BSR    PCHR_FIL
  143.  
  144.  MOVEQ  #0,D6
  145. 70$
  146.  BSR    GCHR_FIL   ;Get a Character from READ file
  147.  BMI.S  80$
  148.  BSR    ENCODE     ;encode
  149.  ADDQ.L #1,D6
  150.  BRA    70$
  151.  
  152. 80$
  153.  TST.B  BCNT(A4)
  154.  BEQ.S  90$
  155.  MOVEQ  #0,D7
  156.  BSR    ENCODE     ;encode 0
  157.  BRA    80$
  158.  
  159. 90$
  160.  BSR    WFLUSH
  161. * "\nxbtoa End N %ld %lx E %lx S %lx R %lx\n",n,n,Ceor,Csum,Crot
  162.  LEA    RBUFF(A4),A0
  163.  MOVE.L D6,D0   ;Bytes in hex
  164.  BSR.S  HEXDEC
  165.  MOVE.L D6,D0   ;Bytes in decimal
  166.  BSR.S  HEXFIL
  167.  MOVE.B #' ',(A0)+
  168.  MOVE.B #'E',(A0)+
  169.  MOVE.L CEOR(A4),D0
  170.  BSR.S  HEXFIL
  171.  MOVE.B #' ',(A0)+
  172.  MOVE.B #'S',(A0)+
  173.  MOVE.L CSUM(A4),D0
  174.  BSR.S  HEXFIL
  175.  MOVE.B #' ',(A0)+
  176.  MOVE.B #'R',(A0)+
  177.  MOVE.L CROT(A4),D0
  178.  BSR.S  HEXFIL
  179.  MOVE.B #$A,(A0)+
  180.  MOVE.B #0,(A0)+
  181.  LEA    TRAIL(PC),A0
  182.  BSR    PLIN_FIL
  183.  LEA    RBUFF(A4),A0
  184.  BSR    PLIN_FIL
  185.  BRA.S  ENDIT
  186.  
  187.  
  188. HEXDEC ;Form 8 ASCII (DECIMAL) digits, leading 0's suppressed
  189.  DIVU   #10000,D0
  190.  MOVE.W D0,-(SP)
  191.  CLR.W  D0
  192.  SWAP   D0
  193.  CLR.L  D1
  194.  MOVEQ  #3,D3
  195. 1$
  196.  DIVU   #10,D0
  197.  SWAP   D0
  198.  OR.B   D0,D1
  199.  ROR.L  #4,D1
  200.  CLR.W  D0
  201.  SWAP   D0
  202.  DBRA   D3,1$
  203.  
  204.  MOVE.W (SP)+,D0 ;For 10k
  205.  MOVEQ  #3,D3
  206. 2$
  207.  DIVU   #10,D0   ;REM,DEC
  208.  SWAP   D0
  209.  OR.B   D0,D1
  210.  ROR.L  #4,D1    ;Rotate remainder
  211.  CLR.W  D0
  212.  SWAP   D0
  213.  DBRA   D3,2$
  214.  MOVE.L D1,D0
  215.  
  216. HEXFIL  ;Form 8 ASCII (HEX) digits, leading 0's suppressed
  217.  MOVE.B #' ',(A0)+
  218.  TST.L  D0
  219.  BNE.S  1$
  220.  MOVE.B #'0',(A0)+
  221.  RTS
  222.  
  223. 1$
  224.  MOVEQ  #0,D2 ;For leading 0's
  225.  MOVEQ  #7,D3
  226. 2$
  227.  ROL.L  #4,D0
  228.  MOVE.B D0,D1
  229.  AND.B  #$F,D1
  230.  SUB.B  D1,D2
  231.  BEQ.S  4$
  232.  ADD.B  #$30,D1
  233.  CMP.B  #$39,D1
  234.  BLE.S  3$
  235.  ADDQ.B #7,D1
  236. 3$
  237.  MOVE.B D1,(A0)+
  238. 4$
  239.  DBRA   D3,2$
  240.  RTS
  241.  
  242.  
  243. NWRITE
  244.  LEA    NOWRIT(PC),A0
  245.  BRA.S  ENDIT1
  246.  
  247. NREAD
  248.  LEA    NOREAD(PC),A0
  249. ENDIT1
  250.  BSR    PLIN_CON
  251.  
  252. ENDIT
  253.  MOVE.L RFILE(A4),D1
  254.  BEQ.S  1$
  255.  JSR    _LVOClose(A6)
  256. 1$
  257.  BSR    WFLUSH
  258.  MOVE.L WFILE(A4),D1
  259.  BEQ.S  ABORT
  260.  JSR    _LVOClose(A6)
  261. ABORT
  262.  JMP    _LVOExit(A6)
  263.  
  264.  
  265. ENCODE
  266.  EOR.L  D7,CEOR(A4) ;Ceor ^= c;
  267.  
  268.  MOVE.L D7,D0
  269.  ADD.L  CSUM(A4),D0 ;Csum +=c;
  270.  ADDQ.L #1,D0       ;Csum +=1;
  271.  MOVE.L D0,CSUM(A4)
  272.  
  273.  MOVE.L CROT(A4),D0 ;if ((Crot & 0x80000000L)) {
  274.  LSL.L  #1,D0       ;Crot <<=1;
  275.  BCC.S  1$
  276.  ADDQ.L #1,D0       ;Crot +=1;
  277. 1$
  278.  ADD.L  D7,D0       ;Crot +=c;
  279.  MOVE.L D0,CROT(A4)
  280.  
  281.  MOVE.L WORD(A4),D1
  282.  LSL.L  #8,D1       ;word <<=8;
  283.  OR.B   D7,D1       ;word |=c;
  284.  MOVE.L D1,WORD(A4)
  285.  
  286.  CMP.B  #3,BCNT(A4) ;if (bcount==3)
  287.  BNE.S  2$
  288.  
  289.  BSR.S  WORDOUT     ;wordout(word);
  290.  
  291.  CLR.B  BCNT(A4)    ;bcount=0;
  292.  RTS
  293.  
  294. 2$
  295.  ADDQ.B #1,BCNT(A4) ;bcount +=1;
  296.  RTS
  297.  
  298.  
  299. WORDOUT
  300.  MOVE.L D1,D7
  301.  BEQ.S  ZERO
  302.  
  303.  LEA    TAB85(PC),A5
  304.  MOVEQ  #3,D4
  305. 1$
  306.  MOVEQ  #0,D0
  307.  MOVEQ  #6,D3
  308. 2$
  309.  LSL.B  #1,D0
  310.  MOVE.L (A5)+,D1
  311.  CMP.L  D1,D7
  312.  BCS.S  3$
  313.  SUB.L  D1,D7
  314.  ADDQ.B #1,D0
  315. 3$
  316.  DBRA   D3,2$
  317.  MOVEM.L A5/D7,-(SP)
  318.  MOVE.B D0,D7
  319.  BSR.S   4$
  320.  MOVEM.L (SP)+,D7/A5
  321.  DBRA   D4,1$
  322. 4$
  323.  ADD.B  #'!',D7
  324.  BRA.S  BINOUT    ;Remainder byte
  325.  
  326.  
  327. ZERO
  328.  MOVEQ  #'z',D7
  329. ***
  330. BINOUT ;charout
  331. ***
  332.  BSR.S  PCHR_FIL        ;putc(c,outf);
  333.  ADDQ.B #1,CCNT(A4)     ;ccount += 1;
  334.  CMP.B  #MAXLIN,CCNT(A4) ;if (ccount==MAXLIN) {
  335.  BNE.S  1$
  336.  MOVEQ  #$A,D7          ;putc('\n',outf);
  337.  BSR.S  PCHR_FIL
  338.  CLR.B  CCNT(A4)        ;ccount = 0;
  339. 1$
  340.  RTS
  341.  
  342. ***
  343. PCHR_FIL ;D7 to W file
  344. ***
  345.  LEA    WBUFF(A4),A0
  346.  MOVE.W WCNT(A4),D0
  347.  MOVE.B D7,0(A0,D0.W)
  348.  ADDQ.W #1,D0
  349.  MOVE.W D0,WCNT(A4)
  350.  CMP.W  #WSIZE,D0
  351.  BNE.S  RTS1
  352.  
  353. ***
  354. WFLUSH ;write buffer to disk
  355. ***
  356.  MOVE.L WFILE(A4),D1
  357.  BEQ.S  RTS1
  358.  LEA    WBUFF(A4),A0
  359.  MOVE.L A0,D2
  360.  CLR.L  D3
  361.  MOVE.W WCNT(A4),D3
  362.  BEQ.S  RTS1
  363.  JSR    _LVOWrite(A6)
  364.  CLR.W  WCNT(A4)
  365.  TST.L  D0
  366.  BMI    ENDIT         ;Error
  367. RTS1    RTS
  368.  
  369.  
  370. ***
  371. RFILL ;Fill transmit buffer
  372. ***
  373.  MOVE.L RFILE(A4),D1
  374.  LEA    RBUFF(A4),A0
  375.  MOVE.L A0,RPNT(A4)
  376.  MOVE.L A0,D2
  377.  MOVEQ  #0,D3
  378.  MOVE.W #RSIZE,D3
  379.  JSR    _LVORead(A6)
  380.  MOVE.W D0,RCNT(A4)
  381.  BEQ.S  WRITE1   ;EOF
  382.  BMI    ENDIT    ;Error
  383. ***
  384. GCHR_FIL
  385. ***
  386.  TST.W  RCNT(A4)
  387.  BEQ.S  RFILL
  388.  MOVE.L RPNT(A4),A0
  389.  MOVEQ  #0,D7
  390.  MOVE.B (A0)+,D7
  391.  MOVE.L A0,RPNT(A4)
  392. WRITE1
  393.  SUBQ.W #1,RCNT(A4)
  394.  RTS
  395.  
  396.  
  397. ***
  398. GLIN_CON ;Get line of txt from console
  399. ***
  400.  MOVE.L INHAN(A4),D1
  401.  MOVE.L A0,D2
  402.  MOVEQ  #79,D3
  403.  JSR    _LVORead(A6)
  404.  SUBQ.L #1,D0
  405.  RTS
  406.  
  407. PLIN_CON
  408.  MOVE.L OUTHN(A4),D1
  409.  BRA.S  PLIN
  410.  
  411. PLIN_FIL
  412.  MOVE.L WFILE(A4),D1
  413. PLIN
  414.  MOVE.L A0,D2
  415.  MOVEQ  #-1,D3
  416. 1$
  417.  TST.B  (A0)+
  418.  DBEQ   D3,1$
  419.  NOT.L  D3
  420.  JMP    _LVOWrite(A6)
  421.  
  422.  
  423. GNAM_CON
  424.  BSR    PLIN_CON
  425.  LEA    FNAME(A4),A0
  426.  BSR    GLIN_CON
  427.  LEA    FNAME(A4),A0
  428.  CLR.B  0(A0,D0.W)
  429.  RTS
  430.  
  431. YESNO
  432.  LEA    CONT(PC),A0    ;Go (Y/N)
  433.  BSR    PLIN_CON
  434.  LEA    WBUFF(A4),A0
  435.  BSR    GLIN_CON
  436.  MOVE.B WBUFF(A4),D0
  437.  AND.B  #$5F,D0
  438.  CMP.B  #'N',D0
  439.  RTS
  440.  
  441.  
  442. INFILE DC.B 'BTOA 941013 - Binary to ASCII converter',$A,$A
  443.        DC.B ' READ file: ',0
  444. OUTFIL DC.B 'WRITE file: ',0
  445. MABNAM DC.B ' ATOB name: ',0
  446. NOREAD DC.B 'No READ',$A,0
  447. NOWRIT DC.B 'No WRITE',$A,0
  448. HEADER DC.B 'xbtoa Begin ',0
  449. TRAIL  DC.B $A,'xbtoa End N',0
  450. CONT   DC.B ' (Y/N) ',0
  451.  
  452. *Powers of 85 for 32 bit division.
  453. P1 EQU 85
  454. P2 EQU P1*85
  455. P3 EQU P2*85
  456. P4 EQU P3*85
  457.  
  458.  CNOP 0,2
  459. TAB85
  460.  DC.L 64*(P4),32*(P4),16*(P4),8*(P4),4*(P4),2*(P4),P4
  461.  DC.L 64*(P3),32*(P3),16*(P3),8*(P3),4*(P3),2*(P3),P3
  462.  DC.L 64*(P2),32*(P2),16*(P2),8*(P2),4*(P2),2*(P2),P2
  463.  DC.L 64*(P1),32*(P1),16*(P1),8*(P1),4*(P1),2*(P1),P1
  464. DOSNAM DC.B  'dos.library',0
  465.  END
  466.  
  467.