home *** CD-ROM | disk | FTP | other *** search
/ norge.freeshell.org (192.94.73.8) / 192.94.73.8.tar / 192.94.73.8 / pub / computers / cpm / alphatronic / PASCALZ4.ZIP / D3 / TEXT.SRC < prev    next >
Text File  |  1999-04-05  |  3KB  |  104 lines

  1. ;MANIPULATE A TEXT BUFFER AND ASSOCIATED POINTERS
  2. ;
  3.     NAME TEXT
  4.     ENTRY .TIN,.TXTIN,.TOUT,.TXTYP
  5.     EXT .POPHDB,.CO,.PUSHBD
  6.     INCLUDE DEFLT.SRC
  7. ;
  8. ;
  9. ;THE .TIN, .TXTIN, AND .TOUT ROU.TINES MANIPULATE A TEXT BUFFER AND
  10. ;THEIR ASSOCIATED POINTERS.  THE BUFFER RESIDES IN THE TOP OF THE
  11. ;TPA.
  12.  
  13. ;EACH CALL TO .TIN RETURNS THE NEXT CHARACTER IN THE TEXT BUFFER.
  14. ;A CARRAIGE RETURN IS PASSED TO INDICATE END OF LINE.  A CPI 20H
  15. ;IS DONE BEFORE CONTROL IS RETURNED TO THE CALLING PROGRAM.  THUS,
  16. ;Z IS TRUE IF THE CHARACTER IS A SPACE AND M AND C ARE TRUE IF
  17. ;THE RETURNED CHARACTER IS A CONTROL CHARACTER.  THE CHARACTER IS
  18. ;RETURNED IN A.
  19.  
  20. .TIN    CALL    .PUSHBD        ;SAVE ALL REGISTERS EXCEPT A
  21.     LHLD    6        ; HL POINTS TO TOP OF TPA + 1.
  22.     LXI    D,-GETP
  23.     DAD    D
  24.     PUSH    H        ; Save pointer to text_in_pointer.
  25.     MOV    E,M
  26.     MVI    D,0
  27.     DAD    D        ; HL points to next character to read - 1.
  28.     INX    H
  29.     MOV    A,M
  30.     POP    H
  31.     CPI    ' '        ; Test for end of line.
  32.     JRC    ENDL
  33.     INR    M
  34.     CPI    ' '
  35. EN:    JMP    .POPHDB
  36.  
  37. ENDL    INX    H        ; HL POINTS TO LAST CHARACTER POINTER.
  38.     MVI    M,0        ; MAKE IT 1 FOR FUTURE .TOUT CALLS.
  39.     JMPR    EN
  40.  
  41. ;.TXTIN READS A LINE INTO THE TEXT BUFFER AND SETS THE TEXT IN
  42. ;POINTER TO THE FIRST CHARACTER (TEXT IN POINTER := 1).
  43.  
  44. .TXTIN    CALL    .PUSHBD        ;SAVE ALL REGISTERS EXCEPT A
  45.     LHLD    6
  46.     LXI    D,-GETP
  47.     DAD    D        ; HL POINTS TO START OF TEXT BUFFER.
  48.     MVI    M,BUFLEN-1    ; TELL CP/M THE MAXIMUM # OF CHARS TO READ.
  49.     XCHG
  50.     MVI    C,10        ; CP/M CODE TO READ A LINE.
  51.     CPM        
  52.     MVI    C,CR
  53.     CALL    .TOUT
  54.     MVI    C,LF
  55.     CALL    .CO
  56.     JMP    .POPHDB
  57.  
  58.  
  59. ;.TOUT STUFFS THE CHARACTER PASSED IN C INTO THE TEXT BUFFER.  THE CARRY IS
  60. ;SET IFF THE BUFFER IS FULL.  THE TEXT_IN_POINT IS RESET TO THE FIRST
  61. ;CHARACTER ON EVERY CALL.
  62.  
  63. .TOUT    CALL    .PUSHBD        ;SAVE ALL REGISTERS EXCEPT A
  64.     PUSH    PSW
  65.     LHLD    6
  66.     LXI    D,-GETP
  67.     DAD    D        ; HL POINTS TO THE TEXT_IN_POINTER.
  68.     MVI    M,1        ; TEXT_IN_POINTER := 1
  69.     INX    H
  70.     MOV    A,M        ; A := TEXT_FILL_POINTER
  71.     CPI    BUFLEN
  72.     JRZ    BFULL        ; BRANCH IF BUFFER IS FULL.
  73.     INR    M        ; TEXT_FILL_POINTER := TEXT_FILL_POINTER + 1
  74.     MOV    E,M
  75.     MVI    D,0
  76.     DAD    D        ; HL POINTS TO SLOT FOR CHARACTER IN C.
  77.     MOV    M,C        ; STUFF IT.
  78.     POP    PSW
  79.     ORA    A
  80.     JMP    .POPHDB
  81.  
  82. BFULL    DCR    M        ; Make it work.
  83.     MVI    C,CR        ; Put CR at end of text buffer.
  84.     CALL    .TOUT        ; Watch out, here's Recursive Robert.
  85.     POP    PSW
  86.     STC
  87.     JMP    .POPHDB
  88.  
  89. ;.TXTYP WRITES THE STRING OF CHARACTERS POINTED TO BY HL TO THE CONSOLE.
  90. ;A NULL OR A CHARACTER WITH ITS MSB SET MARKS THE END OF THE STRING.
  91.  
  92. .TXTYP    MOV    A,M
  93.     ORA    A
  94.     RZ
  95.     PUSH    PSW
  96.     ANI    7FH
  97.     MOV    C,A
  98.     CALL    .CO
  99.     POP    PSW
  100.     RM
  101.     INX    H
  102.     JMPR    .TXTYP
  103. ;
  104.