home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 2 / goldfish_vol2_cd1.bin / files / comm / misc / atob / atob.asm < prev    next >
Assembly Source File  |  1994-10-13  |  8KB  |  525 lines

  1. *Amiga ATOB.ASM 941013
  2. *Randy Lilly  N3ET
  3. *For non-commercial use only
  4. *Decodes ASCII to BINARY (inverse of BTOA).
  5.  
  6. *This source is complete - no LIB or INCLUDES needed.
  7. *Suggest STACK 8000
  8.  
  9. *To assemble and link;
  10. * ASSEM ATOB.ASM -O ATOB.O
  11. * ALINK ATOB.O TO ATOB
  12.  
  13.  NOPAGE
  14.  PLEN 85
  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. _SPRINT         EQU -522
  25. _AbsExecBase equ 4
  26.  
  27. NSIZE EQU 80
  28. RSIZE EQU 512
  29. WSIZE EQU 512
  30.  
  31. * atob: vers 4.0   BIN=(C-!)*85   (((W*2)+1)*16)+W=85
  32.  
  33. CCNT EQU -1 B
  34. BCNT EQU -2 B
  35. WCNT EQU -4 W
  36. CEOR EQU -8 L
  37. CSUM EQU -12 L
  38. CROT EQU -16 L
  39. RPNT EQU -20 L
  40. RCNT EQU -22 W
  41. WORD EQU -26 L
  42. RFILE EQU -30 L
  43. WFILE EQU -34 L
  44. INHAN EQU -38 L
  45. OUTHAN EQU -42 L
  46. TEMP  EQU -46
  47. DATAE EQU TEMP
  48.  
  49. FNAME EQU TEMP-NSIZE
  50. WBUFF EQU FNAME-WSIZE
  51. RBUFF EQU WBUFF-RSIZE
  52.  
  53.  
  54. START
  55.  LINK   A4,#RBUFF
  56.  LEA    DATAE(A4),A0
  57.  MOVEQ  #-DATAE,D3
  58. 1$
  59.  CLR.B  (A0)+
  60.  DBRA   D3,1$
  61.  MOVEQ  #' ',D4
  62.  MOVE.L _AbsExecBase,A6
  63.  LEA    DOSNAM(PC),A1
  64.  CLR.L  D0              ;any version
  65.  JSR    _LVOOpenLibrary(A6)
  66.  MOVE.L D0,A6
  67.  JSR    _LVOInput(A6)   ;already open
  68.  MOVE.L D0,INHAN(A4)
  69.  JSR    _LVOOutput(A6)  ;already open
  70.  MOVE.L D0,OUTHAN(A4)
  71.  
  72.  LEA    INFILE(PC),A0
  73.  BSR    GNAM_CON
  74.  MOVE.L A0,D1
  75.  MOVE.L #1005,D2
  76.  JSR    _LVOOpen(A6)
  77.  MOVE.L D0,RFILE(A4)
  78.  BEQ    NREAD
  79.  CLR.B  FNAME(A4)
  80.  
  81. HSERCH
  82.  LEA    HEADER(PC),A3
  83. 1$
  84.  BSR    GCHR_FIL
  85.  BMI    NOHEAD
  86.  CMP.B  (A3)+,D7
  87.  BNE.S  HSERCH
  88.  MOVE.B (A3),D7
  89.  BNE.S  1$
  90.  BSR    GCHR_FIL
  91.  BMI    BDHEAD
  92.  CMP.B  D4,D7
  93.  BGT.S  HSERCH
  94.  BNE.S  GNAME
  95.  MOVEQ  #NSIZE-1,D6
  96.  LEA    FNAME(A4),A5
  97. 2$
  98.  BSR    GCHR_FIL
  99.  BMI    BDHEAD
  100.  CMP.B  D4,D7
  101.  BLE.S  GNAME
  102.  MOVE.B D7,(A5)+
  103.  CLR.B  (A5)
  104.  DBRA   D6,2$
  105.  BRA    BDHEAD
  106.  
  107. GNAME
  108.  LEA    OUTFIL(PC),A0
  109.  BSR    PLIN_CON
  110.  LEA    FNAME(A4),A0
  111.  MOVE.B (A0),D0
  112.  BEQ.S  GNEW1
  113.  BSR    PLIN_CON
  114.  LEA    CONT(PC),A0     ;(Y/N)
  115.  BSR    PLIN_CON
  116.  LEA    WBUFF(A4),A0
  117.  BSR    GLIN_CON
  118.  MOVE.B WBUFF(A4),D0
  119.  AND.B  #$5F,D0
  120.  CMP.B  #'N',D0
  121.  BNE.S  OPENW
  122. GNEW
  123.  LEA    OUTFIL(PC),A0
  124. GNEW1
  125.  BSR    GNAM_CON
  126. OPENW
  127.  LEA    FNAME(A4),A0
  128.  MOVE.L A0,D1
  129.  MOVE.L #1006,D2
  130.  JSR    _LVOOpen(A6)
  131.  MOVE.L D0,WFILE(A4)
  132.  BEQ    NWRITE
  133. GDATA
  134.  BSR    GCHR_FIL
  135.  BMI    NOTAIL          ;EOF
  136.  CMP.B  #$A,D7
  137.  BEQ    GDATA
  138.  CMP.B  #'x',D7
  139.  BEQ.S  TSERCH
  140.  BSR    DECODE
  141.  BRA    GDATA
  142.  
  143. TSERCH
  144.  LEA    FNAME(A4),A5
  145.  MOVEQ  #NSIZE-2,D6
  146.  MOVE.B #'x',(A5)+
  147.  LEA    TRAIL+1(PC),A3
  148. 1$
  149.  BSR    GCHR_FIL
  150.  BMI    BDTAIL
  151.  MOVE.B D7,(A5)+
  152.  CMP.B  (A3)+,D7
  153.  BNE    BDTAIL
  154.  MOVE.B (A3),D7
  155.  DBEQ   D6,1$
  156.  MOVE.L A5,TEMP(A4)
  157.  
  158. DOTAIL
  159. 1$
  160.  BSR    GCHR_FIL
  161.  BMI.S  3$
  162.  CMP.B  #'Z',D7
  163.  BLE.S  2$
  164.  AND.B  #$5F,D7
  165. 2$
  166.  MOVE.B D7,(A5)+
  167.  CMP.B  D4,D7
  168.  DBLT   D6,1$
  169.  
  170. 3$
  171.  CLR.B  (A5)
  172.  MOVEQ  #NSIZE-1,D6
  173.  MOVE.L TEMP(A4),A0
  174. SPCR
  175.  CMP.B  (A0)+,D4
  176.  DBEQ   D6,SPCR
  177.  BNE    BDTAIL
  178.  
  179.  MOVEQ  #7,D6
  180.  MOVEQ  #0,D0
  181. 1$
  182.  MOVE.B (A0)+,D7
  183.  CMP.B  D4,D7
  184.  BEQ.S  3$
  185.  SUB.B  #'0',D7
  186.  BMI    BDCNT
  187.  CMP.B  #9,D7
  188.  BLE.S  2$
  189.  SUBQ.B #7,D7
  190.  BMI    BDCNT
  191.  CMP.B  #$F,D7
  192.  BGT    BDCNT
  193. 2$
  194.  LSL.L  #4,D0
  195.  ADD.B  D7,D0
  196.  DBRA   D6,1$
  197. 3$
  198.  MOVE.L D0,D6
  199.  
  200.  LEA    RBUFF(A4),A0
  201.  LEA    TRAIL(PC),A1
  202. MOVIT
  203.  MOVE.B (A1)+,(A0)+
  204.  BNE    MOVIT
  205.  LEA    -2(A0),A0
  206.  
  207. * xbtoa End N %ld %lx E %lx S %lx R %lx\n",n,n,Ceor,Csum,Crot
  208. * MOVE.L D6,D0          ;Bytes in hex
  209.  BSR.S  HEXDEC
  210.  MOVE.L D6,D0           ;Bytes in decimal
  211.  BSR.S  HEXFIL
  212.  MOVE.B D4,(A0)+
  213.  MOVE.B #'E',(A0)+
  214.  MOVE.L CEOR(A4),D0
  215.  BSR.S  HEXFIL
  216.  MOVE.B D4,(A0)+
  217.  MOVE.B #'S',(A0)+
  218.  MOVE.L CSUM(A4),D0
  219.  BSR.S  HEXFIL
  220.  MOVE.B D4,(A0)+
  221.  MOVE.B #'R',(A0)+
  222.  MOVE.L CROT(A4),D0
  223.  BSR.S  HEXFIL
  224.  CLR.B  (A0)+
  225.  
  226.  LEA    FNAME(A4),A0
  227.  LEA    RBUFF(A4),A1
  228. TCHK
  229.  CMP.B  (A0)+,(A1)+
  230.  BEQ    TCHK
  231.  TST.B  -(A1)
  232.  BEQ    ENDIT
  233.  
  234.  LEA    FNAME(A4),A0
  235.  BSR    PLIN_CON
  236.  LEA    RBUFF(A4),A0
  237.  BSR    PLIN_CON
  238.  LEA    BDATA(PC),A0
  239.  BRA    ENDIT1
  240.  
  241.  
  242. HEXDEC ;Form 8 ASCII (DECIMAL) digits, leading 0's suppressed
  243.  DIVU   #10000,D0
  244.  MOVE.W D0,-(SP)
  245.  CLR.W  D0
  246.  SWAP   D0
  247.  CLR.L  D1
  248.  BSR.S  DIVIDE
  249.  
  250.  MOVE.W (SP)+,D0 ;For 10k
  251.  BSR.S  DIVIDE
  252.  MOVE.L D1,D0
  253.  
  254. HEXFIL  ;Form 8 ASCII (HEX) digits, leading 0's suppressed
  255.  MOVE.B D4,(A0)+
  256.  TST.L  D0
  257.  BNE.S  1$
  258.  MOVE.B #'0',(A0)+
  259.  RTS
  260.  
  261. 1$
  262.  MOVEQ  #0,D2   ;For leading 0's
  263.  MOVEQ  #7,D3
  264. 2$
  265.  ROL.L  #4,D0
  266.  MOVE.B D0,D1
  267.  AND.B  #$F,D1
  268.  SUB.B  D1,D2
  269.  BEQ.S  4$
  270.  ADD.B  #$30,D1
  271.  CMP.B  #$39,D1
  272.  BLE.S  3$
  273.  ADDQ.B #7,D1
  274. 3$
  275.  MOVE.B D1,(A0)+
  276. 4$
  277.  DBRA   D3,2$
  278.  RTS
  279.  
  280. DIVIDE
  281.  MOVEQ  #3,D3
  282. 1$
  283.  DIVU   #10,D0  ;REM,DEC
  284.  SWAP   D0
  285.  OR.B   D0,D1
  286.  ROR.L  #4,D1   ;Rotate remainder
  287.  CLR.W  D0
  288.  SWAP   D0
  289.  DBRA   D3,1$
  290.  RTS
  291.  
  292. BDCNT
  293.  LEA    BCONT(PC),A0
  294.  BRA.S  ENDIT1
  295.  
  296. BDHEAD
  297.  LEA    BHEAD(PC),A0
  298.  BRA.S  ENDIT1
  299.  
  300. BDTAIL
  301.  LEA    BTAIL(PC),A0
  302.  BRA.S  ENDIT1
  303.  
  304. NOHEAD
  305.  LEA    NHEAD(PC),A0
  306.  BRA.S  ENDIT1
  307.  
  308. NOTAIL
  309.  LEA    NTAIL(PC),A0
  310.  BRA.S  ENDIT1
  311.  
  312. NWRITE
  313.  LEA    NOWRIT(PC),A0
  314.  BRA.S  ENDIT1
  315.  
  316. NREAD
  317.  LEA    NOREAD(PC),A0
  318.  BRA.S  ENDIT1
  319.  
  320. BDCHR
  321.  ADD.B  #'!',D7
  322.  LEA    BCHR(PC),A0     ;Input char out of range
  323.  MOVE.B D7,(A0)
  324.  BRA.S  ENDIT1
  325.  
  326. BDZER
  327.  LEA    ZODD(PC),A0     ;z on odd byte
  328. ENDIT1
  329.  BSR    PLIN_CON
  330.  
  331. ENDIT
  332.  MOVE.L RFILE(A4),D1
  333.  BEQ.S  1$
  334.  JSR    _LVOClose(A6)
  335. 1$
  336.  BSR    WFLUSH
  337.  MOVE.L WFILE(A4),D1
  338.  BEQ.S  ABORT
  339.  JSR    _LVOClose(A6)
  340. ABORT
  341.  JMP    _LVOExit(A6)
  342.  
  343.  
  344. ***
  345. DECODE ;D7
  346. ***
  347.  CMP.B  #'z',D7
  348.  BNE.S  1$
  349.  TST.B  BCNT(A4)
  350.  BEQ.S  2$
  351.  BRA    BDZER
  352.  
  353. 1$
  354.  SUB.B  #'!',D7
  355.  BMI    BDCHR
  356.  CMP.B  #85,D7
  357.  BGE    BDCHR
  358.  MOVE.B BCNT(A4),D0
  359.  BEQ.S  3$
  360.  
  361.  MOVE.L WORD(A4),D0
  362.  MOVE.L D0,D1
  363.  ASL.L  #2,D0
  364.  ADD.L  D1,D0   ;W*5
  365.  
  366.  MOVE.L D0,D1
  367.  ASL.L  #4,D0   ;W(5*16)
  368.  ADD.L  D1,D0   ;W((5*16)+5)
  369.  
  370.  ADD.L  D7,D0
  371.  MOVE.L D0,WORD(A4)
  372.  CMP.B  #4,BCNT(A4)
  373.  BLT.S  4$
  374. 2$
  375.  MOVE.B WORD(A4),D7
  376.  BSR.S  BYTOUT
  377.  MOVE.B WORD+1(A4),D7
  378.  BSR.S  BYTOUT
  379.  MOVE.B WORD+2(A4),D7
  380.  BSR.S  BYTOUT
  381.  MOVE.B WORD+3(A4),D7
  382.  BSR.S  BYTOUT
  383.  
  384.  CLR.L  WORD(A4)
  385.  CLR.B  BCNT(A4)
  386.  RTS
  387.  
  388. 3$
  389.  MOVE.L D7,WORD(A4)
  390. 4$
  391.  ADDQ.B #1,BCNT(A4)
  392.  RTS
  393.  
  394. ***
  395. BYTOUT
  396. ***
  397.  AND.L  #$FF,D7
  398.  EOR.L  D7,CEOR(A4)
  399.  
  400.  MOVE.L D7,D0
  401.  ADD.L  CSUM(A4),D0
  402.  ADDQ.L #1,D0
  403.  MOVE.L D0,CSUM(A4)
  404.  
  405.  MOVE.L CROT(A4),D0
  406.  LSL.L  #1,D0
  407.  BCC.S  1$
  408.  ADDQ.L #1,D0
  409. 1$
  410.  ADD.L  D7,D0
  411.  MOVE.L D0,CROT(A4)
  412.  BRA.S  PCHR_FIL
  413.  
  414.  
  415. ***
  416. GLIN_CON ;Get line from console
  417. ***
  418.  MOVE.L INHAN(A4),D1
  419.  MOVE.L A0,D2
  420.  MOVEQ  #NSIZE,D3
  421.  JSR    _LVORead(A6)
  422.  SUBQ.L #1,D0
  423.  RTS
  424.  
  425.  
  426. ***
  427. PLIN_CON        ;*A0
  428. ***
  429.  MOVE.L OUTHAN(A4),D1
  430.  MOVE.L A0,D2
  431.  MOVEQ  #-1,D3
  432. 1$
  433.  TST.B  (A0)+
  434.  DBEQ   D3,1$
  435.  NOT.L  D3
  436.  JMP    _LVOWrite(A6)
  437.  
  438.  
  439. ***
  440. PCHR_FIL ;D7 to W file
  441. ***
  442.  LEA    WBUFF(A4),A0
  443.  MOVE.W WCNT(A4),D0
  444.  MOVE.B D7,0(A0,D0.W)
  445.  ADDQ.W #1,D0
  446.  MOVE.W D0,WCNT(A4)
  447.  CMP.W  #WSIZE,D0
  448.  BNE.S  RTS1
  449.  
  450. ***
  451. WFLUSH ;write buffer to disk
  452. ***
  453.  MOVE.L WFILE(A4),D1
  454.  BEQ.S  RTS1
  455.  LEA    WBUFF(A4),A0
  456.  MOVE.L A0,D2
  457.  CLR.L  D3
  458.  MOVE.W WCNT(A4),D3
  459.  BEQ.S  RTS1
  460.  JSR    _LVOWrite(A6)
  461.  CLR.W  WCNT(A4)
  462.  TST.L  D0
  463.  BMI    ENDIT           ;Error
  464. RTS1    RTS
  465.  
  466.  
  467. ***
  468. RFILL ;Fill Read buffer
  469. ***
  470.  MOVE.L RFILE(A4),D1
  471.  LEA    RBUFF(A4),A0
  472.  MOVE.L A0,RPNT(A4)
  473.  MOVE.L A0,D2
  474.  MOVEQ  #0,D3
  475.  MOVE.W #RSIZE,D3
  476.  JSR    _LVORead(A6)
  477.  MOVE.W D0,RCNT(A4)
  478.  BEQ.S  REOF            ;EOF
  479.  BMI    ENDIT           ;Error
  480.  
  481. ***
  482. GCHR_FIL ;D7
  483. ***
  484.  TST.W  RCNT(A4)
  485.  BEQ.S  RFILL
  486.  MOVE.L RPNT(A4),A0
  487.  MOVEQ  #0,D7
  488.  MOVE.B (A0)+,D7
  489.  MOVE.L A0,RPNT(A4)
  490. REOF
  491.  SUBQ.W #1,RCNT(A4)
  492.  RTS
  493.  
  494. ***
  495. GNAM_CON ;Get File name from console
  496. ***
  497.  BSR    PLIN_CON
  498.  LEA    FNAME(A4),A0
  499.  BSR    GLIN_CON
  500.  LEA    FNAME(A4),A0
  501.  CLR.B  0(A0,D0.W)
  502.  RTS
  503.  
  504. * SECTION DATA
  505. DOSNAM DC.B 'dos.library',0
  506. ZODD  DC.B 'z on odd byte',$A,0
  507. BCHR  DC.B '  Char out of range',$A,0
  508. NHEAD DC.B 'No header',$A,0
  509. NTAIL DC.B 'No trailer',$A,0
  510. BHEAD DC.B 'Bad header',$A,0
  511. BTAIL DC.B 'Bad trailer',$A,0
  512. BCONT DC.B 'Bad count',$A,0
  513. BDATA DC.B $A,'Trailer mismatch',$A,0
  514.  
  515. INFILE DC.B 'ATOB 941013 - ASCII to Binary converter',$A,$A
  516.        DC.B ' READ file: ',0
  517. OUTFIL DC.B 'WRITE file: ',0
  518. CONT   DC.B ' (Y/N) ',0
  519. NOREAD DC.B 'No READ',$A,0
  520. NOWRIT DC.B 'No WRITE',$A,0
  521. HEADER DC.B 'xbtoa Begin',0
  522. TRAIL  DC.B 'xbtoa End N ',0
  523.  END
  524.  
  525.