home *** CD-ROM | disk | FTP | other *** search
/ The Equalizer BBS / equalizer-bbs-collection_2004.zip / equalizer-bbs-collection / DEMOSCENE-STUFF / BYTE-SRC.ZIP / LOADER / MENUS.INC < prev    next >
Text File  |  1993-12-25  |  9KB  |  271 lines

  1. ;HandleMenu
  2. ;DisplayMenu
  3. ;DisplayChar
  4. ;DisplayText
  5. ;GetVideoSegment
  6.  
  7. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  8. struc       SelectorType
  9.             Row             dw ?
  10.             Column          dw ?
  11.             NumItems        dw ?
  12.             CurrentChoice   dw ?
  13. label       Titles          byte
  14. ends        SelectorType
  15. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  16. struc       StringType
  17.             StringLength    dw ?
  18. label       Text            byte
  19. ends        StringType
  20. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  21. macro       DefineTitle padlength,stringtext
  22.             stringlength sizestr <stringtext>
  23.             errif (stringlength-2+4) gt (padlength) "String too long"
  24.             dw padlength
  25.             if (stringlength-2) ge 1
  26.                 padwidth = ((padlength)-(stringlength-2+4))/2
  27.                 if (padwidth) ge 1
  28.                     db (padwidth) dup ('═')
  29.                 endif
  30.                 db "╡ ",stringtext," ╞"
  31.                 padwidth = (padlength-((stringlength-2+4)+padwidth))
  32.                 if (padwidth) ge 1
  33.                     db (padwidth) dup ('═')
  34.                 endif
  35.             else
  36.                 db (padlength) dup('═')
  37.             endif
  38. endm
  39. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  40. macro       DefineString padlength,stringtext,padvalue
  41.             stringlength sizestr <stringtext>
  42.             errif (stringlength-2) gt (padlength) "String too long"
  43.             dw padlength
  44.             db stringtext
  45.             padwidth = (padlength)-(stringlength-2)
  46.             if (padwidth) ge 1
  47.                 db (padwidth) dup (padvalue)
  48.             endif
  49. endm
  50. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  51. macro       CenterString padlength,stringtext,padvalue
  52.             stringlength sizestr <stringtext>
  53.             errif (stringlength-2) gt (padlength) "String too long"
  54.             dw padlength
  55.             padwidth = ((padlength)-(stringlength-2))/2
  56.             if (padwidth) ge 1
  57.                 db (padwidth) dup (padvalue)
  58.             endif
  59.             db stringtext
  60.             padwidth = (padlength-((stringlength-2)+padwidth))
  61.             if (padwidth) ge 1
  62.                 db (padwidth) dup (padvalue)
  63.             endif
  64. endm
  65. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  66. ;returns:   ES = segment of video memory (0B800h or 0B000h)
  67. proc        GetVideoSegment
  68.             mov ax,40h              ;\ set ES to the BIOS
  69.             mov es,ax               ;/ information area
  70.             mov ax,0B000h           ;default to mono card
  71.             test [word es:4Ah],30h  ;is it a monochrome?
  72.             je @@Quit               ;   yes -- quit, we're done
  73.             mov ax,0B800h           ;set to color card
  74. @@Quit:     mov es,ax               ;point ES to video
  75.             ret                     ;return
  76. endp        GetVideoSegment
  77. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  78. ;           ES = segment of video memory (0B800h or 0B000h)
  79. ;           AL = character
  80. ;           AH = attribute
  81. ;           CX = column (0 based)
  82. ;           DX = row (0 based)
  83. proc        DisplayChar
  84.             push di
  85.  
  86.             mov di,dx
  87.             shl di,2
  88.             add di,dx
  89.             shl di,4
  90.             add di,cx
  91.             shl di,1
  92.             mov [word es:di],ax
  93.  
  94.             inc cx
  95.  
  96.             pop di
  97.             ret
  98. endp        DisplayChar
  99. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  100. ;           ES = segment of video memory (0B800h or 0B000h)
  101. ;           AH = attribute
  102. ;           BX = length of string
  103. ;           CX = column (0 based)
  104. ;           DX = row (0 based)
  105. ;           DS:SI ==> text
  106. proc        DisplayText
  107. @@Loop:     lodsb
  108.             call DisplayChar
  109.             dec bx
  110.             jnz @@Loop
  111.             ret
  112. endp        DisplayText
  113. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  114. ;           ES = segment of video memory (0B800h or 0B000h)
  115. ;           DS:SI ==> menu structure
  116. ;           AL = base color
  117. ;           AH = highlighted color
  118. proc        DisplayMenu
  119.             mov [cs:@@BaseColor],al
  120.             mov [cs:@@HighColor],ah
  121.             mov di,si
  122.  
  123.             ;*** first row ***
  124.             mov cx,[ds:di+SelectorType.Column]
  125.             mov dx,[ds:di+SelectorType.Row]
  126.             mov al,'╔'
  127.             mov ah,[cs:@@BaseColor]
  128.             call DisplayChar
  129.  
  130.             mov bx,[ds:di+offset  (SelectorType).Titles+offset (StringType).StringLength]
  131.             mov si,di
  132.             add si,offset (SelectorType).Titles+offset (StringType).Text
  133.             call DisplayText
  134.  
  135.             mov al,'╗'
  136.             call DisplayChar
  137.  
  138.             ;*** second row ***
  139.             mov cx,[ds:di+SelectorType.Column]
  140.             inc dx              ;next row
  141.             mov al,'║'
  142.             mov ah,[cs:@@BaseColor]
  143.             call DisplayChar
  144.  
  145.             mov bx,[ds:di+offset (SelectorType).Titles+offset (StringType).StringLength]
  146.             mov al,' '
  147. @@2ndLoop:  call DisplayChar
  148.             dec bx
  149.             jnz @@2ndLoop
  150.  
  151.             mov al,'║'
  152.             call DisplayChar
  153.  
  154.             ;*** display all of the choices ***
  155.             mov cx,[ds:di+SelectorType.NumItems]        ;CX = number to do
  156.             mov bx,cx
  157.             sub bx,[ds:di+SelectorType.CurrentChoice]   ;BX = no. of choice
  158.             mov si,di
  159.             add si,offset (SelectorType).Titles
  160.             add si,[word si+(StringType).StringLength]
  161.             add si,size StringType                      ;SI ==> 1st choice
  162.             inc dx              ;next row
  163.  
  164. @@3rdLoop:  push cx bx si
  165.  
  166.             mov ah,[cs:@@BaseColor]     ;\
  167.             mov al,[cs:@@HighColor]     ; \
  168.             cmp bx,cx                   ;  \ set [@@Temp] to color to use
  169.             jz @@GotColor               ;  / for item name
  170.             mov al,ah                   ; /
  171. @@GotColor: mov [cs:@@Temp],al          ;/
  172.  
  173.             mov cx,[ds:di+SelectorType.Column]
  174.             mov al,'║'
  175.             mov ah,[cs:@@BaseColor]
  176.             call DisplayChar
  177.  
  178.             mov ah,[cs:@@Temp]
  179.             mov bx,[ds:si+StringType.StringLength]
  180.             add si,offset (StringType).Text
  181.             call DisplayText
  182.  
  183.             mov al,'║'
  184.             mov ah,[cs:@@BaseColor]
  185.             call DisplayChar
  186.  
  187.             pop si bx cx
  188.             inc dx                              ;start on next row
  189.             add si,[ds:si+StringType.StringLength]
  190.             add si,size StringType              ;point to next string
  191.             dec cx
  192.             jnz @@3rdLoop                       ;loop until we're done
  193.  
  194.             ;*** last row ***
  195.             mov cx,[ds:di+SelectorType.Column]
  196.             mov al,'╚'
  197.             mov ah,[cs:@@BaseColor]
  198.             call DisplayChar
  199.  
  200.             mov bx,[ds:di+offset (SelectorType).Titles+offset (StringType).StringLength]
  201.             mov al,'═'
  202. @@4thLoop:  call DisplayChar
  203.             dec bx
  204.             jnz @@4thLoop
  205.  
  206.             mov al,'╝'
  207.             call DisplayChar
  208.  
  209.             ret
  210.  
  211. @@BaseColor db  ?
  212. @@HighColor db  ?
  213. @@Temp      db  ?
  214. endp        DisplayMenu
  215. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  216. ;           ES = segment of video memory (0B800h or 0B000h)
  217. ;           DS:SI ==> menu structure
  218. ;           AL = base color
  219. ;           AH = highlighted color
  220. ;returns:   BX = selected choice (-1 if escape was pressed)
  221. proc        HandleMenu
  222.             mov [cs:@@BaseColor],al
  223.             mov [cs:@@HighColor],ah
  224.  
  225. @@Update:   push si
  226.             mov al,[cs:@@BaseColor]
  227.             mov ah,[cs:@@HighColor]
  228.             call DisplayMenu
  229.             pop si
  230.  
  231. @@Wait:     mov ah,7
  232.             int 21h
  233.             cmp al,27       ;Escape
  234.             jz @@Escape
  235.             cmp al,13       ;Enter
  236.             jz @@Quit
  237.             cmp al,0
  238.             jnz @@Wait
  239.             mov ah,7
  240.             int 21h
  241.             cmp al,48h      ;Cursor-Up
  242.             jz @@Up
  243.             cmp al,50h      ;Cursor-Down
  244.             jz @@Down
  245.             jmp @@Wait
  246. @@Up:       mov ax,[ds:si+offset (SelectorType).CurrentChoice]
  247.             dec ax
  248.             cmp ax,-1
  249.             jg @@Up1
  250.             mov ax,[ds:si+offset (SelectorType).NumItems]
  251.             dec ax
  252. @@Up1:      mov [ds:si+offset (SelectorType).CurrentChoice],ax
  253.             jmp @@Update
  254. @@Down:     mov ax,[ds:si+offset (SelectorType).CurrentChoice]
  255.             inc ax
  256.             cmp ax,[ds:si+offset (SelectorType).NumItems]
  257.             jb @@Down1
  258.             xor ax,ax
  259. @@Down1:    mov [ds:si+offset (SelectorType).CurrentChoice],ax
  260.             jmp @@Update
  261.  
  262. @@Escape:   mov bx,-1
  263.             ret
  264. @@Quit:     mov bx,[ds:si+offset (SelectorType).CurrentChoice]
  265.             ret
  266.  
  267. @@BaseColor db  ?
  268. @@HighColor db  ?
  269. endp        HandleMenu
  270. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  271.