home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / MBUG / MBUG150.ARC / TXT2ASM.AQM / TXT2ASM.ASM
Assembly Source File  |  1979-12-31  |  13KB  |  593 lines

  1.     TITLE    'FILTER TEXT TO .ASM DB FORMAT'
  2.  
  3.     ; Author    Thomas Hill
  4.     ;        200 Oklahoma St.
  5.     ;        Anchorage, Ak.    99504
  6.     ;        (907) 337-1984
  7.  
  8.     ; Modifications & updates (in reverse order):
  9.     ;
  10.     ; 10/09/82    Version 1.1
  11.     ;        Cleaned up code
  12.     ; 09/30/82    Version 1.0
  13.  
  14.     ; This program accepts as input a text file created by any of the
  15.     ; CP/M text editors.  It outputs a file formatted as "DB" statements
  16.     ; suitable for inclusion in .ASM and .MAC assembly files.
  17.     ; Carriage return, linefeed sequences are translated into the 
  18.     ; label sequence "CR,LF".  Tabs are passed unaltered and form feed
  19.     ; control codes are translated into the label "FF".
  20.     ; In deference to the MAC assembler, which dislikes quoted text lines
  21.     ; longer than 64 characters, input lines longer than 60 characters
  22.     ; are broken into two or more output lines.
  23.  
  24.     ; Note that theis version assumes that the input text will fit
  25.     ; in available TPA.
  26.  
  27.         ; SYSTEM EQUATES
  28.  
  29.         CPM     EQU     0
  30.         BDOS    EQU     CPM+0005H       ; BDOS ENTRY POINT
  31.         FCB1    EQU     CPM+005CH       ; CP/M FILE CONTROL BLOCK
  32.         FCB2    EQU     CPM+006CH       ; SECOND FILE CONTROL BLOCK
  33.         CBUF    EQU     CPM+0080H       ; DEFAULT COMMAND BUFFER
  34.     TPA    EQU    CPM+0100H    ; user program area
  35.  
  36.         ; NON-DISK I/O FUNCTIONS
  37.  
  38.         CONIN   EQU     1       ; CONSOLE INPUT
  39.         CONOUT  EQU     2       ; CONSOLE OUTPUT
  40.         LSTOUT  EQU     5       ; LIST DEVICE OUTPUT
  41.         PRTBUF  EQU     9       ; SEND A STRING TO THE CONSOLE
  42.         RDBUF   EQU     10      ; GET A STRING FROM THE CONSOLE
  43.         CONSTAT EQU     11      ; CONSOLE STATUS
  44.         VERS    EQU     12      ; RETURN CP/M (MP/M) VERSION NUMBER
  45.  
  46.         ; DISK I/O FUNCTIONS
  47.  
  48.         SELDSK  EQU     14      ; SELECT DISK
  49.         OPENF   EQU     15      ; OPEN FILE
  50.         CLOSEF  EQU     16      ; CLOSE A FILE
  51.         DELETF  EQU     19      ; DELETE A FILE
  52.         READF   EQU     20      ; READ A RECORD
  53.         WRITEF  EQU     21      ; WRITE A RECORD
  54.         MAKEF   EQU     22      ; CREATE A FILE
  55.         SETDMA  EQU     26      ; SET DISK DMA ADDRESS
  56.         SIZEF   EQU     35      ; COMPUTE FILE SIZE
  57.  
  58.         ; THOSE FUNCTIONS REQUIRING A BYTE ARGUMENT WILL EXPECT THAT BYTE
  59.         ; TO BE IN THE E REGISTER.  ADDRESS ARGUMENTS ARE PASSED IN THE
  60.         ; DE REGISTER.  RETURN CODES ARE PASSED IN THE ACC.  IN GENERAL,
  61.         ; A RETURN OF ZERO INDICATES SUCCESS, WHILE A OFFH INDICATES FAILURE.
  62.  
  63.         ; character equates
  64.  
  65.         CR      EQU     0DH     ; carriage return
  66.         LF      EQU     0AH     ; line feed
  67.         ESC     EQU     1BH     ; escape code
  68.         EOF     EQU     1AH     ; end-of-file, control-z
  69.         BELL    EQU     07H     ; terminal bell
  70.         BS      EQU     08H     ; backspace
  71.     TAB    EQU    09H    ; tab char
  72.     APOS    EQU    ''''    ; apostrophe
  73.     FORMF    EQU    0CH    ; form feed
  74.         ;
  75.     FALSE    EQU    00H
  76.     TRUE    EQU    0FFH
  77.     ;
  78.     MAX$LEN    EQU    60    ; maximum length for output lines
  79.  
  80.     MACLIB    Z80
  81.  
  82.     ORG    TPA
  83.  
  84. TXT2ASM:
  85.     JMP    FILTER        ; over copyright notice
  86. SIGNON:    DB    'Text to .ASM Formatting Program',cr,lf
  87.     DB    'Copyright October, 1982 by '
  88.     DB    'Thomas N. Hill',cr,lf,LF,'$',eof
  89.  
  90. FILTER:    LXI    D,SIGNON
  91.     CALL    PMESS
  92.     LDA    FCB1+1        ; check for input file
  93.     CPI    ' '
  94.     JZ    USAGE        ; tell how to use.
  95.  
  96.     ; check for second file name as output
  97.  
  98.     LDA    FCB2+1
  99.     CPI    ' '
  100.     CZ    USE$SAME    ; use the same file as output
  101.     LXI    H,FCB2
  102.     LXI    D,OUT$FCB    ; move to output FCB
  103.     MVI    B,12
  104.     LDIR            ; move it
  105.     MVI    B,24
  106. LP1:    MVI    M,0        ; fill rest of FCB with zeros
  107.     INX    H
  108.     DJNZ    LP1
  109.  
  110.     ; input and output FCBs are set. Now open input file and fill buffer
  111.  
  112.     LXI    D,FCB1
  113.     MVI    C,OPENF
  114.     CALL    BDOS        ; try to open the input
  115.     INR    A
  116.     LXI    D,NO$OPEN
  117.     JZ    ERROR        ; nothing there to open.
  118.     LXI    D,OUT$FCB
  119.     MVI    C,DELETF    ; remove any existing output file
  120.     CALL    BDOS
  121.     XRA    A
  122.     LXI    D,OUT$FCB$EX
  123.     MVI    B,24
  124. ZERO:    STAX    D
  125.     INX    D
  126.     DJNZ    ZERO        ; re zero fcb
  127.     LXI    D,OUT$FCB
  128.     MVI    C,MAKEF        ; and re-create it
  129.     CALL    BDOS
  130.     INR    A
  131.     LXI    D,NO$MAKE
  132.     JZ    ERROR        ; can't make file, no room
  133.  
  134.     ; both files open, set up counters and pointers
  135.  
  136.     LXI    H,0
  137.     SHLD    I$LN$CNT    ; input lines
  138.     SHLD    O$LN$CNT    ; output line count
  139.     LXI    H,IN$BUF
  140.     SHLD    IN$PTR        ; input buffer pointer
  141.     LXI    H,OUT$LINE
  142.     SHLD    OUT$PTR        ; output line buffer
  143.     LXI    H,OUT$BUF
  144.     SHLD    OUT$DSK        ; disk output buffer
  145.  
  146.     ; pointers & counters set, begin filtering operation
  147.  
  148.     CALL    FILL$BUF    ; fill the input buffer
  149. LP2:    CALL    SET$LINE    ; set up the output line
  150.     CALL    MAKE$LINE    ; and make one
  151.     CALL    WRT$LINE    ; write the line to disk
  152.     LDA    EOF$FLG        ; was there an EOF during input?
  153.     ORA    A
  154.     JRZ    LP2        ; nope, continue
  155.     CALL    FLUSH        ; yes, flush remaining output 
  156.     LHLD    I$LN$CNT
  157.     CALL    HL2DEC        ; print number of input lines
  158.     LXI    D,IN$MSG
  159.     CALL    PMESS
  160.     LHLD    O$LN$CNT    ; output lines
  161.     CALL    HL2DEC
  162.     LXI    D,OUT$MSG
  163.     CALL    PMESS
  164.     LXI    D,OUT$FCB
  165.     MVI    C,CLOSEF
  166.     CALL    BDOS        ; shut things down
  167.     INR    A
  168.     LXI    D,NO$CLOSE
  169.     JZ    ERROR        ; oh,oh ... can't close file!
  170.     JMP    CPM        ; return to operating system
  171.  
  172.     ; fill the input buffer. set EOF flag if we bump into end of file.
  173.  
  174. FILL$BUF:
  175.     LXI    H,IN$BUF
  176. FILL1:    SHLD    IN$PTR
  177.     XCHG
  178.     MVI    C,SETDMA
  179.     CALL    BDOS        ; tell BDOS where to go
  180.     LXI    D,FCB1
  181.     MVI    C,READF
  182.     CALL    BDOS        ; read something
  183.     ORA    A
  184.     JRNZ    FILL4        ; got EOF, set flag
  185.     LHLD    IN$PTR
  186.     LXI    D,80H
  187.     DAD    D        ; next sector
  188.     LDA    BDOS+2        ; check for no room in memory
  189.     CMP    H
  190.     JRNC    FILL1
  191.     LXI    D,NO$MEM
  192.     JMP    ERROR
  193. FILL4:    LXI    D,FCB1
  194.     MVI    C,CLOSEF
  195.     CALL    BDOS        ; done with that file
  196.     LXI    H,IN$BUF
  197.     SHLD    IN$PTR        ; set pointer to start of buffer
  198.     RET
  199.  
  200.     ; set up the output line buffer.
  201.     ; preload the initial tab, DB, and tab
  202.  
  203. SET$LINE:
  204.     LXI    D,OUT$LINE
  205.     LXI    H,LN$MSK
  206.     LXI    B,MSK$LEN
  207.     LDIR            ; put the line begining in place
  208.     SDED    OUT$PTR        ; save current location in output line
  209.     XRA    A
  210.     STA    NUM$OUT        ; reset output character count
  211.     STA    FIRST
  212.     STA    IN$QUOTE    ; and flags for comma control
  213.     RET
  214.  
  215.     ; here we do the work.
  216.     ; Get characters form the input buffer, translating CR,LF, and FF
  217.     ; controls to proper labels.  Place quotes around text strings,
  218.     ; making sure to double imbedded quotes.  Watch placement of
  219.     ; commas and length of output line.
  220.  
  221. MAKE$LINE:
  222.     LHLD    IN$PTR        ; current buffer pointer
  223.     LDED    OUT$PTR        ; output line pointer
  224. MAKE0:    MOV    A,M        ; get char from input
  225.     CPI    EOF        ; end of input?
  226.     JZ    END$IT
  227.     CPI    CR
  228.     JZ    PUT$CR        ; mark newline
  229.     CPI    LF
  230.     JZ    PUT$LF        ; some lines don't have CRs
  231.     CPI    FORMF
  232.     JZ    PUT$FF        ; and form feeds
  233.     CPI    APOS        ; imbedded quote?
  234.     JNZ    MAKE1
  235.     CALL    PUT$APOS    ; put in two apostrophes
  236.     CALL    PUT$APOS
  237.     INX    H
  238.     JR    MAKE0
  239.  
  240.     ; if we got here, then plain character
  241.  
  242. MAKE1:    MVI    A,TRUE
  243.     STA    FIRST        ; not first char anymore
  244.     LDA    IN$QUOTE    ; are we inside quoted string?
  245.     ORA    A
  246.     JRNZ    MAKE2        ; yes, don't place apos
  247.     CALL    PUT$APOS    ; no, mark start of text line
  248.     MVI    A,TRUE
  249.     STA    IN$QUOTE    ; we are now.
  250. MAKE2:    MOV    A,M        ; recover character
  251. MAKE3:    INX    H
  252.     STAX    D        ; place character in output line
  253.     INX    D
  254.     CALL    OUT$CNT        ; count output chars
  255.     CPI    MAX$LEN        ; reached end?
  256.     JNZ    MAKE0
  257.     LDA    IN$QUOTE
  258.     ORA    A        ; inside quoted line?
  259.     JRZ    MAKE4        ; nope.
  260.     CALL    PUT$APOS    ; end of quoted text
  261. MAKE4:    MVI    A,CR
  262.     STAX    D        ; real end of line
  263.     INX    D
  264.     MVI    A,LF
  265.     STAX    D
  266.     SHLD    IN$PTR        ; save current buffer pointer
  267.     RET
  268.  
  269. END$IT:    LDA    IN$QUOTE
  270.     ORA    A        ; inside quoted string?
  271.     JRZ    ENDIT1
  272.     MVI    A,FALSE
  273.     STA    IN$QUOTE
  274.     CALL    PUT$APOS    ; yes, mark end
  275. ENDIT1:    LDA    FIRST
  276.     ORA    A        ; first position in line?
  277.     JRZ    ENDIT2
  278.     CALL    PUT$COMMA    ; nope, need a comma here
  279. ENDIT2:    CALL    PUT$APOS
  280.     MVI    A,'$'        ; mark end of text
  281.     STAX    D
  282.     INX    D
  283.     CALL    PUT$APOS    ; with CP/M EOM marker
  284.     MVI    A,TRUE
  285.     STA    EOF$FLG
  286.     JMP    MAKE4        ; and end line
  287.  
  288.     ; here are the various "PUT" subroutines
  289.  
  290. PUT$CR:    PUSH    H
  291.     LHLD    I$LN$CNT
  292.     INX    H
  293.     SHLD    I$LN$CNT    ; count input lines
  294.     POP    H
  295.     LDA    IN$QUOTE
  296.     ORA    A        ; inside quoted string?
  297.     JRZ    PUT$C1
  298.     CALL    PUT$APOS    ; close it first
  299.     MVI    A,FALSE
  300.     STA    IN$QUOTE    ; reset flag
  301. PUT$C1:    LDA    FIRST
  302.     ORA    A        ; beginning of line?
  303.     JRZ    PUT$C2        ; yep, no comma
  304.     CALL    PUT$COMMA
  305. PUT$C2:    MVI    A,TRUE
  306.     STA    FIRST        ; not beginning anymore
  307.     MVI    A,'C'
  308.     STAX    D        ; put "CR" label in place
  309.     INX    D
  310.     MVI    A,'R'
  311.     STAX    D
  312.     INX    D
  313. PUT$C3:    INX    H
  314.     MOV    A,M        ; take care of LF
  315.     CPI    LF
  316.     JNZ    MAKE4
  317. PUT$LF:    LDA    IN$QUOTE
  318.     ORA    A
  319.     JRZ    PUT$L1
  320.     CALL    PUT$APOS
  321.     MVI    A,FALSE
  322.     STA    IN$QUOTE
  323. PUT$L1:    LDA    FIRST
  324.     ORA    A
  325.     JRZ    PUT$L2
  326.     CALL    PUT$COMMA    
  327.     MVI    A,TRUE
  328.     STA    FIRST
  329. PUT$L2:    MVI    A,'L'
  330.     STAX    D        ; put "LF" label in place
  331.     INX    D
  332.     MVI    A,'F'
  333.     STAX    D
  334.     INX    D
  335.     JR    PUT$C3        ; look for some more
  336.  
  337. PUT$APOS:
  338.     MVI    A,APOS
  339.     STAX    D
  340.     INX    D        ; put an apostrophe in output line
  341.     RET
  342.  
  343. PUT$COMMA:
  344.     MVI    A,','
  345.     STAX    D
  346.     INX    D
  347.     RET
  348.  
  349. PUT$FF:    MVI    A,'F'
  350.     STAX    D
  351.     INX    D
  352.     STAX    D
  353.     INX    D
  354.     RET
  355.  
  356.     ; count output chars, return count in A
  357.  
  358. OUT$CNT:
  359.     LDA    NUM$OUT
  360.     INR    A
  361.     STA    NUM$OUT
  362.     RET
  363.  
  364.     ; write output line to buffer.  When buffer fills, write it to disk.
  365.  
  366. WRT$LINE:
  367.     PUSH    H
  368.     PUSH    D
  369.     LDED    OUT$DSK
  370.     LXI    H,OUT$LINE
  371. WRT1:    MOV    A,M
  372.     STAX    D        ; move line till see a LF
  373.     LXI    B,O$BUF$TOP    ; buffer top
  374.     MOV    A,B
  375.     CMP    D
  376.     JNZ    WRT4
  377.     MOV    A,C
  378.     CMP    E
  379.     JNZ    WRT4
  380.  
  381.     ; buffer full, write it out
  382.  
  383.     PUSH    H        ; save current line pointer
  384.     MVI    A,BUF$SIZE
  385.     CALL    WRT$BUF
  386.     LXI    H,OUT$BUF
  387.     SHLD    OUT$PTR
  388.     POP    H        ; output line pointer
  389.     JMP    WRT1        ; continue with move, if any left    
  390. WRT4:    MOV    A,M        ; get char again
  391.     INX    H
  392.     INX    D
  393.     CPI    LF        ; end of line?
  394.     JNZ    WRT1
  395.     SDED    OUT$DSK        ; save current location in buffer
  396.     LHLD    O$LN$CNT
  397.     INX    H
  398.     SHLD    O$LN$CNT
  399.     POP    D
  400.     POP    H
  401.     RET
  402.  
  403.     ; flush rest of output buffer to disk
  404.  
  405. FLUSH:    LHLD    OUT$DSK        ; fill rest of buffer with EOFs
  406. FLUSH1:    MVI    M,EOF
  407.     INX    H
  408.     MOV    A,L        ; till next page break
  409.     ORA    A
  410.     JRNZ    FLUSH1
  411.     LXI    D,-OUT$BUF
  412.     DAD    D        ; calc. number of sectors to write
  413.     MOV    A,H        ; pages
  414.     ADD    A        ; double for sectors
  415.     INR    A        ; plus one for safety
  416. WRT$BUF:
  417.     LXI    H,OUT$BUF
  418. WRT2:    PUSH    PSW
  419.     SHLD    OUT$DSK
  420.     XCHG
  421.     MVI    C,SETDMA
  422.     CALL    BDOS
  423.     LXI    D,OUT$FCB
  424.     MVI    C,WRITEF
  425.     CALL    BDOS
  426.     ORA    A
  427.     LXI    D,NO$WRITE
  428.     JNZ    ERROR        ; got a write error
  429.     POP    PSW
  430.     DCR    A
  431.     RZ
  432.     LHLD    OUT$DSK
  433.     LXI    D,80H
  434.     DAD    D
  435.     JR    WRT2
  436.  
  437.     ; double precision convert HL to decimal
  438.  
  439. HL2DEC:    LXI    B,-10000
  440.     CALL    CNVRT        ; 10,000s digit
  441.     MOV    A,E
  442.     ORA    A        ; skip leading zeros
  443.     JRZ    HLD1
  444.     CALL    DIGOUT
  445. HLD1:    LXI    B,-1000
  446.     CALL    CNVRT        ; 1,000s digit
  447.     MOV    A,E
  448.     ORA    A
  449.     JRZ    HLD2
  450.     CALL    DIGOUT
  451. HLD2:    LXI    B,-100
  452.     CALL    CNVRT
  453.     MOV    E,A
  454.     ORA    A
  455.     JRZ    HLD3
  456.     CALL    DIGOUT
  457. HLD3:    LXI    B,-10
  458.     CALL    CNVRT
  459.     MOV    A,E
  460.     ORA    A
  461.     JRZ    HLD4
  462.     CALL    DIGOUT
  463. HLD4:    MOV    A,L        ; print last digit, even a zero
  464.     CALL    DIGOUT
  465.     RET
  466.  
  467. CNVRT:    MVI    E,-1
  468. CNV1:    INR    E
  469.     DAD    B
  470.     MOV    A,H
  471.     ORA    A
  472.     JP    CNV1
  473.     MOV    A,B
  474.     CMA
  475.     MOV    B,A
  476.     MOV    A,C
  477.     CMA
  478.     MOV    C,A
  479.     INX    B
  480.     DAD    B
  481.     RET
  482.  
  483. DIGOUT:    ADI    '0'
  484. COUT:    PUSH    H
  485.     PUSH    D
  486.     PUSH    B
  487.     MOV    E,A
  488.     MVI    C,CONOUT
  489.     CALL    BDOS
  490.     POP    B
  491.     POP    D
  492.     POP    H
  493.     RET
  494.  
  495.     ; no input file, tell user what to do
  496.  
  497. USAGE:    LXI    D,USE$MSG
  498.     CALL    PMESS
  499.     JMP    CPM
  500.  
  501.     ; error routine, print message at (DE) and abort to CP/M
  502.  
  503. ERROR:    CALL    PMESS
  504.     JMP    CPM
  505.  
  506. CRLF:    LXI    D,CRLF$MSG    ; save some code here
  507. PMESS:    MVI    C,PRTBUF
  508.     JMP    BDOS
  509.  
  510.     ; useing same input file name for output. keep name, make type
  511.     ; = .DB
  512.  
  513. USE$SAME:
  514.     LXI    H,FCB1
  515.     LXI    D,FCB2
  516.     LXI    B,9
  517.     LDIR        ; move the name
  518.     XCHG
  519.     MVI    M,'D'
  520.     INX    H
  521.     MVI    M,'B'    ; set type
  522.     INX    H
  523.     MVI    M,' '
  524.     RET
  525.  
  526.     ; messages
  527.  
  528. USE$MSG:
  529.     DB    CR,LF
  530.     DB    'Usage:    TXT2ASM <infile> [<outfile>]',CR,LF
  531.     DB    '    Converts standard text input file to DB format for '
  532.     DB    'assembly',CR,LF
  533.     DB    '    programs. <infile> is input text, optional '
  534.     DB    '<outfile> is the',CR,LF
  535.     DB    '    output file.  If no output file is specified, '
  536.     DB    'output is sent',CR,LF
  537.     DB    '    to <infile name>.DB            '
  538.     DB    '[Oct. 9, 1982  V1.1]',CR,LF,CR,LF
  539.     DB    '$'
  540. NO$OPEN:DB    bell,'Cannot open input file, check directory and spelling.'
  541.     DB    CR,LF,'$'
  542. NO$MAKE:DB    bell,'Cannot create output file, check space remaining.'
  543. CRLF$MSG:
  544.     DB    CR,LF,'$'
  545. NO$CLOSE:
  546.     DB    bell,'Cannot close output file, definite problem here.'
  547.     DB    CR,LF,'$'
  548. NO$WRITE:
  549.     DB    bell,'Cannot complete write to output file.  Disk probably full'
  550.     DB    CR,LF,'$'
  551. NO$MEM:    DB    bell,'Insufficient memory for input file.',cr,lf,'$'
  552. IN$MSG:    DB    ' lines input.',cr,lf,'$'
  553. OUT$MSG:DB    ' lines output.',cr,lf,'$'
  554. LN$MSK:    DB    TAB,'DB',TAB
  555. MSK$LEN    EQU    $ - LN$MSK
  556.  
  557.     ; byte and address storage
  558.  
  559. EOF$FLG:DB    0
  560. FIRST:    DB    0
  561. IN$QUOTE:
  562.     DB    0
  563. IN$PTR:    DW    IN$BUF
  564. OUT$PTR:DW    OUT$LINE
  565. OUT$DSK:DW    OUT$BUF
  566. NUM$OUT:DB    0
  567. I$LN$CNT:
  568.     DW    0
  569. O$LN$CNT:
  570.     DW    0
  571.  
  572.     ; file control block
  573.  
  574. OUT$FCB:DB    0        ; drive
  575.     DB    '        '    ; name
  576.     DB    '   '        ; type
  577. OUT$FCB$EX:
  578.     DS    30        ; the rest
  579.  
  580.     ; buffers
  581.  
  582. BUF$SIZE    EQU    16    ; 16 sectors for buffer
  583.  
  584. OUT$LINE:
  585.     DS    80
  586.  
  587. OUT$BUF:DS    128 * BUF$SIZE
  588. O$BUF$TOP    EQU    $
  589.  
  590. IN$BUF    EQU    $
  591.  
  592.     END
  593.