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 / MBUG114.ARC / INPUT.Z80 < prev    next >
Text File  |  1979-12-31  |  3KB  |  232 lines

  1.  
  2. ; ===========================================================
  3. ;INPUT.Z80
  4. ;    input routines for E-Prolog
  5. ;    June 19, 1985
  6.  
  7.     .Z80
  8.  
  9. FALSE    EQU    0
  10. TRUE    EQU    1
  11. EMPTY    EQU    -1
  12. UNDEF    EQU    -2
  13.  
  14. CTLC    EQU    3
  15. HT    EQU    9
  16. LF    EQU    10
  17. CR    EQU    13
  18. CTLZ    EQU    26
  19.  
  20. CPM    EQU        0000H
  21. BDOS    EQU    CPM+0005H
  22. CDMA    EQU    CPM+0080H
  23. TPA    EQU    CPM+0100H
  24.  
  25. ; compare with given value
  26. ;
  27. ?CPHL    MACRO    ?VALUE
  28.     PUSH    DE
  29.     LD    DE,?VALUE
  30.     CALL    CPHL##
  31.     POP    DE
  32.     ENDM
  33.  
  34.     DSEG
  35. ;int        character;    /* input character */
  36. CHR::    DB    ' '
  37.  
  38. ; input file: 0 = console, 1 = disk
  39. INF::    DB    0
  40.  
  41. ; file control block for input file
  42. INFCB::
  43.     DB    0
  44.     DB    '        '
  45.     DB    '   '
  46.     DB    0,0,0,0
  47.     DS    20
  48.  
  49. ; buffer for input
  50. RDBUFF::
  51.     DB    128,0
  52. INDMA::
  53.     DB    0
  54.     DS    127
  55. INE::
  56. INP::    DW    INDMA
  57.  
  58.     CSEG
  59.  
  60. ; fill with one character
  61. ;
  62. ; all registers destroyed
  63. ?FILL    MACRO    ?ADDR,?COUNT,?VAL
  64.     LD    HL,?ADDR
  65.     PUSH    HL
  66.     POP    DE
  67.     INC    DE
  68.     LD    BC,?COUNT-1
  69.     LD    (HL),?VAL
  70.     LDIR
  71.     ENDM
  72.  
  73. ; copy string
  74. ;
  75. ; input:
  76. ;    HL -> source
  77. ; all registers destroyed
  78. ?COPY    MACRO    ?ADDR
  79.     LD    DE,?ADDR
  80.     CALL    COPY##
  81.     ENDM
  82.  
  83. ; create FCB for input file.
  84. ;
  85. ; input:
  86. ;    HL = list (rest of atom)
  87. ;    DE = lsub (substitutions for HL)
  88.     DSEG
  89. PEXP:    DW    0
  90. PLSUB:    DW    0
  91.     CSEG
  92. DOIN::
  93.     LD    (PEXP),HL
  94.     LD    (PLSUB),DE
  95.     XOR    A
  96.     LD    (INF),A
  97.     ?FILL    INFCB,36,0
  98.     ?FILL    INFCB+1,11,' '
  99. DOIN1:    LD    HL,PEXP
  100.     LD    DE,PLSUB
  101.     CALL    VNEXT##
  102.     CALL    SYMBP##
  103.     JR    Z,DOIN3
  104.     ?CPHL    ACON##
  105.     JR    Z,DOIN3
  106.     LD    A,1
  107.     LD    (INF),A
  108.     ?COPY    INFCB+1
  109.     LD    HL,PEXP
  110.     LD    DE,PLSUB
  111.     CALL    VNEXT##
  112.     CALL    SYMBP##
  113.     JR    Z,DOIN3
  114.     ?CPHL    ACOLON##
  115.     JR    NZ,DOIN2
  116.     LD    A,(INFCB+1)
  117.     SUB    'A'-1
  118.     LD    (INFCB),A
  119.     ?FILL    INFCB+1,11,' '
  120.     JR    DOIN1
  121. DOIN2:    ?CPHL    ADOT##
  122.     JR    NZ,DOIN3
  123.     LD    HL,PEXP
  124.     LD    DE,PLSUB
  125.     CALL    VNEXT##
  126.     CALL    SYMBP##
  127.     JR    Z,DOIN3
  128.     ?COPY    INFCB+9
  129. DOIN3:
  130.     RET
  131.  
  132. ; read into buffer
  133. ;
  134. ; abort program upon reading ^C
  135. ; output:
  136. ;    console - line read (CR, 0 terminated) in RDBUFF
  137. ;    disk - 128 byte block in RDBUFF
  138. ; all registers destroyed
  139. RDBUF::
  140.     LD    A,(INF)        ; input device
  141.     OR    A
  142.     JR    NZ,RDF
  143. RDF1:    LD    A,(OUTF##)    ; current output device
  144.     PUSH    AF
  145.     XOR    A        ; prompt to the conole
  146.     LD    (OUTF##),A
  147.     LD    A,(OPAR##)    ; number of open parentheses
  148.     OR    A
  149.     JR    Z,RDB3
  150.     LD    L,A
  151.     LD    H,0
  152.     CALL    PRDEC##
  153. RDB3:    LD    HL,PRMSG
  154.     DSEG
  155. PRMSG:    DB    '> ',0
  156.     CSEG
  157.     CALL    MSG##
  158.     LD    DE,RDBUFF
  159.     LD    C,10        ; read console buffer
  160.     CALL    BDOS
  161.     LD    A,LF        ; standard BDOS doesn't echo
  162.     CALL    CHROUT##    ;    the line feed (DRI bug)
  163.     POP    AF        ; restore output device
  164.     LD    (OUTF##),A
  165. INIX::    LD    HL,RDBUFF+1
  166.     LD    A,(HL)        ; count
  167.     INC    HL
  168.     LD    (INP),HL    ; pointer
  169.     LD    E,A
  170.     LD    D,0
  171.     ADD    HL,DE        ; end
  172.     LD    (HL),CR
  173.     INC    HL
  174.     LD    (HL),0
  175.     LD    A,(INDMA)
  176.     CP    CTLC
  177.     JP    Z,CPM
  178.     RET
  179. RDF:
  180.     LD    DE,INDMA
  181.     LD    C,26        ; set DMA
  182.     CALL    BDOS
  183.     LD    DE,INFCB
  184.     LD    C,20        ; read sequential
  185.     CALL    BDOS
  186.     LD    HL,INDMA
  187.     LD    (INP),HL    ; pointer
  188.     OR    A        ; successful read?
  189.     RET    Z        ; yes, return
  190.     XOR    A        ; no data (EOF)
  191.     LD    (INF),A        ; revert to console
  192.     JR    RDF1
  193.  
  194. ; read character
  195. ;
  196. ; output:
  197. ;    CHR = character
  198. RDCHAR::
  199.     PUSH    BC
  200.     PUSH    DE
  201.     PUSH    HL
  202. RDB0:    LD    HL,(INP)
  203.     LD    DE,INE
  204.     CALL    CPHL##
  205.     JR    Z,RDB2
  206.     LD    A,(HL)
  207.     OR    A
  208.     JR    Z,RDB1
  209.     CP    1AH
  210.     JR    Z,RDB1
  211.     LD    (CHR),A
  212.     INC    HL
  213.     LD    (INP),HL
  214.     POP    HL
  215.     POP    DE
  216.     POP    BC
  217.     RET
  218. RDB1:    XOR    A        ; on EOF, input device ..
  219.     LD    (INF),A        ;  .. reverts to console
  220. RDB2:    CALL    RDBUF
  221.     JP    RDB0
  222.  
  223. ; un-read character
  224. UNRDCH::    LD    HL,(INP)
  225.     DEC    HL
  226.     LD    (INP),HL
  227.     LD    A,(CHR)
  228.     LD    (HL),A
  229.     RET
  230.  
  231.     END
  232.