home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / lambda / soundpot / p / sclib2.lbr / FPUTC.MZC / FPUTC.MAC
Encoding:
Text File  |  1993-10-25  |  3.9 KB  |  215 lines

  1.  
  2. ;
  3. ;    putc(c,unit)
  4. ;
  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    PUTCHAR
  69. EXTRN    PUTLIST
  70. EXTRN    CPMIO
  71. ;
  72. FPUTC::
  73. PUTC::
  74.     POP    B    ;rtn addr
  75.     POP    D    ;unit
  76.     POP    H    ;c
  77.     PUSH    H
  78.     PUSH    D
  79.     PUSH    B
  80.     MOV    A,D
  81.     ORA    A        ; if(unit < 256) {
  82.     JNZ    PUTC4        ;    /* assume stdout, stderr */
  83.     MOV    A,E        ;    /* or stdlist. */
  84.     CPI    STDOUT        ;    if(unit    == stdout) {
  85.     JNZ    PUTC1
  86.     PUSH    H
  87.     CALL    PUTCHAR        ;        putchar(c);
  88.     POP    H
  89.     RET            ;        return;}
  90. PUTC1:    CPI    STDERR        ;    elseif(unit == stderr) {
  91.     JNZ    PUTC2
  92.     CALL    PUTCHAR        ;        putchar(c);
  93.     RET            ;        return;}
  94. PUTC2:    CPI    STDLST        ;    elseif(unit == stdlist)    {
  95.     JNZ    PUTC3
  96.     PUSH    H
  97.     CALL    PUTLIST        ;        putlist(c);
  98.     POP    H
  99.     RET            ;        return;}
  100. PUTC3:    JMP    PTCER1        ;    else goto putcerr; }
  101.  
  102. PUTC4:    PUSH    H            ; if(cput(c,unit)<0)
  103.     PUSH    D            ;    goto putcerr;
  104.     CALL    CPUT
  105.     POP    D
  106.     MOV    A,H
  107.     ORA    A
  108.     JM    PUTCERR
  109.     MOV    A,L            ; if(c=='\r')
  110.     CPI    EOL
  111.     JNZ    PUTCRET
  112.     LXI    H,LF            ;    cput('\n',unit);
  113.     PUSH    H
  114.     PUSH    D
  115.     CALL    CPUT
  116.     POP    D
  117.     POP    D
  118.     MOV    A,H
  119.     ORA    A
  120.     JM    PUTCERR
  121. PUTCRET:
  122.     POP    H            ; return(c);
  123.     RET
  124. PUTCERR:                ;putcerr:
  125.     POP    B            ; return(-1);
  126. PTCER1:
  127.     LXI    H,-1
  128.     RET
  129.  
  130. ;
  131. ;    cput(c,unit)
  132. ;
  133. CPUT::
  134.     POP    B
  135.     POP    D
  136.     POP    H
  137.     PUSH    H
  138.     PUSH    D
  139.     PUSH    B
  140.     SHLD    ZZCH
  141.     XCHG
  142.     SHLD    ZZUNIT
  143.     LXI    D,FCBSIZE        ; ip = unit + FCBSIZE;
  144.     DAD    D
  145.     SHLD    ZZIP
  146.     LXI    D,NEXTP            ; cp = ip[NEXTP];
  147.     DAD    D
  148.     MOV    E,M
  149.     INX    H
  150.     MOV    D,M
  151.     XCHG
  152.     SHLD    ZZCHP
  153.     LHLD    ZZIP            ; if(ip[UNUSED]==0){
  154.     LXI    D,UNUSED
  155.     DAD    D
  156.     MOV    A,M
  157.     INX    H
  158.     ORA    M
  159.     JNZ    PTCIF1
  160.     LXI    H,WRITE            ;    if(cpmio(WRITE,unit)~=0)    
  161.     PUSH    H
  162.     LHLD    ZZUNIT
  163.     PUSH    H
  164.     CALL    CPMIO
  165.     POP    D
  166.     POP    D
  167.     MOV    A,H
  168.     ORA    L
  169.     JZ    PTCIF2
  170.     LXI    H,-1            ;        return(-1);
  171.     RET
  172. PTCIF2:
  173.     LHLD    ZZIP            ;    else {    ip[UNUSED] = BUFSIZ;
  174.     LXI    D,UNUSED
  175.     DAD    D
  176.     LXI    D,BUFSIZ
  177.     MOV    M,E
  178.     INX    H
  179.     MOV    M,D
  180.     LHLD    ZZIP            ;        cp = &ip[BUFFER];
  181.     LXI    D,BUFFER
  182.     DAD    D
  183.     SHLD    ZZCHP
  184.                     ;        }
  185.                     ;    }
  186. PTCIF1:
  187.     LHLD    ZZIP
  188.     LXI    D,UNUSED        ; ip[UNUSED]--;
  189.     DAD    D
  190.     MOV    E,M
  191.     INX    H
  192.     MOV    D,M
  193.     DCX    D
  194.     MOV    M,D
  195.     DCX    H
  196.     MOV    M,E
  197.     LHLD    ZZCHP            ; ip[NEXTP] = cp+1;
  198.     INX    H
  199.     XCHG
  200.     LHLD    ZZIP
  201.     LXI    B,NEXTP
  202.     DAD    B
  203.     MOV    M,E
  204.     INX    H
  205.     MOV    M,D
  206.     LDA    ZZCH            ; return((*cp =    c) & 0377);
  207.     LHLD    ZZCHP
  208.     MOV    M,A
  209.     MVI    H,0
  210.     MOV    L,A
  211.     RET
  212.  
  213.     END    
  214.  
  215.