home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / reform / reform.asm < prev   
Assembly Source File  |  1993-07-23  |  21KB  |  660 lines

  1. ;             REFORMAT ASM SOURCE
  2. ;
  3. ;             reformat existing asm source code
  4. ;             into preferred tab stops.
  5. ;
  6. ;             all chars outside of quotes are set to lower case
  7. ;
  8. ;             DISCLAIMER
  9. ;             This is an old pgm, uploaded 7/93 by request
  10. ;             Taking a fast look, there are things I would now do
  11. ;             differently. But it works for me.
  12. ;             If run with a single filename, it updates in place!
  13. ;             "Handyman's special"
  14. ;
  15. ;                     Sandy Gant
  16. ;-----------------------------------------------------------
  17.  
  18.               .MODEL  SMALL
  19.               .stack  100h
  20. code          segment para public 'code'
  21.               assume  cs:code, ds:nothing
  22. ;-----------------------------------------------------------
  23.  
  24. inrec         db      160 dup(0)      ;rec in buffer
  25. inrecaddr     dw      inrec
  26. inreclen      dw      0
  27. outrec        db      160 dup(0)      ;reformatted rec
  28. outrecaddr    dw      outrec
  29. outreclen     dw      0
  30.  
  31. cmdptr        dw      0
  32. cmdlen        dw      0
  33. eof           db      0
  34. filespec      db      160 dup(0)
  35. inspec        db      160 dup(0)
  36. outspec       db      'retab.tmp',0
  37. inctr         dw      0
  38. inhandle      dw      255
  39. opsw          db      0
  40. outhandle     dw      255
  41. physlen       dw      0
  42. psp           dw      0
  43. quotesw       db      0
  44. rba           dw      2 dup(0)
  45. readlen       equ     110
  46.  
  47. errmsg1       db      13,10,"File not found",13,10,"$"
  48. errmsg2       db      13,10,"Disk full",13,10,"$"
  49. errmsg3       db      13,10,"Usage:  REFORM file1  is updated",13,10,"$"
  50. ;-----------------------------------------------------------
  51. ;-----------------------------------------------------------
  52.  
  53. start:
  54.               mov     ax, cs
  55.               mov     ds, ax
  56.               mov     psp, es         ;psp segment
  57.               mov     es, ax
  58.               call    parse           ;open files
  59. @@:
  60.               call    getrec        ;rec in si/recaddr, len in cx/reclen
  61.               cmp     eof, 0
  62.               jne     eoj
  63.               call    reform
  64.               call    putrec
  65.               jmp     @b
  66. eoj:
  67.               call    close
  68. abort:
  69.               mov     ax, 4c00h       ;eoj
  70.               int     21h
  71. ;.......................................................
  72.  
  73. reform:
  74.               mov     opsw, 0
  75.               sub     cx, 2           ;dont count cr/lf
  76.               ja      @f
  77.               mov     outreclen, 0
  78.               ret
  79. @@:
  80.               mov     quotesw, 0      ;init
  81.               mov     di, outrecaddr
  82.               mov     al, 0[si]
  83.               cmp     al, ' '         ;labeled
  84.               je      b1              ;no
  85.  
  86.               ;intercept db or dw in col 1  ;9/8/89
  87.               cmp     word ptr [si], 'bd'
  88.               je      @f
  89.               cmp     word ptr [si], 'BD'
  90.               je      @f
  91.               cmp     word ptr [si], 'wd'
  92.               je      @f
  93.               cmp     word ptr [si], 'WD'
  94.               jne     lbl
  95. @@:
  96.               cmp     byte ptr 2[si], ' '
  97.               je      b1              ;yes
  98.  
  99.               ;move label
  100. lbl:          mov     al, 0[si]
  101.               cmp     al, ' '
  102.               je      b1
  103.               cmp     al, ';'
  104.               je      jneat           ;straight copy
  105.               cmp     al, 'A'         ;to l/c
  106.               jb      @f
  107.               cmp     al, 'Z'
  108.               ja      @f
  109.               or      al, 20h
  110. @@:           stosb
  111.               inc     si
  112.               loop    lbl
  113.               jmp     dun
  114. b1:
  115.               ;skip first blank string (after label)
  116. @@:           mov     al, 0[si]
  117.               cmp     al, ' '
  118.               jne     @f
  119.               inc     si
  120.               loop    @b
  121. jdun:         jmp     dun
  122. @@:
  123.               ;add blanks thru 14; min=1
  124.               push    cx
  125.               mov     cx, 14
  126.               add     cx, outrecaddr
  127.               sub     cx, di
  128.               ja      @f
  129.               mov     cx, 1
  130. @@:           mov     al, ' '
  131.               rep     stosb
  132.               pop     cx
  133.  
  134.               ;si = opcode
  135. cod:          mov     al, 0[si]
  136.               cmp     al, ' '
  137.               je      b2
  138.               cmp     al, ';'
  139.               je      jneat           ;straight copy
  140.               cmp     al, 'A'         ;to l/c
  141.               jb      @f
  142.               cmp     al, 'Z'
  143.               ja      @f
  144.               or      al, 20h
  145. @@:           stosb
  146.               inc     si
  147.               loop    cod
  148.               jmp     dun
  149. jneat:        jmp     neat
  150. b2:
  151.               ;[si] = blank after opcode
  152. @@:           mov     al, 0[si]
  153.               cmp     al, ' '
  154.               jne     @f
  155.               inc     si
  156.               loop    @b
  157.               jmp     dun
  158. @@:
  159.               ;[si] = field after opcode
  160.               ;add blanks thru 22; min=1
  161.               push    cx
  162.               mov     cx, 22
  163.               add     cx, outrecaddr
  164.               sub     cx, di
  165.               ja      @f
  166.               mov     cx, 1
  167. @@:           mov     al, ' '
  168.               rep     stosb
  169.               pop     cx
  170.  
  171.               ;si = operands or semi
  172.               ;copy everything until semi
  173.               ;but no blanks beyond 38
  174.               mov     dx, di
  175.               sub     dx, outrecaddr  ;output len
  176. op:           mov     al, 0[si]
  177.               cmp     al, ';'
  178.               jne     @f
  179.               cmp     byte ptr -1[si], "'"  ;  '; is not ;
  180.               je      @f
  181.               cmp     byte ptr -1[si], '"'  ;  "; is not ;
  182.               je      @f
  183.               jmp     sp38
  184. @@:           cmp     al, ' '
  185.               jne     op20
  186.               cmp     dx, 38
  187.               jb      op20
  188.  
  189.               ;skip blanks if next nonblank is semi
  190.               push    cx
  191.               mov     bx, si
  192. @@:           cmp     byte ptr 0[bx], ' '
  193.               jne     @f
  194.               inc     bx
  195.               loop    @b
  196.               pop     cx
  197.               jmp     op20
  198. @@:           pop     cx
  199.               cmp     byte ptr 0[bx], ';'
  200.               jne     op20            ;it's not
  201.               cmp     byte ptr -1[bx], "'"  ;'; is not ;
  202.               je      op20
  203.               cmp     byte ptr -1[bx], '"'  ;"; is not ;
  204.               je      op20
  205.               add     cx, si          ;skip blanks
  206.               sub     cx, bx
  207.               mov     si, bx
  208.               xor     dx, dx
  209.  
  210.               cmp     word ptr -2[di], '  '  ;need 2 preceding blanks
  211.               je      @f
  212.               mov     al, ' '
  213.               stosb
  214.               cmp     byte ptr -2[di], ' '
  215.               je      @f
  216.               stosb
  217. @@:           mov     al, 0[si]
  218. op20:
  219.               ;convert to l/c
  220.               cmp     al, '"'         ;test for immediate chars
  221.               je      op21            ;yes
  222.               cmp     al, "'"
  223.               jne     op24            ;no
  224. op21:         cmp     quotesw, 0      ;starting or ending
  225.               je      op23            ;starting
  226.               dec     quotesw         ;ending- reset
  227.               jmp     short op25
  228. op23:         inc     quotesw
  229.               jmp     short op25
  230. op24:         cmp     quotesw, 0
  231.               jne     op25
  232.               cmp     al, 'A'
  233.               jb      op25
  234.               cmp     al, 'Z'
  235.               ja      op25
  236.               or      al, 20h         ;to lower case
  237. op25:         stosb
  238.  
  239.               ;add space after comma if needed
  240.               cmp     al, ','         ;comma
  241.               jne     @f              ;no
  242.               cmp     quotesw, 0      ;inside a quote
  243.               jne     @f              ;yes
  244.               cmp     byte ptr 1[si], ' '  ;following space
  245.               je      @f              ;yes- do nothing
  246.               mov     byte ptr 0[di], ' '
  247.               inc     di
  248.               inc     dx
  249. @@:
  250.               inc     si
  251.               inc     dx
  252.               dec     cx
  253.               jz      @f
  254.               jmp     op
  255. @@:           jmp     dun
  256. sp38:
  257.               ;add blanks thru 38; min=1
  258.               push    ax
  259.               push    cx
  260.               mov     cx, 38
  261.               add     cx, outrecaddr
  262.               sub     cx, di
  263.               ja      @f
  264.               mov     cx, 1
  265.               cmp     byte ptr -1[di], ' '  ;prev char bl
  266.               jne     @f
  267.               dec     cx              ;no fill
  268. @@:           mov     al, ' '
  269.               rep     stosb
  270.               pop     cx
  271.               pop     ax
  272.  
  273.               ;copy remainder as-is
  274. neat:
  275.               mov     quotesw, 0
  276. neatnext:     lodsb
  277.               cmp     al, 13
  278.               je      dun
  279.               cmp     al, '"'         ;test for immediate chars
  280.               je      neat21          ;yes
  281.               cmp     al, "'"
  282.               jne     neat24          ;no
  283. neat21:       cmp     quotesw, 0
  284.               je      neat23          ;starting
  285.               dec     quotesw
  286.               jmp     short neat25
  287. neat23:       inc     quotesw
  288.               jmp     short neat25
  289. neat24:       cmp     quotesw, 0
  290.               jne     neat25
  291.               cmp     al, 'A'
  292.               jb      neat25
  293.               cmp     al, 'Z'
  294.               ja      neat25
  295.               or      al, 20h         ;to lower case
  296. neat25:       stosb
  297.               jmp     neatnext
  298. dun:
  299.               sub     di, outrecaddr
  300.               mov     outreclen, di
  301.  
  302.               ;if line len is too long, left-shift the comment
  303. maxlen        equ     72
  304.               cmp     di, maxlen
  305.               ja      @f              ;too long
  306.               ret                     ;exit
  307. @@:
  308.               mov     ax, di
  309.               sub     ax, maxlen      ;oversize amt
  310.               mov     cx, outreclen   ;loop ctr
  311.               mov     di, outrecaddr  ;find 1st semi
  312. @@:
  313.               cmp     byte ptr 0[di], ';'
  314.               je      @f
  315.               inc     di
  316.               loop    @b
  317.               ret                     ;no comment
  318. @@:
  319.               mov     bx, di          ;leave di at semi
  320.               mov     cx, ax          ;oversize amt
  321.               add     cx, 2           ;need 2 separator spaces also
  322. @@:           cmp     bx, outrecaddr
  323.               je      s44             ;forget it
  324.               dec     bx
  325.               cmp     byte ptr 0[bx], ' '
  326.               jne     @f
  327.               loop    @b
  328.               dec     bx
  329. @@:
  330.               add     bx, 3
  331.  
  332.               ;if bx < di, move [di] to [bx]
  333.               cmp     bx, di
  334.               jae     s44             ;no squeeze space
  335.               mov     cx, outreclen   ;for cx bytes
  336.               add     cx, outrecaddr
  337.               sub     cx, bx
  338.               add     outreclen, bx   ;adj len
  339.               sub     outreclen, di
  340.               mov     si, di
  341.               mov     di, bx
  342.               rep     movsb
  343. s44:
  344.               ret
  345. ;-----------------------------------------------------------
  346.  
  347. getrec:
  348.               ;set rba to read from start of next rec
  349.               mov     dx, rba
  350.               mov     cx, rba+2
  351.               add     dx, physlen
  352.               adc     cx, 0
  353.               mov     rba, dx
  354.               mov     rba+2, cx
  355.               call    setrba
  356.  
  357.               mov     ah, 3fh
  358.               mov     dx, inrecaddr
  359.               mov     cx, readlen     ;max read len
  360.               mov     bx, inhandle
  361.               int     21h
  362.  
  363.               cmp     ax, 2           ;eof
  364.               jb      seteof          ;yes
  365.               mov     physlen, ax     ;save
  366.               inc     inctr
  367.  
  368.               ;set inreclen
  369.               mov     cx, ax
  370.               mov     al, 10          ;lf
  371.               mov     di, inrecaddr
  372.               repne   scasb
  373.               je      getlen
  374.  
  375.               ;no lf found
  376.               ;if it has no alphmeric, trash it
  377.               mov     bx, inrecaddr
  378.               mov     cx, physlen
  379. @@:           cmp     byte ptr 0[bx], '0'
  380.               jb      getbmp
  381.               cmp     byte ptr 0[bx], 'z'
  382.               jna     getadj
  383. getbmp:       inc     bx
  384.               loop    @b
  385.  
  386.               ;abandon data
  387.               mov     inreclen, 160
  388.               mov     physlen, 160
  389.               jmp     short getrec    ;beginagin
  390. seteof:
  391.               inc     eof
  392.               ret
  393. getadj:
  394. ;9/26         sub     di, 2
  395.               mov     byte ptr 0[di], 13
  396.               inc     di
  397.               mov     byte ptr 0[di], 10
  398.               inc     di
  399. getlen:
  400.               sub     di, inrecaddr
  401.               mov     inreclen, di
  402.               mov     physlen, di
  403.               mov     cx, di
  404.  
  405.               ;remove trailing blanks
  406.               mov     si, inrecaddr
  407.               add     si, inreclen
  408.               sub     si, 2
  409. @@:           dec     si
  410.               cmp     si, inrecaddr
  411.               jb      @f
  412.               cmp     byte ptr 0[si], ' '
  413.               jne     @f
  414.               dec     inreclen
  415.               mov     byte ptr 0[si], 13
  416.               mov     byte ptr 1[si], 10
  417.               jmp     @b
  418. @@:
  419. convtab:
  420.               ;convert tabs to spaces
  421.               tabval equ 4
  422.               mov     cx, inreclen
  423.               cmp     cx, 160+1-tabval
  424.               ja      getrecx         ;no room to expand
  425.               mov     bx, inrecaddr
  426. @@:
  427.               cmp     byte ptr 0[bx], 9
  428.               je      @f
  429.               inc     bx
  430.               loop    @b
  431.               jmp     short tabsdun
  432. @@:
  433.               mov     di, inrecaddr
  434.               add     di, inreclen
  435.               mov     si, di
  436.               dec     si              ;from
  437.               add     di, tabval-2    ;to
  438.               mov     cx, inreclen
  439.               add     cx, inrecaddr
  440.               sub     cx, bx
  441.               dec     cx
  442.               std
  443.               rep     movsb
  444.               cld
  445.               mov     cx, tabval
  446. @@:           mov     byte ptr 0[bx], ' '
  447.               inc     bx
  448.               loop    @b
  449.               add     inreclen, tabval-1
  450.               jmp     convtab         ;try again
  451. tabsdun:
  452.               ;change solo semi to empty line
  453.               mov     cx, inreclen
  454.               cmp     cx, 3
  455.               jne     @f
  456.               cmp     byte ptr inrec, ';'
  457.               jne     @f
  458.               dec     inreclen
  459. @@:
  460. getrecx:
  461.               mov     si, inrecaddr
  462.               mov     cx, inreclen
  463.               ret
  464. ;-----------------------------------------------------------
  465.  
  466. putrec:
  467.               mov     ah, 40h         ;write one record
  468.               mov     dx, outrecaddr
  469.               mov     cx, outreclen
  470.               mov     si, dx          ;add cr/lf
  471.               add     si, cx
  472.               mov     byte ptr 0[si], 13
  473.               mov     byte ptr 1[si], 10
  474.               add     cx, 2
  475.               mov     bx, outhandle
  476.               int     21h
  477.               ret
  478. ;-----------------------------------------------------------
  479.  
  480.               ;Parse the cmdline and open 2 files
  481. parse:
  482.               mov     es, psp
  483.               mov     di, 81h         ;point DI to command line text
  484.               mov     cmdptr, di      ;save addr
  485.               mov     al, es:[di-1]   ;len
  486.               cmp     al, 2           ;less than 2 chars entered?
  487.               jb      usage           ;yes- show usage
  488. @@:
  489.               xor     ah, ah
  490.               mov     cmdlen, ax
  491.  
  492.               call    parse_one
  493. ;             mov     ax, cmdlen      ;compute remaining cmdlen
  494. ;             add     ax, cmdptr
  495. ;             sub     ax, si
  496. ;             cmp     ax, 2           ;less than 2 chars left
  497. ;             jl      usage           ;yes- show usage
  498.  
  499.               call    open1
  500.               ;
  501.               ;new code - no out spec - updt-in-place
  502. ;             mov     cmdptr, si      ;save addr of next filespec
  503. ;             call    parse_one
  504.               mov     es, psp
  505.               cmp     byte ptr es:0[si], 13
  506.               je      @f
  507.               cmp     byte ptr es:1[si], 13
  508.               jne     usage
  509. @@:           push    ds
  510.               pop     es
  511.               mov     di, offset filespec
  512.               mov     si, offset outspec
  513.               mov     cx, 160
  514.               rep     movsb
  515.               ;end of no out spec
  516.               ;
  517.               call    open2
  518.               ret
  519. usage:
  520.               push    ds
  521.               pop     es
  522.               mov     ah, 9           ;usage msg
  523.               mov     dx, offset errmsg3
  524.               int     21h
  525.               jmp     abort
  526. ;-----------------------------------------------------------------------
  527.  
  528. parse_one:
  529.               ;Parse the cmdline and create a complete filespec.
  530.               ;cmdptr = cmd line string
  531.               mov     si, cmdptr
  532.               mov     di, offset filespec  ;point DI to buffer
  533. @@:           cmp     byte ptr es:[si], 32  ;advance to first non-space
  534.               jne     @f
  535.               inc     si
  536.               jmp     @b
  537. @@:           cmp     byte ptr es:[si+1], ":"  ;leading drive specifier?
  538.               je      parse4          ;yes, then filespec is complete
  539.               mov     ah, 19h         ;get current drive
  540.               int     21h
  541.  
  542.               add     al, 65          ;convert to ASCIIZ
  543.               mov     ah, ":"         ;complete drive specifier
  544.               mov     word ptr [di], ax  ;write drive spec to buffer
  545.               add     di, 2
  546.  
  547.               cmp     byte ptr es:[si], "\"  ;leading backslash?
  548.               je      parse4          ;yes, then filespec is complete
  549.               mov     byte ptr [di], "\"  ;fill in the backslash
  550.               inc     di
  551.               mov     byte ptr [di], 0
  552.  
  553.               push    si
  554.               push    di
  555.               mov     ah, 47h         ;get current path at ds:si
  556.               mov     si, di
  557.               xor     dl, dl          ;default drive
  558.               int     21h
  559.               pop     di
  560.               pop     si
  561.  
  562.               cmp     byte ptr [di], 0  ;anything returned?
  563.               je      parse4          ;no, then filespec is complete
  564. @@:           inc     di              ;bump to end of string
  565.               cmp     byte ptr [di], 0
  566.               jne     @b
  567.               mov     byte ptr [di], "\"  ;insert trailing backslash
  568.               inc     di
  569. parse4:
  570.               mov     al, es:[si]     ;add filename
  571.               cmp     al, ' '
  572.               je      @f
  573.               cmp     al, 13
  574.               je      @f
  575.               mov     0[di], al
  576.               inc     si
  577.               inc     di
  578.               jmp     parse4
  579. @@:           mov     byte ptr [di], 0  ;terminator
  580.               ret
  581. ;-----------------------------------------------------------
  582.  
  583. open1:
  584.               ;copy filespec to inspec
  585.               mov     bx, offset filespec
  586.               push    bx
  587.               mov     di, offset inspec
  588.               mov     cx, 160
  589. @@:           mov     al, 0[bx]
  590.               mov     cs:[di], al
  591.               inc     bx
  592.               inc     di
  593.               loop    @b
  594.  
  595.               ;open input file
  596.               mov     ax, 3d00h       ;ro
  597.               pop     dx
  598.               int     21h
  599.               jc      @f              ;new
  600.               mov     inhandle, ax
  601.               ret
  602. @@:
  603.  
  604.               mov     ah, 9           ;print 'File not found'
  605.               mov     dx, offset errmsg1
  606.               int     21h
  607.               jmp     abort
  608. ;-----------------------------------------------------------
  609.  
  610. open2:
  611.               ;open/truncate output file
  612.               mov     ah, 3ch
  613.               mov     dx, offset outspec
  614.               mov     cx, 0           ;attr
  615.               int     21h
  616.               jc      @f
  617.               mov     outhandle, ax
  618.               ret
  619. @@:
  620.               mov     ah, 9           ;disk full
  621.               mov     dx, offset errmsg2
  622.               int     21h
  623.               jmp     abort
  624. ;-----------------------------------------------------------
  625.  
  626. close:
  627.               mov     ah, 3Eh         ;close file
  628.               mov     bx, inhandle
  629.               int     21h
  630.  
  631.               mov     ah, 3Eh         ;close file
  632.               mov     bx, outhandle
  633.               int     21h
  634.  
  635.               ;delete input
  636.               mov     ah, 41h
  637.               mov     dx, offset inspec
  638.               int     21h
  639.  
  640.               ;rename outpaut as input
  641.               mov     ah, 56h
  642.               mov     dx, offset outspec
  643.               mov     di, offset inspec
  644.               push    ds
  645.               pop     es
  646.               int     21h
  647.               ret
  648. ;-----------------------------------------------------------
  649.  
  650. setrba:
  651.               ;set rba=cx, dx
  652.               mov     ax, 4200h
  653.               mov     bx, inhandle
  654.               int     21h
  655.               ret
  656. ;-----------------------------------------------------------
  657.  
  658. code          ends
  659.               end     start
  660.