home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 223_02 / cpmio.mac < prev    next >
Text File  |  1989-02-23  |  4KB  |  163 lines

  1. ;
  2. ;    cpmio(fn,unit)
  3. ;
  4. ;    F. A. Scacchitti 9/4/84
  5. ;
  6. CBDOS    EQU    5    ;/* bdos entry point */
  7. CPMARG    EQU    128    ;/* CP/M command line */
  8. MAXARG    EQU    32    ;/* Maximum number of input args */
  9. STDIN    EQU    0
  10. STDOUT    EQU    1
  11. STDERR    EQU    2
  12. STDLST    EQU    4
  13. CTRLZ    EQU    26    ;control z
  14. NULL    EQU    0    ;pointer to nothing
  15. FCBSIZE    EQU    36    ;size, in bytes, of an FCB
  16. NEXTP    EQU    0    ;offset    to next-character pointer in I/O structure
  17. UNUSED    EQU    2    ;offset    to unused-positions-count in I/O structure
  18. BUFFER    EQU    6    ;offset    to disk    sector buffer in I/O structure
  19. UNGOT    EQU    5    ;offset to char ungotten by ungetc()
  20. FLAG    EQU    33    ;file-type flag    byte (in unused    part of    FCB)
  21. FREEFLG    EQU    128    ;This I/O structure is available for the taking
  22. EOFFLG    EQU    2    ;The end of this file has been hit
  23. WRTFLG    EQU    1    ;This file open    for writing
  24. BUFSIZ    EQU    1024    ;how long the sector buffer is
  25. NBUFS    EQU    8    ;number    of I/O buffers
  26. TBUFF    EQU    128    ;default cpm buffer
  27. LF    EQU    10
  28. EOL    EQU    13
  29. ;
  30. ; CP/M BDOS CALLS 
  31. ;
  32. CLOSE    EQU    16    ;close a file
  33. CPMSTR    EQU    9    ;print '$' delimited string on console
  34. CREATE    EQU    22    ;make a    file
  35. DMA    EQU    26    ;set DMA (I/O address)
  36. DELETE    EQU    19    ;delete    a file
  37. GETCH    EQU    1    ;read character    from console
  38. GETSTR    EQU    10    ;read string from console
  39. LSTOUT    EQU    5    ;write character to list device
  40. OPEN    EQU    15    ;open a    file
  41. PUTCH    EQU    2    ;write character to console
  42. QUERY    EQU    25    ;get logged-in drive id
  43. READ    EQU    20    ;read a    sector
  44. SELECT    EQU    14    ;log-in    a drive
  45. WRITE    EQU    21    ;write a sector
  46. ;
  47. ;    File i/o storage varibles found in ulink()
  48. ;
  49. EXTRN    ZZUNIT
  50. EXTRN    ZZIP
  51. EXTRN    ZZCHP
  52. EXTRN    ZZDP
  53. EXTRN    ZZFILE
  54. EXTRN    ZZMODE
  55. EXTRN    ZZCH
  56. EXTRN    ZZT
  57. EXTRN    ZZFN
  58. EXTRN    ZZNUBU
  59. EXTRN    ZZMXSC
  60. ;
  61. ;    Characteristics variable storage found in ulink()    
  62. ;
  63. EXTRN    ZZSVCH
  64. EXTRN    ZZDFLT
  65. EXTRN    ZZSTAK
  66. EXTRN    ZZMEM
  67. ;
  68. EXTRN    CPMDISK
  69. ;
  70. ;    Default disk I/O buffer
  71. ;
  72. EXTRN    ZZBUF
  73. ;
  74. CPMIO::
  75.     POP    B
  76.     POP    D
  77.     POP    H
  78.     SHLD    ZZFN
  79.     XCHG
  80.     SHLD    ZZUNIT
  81.     PUSH    D
  82.     PUSH    H
  83.     PUSH    B
  84.     LHLD    ZZUNIT            ; cpmdisk(*unit);
  85.     MOV    L,M
  86.     MVI    H,0
  87.     PUSH    H
  88.     CALL    CPMDISK
  89.     POP    H
  90.     LHLD    ZZUNIT            ; ZZIP = unit+FCBSIZE;
  91.     LXI    D,FCBSIZE        ; cpm(DMA,&ZZIP[BUFFER]);
  92.     DAD    D
  93.     LXI    D,BUFFER
  94.     DAD    D
  95.     SHLD    ZZNUBU        ;# SAVE TO UPGRADE DURING LOOPING
  96.     XCHG
  97.     MVI    C,DMA
  98.     CALL    CBDOS        ; (mod fas)
  99.     LHLD    ZZFN            ; t = cpm(ZZFN,unit);
  100.     MOV    C,L
  101.     MVI    A,8        ;# READ/WRITE UP TO 8 SECTORS
  102.     STA    ZZMXSC        ;# SAVE IT
  103.     LHLD    ZZUNIT
  104.     XCHG
  105. IOLOOP:    PUSH    H        ;# NEW CONSTRUCT TO ACCOMODATE 1K BUFFERS
  106.     PUSH    D        ;# SAVE IT ALL FOR REPEAT PERFORMANCE
  107.     PUSH    B
  108. ;
  109.     PUSH    H        ;# DON'T WRITE BLANKS
  110.     MOV    A,C
  111.     CPI    READ
  112.     POP    H
  113.     JZ    NOWRIT
  114.     PUSH    H
  115.     LHLD    ZZNUBU
  116.     MOV    A,M
  117.     POP    H
  118.     CPI    1AH        ;# END OF FILE CHAR ?
  119.     JZ    IOEXIT
  120. ;
  121. NOWRIT:
  122.     CALL    CBDOS        ;# READ/WRITE A SECTOR
  123.     PUSH    PSW
  124.     CALL    CCSXT##
  125.     SHLD    ZZT
  126.     POP    PSW
  127.     ORA    A        ;# CHECK FOR LAST SECTOR
  128.     JNZ    IOEXIT        ;# IF LAST GET OUT OF HERE
  129.     LDA    ZZMXSC
  130.     DCR    A        ;# CHECK FOR 8 SECTORS DONE
  131.     JZ    IOEXIT
  132.     STA    ZZMXSC
  133.     LHLD    ZZNUBU        ;# GET BUFFER ADDRESS
  134.     LXI    D,128
  135.     DAD    D        ;# COMPUTE NEW BUFFER ADDRESS
  136.     SHLD    ZZNUBU        ;# SAVE TIL NEXT TIME
  137.     XCHG
  138.     MVI    C,DMA
  139.     CALL    CBDOS        ;# SET THE NEW BUFFER
  140.     POP    B
  141.     POP    D
  142.     POP    H
  143.     JMP    IOLOOP
  144. IOEXIT:    POP    B        ;# CLEAN UP
  145.     POP    D
  146.     POP    H
  147.     MVI    C,DMA            ; cpm(DMA,ZZBUF);
  148.     LXI    D,ZZBUF
  149.     CALL    CBDOS        ; (mod fas)
  150.     LHLD    ZZT            ; if(t~=0) return(-1);
  151.     MOV    A,H            ; else       return(0);
  152.     ORA    L
  153.     JNZ    CPMIF1
  154.     LXI    H,0
  155.     JMP    CPMIF2
  156. CPMIF1:
  157.     LXI    H,-1
  158. CPMIF2:
  159.     RET
  160. ;
  161.     END
  162.  
  163.