home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol044 / heli2cpm.s < prev    next >
Text File  |  1984-04-29  |  5KB  |  234 lines

  1.  ORG 103H
  2.  XEQ 103H
  3. SIN EQU 0C01FH    SOL INPUT
  4. SOU EQU 0C019H    SOL OUTPUT
  5. STAK EQU 0CBFFH   STACK IN SCRATCHPAD RAM
  6.  LXI SP,STAK
  7.  COPY NPTDEFS     PTDOS SYSTEM CALLS
  8.  CALL 0C0D5H      CLEAR SCREEN
  9.  CALL MSGI        ASK FOR INPUT FILENAME
  10.  LXI H,IBUFI
  11. IMF CALL SIN      PUT IT IN BUFFER FOR PSCAN
  12.  JZ IMF
  13.  MOV M,A
  14.  CPI 0DH
  15.  PUSH PSW
  16.  MOV B,A
  17.  CNZ OUTR       ECHO TO SCREEN IF NOT C/R
  18.  POP PSW
  19.  INX H
  20.  JNZ IMF
  21.  CALL MSGO     ASK FOR OUTPUT FILENAME
  22.  LXI H,IBUFO
  23. OMF CALL SIN   TO BUFFER
  24.  JZ OMF
  25.  MOV M,A
  26.  CPI 0DH
  27.  PUSH PSW
  28.  MOV B,A
  29.  CNZ OUTR
  30.  POP PSW
  31.  INX H
  32.  JNZ OMF
  33. PI MVI A,PSOP+40H  OPEN INPUT FILE
  34.  LXI H,IBUFI       NAME IS IN IBUFI
  35.  LXI D,OBUFI       OUTPUT BUFFER FOR PSCAN
  36.  CALL PSCAN
  37.  JC ERR            CARRY IS ERROR, ALWAYS
  38.  JZ ERR            HERE, SO IS ZERO
  39.  MOV A,E
  40.  CPI 0FFH          0FFH IN E IS ERROR
  41.  JZ ERR
  42.  STA IFN           GOT FILE NUMBER, STORE IT
  43. PO MVI A,PSCO+40H  DO SAME FOR OUTPUT FILE
  44.  LXI H,IBUFO       CREATE IF IT DOESN'T EXIST
  45.  LXI D,OBUFO
  46.  CALL PSCAN
  47.  JC ERR
  48.  JZ ERR
  49.  MOV A,E
  50.  CPI 0FFH
  51.  JZ ERR
  52.  STA OFN
  53.  LXI H,0
  54.  SHLD TEMP1    COUNTER FOR INPUT FILE BUFFER
  55.  LXI H,04C0H
  56.  SHLD TEMP2    COUNTER FOR OUTPUT FILE BUFFER
  57.  LXI H,OFB
  58.  SHLD TEMP5    START OF OUTPUT FILE BUFFER
  59.  MVI A,1
  60.  STA  TEMP6    EOF FLAG
  61. START LHLD  TEMP1
  62.  XRA A         SEE IF COUNTER IS ZERO
  63.  CMP H
  64.  JNZ STAR2
  65.  CMP L
  66.  JZ  BEGIN         EMPTY?, READ IN MORE & RESET COUNTER
  67. STAR2 LHLD  TEMP4  TEMP4 IS INPUT BUFFER POINTER
  68.  MOV A,M
  69.  STA TEMP3
  70.  CALL WOBUF   PUT CHARACTER IN OUTPUT FILE BUFFER
  71. CONT  LHLD  TEMP4  INCREMENT INPUT FILE BUFFER POINTER
  72.  INX H
  73.  SHLD TEMP4
  74.  LHLD  TEMP1  DECREMENT INPUT BUFFER COUNTER
  75.  DCX H
  76.  SHLD TEMP1
  77.  LDA TEMP3  PUT CHARACTER IN A
  78.  CPI 0DH    CR? THEN ADD LINEFEED
  79.  CZ LFINS
  80.  JMP START
  81. LFINS MVI A,0AH   ADD LINEFEED
  82.  CALL WOBU2
  83.  RET
  84. BEGIN LDA TEMP6  EOF?
  85.  CPI 0
  86.  JZ FINISH  IF SO, ADD A CTL Z, ENDFILE THE OUTPUT FILE,
  87. ;           CLOSE FILES, AND RETURN TO SYS
  88.  PUSH H    READ INPUT FILE INTO BUFFER
  89.  PUSH B         RESET COUNTER
  90.  PUSH D
  91.  PUSH PSW
  92.  LXI B,04C0H
  93.  LXI D,IFB
  94.  MVI L,1
  95.  LDA IFN
  96.  CALL SYS
  97.  DB DRDOP      DELIMITED READ
  98.  JMP RERR         ERROR RETURN
  99. NRET PUSH B       NORMAL RETURN FROM READ
  100.  POP H        B HAD BYTES LEFT IN BUFFER, NOW H HAS IT
  101.  SHLD TEMP1   STORE IT
  102.  LXI H,TEMP1  HL POINTS TO BYTES LEFT
  103.  MVI A,0C0H   DOUBLE PRECISION SUBTRACTION OF
  104.  SUB M        BYTES LEFT FROM SIZE OF BUFFER
  105.  MOV C,A     (4C0H)
  106.  INX H
  107.  MVI A,04
  108.  SBB M
  109.  MOV B,A
  110.  PUSH B      B HAS BYTES READ
  111.  POP H       NOW H HAS IT
  112.  SHLD TEMP1  NOW IN TEMP1
  113.  LXI H,IFB
  114.  SHLD TEMP4
  115.  POP PSW
  116.  POP D
  117.  POP B
  118.  POP H
  119.  JMP START
  120. RERR CPI 18H  IN CASE THERE IS NO EOF MARK
  121.  JZ EFSET     (A WILL CONTAIN 18H IF EOF)
  122.  JMP ERR1
  123. EFSET XRA A   RESET EOF FLAG
  124.  STA TEMP6
  125.  JMP NRET
  126. WOBUF LDA TEMP3     GET CHARACTER
  127. WOBU2 LHLD  TEMP5   H POINTS TO OUTPUT FILE BUFFER
  128.  MOV M,A            PUT IT THERE
  129.  LHLD  TEMP2        TEMP2 IS COUNTER
  130.  DCX H              BUFFER FULL?
  131.  SHLD TEMP2
  132.  XRA A
  133.  CMP H
  134.  JNZ RES
  135.  CMP L
  136.  JZ WRT             IF SO, WRITE TO DISK
  137. RES   LHLD TEMP5    INCREMENT COUNTER
  138.  INX H
  139.  SHLD TEMP5         STORE IT
  140.  RET                OTHERWISE GET ANOTHER CHARACTER
  141. WRT1 XRA A          RESET EOF FLAG
  142.  STA TEMP6
  143. WRT LDA OFN         DELIMITED WRITE TO DISK
  144.  LXI B,04C0H
  145.  LXI D,OFB
  146.  MVI L,1
  147.  CALL SYS
  148.  DB DWROP
  149.  JMP ERR1
  150. W2 LXI H,04C0H  RESET COUNTER
  151.  SHLD TEMP2
  152.  LXI H,OFB    RESET POINTER
  153.  SHLD TEMP5
  154.  RET
  155. FINISH MVI A,1AH ADD CP/M END OF FILE
  156.  CALL WOBU2
  157.  MVI A,1     THIS PUTS 1 AT THE END FOR DELIMITED WRITE
  158.  CALL WOBU2
  159.  CALL WRT    REST OF OUTPUT BUFFER TO DISK
  160.  LDA OFN
  161.  LXI B,1
  162.  MVI D,128
  163.  CALL SYS
  164.  DB SPAOP
  165.  JMP ERR
  166.  LDA OFN  ENDFILE ROUTINE
  167.  CALL SYS
  168.  DB EOFOP
  169.  JMP ERR
  170. EN MVI A,255  CLOSE ALL OPEN FILES
  171.  CALL SYS
  172.  DB CAOP
  173.  JMP ERR
  174.  CALL SYS  RETURN TO PTDOS
  175.  DB RESOP
  176. MSGI LXI H,MSI
  177. MSGI1 MOV A,M
  178.  CPI 0FFH
  179.  RZ
  180.  MOV B,A
  181.  CALL OUTR
  182.  INX H
  183.  JMP MSGI1
  184. MSGO LXI H,MSO
  185.  JMP MSGI1
  186. MSI ASC 'ENTER INPUT FILE NAME - C/R'
  187.  DB 0DH
  188.  DB 0AH
  189.  DB 0FFH
  190. MSO DB 0DH
  191.  DB 0AH
  192.  ASC 'ENTER OUTPUT FILE NAME - C/R'
  193.  DB 0DH
  194.  DB 0AH
  195.  DB 0FFH
  196. OUTR PUSH H
  197.  PUSH D
  198.  PUSH B
  199.  PUSH PSW
  200.  CALL SOU
  201.  POP PSW
  202.  POP B
  203.  POP D
  204.  POP H
  205.  RET
  206. ERR1 MOV E,A
  207. ERR LXI H,EM
  208.  MOV M,E
  209.  MVI A,84H
  210.  CALL UTIL
  211.  DB UXOP
  212.  JMP ERR
  213.  DB -1
  214. EM DS 1
  215.  JMP EN
  216. TEMP1 DS 2
  217. TEMP2 DS 2
  218. TEMP3 DS 1
  219. TEMP4 DS 2
  220. TEMP5 DS 2
  221. TEMP6 DS 2
  222. IFN DS 1
  223. OFN DS 1
  224. IBUFI DS 10
  225. IBUFO DS 10
  226. OBUFI DS 20
  227.  DB 0AEH
  228.  DW 04C0H
  229.  DB 0
  230. OBUFO DS 20
  231. IFB DS 04C0H
  232. OFB DS 04C0H
  233.  END
  234.