home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol013 / entab.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  5.6 KB  |  306 lines

  1.     PAGE    60
  2.     TITLE    'ENTAB - REPLACE SPACES WITH TABS V1.3 2/5/81'
  3. ;
  4. ;     A SOFTWARE TOOL AS DESRIBED BY KERNIGAN AND PLAUGHER
  5. ; WHICH COMPRESSES SPACES INTO APPROPRIATE TABS AS PER
  6. ; CP/M CONVENTIONS. IT IS USEFUL FOR COMPACTING A PROGRAM
  7. ; AFTER A MODEM TRANSFER WHICH EXPANDS THE TABS.
  8. ;
  9. BDOS    EQU    5    ;CPM ENTRY
  10. FCB    EQU    5CH    ;DEFAULT FCB
  11. ;
  12. PRINT    EQU    9
  13. OPEN    EQU    15
  14. CLOSE    EQU    16
  15. DELETE    EQU    19
  16. READ    EQU    20
  17. WRITE    EQU    21
  18. CREATE    EQU    22
  19. RENAME    EQU    23
  20. SETDMA    EQU    26
  21.  
  22. BLANK    EQU    ' '
  23. TAB    EQU    9
  24. CR    EQU    0DH
  25. LF    EQU    0AH
  26. EOF    EQU    1AH    ;CONTROL Z
  27. DOLLAR    EQU    '$'
  28. ;
  29. REC    EQU    16    ;NUMBER OF SECTORS PER TRANSFER
  30. ;
  31.     ORG    100H
  32.     LXI    H,0    ;SET UP OUR OWN STACK
  33.     DAD    SP    ;SAVE THEIRS
  34.     SHLD    STACK
  35.     LXI    SP,STACK
  36. ;
  37.     LXI    D,SGNMSG    ;TELL THE FOLKS OUR NAME
  38.     MVI    C,PRINT
  39.     CALL    BDOS
  40.     JMP    GTFCB
  41. SGNMSG:    DB    CR,LF,'ENTAB  V1.3  2/5/81',CR,LF,DOLLAR
  42. ;
  43. GTFCB:    LXI    H,FCB    ;GET THE TYPED IN FILE NAME
  44.     LXI    D,FCB1
  45.     MVI    C,16
  46.     CALL    MOVE    ;AND MOVE IT TO OUR OWN
  47.     LXI    H,FCB
  48.     LXI    D,FCB2
  49.     MVI    C,16
  50.     CALL    MOVE    ;AND AGAIN
  51. ;
  52.     LXI    D,FCB1
  53.     MVI    C,OPEN
  54.     CALL    BDOS    ;OPEN IT
  55.     INR    A
  56.     JNZ    FILSEC    ;NO ERROR
  57.     LXI    D,FNFMSG    ;'FILE NOT FOUND'
  58.     MVI    C,PRINT
  59.     CALL    BDOS
  60.     JMP    EXIT
  61. FNFMSG:    DB    'FILE NOT FOUND',CR,LF,DOLLAR
  62. ;
  63. FILSEC:    LXI    H,FCB2+9    ;SEC NAME
  64.     MVI    M,DOLLAR;MAKE IT '.$$$'
  65.     INX    H
  66.     MVI    M,DOLLAR
  67.     INX    H
  68.     MVI    M,DOLLAR
  69.     LDA    FCB+16    ;GET DESTINATION DRIVE
  70.     ORA    A    ;HAS USER ENTERED VALUE
  71.     JZ    DEL
  72.     SBI    'A'-1    ;MAKE IT A NUMBER
  73.     STA    FCB2    ;FILL IT IN
  74. ;
  75. DEL:    MVI    A,0    ;MAKE NEXT RECORD 0
  76.     STA    FCB1+32
  77.     STA    FCB2+32
  78.     LXI    D,FCB2
  79.     MVI    C,DELETE
  80.     CALL    BDOS    ;DELETE IT JUST IN CASE
  81. ;
  82.     LXI    D,FCB2
  83.     MVI    C,CREATE
  84.     CALL    BDOS    ;NOW CREATE IT
  85.     INR    A
  86.     JNZ    ENTAB    ;FILE CREATED
  87.     LXI    D,CRMSG    ;'NO DIRECTORY SPACE'
  88.     MVI    C,PRINT
  89.     CALL    BDOS
  90.     JMP    EXIT    ;CAN'T KEEP GOING
  91. CRMSG:    DB    'CANT CREATE DESTINATION FILE',CR,LF,DOLLAR
  92. ;
  93. ;
  94. ENTAB:    MVI    A,0    ;COL=0
  95.     STA    COL
  96. NXTCHR:    LDA    COL    ;NEWCOL=COL
  97.     STA    NEWCOL
  98. BLNK:    CALL    GETC    ;GET A CHARACTER
  99.     STA    CHAR
  100.     CPI    BLANK    ;IS IT A BLANK?
  101.     JNZ    NTBLNK
  102.     LDA    NEWCOL
  103.     INR    A
  104.     STA    NEWCOL    ;NEWCOL=NEWCOL+1
  105.     ANI    7    ;CHECK FOR TAB POS
  106.     JNZ    BLNK    ;GUESS NOT!
  107.     MVI    C,TAB
  108.     CALL    PUTC
  109.     LDA    NEWCOL
  110.     STA    COL
  111.     JMP    BLNK    ;GET ANOTHER
  112. NTBLNK:    LDA    CHAR
  113.     CPI    TAB
  114.     JNZ    NOTTAB
  115.     LDA    NEWCOL    ;HAVE A TAB SO
  116.     ADI    8    ;.GET TO NEXT
  117.     ANI    0F8H    ;.TAB POSITION
  118.     STA    NEWCOL    ;UPDATE POINTERS
  119.     STA    COL
  120.     MVI    C,TAB    ;NOW PUT OUT THE TAB CHAR
  121.     CALL    PUTC
  122.     JMP    BLNK    ;GO FOR MORE CHARACTERS
  123. NOTTAB:    LDA    COL    ;IF COL<NEWCOL
  124.     LXI    H,NEWCOL
  125.     SUB    M
  126.     JP    EOFCHK
  127.     MVI    C,BLANK
  128.     CALL    PUTC    ;FILL IN THE BLANKS
  129.     LXI    H,COL    ;COL=COL+1
  130.     INR    M
  131.     JMP    NOTTAB
  132. EOFCHK:    LDA    CHAR
  133.     MOV    C,A    ;FIRST OUTPUT THE CHAR
  134.     CALL    PUTC
  135.     LDA    CHAR
  136.     CPI    EOF
  137.     JZ    DONE
  138.     CPI    0FFH    ;NO DATA LEFT
  139.     JZ    DONE
  140.     CPI    LF    ;TREAT LF AS NEWLINE
  141.     JZ    ENTAB
  142.     CPI    CR    ;ALONG WITH CR
  143.     JZ    ENTAB
  144.     LXI    H,COL
  145.     INR    M    ;COL=COL+1
  146.     JMP    NXTCHR    ;ELSE CONTINUE ON THIS LINE
  147. ;
  148. ;
  149. DONE:    CALL    PUTBUF    ;WRITE UNFINISHED BUFFER
  150.     LXI    D,FCB2
  151.     MVI    C,CLOSE
  152.     CALL    BDOS    ;CLOSE THE NEW FILE
  153. ;
  154.  
  155.     LXI    D,FCB1
  156.     MVI    C,DELETE
  157.     CALL    BDOS    ;NOW DELETE THE ORIGINAL
  158. ;
  159.     LXI    H,FCB1    ;MOVE THE NEW FILE NAME
  160.     LXI    D,FCB2+16    ;TO FCB2
  161.     MVI    C,16
  162.     CALL    MOVE
  163.     MVI    A,0
  164.     STA    FCB2+16    ;MAKE SURE ITS 0
  165. ;
  166.     LXI    D,FCB2
  167.     MVI    C,RENAME
  168.     CALL    BDOS    ;RENAME .$$$ TO ORIGINAL
  169. ;
  170.     LXI    D,DNMSG    ;TELL THEM WERE DONE
  171.     MVI    C,PRINT
  172.     CALL    BDOS
  173.     JMP    EXIT
  174. DNMSG:    DB    'ENTAB DONE',CR,LF,DOLLAR
  175. ;
  176. EXIT:    LXI    D,80H    ;RESET DEFAULT DMA
  177.     MVI    C,SETDMA
  178.     CALL    BDOS
  179. ;
  180.     LHLD    STACK
  181.     SPHL
  182.     RET        ;BACK TO CP/M
  183. ;
  184. ;
  185. ; MOVE - MOVE (HL -> (DE) FOR C BYTES
  186. ;
  187. MOVE:    MOV    A,M
  188.     STAX    D
  189.     INX    H
  190.     INX    D
  191.     DCR    C
  192.     JNZ    MOVE
  193.     RET
  194. ;
  195. ;
  196. GETC:    LHLD    CICNT    ;ANY CHAR IN BUFFER?
  197.     MOV    A,H
  198.     ORA    L
  199.     CZ    GETBUF    ;GET SOME IF NOT
  200.     LHLD    CIPNT    ;POINTER TO CHAR
  201.     MOV    A,M    ;GET THE CHARACTER
  202.     INX    H    ;INCREMENT THE POINTER
  203.     SHLD    CIPNT
  204.     LHLD    CICNT    ;REDUCE THE COUNT
  205.     DCX    H
  206.     SHLD    CICNT
  207.     RET
  208.  
  209. ;
  210. GETBUF:    MVI    A,REC    ;RECORDS PER BUFFER
  211.     LXI    H,0
  212.     SHLD    CICNT    ;INIT FO READ
  213.     LXI    H,CIBUF
  214.     SHLD    CIPNT    ;INIT THE POINTER
  215. GBUF:    SHLD    DMAADD    ;IPDATE DMA ADDRESS
  216.     XCHG        ;FOR BDOS CALL
  217.     STA    SECCNT    ;UPDATE SECTORS TO GO
  218.     ORA    A
  219.     RZ        ;RETURN IF NONE
  220.     MVI    C,SETDMA
  221.     CALL    BDOS    ;SET LOAD ADDRESS
  222.     LXI    D,FCB1
  223.     MVI    C,READ
  224.     CALL    BDOS    ;GET A SECTOR
  225.     PUSH    PSW    ;SAVE DISK STATUS
  226.     LHLD    CICNT
  227.     LXI    D,128    ;# OF BYTES READ
  228.     DAD    D
  229.     SHLD    CICNT    ;UPDATE IT
  230.     LHLD    DMAADD    ;UPDATE POINTER
  231.     POP    PSW    ;GET DISK STATUS
  232.     ORA    A
  233.     JZ    ROK    ;READ WAS OK
  234.     MVI    M,0FFH    ;OUR OWN END OF FILE
  235.     RET
  236. ROK:    DAD    D    ;THIS TO
  237.     LDA    SECCNT
  238.     DCR    A    ;ONE LESS LEFT
  239.     JMP    GBUF
  240. ;
  241. PUTC:    LHLD    COPNT    ;POINTER
  242.     MOV    M,C    ;PUT CHAR IN BUFFER
  243.     INX    H
  244.     SHLD    COPNT    ;INCREMENT POINTER
  245.     LHLD    COCNT
  246.     INX    H    ;BUMP IT
  247.     SHLD    COCNT
  248.     MOV    A,H    ;SEE IF END OF BUFFER
  249.     CPI    REC*128/256
  250.     CZ    PUTBUF
  251.     RET
  252. ;
  253. PUTBUF:    LHLD    COCNT    ;# OF CHAR IN BUFFER
  254.     SHLD    TEMP
  255.     LXI    H,0
  256.     SHLD    COCNT    ;REINIT FOR NEXT TIME
  257.     LXI    H,COBUF
  258.     SHLD    COPNT    ;REINIT FOR NEXT TIME
  259. PBUF:    SHLD    DMAADD    ;UPDATE WRITE ADDRESS
  260.     XCHG        ;TO DE FOR CPM CALL
  261.     LHLD    TEMP    ;ANY LEFT TO WRITE
  262.     MOV    A,L
  263.     ORA    H
  264.     RZ        ;IF NOT
  265.     MVI    C,SETDMA
  266.     CALL    BDOS
  267.     LXI    D,FCB2    ;WRITE FILE BLOCK
  268.     MVI    C,WRITE
  269.     CALL    BDOS
  270.     ORA    A    ;CHECK FOR ERROR
  271.     JNZ    WRERR    ;.AND TAKE CARE OF IT
  272.     LHLD    TEMP    ;BYTE COUNT
  273.     LXI    D,-128    ;PER SECTOR
  274.     DAD    D    ;THIS MANY LEFT
  275.     SHLD    TEMP
  276.     MOV    A,H    ;GET SIGN BIT
  277.     ORA    A    ;TEST IT
  278.     RM        ;ALL DATA WRITTEN (NOT A FULL BUFFER)
  279.     LHLD    DMAADD    ;UPDATE BUFFER
  280.     LXI    D,128
  281.     DAD    D
  282.     JMP    PBUF
  283. ;
  284. WRERR:    LXI    D,WERMSG    ;'WRITE ERROR'
  285.     MVI    C,PRINT
  286.     CALL    BDOS
  287.     JMP    EXIT    ;THIS WILL FIX STACK
  288. WERMSG:    DB    'WRITE ERROR',CR,LF,DOLLAR
  289.     DS    48    ;SOME STACK SPACE
  290. STACK:    DW    0
  291. COL:    DB    0
  292. NEWCOL:    DB    0
  293. CHAR:    DB    0    ;INPUT CHAR
  294. SECCNT:    DB    0    ;SECTORS TO READ
  295. CICNT:    DW    0
  296. COCNT:    DW    0
  297. TEMP:    DW    0
  298. DMAADD:    DW    0
  299. FCB1:    DS    33
  300. FCB2:    DS    33
  301. CIPNT:    DW    CIBUF
  302. COPNT:    DW    COBUF
  303. CIBUF:    DS    128*REC
  304. COBUF:    DS    128*REC
  305.     END
  306.