home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / packet / rli120.ark / ISCALL.MAC < prev    next >
Text File  |  1986-08-12  |  6KB  |  235 lines

  1. ; ISCALL.MAC - 12 Aug 85 - Local mods by K1BC
  2. ; C.FILE added 9/7/85 by w0rli.
  3.  
  4.     .z80
  5.     maclib    TNC.LIB
  6.  
  7.     entry    iscall,ascitb,c.file,c.alfa,c.lc,c.num
  8.  
  9.     cseg
  10.  
  11. ; Parameters
  12.  
  13. ncpcs    equ    6        ;Number of characters per callsign
  14.  
  15. ; Bits in ASCII character table, for various uses.
  16.  
  17. c.ctl    equ    01H        ;Char is a control (00-1F)
  18. c.supp    equ    02H        ;Char should be suppressed while monitoring
  19. c.alfa    equ    04H        ;Char is A-Z or a-z
  20. cb.alf    equ    2        ; Bit number for above value
  21. c.num    equ    08H        ;Char is 0-9
  22. c.lc    equ    10H        ;Char is a-z
  23. c.wsp    equ    20H        ;Char is space or tab
  24. c.file    equ    40H        ;Char is legal in file name
  25.  
  26. ; Routine to determine whether a string is a legitimate callsign.
  27. ; We look for the string to be one of the patterns at ISCPAT
  28. ; NOTE:
  29. ;    Callsign to be tested MUST be padded with spaces to 6 chars, and
  30. ;    Callsign to be tested MUST have had "-1" SSID stripped off.
  31. ;
  32. ; This algorithm will catch such common spurious calls as the following,
  33. ; which have actually been seen:
  34. ;    ALL or NTS or GOD
  35. ;    completely blank or missing
  36. ;    ABCDEF
  37. ;    TEST
  38. ;    AFA1XX or NNN0XX
  39. ;    
  40. ; Calling sequence:
  41. ;    HL points to first character of the alleged callsign.
  42. ;    call iscall
  43. ;    returns CY flag clear if it looks OK
  44. ;        CY flag  set  it is looks wrong
  45. ;
  46. ;    all registers clobbered by this routine
  47.  
  48. iscall:
  49.     ld de,    iscpat        ;Point at possible patterns
  50.     push    hl        ;Start of the alleged callsign
  51. iscl1:                ;Back here for each possible pattern to check
  52.     ld bc,    0        ;B counts chars up to 6
  53.     pop    hl        ;Get start of callsign
  54.     ld a,    (de)        ;Any more patterns to test?
  55.     or    a        ; ..
  56.     scf            ;Set failure flag for caller
  57.     ret z            ;Return if tried all patterns and failed.
  58.     push    hl        ;Save start of test call for loop
  59.     ld c,    a        ;Hold length of pattern in C
  60.     inc    de        ;Step past length of pattern
  61.  
  62. iscl2:    push    de        ;Get bits for callsign char
  63.     push    hl
  64.     ld d,    0
  65.     ld a,    (hl)
  66.     and    7FH        ;Junk possible parity bit from char
  67.     ld e,    a        ;Compute table offset
  68.     ld hl,    ascitb
  69.     add hl,    de
  70.     ld a,    (hl)        ;Get the bits
  71.     pop    de
  72.     pop    hl
  73.     and    (hl)        ;See if bit on in pattern and in callsign
  74.     ex de,    hl
  75.     jp z,    iscl3        ;Go if not a match
  76.     inc    hl        ;Step source pointer
  77.     inc    de        ;Step pattern pointer
  78.     inc    b        ;Count up to 6 chars in source
  79.     dec    c        ;Count thru pattern
  80.     jp nz,    iscl2        ;Go if more to check
  81. ; Here if all chars had right type thru length of pattern. 
  82. ; This is a match if length was 6, or if shorter but source is
  83. ; followed by white space.
  84.     ld a,    b        ;Is it 6?
  85.     cp    ncpcs        ; ..
  86.     jp z,    iscl4        ;Yes, so it is a match.
  87.     push    hl
  88.     push    de
  89.     ld a,    (hl)        ;Not 6 chars long. Get next char in source
  90.     and    7FH        ;Flush parity bit
  91.     ld d,    0
  92.     ld e,    a
  93.     ld hl,    ascitb
  94.     add hl,    de
  95.     ld a,    (hl)        ;Bits for the following character
  96.     pop    de
  97.     pop    hl
  98.     and    c.wsp        ;Is it white space?
  99.     jp nz,    iscl4        ;Yes, so it is a match
  100. ;Pattern was not a match. Go see if any more patterns to try.
  101.     jp    iscl1        ;Try another pattern
  102.  
  103. ;Here if pattern failed to match before we counted thru it all the way.
  104. ;Have to step past the rest of it to find next one.
  105.  
  106. iscl3:
  107.     inc    de        ;Step pattern pointer
  108.     dec    c        ;Count thru pattern
  109.     jp nz,    iscl3        ;Go if more to check
  110.     jp    iscl1        ;Now go check possible further patterns
  111.  
  112. ; Here if pattern was a match. Straighten out the stack and return success.
  113.  
  114. iscl4:    pop    hl        ;Restore start of source callsign
  115.     or    a        ;Clear carry flag, means was good.
  116.     ret            ; Back to caller
  117.  
  118. ; Here are the legal patterns of callsigns. Format is: Length byte, then
  119. ; that many bytes of pattern. Then another length byte, zero to end.
  120. ; The pattern is c.alfa for a letter and c.num for a digit.
  121.  
  122. iscpat:
  123.     db    3,c.alfa,c.num,c.alfa                ;N6V
  124.     db    4,c.alfa,c.num,c.alfa,c.alfa            ;K1BC
  125.     db    4,c.alfa,c.alfa,c.num,c.alfa            ;KD2S
  126.     db    4,c.num,c.alfa,c.num,c.alfa            ;4U1U
  127.     db    5,c.alfa,c.num,c.alfa,c.alfa,c.alfa        ;W0RLI
  128.     db    5,c.alfa,c.alfa,c.num,c.alfa,c.alfa        ;KD6SQ
  129.     db    5,c.num,c.alfa,c.num,c.alfa,c.alfa        ;4U1UN
  130.     db    5,c.alfa,c.num,c.num,c.alfa,c.alfa        ;W84OG
  131.     db    5,c.alfa,c.alfa,c.num,c.num,c.alfa        ;WX84X
  132.     db    6,c.alfa,c.alfa,c.num,c.alfa,c.alfa,c.alfa    ;WB1EMT
  133.     db    6,c.num,c.alfa,c.num,c.alfa,c.alfa,c.alfa    ;4U1ITU
  134.     db    6,c.alfa,c.num,c.num,c.alfa,c.alfa,c.alfa    ;W84OGX
  135.     db    6,c.alfa,c.alfa,c.num,c.num,c.alfa,c.alfa    ;WX84OG
  136.     db    0                        ;End of list
  137.  
  138. ;Table of descriptors for the 128 ASCII characters. Should be page-aligned
  139. ; for easier reference, but...
  140. ;Bytes are indexed by the ASCII character number. 
  141. ;This block of 128 bytes looks like a waste of space, but it is made
  142. ; up by being used in a bunch of comparison tests.
  143.  
  144. ascitb:    db    c.ctl+c.supp            ;^@
  145.     db    c.ctl+c.supp            ;^A
  146.     db    c.ctl+c.supp            ;^B
  147.     db    c.ctl+c.supp            ;^C
  148.     db    c.ctl+c.supp            ;^D
  149.     db    c.ctl+c.supp            ;^E
  150.     db    c.ctl+c.supp            ;^F
  151.     db    c.ctl+c.supp            ;^G - Bell
  152.  
  153.     db    c.ctl                ;^H - Backspace
  154.     db    c.ctl+c.wsp            ;^I - Tab
  155.     db    c.ctl                ;^J - Linefeed
  156.     db    c.ctl+c.supp            ;^K - Vert tab
  157.     db    c.ctl+c.supp            ;^L - Formfeed
  158.     db    c.ctl                ;^M - Carriage Return
  159.     db    c.ctl+c.supp            ;^N
  160.     db    c.ctl+c.supp            ;^O
  161.  
  162.     db    c.ctl+c.supp            ;^P
  163.     db    c.ctl                ;^Q - XON
  164.     db    c.ctl+c.supp            ;^R
  165.     db    c.ctl                ;^S - XOFF
  166.     db    c.ctl+c.supp            ;^T
  167.     db    c.ctl+c.supp            ;^U
  168.     db    c.ctl+c.supp            ;^V
  169.     db    c.ctl+c.supp            ;^W
  170.  
  171.     db    c.ctl+c.supp            ;^X
  172.     db    c.ctl+c.supp            ;^Y
  173.     db    c.ctl+c.supp            ;^Z
  174.     db    c.ctl+c.supp            ;^[ - ESC
  175.     db    c.ctl+c.supp            ;^\
  176.     db    c.ctl+c.supp            ;^]
  177.     db    c.ctl+c.supp            ;^^
  178.     db    c.ctl+c.supp            ;^_
  179.  
  180.     db    c.wsp+c.file            ; space    040 02H
  181.     db    c.file                ; !
  182.     db    c.file                ; "
  183.     db    c.file                ; #
  184.     db    c.file                ; $
  185.     db    c.file                ; %
  186.     db    c.file                ; &
  187.     db    c.file                ; '
  188.  
  189.     db    c.file                ;( 050 28H
  190.     db    c.file                ;)
  191.     db    0                ;*
  192.     db    c.file                ;+
  193.     db    0                ;,
  194.     db    c.file                ;-
  195.     db    0                ;.
  196.     db    c.file                ;/
  197.  
  198.                         ;0-9 060-071 30H-39H
  199.     rept    10
  200.     db    c.num+c.file
  201.     endm
  202.  
  203.     db    0                ;: 072 3AH
  204.     db    0                ;;
  205.     db    0                ;<
  206.     db    0                ;=
  207.     db    0                ;>
  208.     db    0                ;?
  209.  
  210.     db    c.file                ;@ 100 40H
  211.                         ;A-Z 101-132 41H-5AH
  212.     rept    26
  213.     db    c.alfa+c.file
  214.     endm
  215.  
  216.     db    0                ;[ 133 5BH
  217.     db    c.file                ;\
  218.     db    0                ;]
  219.     db    c.file                ;^
  220.     db    c.file                ;_
  221.  
  222.     db    c.file                ;` 140 60H
  223.                         ;a-z 141-172 61H-7AH
  224.     rept    26
  225.     db    c.alfa+c.lc
  226.     endm
  227.  
  228.     db    c.file                ;{
  229.     db    c.file                ;|
  230.     db    c.file                ;}
  231.     db    c.file                ;~
  232.     db    c.supp                ;DELETE
  233.  
  234.     end
  235.