home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol010 / als8cpm.asm < prev    next >
Assembly Source File  |  1984-04-29  |  17KB  |  612 lines

  1. ;**************************************************
  2. ;*                                                *
  3. ;*               ALS8CPM.ASM                      *
  4. ;*                                                *
  5. ;*  PROGRAM FOR CONVERTING PROCESSOR TECHNOLOGY   *
  6. ;*  ALS-8/SPKG-1 ASSEMBLER FILES TO CP/M FORMAT   *
  7. ;*                                                *
  8. ;*            (C) COPYRIGHT 1980                  *
  9. ;* ED ELIZONDO 6 CYPRESS CT EAST WINDSOR NJ 08520 *
  10. ;*     A L L   R I G H T S   R E S E R V E D      *
  11. ;*                                                *
  12. ;* THIS PROGRAM MAY BE USED FREELY BY COMPUTER    *
  13. ;* HOBBYISTS FOR NON-COMMERCIAL APPLICATIONS.     *
  14. ;* IT MAY NOT BE USED FOR COMMERCIAL APPLICATIONS *
  15. ;* OR SOLD WITHOUT WRITTEN PERMISSION OF THE      *
  16. ;* AUTHOR.                                        *
  17. ;*                                                *
  18. ;*          REV 1.6      31 JAN 1980              *    
  19. ;*                                                *
  20. ;**************************************************
  21. ;
  22. ; NOTE:  This program processes assembly language files
  23. ; prepared for the Processor Technology ALS-8 or Software
  24. ; Package No 1 assemblers to a format compatible with 
  25. ; the CP/M ASM assembler. It requires the presence of
  26. ; CUTER/SOLOS or some other means of loading the ALS-8
  27. ; source file onto memory so that it can be saved by CP/M.
  28. ; It does not require the presence of anything other than
  29. ; CP/M during the remaining operations.
  30. ;
  31. ; The translation process operates in accordance with
  32. ; the following algorithms:
  33. ;  Each line is converted independently.  The line byte count
  34. ; and line number fields are deleted from the source lines
  35. ; and each line is terminated with a CR/LF sequence.
  36. ;  A semicolon is placed ahead of all comment lines (for
  37. ; compatibility with MAC) and ahead of all comment fields.
  38. ; Leading spaces are deleted from comment fields only.
  39. ; Comment lines and the remainder of comment fields are
  40. ; passed unchanged, except for deletion of any exclamation
  41. ; marks.
  42. ;  Periods used as dummy operands for formatting purposes
  43. ; are removed, as well as any leading spaces appearing in
  44. ; instructiona and operand fields.  Operands enclosed in
  45. ; single quotes are passed unchanged.
  46. ;  ASC pseudo-operators are changed to DB and the corresponding
  47. ; delimiters changed to single quotes.
  48. ;  The '>' pseudo-operator is converted to an 'AND 0FFH' post
  49. ; operator and the '<' is similarly converted to a 'SHR 8'.
  50. ;  Instruction, operand and comment fields are tabbed
  51. ; and colons are added to labels to "pretty" the output.
  52. ;  The program utilizes slightly modified versions of the
  53. ; CP/M User's Group LIOS.ASM disk I/O routines (CPMUG 1.19)
  54. ;
  55. ; TO USE: 1) load your ALS-8 format program into RAM at 100H
  56. ;            (If using SOLOS/CUTER, note the first two digits
  57. ;             of program size returned by the load message.
  58. ;             Convert to decimal and add 1 to obtain the
  59. ;             number nn required in step 3).
  60. ;         2) boot up CP/M
  61. ;         3) type SAVE nn NAME1.EXT (where nn is number of
  62. ;            pages of program size in decimal)
  63. ;         4) run the conversion program by typing:
  64. ;             ALS8CPM NAME1.EXT NAME2.ASM
  65. ;            where NAME2.ASM is the desired name of the CP/M
  66. ;            compatible output file (note spaces between
  67. ;            the above name fields)
  68. ;         5) edit the resulting ASM file to add the appropriate
  69. ;            ORG statement.
  70. ;      6) assemble to locate any residual unique errors.
  71. ;
  72. ;*************************************************************
  73. ;
  74. ;    BDOS ADDRESSES:
  75. ;
  76. BDOS:    EQU    0005        ;BDOS ENTRY POINT
  77. SOURCE:    EQU    5CH        ;SOURCE FILE FCB
  78. TBUF:    EQU    0080H        ;TRANSFER BUFFER
  79. ;
  80. ;    BDOS FUNCTION CODES:
  81. ;
  82. PRINT:    EQU    9
  83. OPEN:    EQU    15
  84. CLOSE:    EQU    16
  85. MAKE:    EQU    22
  86. READ:    EQU    20
  87. WRITE:    EQU    21
  88. DELETE:    EQU    19
  89. ;
  90. ;    ASCII CODES:
  91. ;
  92. SPACE:    EQU    20H
  93. QUOTE:    EQU    27H
  94. TAB:    EQU    09H
  95. CR:    EQU    0DH
  96. LF:    EQU    0AH
  97. ;
  98. ;***************************
  99. ;*    MAIN PROGRAM       *
  100. ;***************************
  101. ;
  102.     ORG    100H
  103. ;
  104.     LXI    H,0        ;GET OLD STACK POINTER
  105.     DAD    SP
  106.     SHLD    OLDSTK        ;SAVE IT FOR EXIT
  107.     LXI    SP,NEWSTK    ;SET UP NEW STACK
  108. ;
  109.     LXI    D,MSSG0        ;SAY HELLO
  110.     CALL    MESSAGE
  111. ;
  112.     CALL    GETNAMES    ;GET FILE NAMES FROM COMMAND LINE
  113.     CALL    OPENFILES    ;OPEN FILES FOR ACCESS
  114.     LXI    D,MSSG8        ;WE'RE DOING FINE
  115.     CALL    MESSAGE
  116. ;
  117.     CALL    PROCESS        ;PROCESS LINE BY LINE
  118.     CALL    WEOF        ;FILL LAST INCOMPLETE PAGE
  119. ;
  120. ABEND:    CALL    CLOSEFILE    ;CLOSE FILES
  121.     LXI    D,MSSG9        ;WE'RE FINISHED
  122.     CALL    MESSAGE
  123. ;
  124. FIN:    LHLD    OLDSTK        ;RESTORE OLD STACK POINTER
  125.     SPHL
  126.     RET            ;RETURN TO CP/M
  127. ;
  128. ;
  129. ;****************************************
  130. ;           G E T N A M E S             *
  131. ; SUBROUTINE TO CHECK & GET FILE NAMES  *
  132. ;****************************************
  133. ;
  134. GETNAMES:
  135.     LDA    SOURCE+1    ;FIRST CHAR OF SOURCE NAME
  136.     CPI    SPACE        ;EMPTY?
  137.     JZ    ERROR6        ;YES, ERROR
  138.     LDA    SOURCE+17    ;FIRST CHAR OF DEST NAME
  139.     CPI    SPACE        ;EMPTY?
  140.     JZ    ERROR7        ;YES, ERROR
  141.  
  142. ;    MOVE DEST FCB TO SAFE PLACE
  143.     LXI    D,SOURCE+16    ;START OF TEMP DEST FCB
  144.     LXI    H,DEST        ;WORKING DEST FCB
  145.     MVI    B,16        ;NUMBER OF FCB CHARACTERS
  146.     CALL    MOVE        ;MOVE NAME
  147. ;
  148. ;    INITIALIZE FCB'S
  149.     XRA    A        ;GET A 0
  150.     STA    SOURCE+32    ;ZERO SOURCE NR FIELD
  151.     STA    DEST+32        ;ZERO DEST NR FIELD
  152.     RET
  153. ;
  154. ;****************************************
  155. ;         O P E N F I L E S             *
  156. ;  SUBROUTINE TO OPEN FILES FOR ACCESS  *
  157. ;****************************************
  158. ;
  159. OPENFILES:
  160.     MVI    C,OPEN        ;GET OPEN FUNCTION
  161.     LXI    D,SOURCE
  162.     CALL    BDOS        ;OPEN SOURCE FILE
  163.     CPI    0FFH        ;OPEN ERROR?
  164.     JZ    ERROR1        ;YES, ABORT
  165. ;
  166.     MVI    C,DELETE    ;DELETE FUNCTION
  167.     LXI    D,DEST
  168.     CALL    BDOS        ;DELETE EXISTING DEST FILE
  169.     MVI    C,MAKE        ;MAKE FUNCTION
  170.     LXI    D,DEST
  171.     CALL    BDOS        ;CREATE NEW DEST FILE
  172.     CPI    0FFH        ;MAKE ERROR?
  173.     JZ    ERROR3        ;YES, ABORT
  174.     MVI    C,OPEN        ;OPEN FUNCTION
  175.     LXI    D,DEST
  176.     CALL    BDOS        ;OPEN DEST FILE
  177.     RET
  178. ;
  179. ;***********************************
  180. ;         P R O C E S S            *
  181. ;  ROUTINE TO PROCESS EACH LINE    *
  182. ;***********************************
  183.  
  184. PROCESS:
  185.     XRA    A        ;CLEAR STRING FLAG
  186.     STA    FLAG
  187.     CALL    GETBYT        ;GET LINE CHAR COUNT
  188.     CPI    1        ;END OF FILE?
  189.     JZ    EOFMARK        ;YES, PROCESS IT
  190.     DCR    A        ;UPDATE CHAR LINE COUNT
  191.     STA    EOLCNT        ;SAVE IT
  192.  
  193.     MVI    B,5        ;FIELD COUNT
  194. LNUM:    PUSH    B        ;MOVE PAST LINE NUMBER FIELD
  195.     CALL    GETBYT        ;READ A BYTE
  196.     POP    B
  197.     CALL    COUNT        ;DECREMENT LINE COUNT
  198.     JZ    PREMEND        ;PREMATURE END OF LINE
  199.     DCR    B        ;DECREMENT FIELD COUNT
  200.     JNZ    LNUM        ;UNTIL DONE
  201. ;
  202. LABEL:    CALL    GETBYT        ;PROCESS LABEL FIELD
  203.     CPI    '*'        ;COMMENT LINE?
  204.     JZ    COMLINE        ;YES, PROCESS IT
  205.     CPI    SPACE        ;MISSING LABEL?
  206.     JZ    INSTR        ;THEN PROCESS INST
  207. LABEL1:    CALL    OUTBYT        ;OUTPUT LABEL CHAR
  208.     CALL    COUNT        ;DECREMENT LINE COUNT
  209.     JZ    EOLINE        ;IF END OF LINE
  210.     CALL    GETBYT        ;GET NEXT BYTE
  211.     CPI    SPACE        ;END OF ALS-8 LABEL?
  212.     JZ    LABEL2        ;YES, EXIT LOOP
  213.     CPI    ':'        ;END OF INTEL LABEL?
  214.     JNZ    LABEL1        ;NO, KEEP GOING
  215. LABEL2:    MVI    A,':'        ;YES, OUTPUT A COLON
  216.     CALL    OUTBYT        ;AND DROP THRU
  217.  
  218. INSTR:    MVI    A,TAB        ;PROCESS INSTR FIELD
  219.     CALL    OUTBYT        ;TAB TO NEXT COLUMN
  220.     CALL    DELSP        ;DELETE LEADING SPACES
  221.     JC    EOLINE        ;IF END OF LINE
  222.         
  223. ;    CHECK FOR ASC PSEUDO-OP
  224.     CPI    'A'        ;POSSIBLE ASC PSEUDO OP?
  225.     JNZ    INSTR2        ;NO WAY
  226.     CALL    COUNT        ;DECREMENT LINE COUNT
  227.     JZ    EOLINE        ;IF END OF LINE
  228.     CALL    GETBYT        ;GET NEXT BYTE
  229.     CPI    'S'        ;ASC PSEUDO OP?
  230.     JNZ    RECOV2        ;NO, RECOVER LAST TWO BYTES
  231.     CALL    COUNT        ;DECREMENT LINE COUNT
  232.     JZ    EOLINE        ;IF END OF LINE
  233.     CALL    GETBYT        ;GET NEXT BYTE
  234.     CPI    'C'        ;ASC PSEUDO OP?
  235.     JNZ    RECOV3        ;NO, RECOVER LAST 3 BYTES
  236. ;
  237. ;    CONVERT ASC PSEUDO OP TO DB
  238.     LXI    D,DBOP        ;OUTPUT A 'DB'
  239.     CALL    PUTSTRING
  240.     MVI    A,TAB        ;END OF INSTR FIELD
  241.     CALL    OUTBYT        ;TAB TO NEXT COLUMN
  242. ;
  243. ;    HANDLE ASC OPERAND AND CONVERT DELIMITERS 
  244.     CALL    DELSP        ;DELETE EXTRA SPACES
  245.     JC    EOLINE        ;IF END OF LINE
  246.     STA    DELIM        ;SAVE THE ASC DELIMITER
  247.     MVI    A,QUOTE        ;GET CPM DELIMITER
  248. ASC2:    CALL    OUTBYT        ;OUTPUT IT
  249.     CALL    COUNT        ;DECREMENT LINE COUNT
  250.     JZ    EOLINE        ;IF END OF LINE
  251.     LDA    DELIM        ;GET DELIMITER
  252.     MOV    B,A        ;INTO B
  253.     PUSH    B        ;SAVE B
  254.     CALL    GETBYT        ;GET NEXT BYTE
  255.     POP    B        ;RESTORE B
  256.     CMP    B        ;DELIMITER?
  257.     JNZ    ASC2        ;NO, KEEP GOING
  258.     MVI    A,QUOTE        ;YES, GET CPM DELIMITER
  259.     CALL    OUTBYT        ;OUTPUT IT
  260.     JMP    COMMENT        ;REMAINDER MUST BE COMMENT
  261. ;
  262. ;    RECOVER LAST TWO BYTES (NOT ASC PSEUDO OP)
  263. RECOV2:    STA    TEMP2        ;SAVE LAST BYTE
  264.     MVI    A,'A'        ;FIRST BYTE WAS AN 'A'
  265.     CALL    OUTBYT        ;OUTPUT IT
  266.     LDA    TEMP2        ;GET LAST BYTE
  267.     JMP    INSTR2        ;CONTINUE NORMALLY
  268. ;
  269. ;    RECOVER LAST 3 BYTES (NOT ASC PSEUDO OP)
  270. RECOV3:    STA    TEMP2        ;SAVE LAST BYTE
  271.     LXI    D,ASOP        ;WE KNOW LAST 2 BYTES WERE 'AS'
  272.     CALL    PUTSTRING    ;SO OUTPUT THEM
  273.     LDA    TEMP2        ;GET LAST BYTE
  274. ;
  275. ;    HANDLE REMAINDER OF INSTRUCTION FIELD
  276. INSTR2:    CALL    PASS        ;OUTPUT REST OF FIELD
  277.     JC    EOLINE        ;IF END OF LINE
  278. ;
  279. OPERAND:
  280.     MVI    A,TAB        ;PROCESS OPERAND FIELD
  281.     CALL    OUTBYT        ;TAB TO NEXT COLUMN
  282.     CALL    DELSP        ;DELETE LEADING SPACES
  283.     JC    EOLINE        ;IF END OF LINE
  284. ;
  285. ;    CHECK FOR '<' SPECIAL OPERATOR
  286. OPER1:    CPI    '<'        ;LEFT BYTE MASK?
  287.     JNZ    OPER3        ;NO WAY
  288.     CALL    COUNT        ;DECREMENT END OF LINE COUNT
  289.     JZ    EOLINE        ;IF END OF LINE
  290.     CALL    GETBYT        ;GET NEXT BYTE
  291.     CALL    PASS        ;OUTPUT REST OF FIELD
  292.     JC    EOLINE        ;IF PREMATURE END OF LINE
  293.     LXI    D,LBYTE        ;OUTPUT A SHIFT RIGHT EXPR
  294.     CALL    PUTSTRING
  295.     JMP    COMMENT        ;REMAINDER MUST BE COMMENT
  296. ;
  297. ;    CHECK FOR '>' SPECIAL OPERATOR
  298. OPER2:    CPI    '>'        ;RIGHT BYTE MASK?
  299.     JNZ    OPER3        ;NO WAY
  300.     CALL    COUNT        ;DECREMENT LINE COUNT
  301.     JZ    EOLINE        ;IF END OF LINE
  302.     CALL    GETBYT        ;GET NEXT BYTE
  303.     CALL    PASS        ;OUTPUT REST OF FIELD
  304.     JC    EOLINE        ;IF END OF LINE
  305.     LXI    D,RBYTE        ;THEN A MASK RIGHT EXP
  306.     CALL    PUTSTRING
  307.     JMP    COMMENT        ;REMAINDER MUST BE COMMENT
  308.  
  309. ;    HANDLE REMAINDER OF OPERAND
  310. OPER3:    CPI    QUOTE        ;IS IT A QUOTE?
  311.     CZ    TOGGLE        ;YES, TOGGLE STRING FLAG
  312.     CPI    '.'        ;IS IT A PERIOD?
  313.     JZ    STRING        ;YES, CHECK IF PART OF STRING
  314.     CPI    SPACE        ;IS IT A SPACE?
  315.     JNZ    OPER4        ;NO, PROCESS IT
  316. STRING:    STA    TEMP        ;SAVE BYTE
  317.     LDA    FLAG        ;IS CHAR WITHIN STRING?
  318.     ORA    A
  319.     JZ    COMMENT        ;NO, END OF OPERAND FIELD
  320.     LDA    TEMP        ;YES, GET BACK BYTE
  321. OPER4:    CALL    OUTBYT        ;OUTPUT BYTE
  322.     CALL    COUNT        ;DECREMENT LINE COUNT
  323.     JZ    EOLINE        ;IF END OF LINE
  324.     CALL    GETBYT        ;GET NEXT BYTE
  325.     JMP    OPER3        ;KEEP GOING
  326. ;
  327. ;
  328. COMLINE:            ;PROCESS COMMENT LINE
  329.     MVI    A,';'        ;GET A SEMICOLON
  330.     JMP    CLOOP        ;OUTPUT IT & REST OF LINE
  331. COMMENT:            ;PROCESS COMMENT FIELD
  332.     MVI    A,TAB
  333.     CALL    OUTBYT        ;TAB TO NEXT COLUMN
  334.     MVI    A,';'        ;GET A SEMICOLON
  335.     CALL    OUTBYT        ;OUTPUT IT
  336.     CALL    DELSP        ;DELETE LEADING SPACES
  337.     JC    EOLINE        ;IF END OF LINE
  338.     CPI    '!'        ;EXCLAMATION MARK?
  339.     JZ    CLOOP2        ;YES, DELETE IT
  340. CLOOP:    CALL    OUTBYT        ;NO, OUTPUT IT
  341. CLOOP2:    CALL    COUNT        ;DECREMENT LINE COUNT
  342.     JZ    EOLINE        ;IF END OF LINE
  343.     CALL    GETBYT        ;GET NEXT BYTE
  344.     CPI    '!'        ;EXCLAMATION MARK?
  345.     JZ    CLOOP2        ;YES, DELETE IT
  346.     JMP    CLOOP        ;KEEP GOING
  347.  
  348. PREMEND:            ;PREMATURE END OF LINE
  349.     MVI    A,CR        ;OUTPUT A CARRIAGE RET
  350.     CALL    OUTBYT
  351. EOLINE:    MVI    A,LF        ;NORMAL END OF LINE
  352.     CALL    OUTBYT        ;OUTPUT A LINE FEED
  353.     JMP    PROCESS        ;PROCESS NEXT LINE
  354. ;
  355. EOFMARK:
  356.     MVI    A,'Z'-40H    ;GET A CPM EOF MARK
  357.     CALL    OUTBYT        ;OUTPUT IT
  358.     RET            ;EXIT PROCESS
  359. ;
  360. ;
  361. TOGGLE:    PUSH    PSW        ;FLAG SET IF STRING IN QUOTES
  362.     LDA    FLAG        ;TOGGLE FLAG
  363.     CMA
  364.     STA    FLAG        ;THAT'S ALL
  365.     POP    PSW
  366.     RET
  367. ;
  368. ;    DELETE EXTRA SPACES
  369. DELSP:    CALL    COUNT        ;DECREMENT LINE COUNT
  370.     JZ    DELSP2        ;IF PREMATURE END OF LINE
  371.     CALL    GETBYT        ;GET NEXT BYTE
  372.     CPI    SPACE        ;SPACE?
  373.     JZ    DELSP        ;YES, DELETE IT
  374.     ORA    A        ;RESET CARRY FLAG
  375.     RET            ;RETURN WITH BYTE
  376. DELSP2:    STC            ;SET CARRY FLAG FOR EOL
  377.     RET            ;RETURN WITH FLAG SET
  378. ;
  379. ;    OUTPUT BYTES UNTIL END OF FIELD
  380. PASS:    CALL    OUTBYT        ;OUTPUT BYTE
  381.     CALL    COUNT        ;DECREMENT LINE COUNT
  382.     JZ    PASS2        ;IF PREMATURE END OF LINE
  383.     CALL    GETBYT        ;GET NEXT BYTE
  384.     CPI    SPACE        ;END OF FIELD?
  385.     JNZ    PASS        ;NO, KEEP GOING
  386.     ORA    A        ;RESET CARRY FLAG
  387.     RET            ;RETURN WITH SPACE
  388. PASS2:    STC            ;SET CARRY FLAG FOR EOL
  389.     RET            ;RETURN WITH FLAG SET
  390. ;
  391. COUNT:    LDA    EOLCNT        ;DECREMENT END OF LINE COUNT
  392.     DCR    A
  393.     STA    EOLCNT        ;THAT'S ALL
  394.     RET
  395. ;
  396. ;*************************************
  397. ;        P U T S T R I N G           *
  398. ; ROUTINE TO OUTPUT A STRING TO DISC *
  399. ;*************************************
  400. ;
  401. PUTSTRING:
  402.     LDAX    D        ;GET A BYTE
  403.     CPI    '$'        ;TERMINATOR?
  404.     RZ            ;YES, RETURN
  405.     PUSH    D        ;SAVE D&E
  406.     CALL    OUTBYT        ;NO, OUTPUT BYTE
  407.     POP    D        ;RESTORE D&E
  408.     INX    D        ;BUMP POINTER
  409.     JMP    PUTSTRING    ;KEEP GOING
  410. ;
  411. ;********************
  412. ;  CANNED STRINGS:  *
  413. ;********************
  414. ;    
  415. ASOP:    DB    'AS$'        ;STRING TO RECOVER AS STRING
  416. DBOP:    DB    'DB$'        ;STRING TO REPLACE ASC OP
  417. RBYTE:    DB    ' AND 0FFH$'    ;STRING TO REPLACE ">" OP
  418. LBYTE:    DB    ' SHR 8$'    ;STRING TO REPLACE "<" OP
  419.  
  420.  
  421. ;*********************************
  422. ;            O U T B Y T         *
  423. ;   ROUTINE TO OUTPUT A BYTE     *
  424. ;                                *
  425. ;  INPUT:     A=BYTE             *
  426. ;*********************************
  427.  
  428. OUTBYT:    STA    TEMP        ;SAVE BYTE
  429. OUT1:    LXI    H,OBUF+128
  430.     XCHG            ;BUFFER END ADDR IN DE
  431.     LHLD    OUTPT        ;CURRENT ADDR IN HL
  432.     CALL    CPHL        ;TEST FOR END OF BUFFER
  433.     JZ    OUT2        ;YES, WRITE
  434.     LDA    TEMP
  435.     MOV    M,A        ;STORE DATA BYTE IN BUFFER
  436.     INX    H        ;BUMP BUFFER POINTER
  437.     SHLD    OUTPT        ;SAVE BUFFER POINTER
  438.     ORA    A
  439.     RET            ;EXIT
  440. OUT2:    LXI    D,OBUF        ;POINT TO OUTPUT BUFFER
  441.     LXI    H,TBUF        ;TEMP BUFFER
  442.     MVI    B,128
  443.     CALL    MOVE        ;COPY BUFFERS
  444.     MVI    C,WRITE        ;WRITE FUNCTION
  445.     LXI    D,DEST        ;OUTPUT FCB
  446.     CALL    BDOS        ;ISSUE WRITE
  447.     CPI    0FFH    
  448.     JZ    ERROR3
  449.     CPI    2
  450.     JZ    ERROR4
  451.     CPI    1
  452.     JZ    ERROR5
  453.     LXI    H,OBUF        ;RESET POINTER
  454.     SHLD    OUTPT
  455.     JMP    OUT1        ;CONTINUE
  456.  
  457. ;*********************************
  458. ;         G E T B Y T            *
  459. ;   ROUTINE TO READ A BYTE       *
  460. ;                                *
  461. ;  OUTPUT:      A=BYTE           *
  462. ;*********************************
  463.  
  464. GETBYT:    LXI    H,IBUF+128
  465.     XCHG            ;BUFFER END ADDR. IN DE
  466.     LHLD    INPTR        ;CURRENT POINTER IN HL
  467.     CALL    CPHL        ;TEST FOR END OF BUFFER
  468.     JZ    GETB2        ;YES, READ
  469. GETB1:    MOV    A,M        ;GET BYTE
  470.     INX    H        ;BUMP POINTER
  471.     SHLD    INPTR        ;SAVE POINTER
  472.     ORA    A        ;RESET CARRY
  473.     RET
  474. GETB2:    MVI    C,READ        ;READ FUNCTION
  475.     LXI    D,SOURCE    ;FCB ADDRESS
  476.     CALL    BDOS        ;ISSUE READ
  477.     CPI    0        ;ERROR?
  478.     JNZ    ERROR2        ;YES
  479.     LXI    D,TBUF        ;POINT TO TEMP BUFFER
  480.     LXI    H,IBUF        ;INPUT BUFFER
  481.     MVI    B,128
  482.     CALL    MOVE        ;COPY BUFFER
  483.     LXI    H,IBUF        ;RESET BUFFER POINTER
  484.     SHLD    INPTR
  485.     JMP    GETB1        ;CONTINUE
  486.  
  487. ;***********************************
  488. ;            M O V E               *
  489. ;  ROUTINE TO MOVE BLOCKS OF DATA  *
  490. ;***********************************
  491. MOVE:    LDAX    D        ;GET BYTE
  492.     MOV    M,A        ;STORE BYTE
  493.     INX    H
  494.     INX    D        ;BUMP POINTERS
  495.     DCR    B        ;DECREMENT COUNT
  496.     JNZ    MOVE        ;LOOP
  497.     RET
  498.  
  499. ;*********************************
  500. ;             C P H L            *
  501. ;  ROUTINE TO COMPARE HL VS DE   *
  502. ;*********************************
  503.  
  504. CPHL:    MOV    A,H
  505.     CMP    D
  506.     RNZ
  507.     MOV    A,L
  508.     CMP    E
  509.     RET
  510.  
  511. ;**********************************
  512. ;       W E O F                   *
  513. ;  ROUTINE TO FILL UP LAST RECORD *
  514. ;  WITH CP/M EOF MARKS            *
  515. ;**********************************
  516.  
  517. WEOF:    LXI    H,OBUF+128    ;END OF BUFFER
  518.     XCHG
  519.     LHLD    OUTPT        ;WHERE WE ARE
  520.     CALL    CPHL        ;SAME?
  521.     JZ    OUTBYT        ;YES, WRITE LAST RECORD
  522.     MVI    A,'Z'-40H    ;NO, GET A CPM EOF MARK
  523.     CALL    OUTBYT        ;OUTPUT IT TO BUFFER
  524.     JMP    WEOF        ;KEEP GOING
  525. ;
  526. ;********************************
  527. ;      C L O S E F I L E        *
  528. ;  SUBROUTINE TO CLOSE FILES    *
  529. ;********************************
  530. ;
  531. CLOSEFILE:
  532.     MVI    C,CLOSE        ;CLOSE FUNCTION
  533.     LXI    D,DEST
  534.     CALL    BDOS        ;CLOSE DESTINATION FILE
  535.     MVI    C,CLOSE        ;CLOSE FUNCTION
  536.     LXI    D,SOURCE
  537.     CALL    BDOS        ;CLOSE SOURCE FILE
  538.     RET
  539. ;
  540.  
  541. ;
  542. ;*****************************
  543. ;      ERROR HANDLERS        *
  544. ;*****************************
  545. ;
  546. ERROR1:    LXI    D,MSSG1
  547.     JMP    ERRMSG
  548. ERROR2:    LXI    D,MSSG2
  549.     JMP    ABORT
  550. ERROR3:    LXI    D,MSSG3
  551.     JMP    ERRMSG
  552. ERROR4:    LXI    D,MSSG4
  553.     JMP    ABORT
  554. ERROR5:    LXI    D,MSSG5
  555.     JMP    ABORT
  556. ERROR6:    LXI    D,MSSG6
  557.     JMP    ERRMSG
  558. ERROR7:    LXI    D,MSSG7
  559. ERRMSG:    CALL    MESSAGE
  560.     JMP    FIN        ;RETURN TO CPM
  561. ABORT:    CALL    MESSAGE
  562.     JMP    ABEND        ;CLOSE FILES & RETURN TO CPM
  563. ;
  564. ;*********************************
  565. ;        M E S S A G E           *
  566. ;  SUBROUTINE TO OUTPUT MESSAGE  *
  567. ;*********************************
  568. ;
  569. MESSAGE:
  570.     MVI    C,PRINT        ;PRINT FUNCTION
  571.     CALL    BDOS
  572.     RET
  573. ;
  574. ;***************************
  575. ;      MESSAGES:           *
  576. ;***************************
  577. ;
  578. MSSG0    DB    'ALS-8 to CP/M File Converter - ver 1.6',CR,LF
  579.     DB    'by Ed Elizondo',CR,LF,'$'
  580. MSSG1    DB    'Source file not on disk',CR,LF,'$'
  581. MSSG2    DB    'Read past end of file',CR,LF,'$'
  582. MSSG3    DB    'Directory full',CR,LF,'$'
  583. MSSG4    DB    'Disk full',CR,LF,'$'
  584. MSSG5    DB    'Error in extending file',CR,LF,'$'
  585. MSSG6    DB    'No source file indicated',CR,LF,'$'
  586. MSSG7    DB    'No destination file indicated',CR,LF,'$'
  587. MSSG8    DB    'Converting file',CR,LF,'$'
  588. MSSG9    DB    'Done',CR,LF,'$'
  589.  
  590. ;*************************
  591. ;    DATA BUFFERS:    *
  592. ;*************************
  593. ;
  594. TEMP:    DS    1        ;TEMPORARY SAVE BYTE
  595. TEMP2:    DS    1        ;ANOTHER ONE
  596. DELIM    DS    1        ;ASC DELIMITER SAVE BYTE
  597. FLAG:    DB    0        ;SWITCH FOR QUOTED STRINGS
  598. EOLCNT:    DB    0        ;END OF LINE COUNT
  599. DEST:    DS    33        ;DEST FILE FCB
  600. ;
  601. OUTPT:    DW    OBUF        ;OUTPUT POINTER
  602. INPTR:    DW    IBUF+128    ;INPUT POINTER
  603. IBUF:    DS    128        ;INPUT BUFFER
  604. OBUF:    DS    128        ;OUTPUT BUFFER
  605. ;
  606. OLDSTK:    DS    2        ;OLD STACK POINTER
  607.     DS    40H        ;STACK AREA
  608. NEWSTK:    EQU    $
  609. ;
  610.  
  611.     END
  612.