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 / GENASM / DISPMEN.LBR / DISPMEN.LQB / DISPMEN.LIB
Text File  |  2000-06-30  |  2KB  |  96 lines

  1. ;DISPMEN (Display Menu) Macro by R. Buckman
  2. ;File name: DISPMEN.lib
  3. ;
  4. MENFLG    SET    FALSE        ;CONDITIONAL ASSEMBLY FLAG
  5.  
  6. DISPMEN    MACRO    TOP,BOT,CPE    ;TOP, BOTTOM, CHARS PER ENTRY
  7. ;
  8.     LOCAL    COMOF0,COMOF1,PRTLN,PRTSPC,PRTENT0,PRTENT1
  9. ;
  10.     IF NOT MENFLG
  11.     JMP    AROUND
  12. ?SETUP:
  13.     LDA    TMNENT        ;COMPUTE NO. OF MENU ENTRIES
  14.     STC
  15.     CMC            ;CLEAR CARRY FLAG
  16.     RAR            ;DIVIDE BY 2
  17.     JNC    COMOF0        ;EVEN NO. OF ENTRIES
  18.     INR    A        ;ODD NO. OF ENTRIES
  19. COMOF0:                ;COMPUTE OFFSET TO RT COL
  20.     MOV    C,A        ;NO. OF ENTRIES TO PRT IN LF COL
  21.     LDA    LEN        ;LENGTH OF ONE ENTRY
  22.     MVI    D,0
  23.     MOV    E,A        ;[DE] HAS LENGTH OF ONE ENTRY
  24. COMOF1:                ;COMPUTE 1ST ADDR FOR RIGHT COLUMN
  25.     DAD    D        ;ADD LENGTH OF ONE ENTRY TO [HL]
  26.     DCR    C
  27.     JNZ    COMOF1        ;KEEP IT UP UNTIL [C]=0
  28.     SHLD    RCOL        ;SAVE 1ST ADDR FOR RIGHT COLUMN
  29.     LDA    TMNENT
  30.     MOV    B,A        ;[B] HAS NO. OF ENTRIES TO PRINT
  31.     LDA    LEN        ;COMPUTE SPACES TO PRINT..
  32.     MOV    C,A        ;..BETWEEN COLUMNS
  33.     MVI    A,41        ;COL NO. TO PRINT RIGHT SIDE
  34.     SBB    C
  35.     MOV    D,A        ;[D] HAS NO. OF SPACES
  36. PRTLN:
  37.     LHLD    LCOL        ;GET LEFT COLUMN ADDRESS
  38.     CALL    PRTENT0
  39.     RZ            ;ALL DONE PRINTING MENU
  40.     SHLD    LCOL        ;SAVE NEXT LEFT COL ADDR
  41.     MOV    C,D
  42. PRTSPC:    MVI    A,32        ;SPACE
  43.     CALL    CTYPE
  44.     DCR    C
  45.     JNZ    PRTSPC
  46.     LHLD    RCOL
  47.     CALL    PRTENT0
  48.     RZ            ;ALL DONE
  49.     SHLD    RCOL
  50.     CALL    CRLF
  51.     JMP    PRTLN
  52. ;
  53. PRTENT0:
  54.     LDA    LEN
  55.     MOV    C,A        ;NUMBER OF CHARACTERS TO PRINT
  56.     CALL    PRTENT1        ;PRT ENTRY POINTED TO BY [HL]
  57.     DCR    B
  58.     RET
  59. PRTENT1:            ;PRT ONE ENTRY, [HL]=1ST CHAR
  60.                 ;[C] = NUMBER OF CHAR (LENGTH)
  61.     MOV    A,M        ;PLACE CHAR IN [A] FOR CTYPE
  62.     CALL    CTYPE        ;PRT 1 CHAR POINTED TO BY [HL]
  63.     INX    H        ;POINT TO NEXT CHAR
  64.     DCR    C
  65.     JNZ    PRTENT1
  66.     RET
  67. ;
  68. ;Local variables for menu routine
  69. ;
  70. LEN:    DS    1    ;NO. OF CHARACTERS PER ENTRY
  71. LCOL:    DW    0    ;LEFT COLUMN POINTER
  72. RCOL:    DW    0    ;RIGHT COLUMN POINTER
  73. TMNENT:    DS    1    ;TOTAL NO. OF MENU ENTRIES
  74. ;
  75. MENFLG    SET    TRUE
  76. ;
  77. AROUND:
  78.     ENDIF
  79.     PUSH    H
  80.     PUSH    D
  81.     PUSH    B
  82.     PUSH    PSW
  83.     MVI    A,(BOT-TOP)/CPE    ;COMPUTE TOTAL NO. OF MENU ENTRIES
  84.     STA    TMNENT
  85.     MVI    A,CPE        ;CHARS PER ENTRY
  86.     STA    LEN
  87.     LXI    H,TOP        ;MENU START ADDRESS
  88.     SHLD    LCOL
  89.     CALL    ?SETUP
  90.     POP    PSW
  91.     POP    B
  92.     POP    D
  93.     POP    H
  94.     ENDM
  95. ;
  96.