home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 14 / CDACTUAL.iso / cdactual / demobin / share / program / asm / SET_ASM.ZIP / SETTEST.ASM < prev   
Encoding:
Assembly Source File  |  1988-12-30  |  6.9 KB  |  240 lines

  1. page 60,132
  2. title    SETTEST.ASM  1.00
  3. ;--------------------------------------------------------------
  4. ;  Program     : Sets module test program
  5. ;  Version    : 1.00
  6. ;  System      : IBM PC-DOS 2.00+
  7. ;  Language    : IBM 8088 Macro Assembler
  8. ;  Author      : (C) 1985 by Tom Swan
  9. ;  Address    : Swan Software  P.O. Box 206  Lititz PA  17543
  10. ;--------------------------------------------------------------
  11. true    equ    -1
  12. false    equ    0
  13. host    equ    true
  14.  
  15. ;----------------------------------------
  16. ;    Code, data, stack groups
  17. ;----------------------------------------
  18. dgroup    group    dseg
  19. cgroup    group    cseg
  20. sgroup    group    sseg
  21.     assume    cs:cgroup, ds:dgroup, es:dgroup, ss:sgroup
  22.  
  23. ;----------------------------------------
  24. ;    Equates
  25. ;----------------------------------------
  26. cr    equ    13            ;ASCII carriage return
  27. lf    equ    10            ;ASCII line feed
  28.  
  29. ;----------------------------------------
  30. ;    Macro definitions
  31. ;----------------------------------------
  32.  
  33. ; Call dos function p1
  34.  
  35. dosfn    macro    p1            ;;"dosfn 2" calls dos function #2
  36.     mov    ah,p1            ;;pass function number in ah
  37.     int    21h            ;;call dos via interrupt 21 hex
  38.     endm
  39.  
  40. ; Call sets function
  41.  
  42. setfn    macro    n            ;;"setfn 8" calls sets function #8
  43.     mov    ah,n            ;;elect function n
  44.     call    sets            ;;call sets package (near)
  45.     endm
  46.  
  47. ;----------------------------------------
  48. ;    Data segment
  49. ;----------------------------------------
  50. dseg    segment byte public 'data'
  51. progid    db    'Set Test Program 1.00',cr,lf
  52.     db    '(C) 1985 by Tom Swan',cr,lf
  53. crlf    db    cr,lf,'$'
  54. donemsg db    cr,lf,'Test completed',cr,lf,'$'
  55.  
  56. ;----- Test strings.  First byte = length.
  57.  
  58. s1    db    36,'1234567890abcdefghijklmnopqrstuvwxyz'
  59. s2    db    13,'ACEGIKMOQSUWY'
  60. s3    db    13,'BDFHJLNPRTVXZ'
  61.  
  62. dseg    ends
  63.  
  64. ;----------------------------------------
  65. ;    Stack segment
  66. ;----------------------------------------
  67. sseg    segment para stack 'stack'
  68.     db    8 dup('**Stack*')
  69. sseg    ends
  70.  
  71. ;----------------------------------------
  72. ;    Code segment
  73. ;----------------------------------------
  74. cseg    segment byte public 'code'
  75.  
  76.     include    sets.ext        ;include global declarations
  77.  
  78. settest    proc    far
  79.     push    ds            ;set up far return address on stack
  80.     xor    ax,ax            ; equal to ds:0000.
  81.     push    ax
  82.     push    ds            ;save value of segment
  83.                                         ; registers ds,es 
  84.     push    es
  85.     mov    ax,dseg            ;prepare to load ds,es via ax
  86.     mov    ds,ax            ;set ds=data segment address
  87.     mov    es,ax            ;set es=data segment address
  88.     lea    dx,progid        ;dx=address program id message
  89.     dosfn    9            ;print string
  90.     lea    si,s1            ;test string 1
  91.     call    test
  92.     lea    si,s2            ;test string 2
  93.     call    test
  94.     lea    si,s3            ;test string 3
  95.     call    test
  96.     lea    dx,donemsg        ;dx=address done message
  97.     dosfn    9            ;print string
  98.     pop    es            ;restore segment registers es,ds
  99.     pop    ds
  100.     ret                ;execute far return to dos
  101. settest endp
  102. page
  103. ;----------------------------------------------------------
  104. ; PRINT / NEWLINE
  105. ;----------------------------------------------------------
  106. ; Purpose    -- display test string
  107. ;
  108. ; Called by    -- test
  109. ;
  110. ; Calls        -- none
  111. ;
  112. ; Arguments    -- (ds:si) = address of string at len byte
  113. ;
  114. ; Registers    -- ax,cx,dx destroyed, si preserved
  115. ;----------------------------------------------------------
  116. print    proc    near
  117.     push    si
  118.     cld                ;clear df for auto increments
  119.     lodsb                ;al <- [ds:si]; si <- si + 1
  120.     xor    cx,cx            ;zero cx
  121.     mov    cl,al            ;cx = string length 0 .. 255
  122.     jcxz    print2            ;exit if length = 0
  123. print1:
  124.     lodsb                ;al <- next character from string
  125.     mov    dl,al            ;transfer al to dl
  126.     dosfn    2            ;print char in dl
  127.     loop    print1            ;loop on cx
  128. print2:
  129.     pop    si            ;restore si register
  130.  
  131. ;----- Print crlf and return.  Can be called as separate subroutine.
  132. newline:
  133.     lea    dx,crlf            ;dx = address cr lf ASCII$ string
  134.     dosfn    9            ;print string
  135.     ret                ;return to caller
  136. print    endp
  137. page
  138. ;----------------------------------------------------------
  139. ; TEST
  140. ;----------------------------------------------------------
  141. ; Purpose    -- perform test -- enter characters until
  142. ;           set of characters typed equals expected
  143. ;           set of characters.  Repeat test if any
  144. ;           extra characters are accidentally typed.
  145. ;
  146. ; Called by    -- main program
  147. ;
  148. ; Calls        -- sets
  149. ;           print
  150. ;           report
  151. ;
  152. ; Arguments    -- (ds:si) = address of test string
  153. ;
  154. ; Registers    -- ax,cx,dx,di destroyed
  155. ;----------------------------------------------------------
  156. dseg    segment byte public 'data'
  157. chset    set<>            ;set of characters entered
  158. doneset set<>            ;set of characters expected
  159. dseg    ends
  160.  
  161. test    proc    near
  162.     push    si            ;save si in case test repeats
  163.     call    print            ;print test string
  164.     lea    di,doneset        ;di = address of doneset variable
  165.     setfn    4            ;doneset <- set of chars in string
  166.     lea    di,chset        ;di = address of chset variable
  167.     setfn    10            ;make chset = null set []
  168.     lea    si,doneset        ;preset si = address of doneset
  169. test1:
  170.     dosfn    1            ;get and echo char (ch in al)
  171.     mov    dl,al            ;transfer char to dl
  172.     setfn    8            ;insert dl into chset at (di)
  173.     xchg    si,di            ;si=chset, di=doneset
  174.     setfn    6            ;test for doneset <= chset
  175.     xchg    si,di            ;si=doneset, di=chset
  176.     jne    test1            ;jump if doneset
  177.                                         ; not a subset of chset
  178.  
  179. ;----- Report results of test, and repeat same test on any errors
  180.     call    report            ;check and report results
  181.     pop    si            ;restore si register
  182.     jz    test            ;repeat test on any errors
  183.     ret                ;else end test
  184. test    endp
  185. page
  186. ;----------------------------------------------------------
  187. ; REPORT
  188. ;----------------------------------------------------------
  189. ; Purpose    -- report results of test.
  190. ;
  191. ; Called by    -- test
  192. ;
  193. ; Calls        -- newline
  194. ;           sets
  195. ;
  196. ; Arguments    -- doneset (in test dseg) = expected char set
  197. ;           chset (in test dseg) = chars entered
  198. ;
  199. ; Registers    -- ax,dx,di,si destroyed
  200. ;           zf = 1 if extra chars entered (use jz)
  201. ;           zf = 0 if entry was perfect (use jnz)
  202. ;----------------------------------------------------------
  203. dseg    segment byte public 'data'
  204. repmsg    db    'Extra chars = ','$'
  205. noerr    db    'none',cr,lf,'$'
  206. error    db    ?
  207. dseg    ends
  208.  
  209. report    proc    near
  210.     mov    error,false        ;error flag = false
  211.     call    newline            ;write a blank line
  212.     lea    dx,repmsg        ;prepare to print report message
  213.     dosfn    9            ;print string
  214.     lea    di,doneset        ;di = address of doneset
  215.     lea    si,chset        ;si = address of chset
  216.     setfn    2            ;doneset <- chset - doneset
  217.     mov    dl,32            ;dl = ASCII first char to check
  218. rep1:
  219.     setfn    0            ;set membership for value in dl
  220.     jz    rep2            ;jump if dl not a member of doneset
  221.     mov    error,true        ; else flag the error
  222.     dosfn    2            ; and print the extra character
  223. rep2:
  224.     inc    dl            ;next char to test
  225.     cmp    dl,128            ;loop while dl < 128
  226.     jb    rep1
  227.     lea    dx,noerr        ;prepare to print "none" message
  228.     cmp    error,true        ;check error flag
  229.     jne    rep3            ;jump if no errors detected
  230.     lea    dx,crlf            ;print crlf if errors found
  231. rep3:
  232.     dosfn    9            ;print ASCII$ string at dx
  233.     call    newline            ;write two blank lines
  234.     call    newline
  235.     cmp    error,true        ;set flags before returning
  236.     ret                ;end test / report
  237. report    endp
  238. cseg    ends                ;end of segment
  239.     end    settest            ;end program
  240.