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 / SIMTEL / CPMUG / CPMUG029.ARK / SELECTS.LIB < prev    next >
Text File  |  1984-04-29  |  2KB  |  79 lines

  1. ;    MACRO LIBRARY FOR "SELECT" CONSTRUCT
  2. ;
  3. ;    LABEL GENERATORS
  4. GENSLXI    MACRO    NUM
  5. ;;    LOAD HL WITH ADDRESS OF CASE LIST
  6.     LXI    H,SELV&NUM
  7.     ENDM
  8. ;
  9. GENCASE    MACRO    NUM,ELT
  10. ;;    GENERATE JMP TO END OF CASES
  11.     IF    ELT GT 0
  12.     JMP    ENDS&NUM    ;;PAST ADDR LIST
  13.     ENDIF
  14. ;;    GENERATE LABEL FOR THIS CASE
  15. CASE&NUM&@&ELT:
  16.     ENDM
  17. ;
  18. GENELT    MACRO    NUM,ELT
  19. ;;    GENERATE ONE ELEMENT OF CASE LIST
  20.     DW    CASE&NUM&@&ELT
  21.     ENDM
  22. ;
  23. GENSLAB    MACRO    NUM,ELTS
  24. ;;    GENERATE CASE LIST
  25. SELV&NUM:
  26. ECNT    SET    0    ;;COUNT ELEMENTS
  27.     REPT    ELTS    ;;GENERATE DW'S
  28.     GENELT    NUM,%ECNT
  29. ECNT    SET    ECNT+1
  30.     ENDM        ;;END OF DW'S
  31. ;;    GENERATE END OF CASE LIST LABEL
  32. ENDS&NUM:
  33.     ENDM
  34. ;
  35. SELNEXT    MACRO
  36. ;;    GENERATE THE NEXT CASE
  37.     GENCASE    %CCNT,%ECNT
  38. ;;    INCREMENT THE CASE ELEMENT COUNT
  39. ECNT    SET    ECNT+1
  40.     ENDM
  41. ;
  42. SELECT    MACRO    VAR
  43. ;;    GENERATE CASE SELECTION CODE
  44. SCNT    SET    0    ;;COUNT "SELECTS"
  45. SELECT    MACRO    V    ;;REDEFINITION OF SELECT
  46.     SYMPSH    %CCNT    ;;SAVE PREVIOUS SELECT NUMBER
  47.     SYMPSH    %ECNT    ;;AND ITS CASE COUNT
  48. CCNT    SET    SCNT    ;;CREATE NEXT SELECT NUMBER
  49. SCNT    SET    SCNT+1    ;;UPDATE SELECT COUNT
  50. ;;    SELECT ON V OR ACCUMULATOR CONTENTS
  51.     IF    NOT NUL V
  52.     LDA    V    ;;LOAD SELECT VARIABLE
  53.     ENDIF
  54.     GENSLXI    %CCNT    ;;GENERATE THE LXI H,SELV#
  55.     MOV    E,A    ;;CREATE DOUBLE PRECISION
  56.     MVI    D,0    ;;V IN D,E PAIR
  57.     DAD    D    ;;SINGLE PREC INDEX
  58.     DAD    D    ;;DOUBLE PREC INDEX
  59.     MOV    E,M    ;;LOW ORDER BRANCH ADDR
  60.     INX    H    ;;TO HIGH ORDER BYTE
  61.     MOV    D,M    ;;HIGH ORDER BRANCH INDEX
  62.     XCHG        ;;READY BRANCH ADDRESS IN HL
  63.     PCHL        ;;GONE TO THE PROPER CASE
  64. ECNT    SET    0    ;;ELEMENT COUNTER RESET
  65.     SELNEXT        ;;SELECT CASE 0
  66.     ENDM
  67. ;;    INVOKE REDEFINED SELECT THE FIRST TIME
  68.     SELECT    VAR
  69.     ENDM
  70. ;
  71. ENDSEL    MACRO
  72. ;;    END OF SELECT, GENERATE CASE LIST
  73.     GENCASE    %CCNT,%ECNT    ;;LAST CASE
  74.     GENSLAB    %CCNT,%ECNT    ;;CASE LIST
  75. ;;    GET BACK PREVIOUS SELECT PARAMETERS (IF ANY)
  76.     SYMPOP    ECNT
  77.     SYMPOP    CCNT
  78.     ENDM
  79.