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 / CPM / CATLOG / FML.LBR / LOOKUP.ZQ0 / LOOKUP.Z80
Text File  |  2000-06-30  |  7KB  |  320 lines

  1. ; ****** LOOKUP.ASM *******
  2. ;
  3. ; by Jim Schenkel (415) 928-4445  - reads a data file and tries to match
  4. ; match an input string
  5. ;
  6. ; rev. 8/15/86 - Paul Foote, to protect CCP and start buffer on even page
  7. ; rev. 9/1/82  - Jim Schenkel
  8.  
  9.  
  10.     .Z80            ; Needed for M80 assembler, else ignore
  11.     ASEG            ; Needed for M80 assembler, else ignore
  12.  
  13.  
  14.     ORG    100H        ; CP/M operating system
  15.  
  16.     JP    START
  17.  
  18.  
  19. BDOS    EQU    0005H        ; DOS entry point
  20. FCB    EQU    005CH        ; File control block
  21. TYPEF    EQU    2        ; Type character to console
  22. PRINTF    EQU    9        ; Print string terminated by '$'
  23. RDBUFF    EQU    10        ; Read console buffer
  24. OPENF    EQU    15        ; Open file
  25. READF    EQU    20        ; Sequential read
  26. DMAF    EQU    26        ; Set DMA
  27. CR    EQU    0DH        ; Carriage return
  28. LF    EQU    0AH        ; Line feed
  29. TAB    EQU    9        ; Tab character
  30.  
  31.  
  32.  
  33. ; File name must be exactly 11 bytes (FILENAME.TYP) - placed here so it
  34. ; can be easily changed to default to your favorite program.
  35.  
  36. FILNAM:    DEFB    'MAST    LST'    ; Name of default file
  37.  
  38.  
  39. ; Initialize local stack
  40.  
  41. START:    LD    HL,0        ; Clear HL
  42.     ADD    HL,SP        ; Add in old stack
  43.     LD    (OLDSP),HL    ; Save it
  44.     LD    SP,STACK    ; Set up new stack
  45.     CALL    CLEAR        ; Clear screen
  46.  
  47.  
  48. ; Check for command line file name
  49.  
  50.     LD    A,(FCB+1)    ; Get first character
  51.     CP    ' '        ; If it's not a space
  52.     JR    NZ,OPEN        ; Then use that name
  53.     LD    DE,HOWDY    ; Sign on
  54.     CALL    PRINT
  55.  
  56.  
  57. ; Move the default file name into the FCB
  58.  
  59.     LD    HL,FILNAM    ; Point to file name
  60.     LD    DE,FCB+1    ; Point to FCB filename
  61.     LD    BC,11        ; Counter
  62.     LDIR            ; Move it
  63.  
  64.  
  65. ; Open the file
  66.  
  67. OPEN:    LD    DE,FCB        ; Point to FCB
  68.     LD    C,OPENF        ; Open the file
  69.     CALL    BDOS
  70.     LD    DE,NOFILE    ; Error message
  71.     INC    A        ; FF-->0 if no file
  72.     JP    Z,ERROR        ; So bail out
  73.  
  74.  
  75. ; Calculate the top of memory
  76.  
  77.     LD    HL,(0006)    ; Get BDOS location
  78.     LD    DE,900H        ; Leave enough room
  79.     SBC    HL,DE        ; To avoid trouble
  80.     LD    (TOP),HL    ; Store upper bound
  81.  
  82.  
  83. ; Initialize the pointer to the DMA
  84.  
  85.     LD    DE,BUFFER    ; Point to data area
  86.     LD    (BDMA),DE    ; Store current pointer
  87.     LD    C,DMAF        ; Set the DMA
  88.     CALL    BDOS
  89.     XOR    A        ; Zero a
  90.     LD    (FCB+32),A    ; Clear CR in DMA
  91.  
  92.  
  93. ; Read data into memory
  94.  
  95. READ:    LD    DE,FCB        ; Get record
  96.     LD    C,READF
  97.     CALL    BDOS
  98.     OR    A        ; Zero if read ok
  99.     JR    NZ,BUFSIZ    ; Else entire file was read
  100.  
  101.  
  102. ; Increment the buffer pointer
  103.  
  104.     LD    HL,(BDMA)    ; Get the current pointer
  105.     LD    DE,80H        ; Add 128 bytes
  106.     ADD    HL,DE        ; As offset
  107.     LD    (BDMA),HL    ; Store new pointer
  108.     PUSH    HL        ; Save pointer
  109.     LD    DE,(TOP)    ; Get upper bound
  110.     SBC    HL,DE        ; Subtract from pointer
  111.     JR    C,XBF        ; DE>HL, so proceed
  112.     LD    DE,OVRFLW    ; HL>DE, so give
  113.     CALL    PRINT        ; Message and
  114.     JR    BUFSIZ        ; Don't read any more
  115.  
  116. XBF:    POP    DE        ; Pick up pointer in DE
  117.     LD    C,DMAF        ; Update the DMA
  118.     CALL    BDOS
  119.     JR    READ        ; Do it again
  120.  
  121.  
  122. ; Calculate size of data buffer
  123.  
  124. BUFSIZ:    LD    HL,(BDMA)    ; Get last DMA
  125.     LD    DE,80H        ; Add another block
  126.     ADD    HL,DE        ; To get to end of buffer
  127.     LD    DE,BUFFER    ; Get start of buffer
  128.     OR    A        ; Clear carry
  129.     SBC    HL,DE        ; Subtract start from end
  130.     LD    (BUFLEN),HL    ; Store buffer length
  131.  
  132.  
  133. ; Get the input string
  134.  
  135. GETSTR:    CALL    CLSTR        ; Clear the search string
  136.     LD    DE,PROMPT    ; Ready the prompt
  137.     LD    C,PRINTF    ; Print it
  138.     CALL    BDOS
  139.     LD    DE,MX        ; Point to input buffer
  140.     LD    C,RDBUFF    ; Read a buffer
  141.     CALL    BDOS
  142.     LD    A,(MX+1)    ; Get string length
  143.     OR    A        ; Test for zero
  144.     JR    NZ,CONT
  145.     LD    DE,CRLF    
  146.     JR    ERROR        ; 0 = aborted
  147.  
  148. ; Convert to upper-case
  149.  
  150. CONT:    LD    BC,(MX)        ; Get CX in B
  151.     LD    HL,STRING    ; Point to string
  152.  
  153. UP:    LD    A,(HL)        ; Get a character
  154.     CP    'a'        ; Check for lower case
  155.     JR    C,NOLO        ; Jump if ok
  156.     SUB    20H        ; Else convert to lower
  157.     LD    (HL),A        ; And store it
  158.  
  159. NOLO:    INC    HL        ; Bump pointer
  160.     DJNZ    UP        ; And loop
  161.  
  162.  
  163. ; Search for the string
  164.  
  165. SEARCH:    LD    HL,BUFFER    ; Point to buffer
  166.     LD    BC,(BUFLEN)    ; Counter for length
  167.  
  168. LOOK:    LD    DE,STRING    ; Point to search string
  169.     LD    A,(DE)        ; Get first character
  170.     CPIR            ; Look for a match
  171.     JR    Z,GOT1        ; Found a match
  172.     JP    PO,GETSTR    ; Counter has reached zero
  173.                 ; So ask for another string
  174.     JR    LOOK        ; Do entire buffer
  175.  
  176.  
  177. ; Found match for first character, check the rest of the search string
  178.  
  179. GOT1:    PUSH    BC        ; Save BUFLEN counter
  180.     LD    BC,(MX)        ; Get CX in B
  181.     DEC    B        ; Allow for first character
  182.     JR    Z,SHOW        ; Print if only 1
  183.  
  184. GOT2:    INC    DE        ; Bump pointer to string
  185.     LD    A,(DE)        ; Get a character
  186.     CP    '?'        ; Wild card?
  187.     JR    Z,WILD        ; Yes, so ignore match
  188.     CP    (HL)        ; Does it match?
  189.     JR    NZ,NOPE        ; No, try again
  190.  
  191. WILD:    INC    HL        ; Bump pointer to buffer
  192.     DJNZ    GOT2        ; Loop for all characters
  193.     JR    SHOW        ; All characters match
  194.  
  195. NOPE:    POP    BC        ; Restore BUFLEN counter
  196.     JR    LOOK        ; And keep looking
  197.  
  198.  
  199. ; Print the record and update the data pointer and counter to the end of
  200. ; the record
  201.  
  202. SHOW:    POP    BC        ; Restore BUFLEN counter
  203.  
  204. SHOW1:    DEC    HL        ; Back up a character
  205.     PUSH    HL        ; Save pointer to buffer
  206.     LD    DE,BUFFER    ; Beginning of buffer
  207.     OR    A        ; Clear the carry
  208.     SBC    HL,DE        ; Are we at the beginning?
  209.     POP    HL        ; (restore the pointer)
  210.     JR    Z,NEXTCH    ; Yes, so print 1st record
  211.     INC    BC        ; Else increment counter
  212.     LD    A,(HL)        ; What's that character?
  213.     CP    CR        ; Is it a carriage return?
  214.     JR    NZ,SHOW1    ; No, so go back further
  215.  
  216. NEXTCH:    LD    E,A        ; Ready to print character
  217.     CALL    PRCHR        ; Start printing the record
  218.     INC    HL        ; Byte by byte
  219.     DEC    BC        ; Keeping track of length
  220.     LD    A,B        ; If bc goes to zero
  221.     OR    C        ; Then at the end of the data buffer
  222.     JR    Z,LOOK
  223.     LD    A,(HL)        ; Get another character
  224.     CP    1AH        ; End of file?
  225.     JR    Z,GETSTR    ; Then get another string
  226.     CP    CR        ; End of record?
  227.     JR    NZ,NEXTCH    ; No, get another character
  228.     JR    LOOK        ; Yes, so go look some more
  229.  
  230.  
  231. ; Wrap it up and bail out
  232.  
  233. ERROR:    CALL    PRINT        ; Print message
  234.     LD    HL,(OLDSP)    ; Get old stack pointer
  235.     LD    SP,HL        ; Put it in place
  236.     RET            ; Return to CCP
  237.  
  238. ;-----------------------------------------------------------------------
  239. ;              subroutines
  240.  
  241. ; Clear the screen
  242.  
  243. CLEAR:    LD    E,26        ; Clear screen character
  244.  
  245.  
  246. ; Print a character
  247.  
  248. PRCHR:    PUSH    AF        ; Save everything
  249.     PUSH    BC
  250.     PUSH    DE
  251.     PUSH    HL
  252.     LD    C,TYPEF        ; Type character function
  253.     CALL    BDOS        ; Do it, then
  254.     POP    HL        ; Restore everything
  255.     POP    DE
  256.     POP    BC
  257.     POP    AF
  258.     RET
  259.  
  260.  
  261. ; Clear the input string
  262.  
  263. CLSTR:    LD    B,80        ; Counter for 128 bytes
  264.     LD    HL,STRING    ; Point to string storage
  265.     XOR    A        ; Clear a
  266.  
  267. CLR2:    LD    (HL),A        ; Zero a byte
  268.     INC    HL        ; Bump pointer
  269.     DJNZ    CLR2        ; And loop
  270.     RET
  271.  
  272.  
  273. ; Print a string terminated by '$'
  274.  
  275. PRINT:    PUSH    AF        ; Save the registers
  276.     PUSH    BC
  277.     PUSH    DE
  278.     PUSH    HL
  279.     LD    C,PRINTF    ; Print function
  280.     CALL    BDOS
  281.     POP    HL        ; Restore the registers
  282.     POP    DE
  283.     POP    BC
  284.     POP    AF
  285.     RET
  286.  
  287.  
  288. ; Messages
  289.  
  290. CRLF    DEFB    CR,LF,'$'
  291. HOWDY:    DEFB    CR,LF,TAB,'*** SELECT STRING TO FIND ***',CR,LF,LF,'$'
  292. NOFILE:    DEFB    CR,LF,'++ Cannot find the data file ++',CR,LF,'$'
  293. OVRFLW:    DEFB    CR,LF,LF,'++ File is longer than available space, '
  294.     DEFB    'excess is unavailable ++',CR,LF,'$'
  295. PROMPT:    DEFB    CR,LF,LF,'==>','$'
  296.  
  297.  
  298. ; Storage
  299.  
  300.     DEFS    64        ; Stack area
  301. STACK    EQU    $        ; Reserved
  302. OLDSP:    DEFW    0        ; Old stack pointer
  303. TOP:    DEFW    0        ; Top of memory
  304. BUFLEN:    DEFW    0        ; Length of data buffer
  305. BDMA:    DEFW    0        ; Current DMA pointer
  306.  
  307.  
  308. ; Read buffer - MX, CX and string must be in this order
  309.  
  310. MX:    DEFB    80H        ; Max length of search string
  311. CX:    DEFB    0        ; Reserved for actual length
  312. STRING:    DEFS    80H        ; Space for search string
  313.  
  314.     ORG    ($+255)/256*256
  315.  
  316. BUFFER    EQU    $        ; Begin data buffer here
  317.  
  318.  
  319.     END
  320.