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 / ZSYS / SIMTEL20 / SYSLIB / SLIB1.LBR / SACAS3.Z80 < prev    next >
Text File  |  2000-06-30  |  2KB  |  85 lines

  1. ;
  2. ; SYSLIB Module Name: ACASE3
  3. ; Author: Richard Conn
  4. ; SYSLIB Version Number: 3.6
  5. ; Module Version Number: 1.1
  6.  
  7.     public    acase3
  8.  
  9. ;
  10. ; ACASE3 is a case statement processor.  On input, register A contains a
  11. ; value to test against and DE contains the address of the case table.
  12. ; Unlike ACASE1 and ACASE2, the return address to ACASE3 is preserved,
  13. ; so routines can continue execution by issuing a simple RET, and control
  14. ; will resume after the call to ACASE3.
  15. ;
  16. ;    MVI    A,TEST    ; test value
  17. ;    LXI    D,TABLE    ; case table
  18. ;    CALL    ACASE3
  19. ;    < instr to return to >    ; control resumes here if routines RET
  20. ;    ...
  21. ; TABLE:
  22. ;    DB    NUM$ENT    ; number of entries in CASE table
  23. ;    DW    DEFAULT    ; address to goto if no match in acase3
  24. ;    DB    VAL1    ; entry value 1 to test for
  25. ;    DW    ADDR1    ; address to goto if entry 1 matches
  26. ;    DB    VAL2    ; entry value 2 to test for
  27. ;    DW    ADDR2    ; address to goto if entry 2 matches
  28. ;    ...
  29. ;    DB    VALN    ; entry value N to test for (N = NUM$ENT)
  30. ;    DW    ADDRN    ; address to goto if entry N matches
  31. ;
  32. ; NUM$ENT is the number of values (VAL1 .. VALN) in the case table
  33. ;
  34. acase3:
  35.     push    hl    ; save HL
  36.     ld    h,d    ; HL=DE=case table address
  37.     ld    l,e
  38.     push    af    ; save regs
  39.     push    bc
  40.     ld    b,(hl)    ; number of entries
  41.     inc    hl    ; pt to default
  42.     ld    (default),hl    ; save it
  43.     inc    hl    ; pt to first entry
  44.     inc    hl
  45. ;
  46. ; Loop through case table entries, looking for a match
  47. ;
  48. loop:
  49.     cp    (hl)    ; compare
  50.     jp    z,match
  51.     inc    hl    ; pt to next
  52.     inc    hl
  53.     inc    hl
  54.     dec    b    ; count down
  55.     jp    nz,loop
  56. ;
  57. ; No match found - use default
  58. ;
  59.     ld    hl,(default)    ; get default
  60.     jp    goto
  61. ;
  62. ; Match - use HL+1
  63. ;
  64. match:
  65.     inc    hl    ; point to address
  66. ;
  67. ; Get address in HL and run routine (original return address still on stack)
  68. ;
  69. goto:
  70.     ld    a,(hl)    ; get low
  71.     inc    hl
  72.     ld    h,(hl)    ; get high
  73.     ld    l,a    ; HL = address
  74.     pop    bc    ; restore regs
  75.     pop    af
  76.     ex    (sp),hl        ; return address on stack, HL restored
  77.     ret
  78. ;
  79. ; Storage for default address
  80. ;
  81. default:
  82.     ds    2
  83.  
  84.     end
  85.