Вторая процедура - упрощенный релоцируемый вариант, опубликованной ранее
в ZX РЕВЮ процедуры Select. В ней использован тот же прием, что и в только что
расмотренной мною, т.е.
Def Fn S(X,Y,Len,N,Col)=USR add
Len - длина полоски;
N - количество выбираемых пунктов;
Col - цветовой атрибут полоски.
В регистре C процедура возвращает номер выбранного пункта. Узнать его можно и
из Бейсика, как это предложено в оригинале:
Np = RANDOMIZE Fn S(X,Y,Len,N,Col)
Программа расчитана на расширенную клавиатуру и на работу с Бейсиком. Однако,
ее несложно переделать для испоьзования в машкодах и "подвесить" на любые
клавиши.
Предложенные мною процедуры, помогут организовать в программах
многооконные меню.
; (C) Savchenko Vladislav, 1996
10 ENT $
20 LD IX,(23563)
30 LD D,(IX+4)
40 LD E,(IX+12)
50 LD A,E
60 AND #18
70 RRCA
80 RRCA
90 RRCA
100 OR #58
110 LD H,A
120 LD A,E
130 AND #07
140 RRCA
150 RRCA
160 RRCA
170 ADD A,D
180 LD L,A
190 LD DE,#0020
200 LD B,(IX+28)
210 LD C,D
220 DEC B
230 LEN PUSH BC
240 LD B,(IX+20)
250 LD C,(HL)
260 PUSH BC
270 LD A,(IX+36)
280 PUSH HL
290 LOOP1 LD (HL),A
300 INC HL
310 DJNZ LOOP1
320 POP HL
330 RES 5,(IY+1)
340 KEY BIT 5,(IY+1)
350 JR Z,KEY
360 LD A,(IY-50)
370 CP 14
380 JR NC,KEY
390 CP 10
400 JR C,KEY
410 POP BC
420 PUSH HL
430 LOOP2 LD (HL),C
440 INC HL
450 DJNZ LOOP2
460 POP HL
470 POP BC
480 CP 13
490 JR C,NEXTA
500 LD B,0
510 INC C
520 RET
530 NEXTA CP 11
540 JR C,NEXTB
550 LD A,C
560 OR A
570 JR Z,LEN
580 SBC HL,DE
590 DEC C
600 JR LEN
610 NEXTB LD A,C
620 CP B
630 JR NC,LEN
640 ADC HL,DE
650 DEC HL
660 INC C
670 JR LEN
Длина 110 байт.
ИФК.: Неприятной особенностью этой процедуры, является то, что она
работает только при разрешенных прерываниях IM1. А это плохо. Если Вы работаете
со вторыми прерываниями, то можно посоветовать в конце обработки прерываний
подать команду CALL #66. Если Вы не желаете использовать прерывания вообще, что
предпочтительней, то вставте эту команду между строками 330 и 340, а также
перенесите на эту команду метку KEY. Если и это Вас не устроит, то читайте
порты сами.