----------------------------------
(C) Антон Сидоренко,
Мурманская обл., 1995.
-----------------------------------
OPTION SELECTOR
Программа выполняет выбор оп-
ции меню посредством наведения
полоски-указателя на необходимую
опцию (как в системном меню
SPECTRUM-128).
Эту процедуру можно встраивать
как в программы в кодах, так и в
Бейсик-программы, так как обмен
данными происходит через ячейки
памяти.
Программа имеет два режима уп-
равления полоской-указателем и
два режима выхода, которые зада-
ются содержимым ячеек MOD2 и MOD1
соответственно (см. ниже).
У программы есть ограничение:
нельзя задавать координаты первой
опции в нулевой строке экрана.
Пример работы. Командами PRINT
или другим способом изобразите на
экране меню с несколькими пункта-
ми. Занесите координаты первого
пункта в ячейку FCRD и задайте
остальные переменные для работы
OPTION SELECTOR'а. Запустите его
RANDOMIZE USR 40000 или иначе. По
окончании работы программа поме-
щает номер выбранного пункта меню
в ячейку OPTN и выходит по коман-
де RET. Считав командой PEEK зна-
чение OPTN Вы узнаете, какой
пункт меню был выбран.
Теперь привожу описание необ-
ходимых переменных, которые зада-
ются перед запуском:
FCRD (2 байта) - координаты
первого символа первого пункта
меню (строка, столбец).
NLIN (1 байт) - количество оп-
ций меню.
MCLR (1 байт) - цвет (атрибу-
ты) для выделения опций.
RCLR (1 байт) - атрибуты для
восстановления исходного цвета
опции.
MOD2 (1 байт) - режим звука
(1) или паузы (0) при движении
курсора.
MOD1 (1 байт) - режим звука
(0) или мигания (1) при выборе
опции.
WLIN (1 байт) - ширина курсора
в знакоместах.
00001 ; (C) Logic Games'94
00010 ORG 40000
00020 ENT
00030 OS EI
00040 CALL NEWCR
00050 CALL INIT
00060 CALL PIC2
00070 OS1 CALL INPUT
00080 CALL ADDTN
00090 CALL PICTR
00100 CALL PAUSE
00110 JR OS1
00120 NEWCR LD DE,FCRD
00130 NC1 LD A,(DE)
00140 LD (NCRD),A
00150 LD (TCRD),A
00160 LD L,A
00170 INC DE
00180 LD H,0
00190 OR A
00200 ADD HL,HL
00210 ADD HL,HL
00220 ADD HL,HL
00230 ADD HL,HL
00240 ADD HL,HL
00250 LD A,(FCRD+1)
00260 LD E,A
00270 LD D,0
00280 ADD HL,DE
00290 LD DE,22528
00300 ADD HL,DE
00310 LD (OCRD),HL
00320 RET
00330 INPUT NOP
00340 INP1 LD A,239
00350 IN A,(254)
00360 AND 31
00370 BIT 0,A
00380 JR Z,FIRE
00390 BIT 2,A
00400 JR Z,UP
00410 BIT 1,A
00420 JR Z,DOWN
00430 JR INP1
00440 UP LD A,1
00450 RET
00460 DOWN XOR A
00470 RET
00480 FIRE LD A,2
00490 RET
00500 ADDTN SRL A
00510 JR NZ,QUIT
00520 JR C,ADD2
00530 SUBTN LD A,(STEP)
00540 LD B,A
00550 LD A,(TCRD)
00560 AND A
00570 SUB B
00580 LD B,A
00590 LD A,(FCRD)
00600 CP 0
00610 JR Z,S2
00620 DEC A
00630 S2 CP B
00640 JR NC,SUB2
00650 LD A,B
00660 S3 LD (TCRD),A
00670 LD (NCRD),A
00680 RET
00690 SUB2 LD A,(FCRD)
00700 LD D,A
00710 LD A,(STEP)
00720 LD C,A
00730 LD A,(NLIN)
00740 DEC A
00750 DEC A
00760 LD B,A
00770 LD A,C
00780 AND A
00790 SUB3 ADD A,C
00800 DJNZ SUB3
00810 ADD A,D
00820 LD (TCRD),A
00830 RET
00840 ADD2 CALL SUB2
00850 LD A,(TCRD)
00860 INC A
00870 LD B,A
00880 LD A,(NCRD)
00890 LD C,A
00900 LD A,(STEP)
00910 AND A
00920 ADD A,C
00930 CP B
00940 JR NC,ADD3
00950 LD (TCRD),A
00960 RET
00970 ADD3 LD A,(FCRD)
00980 LD (TCRD),A
00990 RET
01000 QUIT LD A,(MOD1)
01010 SLA A
01020 JR NZ,FLASH
01030 LD HL,50
01040 LD DE,70
01050 CALL 949
01060 LD A,(RCLR)
01070 LD (MCLR),A
01080 CALL PICTR
01090 JR END
01100 FLASH LD B,10
01110 FL1 PUSH BC
01120 CALL PICTR
01130 LD A,(MCLR)
01140 LD (CLR),A
01150 LD A,(RCLR)
01160 LD (MCLR),A
01170 CALL PICTR
01180 LD A,(CLR)
01190 LD (MCLR),A
01200 LD HL,500
01210 FL2 DEC HL
01220 LD A,H
01230 OR L
01240 JR NZ,FL2
01250 POP BC
01260 DJNZ FL1
01270 END LD A,(NCRD)
01280 LD B,A
01290 LD A,(STEP)
01300 LD C,A
01310 LD A,(FCRD)
01320 LD HL,OPTN
01330 LD (HL),1
01340 EN1 CP B
01350 JR Z,EN2
01360 ADD A,C
01370 INC (HL)
01380 JR EN1
01390 EN2 POP HL
01400 RET
01410 PICTR LD HL,(OCRD)
01420 CALL PIC3
01430 LD A,(RCLR)
01440 LD (HL),A
01450 HALT
01460 LDIR
01470 LD DE,TCRD
01480 CALL NC1
01490 LD A,(TCRD)
01500 LD (NCRD),A
01510 PIC2 LD HL,(OCRD)
01520 CALL PIC3
01530 LD A,(MCLR)
01540 LD (HL),A
01550 HALT
01560 LDIR
01570 RET
01580 PIC3 LD A,(WLIN)
01590 LD C,A
01600 LD B,0
01610 DEC C
01620 LD D,H
01630 LD E,L
01640 INC DE
01650 RET
01660 PAUSE LD A,(MOD2)
01670 SLA A
01680 JR NZ,PAUS2
01690 LD B,4
01700 PAS1 HALT
01710 DJNZ PAS1
01720 RET
01730 PAUS2 LD B,3
01740 PAS2 HALT
01750 DJNZ PAS2
01760 LD HL,20
01770 LD DE,30
01780 CALL 949
01790 RET
01800 INIT LD A,(FCRD)
01810 LD (TCRD),A
01820 LD (NCRD),A
01830 RET
01840 FCRD DEFW #0105
01850 NLIN DEFB 6
01860 MCLR DEFB 7
01870 RCLR DEFB 56
01880 MOD1 DEFB 0
01890 MOD2 DEFB 1
01900 WLIN DEFB 10
01910 OPTN DEFB 0
01920 OCRD DEFW 0
01930 NCRD DEFB 0
01940 STEP DEFB 1
01950 TCRD DEFB 0
01960 CLR DEFB 0
Приведенная программа имеет
один небольшой недостаток. После
нажатия клавиши "ОГОНЬ" изменяет-
ся содержимое ячейки MCLR, оно
становится равным RCLR. Это при-
ведет к тому, что при повторном
запуске блока кодов (что очень
вероятно при выполнении какой-ли-
бо программы) не будет происхо-
дить выделение опции меню другим
цветом. Для устранения этого не-
достатка можем порекомендовать
несколько изменить программу:
прежде всего разбить подпрограмму
PICTR на две самостоятельные час-
ти: PICTR и PIC2, что достигается
введением дополнительных строк:
01505 RET
00095 CALL PIC2
Кроме этого необходимо исклю-
чить строки 1060, 1070, а также
изменить строку 1120:
01120 CALL PIC2
Другим усовершенствованием яв-
ляется упрощение использования
подпрограммы меню из Бейсика.
Чтобы не считывать результат при
помощи PEEK, добавьте еще пару
строк:
01392 LD BC,(OPTN)
01394 LD B,0
В этом случае результат можно
считывать в переменную Бейсика.
Например, при вызове программы
меню при помощи LET men=USR 40000
результат работы без лишних хло-
пот прямиком попадет в переменную
men. PRINT USR 40000 выдаст ре-
зультат работы на экран и т.д.
Модернизированная программа
будет иметь параметры:
Start of object: #9C40 (40000)
Length : #0177 (00375)
Executes : #9C40 (40000)
Шестнадцатиричный дамп блока
кодов:
9C40: FB CD 5B 9C CD 9E 9D CD :70
9C48: 69 9D CD 7E 9C CD 9B 9C :D5
9C50: CD 4F 9D CD 69 9D CD 82 :C7
9C58: 9D 18 EF 11 A8 9D 1A 32 :3A
9C60: B3 9D 32 B5 9D 6F 13 26 :78
9C68: 00 B7 29 29 29 29 29 3A :C2
9C70: A9 9D 5F 16 00 19 11 00 :F1
9C78: 58 19 22 B1 9D C9 00 3E :FC
9C80: EF DB FE E6 1F CB 47 28 :23
9C88: 0F CB 57 28 06 CB 4F 28 :C5
9C90: 05 18 EC 3E 01 C9 AF C9 :B5
9C98: 3E 02 C9 CB 3F 20 56 38 :F5
9CA0: 35 3A B4 9D 47 3A B5 9D :CF
9CA8: A7 90 47 3A A8 9D FE 00 :3F
9CB0: 28 01 3D B8 30 08 78 32 :4C
9CB8: B5 9D 32 B3 9D C9 3A A8 :D3
9CC0: 9D 57 3A B4 9D 4F 3A AA :0E
9CC8: 9D 3D 3D 47 79 A7 81 10 :73
9CD0: FD 82 32 B5 9D C9 CD BE :C3
9CD8: 9C 3A B5 9D 3C 47 3A B3 :0C
9CE0: 9D 4F 3A B4 9D A7 81 B8 :D3
9CE8: 30 04 32 B5 9D C9 3A A8 :E7
9CF0: 9D 32 B5 9D C9 3A AD 9D :FA
9CF8: CB 27 20 0E 21 32 00 11 :18
9D00: 46 00 CD B5 03 CD 4F 9D :21
9D08: 18 26 06 0A C5 CD 69 9D :8B
9D10: 3A AB 9D 32 B6 9D 3A AC :9A
9D18: 9D 32 AB 9D CD 4F 9D 3A :BF
9D20: B6 9D 32 AB 9D 21 F4 01 :A0
9D28: 2B 7C B5 20 FB C1 10 DC :E9
9D30: 3A B3 9D 47 3A B4 9D 4F :78
9D38: 3A A8 9D 21 B0 9D 36 01 :F9
9D40: B8 28 04 81 34 18 F9 E1 :68
9D48: ED 4B B0 9D 06 00 C9 2A :63
9D50: B1 9D CD 77 9D 3A AC 9D :9F
9D58: 77 76 ED B0 11 B5 9D CD :AF
9D60: 5E 9C 3A B5 9D 32 B3 9D :05
9D68: C9 2A B1 9D CD 77 9D 3A :61
9D70: AB 9D 77 76 ED B0 C9 3A :E2
9D78: AF 9D 4F 06 00 0D 54 5D :74
9D80: 13 C9 3A AE 9D CB 27 20 :90
9D88: 06 06 04 76 10 FD C9 06 :87
9D90: 03 76 10 FD 21 14 00 11 :F9
9D98: 1E 00 CD B5 03 C9 3A A8 :83
9DA0: 9D 32 B5 9D 32 B3 9D C9 :A9
9DA8: 05 01 06 07 38 00 01 0A :9B
9DB0: 00 00 00 00 01 00 00 00 :4E
SUPER RUNNING LINE.
Эта программа выводит заданный
текст (тем шрифтом, который опре-
делен системной переменной CHARS)
в виде бегущей строки, расходя-
щейся влево и вправо (зеркально)
из центра экрана. Плавность сдви-
га достигается при помощи команды
HALT.
В строке 30 листинга задается
длина текста, заданного в строках
1090-1150.
00010 ; (C) Logic Games'94
00020 ORG 40000
00030 LENGTH EQU 57
00040 STBUFG DEFS 8
00050 TEXTA DEFW 0
00060 LOOP1 DEFB 0
00070 LOOP2 DEFW 0
00080 ENT
00090 EI
00100 START LD A,8
00110 LD (LOOP1),A
00120 LD HL,LENGTH
00130 LD (LOOP2),HL
00140 LD HL,TEXTN
00150 LD (TEXTA),HL
00160 TS2 CALL GSYM
00170 CALL FASYM
00180 TS1 CALL SCROLL
00190 CALL SCROLL
00200 CALL MSYM
00210 LD A,(LOOP1)
00220 DEC A
00230 LD (LOOP1),A
00240 JR NZ,TS1
00250 LD A,8
00260 LD (LOOP1),A
00270 LD HL,(LOOP2)
00280 DEC HL
00290 LD (LOOP2),HL
00300 LD A,H
00310 OR L
00320 JR NZ,TS2
00330 RET
00340 GSYM LD HL,(TEXTA)
00350 LD A,(HL)
00360 INC HL
00370 LD (TEXTA),HL
00380 RET
00390 FASYM LD HL,(23606)
00400 LD B,A
00410 LD DE,8
00420 CP 31
00430 JR Z,FA1
00440 FA2 AND A
00450 ADD HL,DE
00460 DJNZ FA2
00470 FA1 LD DE,STBUFG
00480 LD BC,8
00490 LDIR
00500 RET
00510 SCROLL HALT
00520 LD HL,16385
00530 LD B,8
00540 SM1 PUSH BC
00550 PUSH HL
00560 LD B,15
00570 SM2 AND A
00580 RL (HL)
00590 JR NC,SM3
00600 DEC HL
00610 SET 0,(HL)
00620 INC HL
00630 SM3 INC HL
00640 DJNZ SM2
00650 POP HL
00660 POP BC
00670 INC H
00680 DJNZ SM1
00690 SR NOP
00700 LD HL,18206
00710 LD B,8
00720 SR1 PUSH BC
00730 PUSH HL
00740 LD B,15
00750 SR2 AND A
00760 RR (HL)
00770 JR NC,SR3
00780 INC HL
00790 SET 7,(HL)
00800 DEC HL
00810 SR3 DEC HL
00820 DJNZ SR2
00830 POP HL
00840 POP BC
00850 DEC H
00860 DJNZ SR1
00870 LD A,#7F
00880 IN A,(#FE)
00890 RRA
00900 RET C
00910 POP BC
00920 RET
00930 MSYM LD HL,16384+15
00940 LD DE,STBUFG
00950 LD B,8
00960 MBUF1 LD A,(DE)
00970 AND A
00980 RLA
00990 LD (DE),A
01000 JR NC,MBUF2
01010 SET 0,(HL)
01020 INC HL
01030 SET 7,(HL)
01040 DEC HL
01050 MBUF2 INC H
01060 INC DE
01070 DJNZ MBUF1
01080 RET
01090 TEXTN DEFM "SCROLLING "
01100 DEFM "(SUPER "
01110 DEFM "RUNNING "
01120 DEFM "LINE) "
01130 DEFM "(C)Logic "
01140 DEFM "Games'94"
01150 DEFM " "
Start of object: #9C40 (40000)
Length : #00F9 (00249)
Executes : #9C4D (40013)
При тестировании мы сделали
некоторые изменения:
00520 LD HL,16384
00560 LD B,16
Шестнадцатиричный дамп блока:
9C40: 00 00 00 00 00 00 00 00 :DC
9C48: 00 00 00 00 00 FB 3E 08 :25
9C50: 32 4A 9C 21 39 00 22 4B :CB
9C58: 9C 21 00 9D 22 48 9C CD :21
9C60: 88 9C CD 91 9C CD A9 9C :2C
9C68: CD A9 9C CD E7 9C 3A 4A :EA
9C70: 9C 3D 32 4A 9C 20 EE 3E :49
9C78: 08 32 4A 9C 2A 4B 9C 2B :70
9C80: 22 4B 9C 7C B5 20 D8 C9 :17
9C88: 2A 48 9C 7E 23 22 48 9C :D9
9C90: C9 2A 36 5C 47 11 08 00 :11
9C98: FE 1F 28 04 A7 19 10 FC :49
9CA0: 11 40 9C 01 08 00 ED B0 :CF
9CA8: C9 76 21 00 40 06 08 C5 :B7
9CB0: E5 06 10 A7 CB 16 30 04 :03
9CB8: 2B CB C6 23 23 10 F4 E1 :3B
9CC0: C1 24 10 EB 00 21 1E 47 :C2
9CC8: 06 08 C5 E5 06 0F A7 CB :A3
9CD0: 1E 30 04 23 CB FE 2B 2B :00
9CD8: 10 F4 E1 C1 25 10 EB 3E :78
9CE0: 7F DB FE 1F D8 C1 C9 21 :76
9CE8: 0F 40 11 40 9C 06 08 1A :E8
9CF0: A7 17 12 30 06 CB C6 23 :46
9CF8: CB FE 2B 24 13 10 F0 C9 :88
9D00: 53 43 52 4F 4C 4C 49 4E :03
9D08: 47 20 28 53 55 50 45 52 :C3
9D10: 20 52 55 4E 4E 49 4E 47 :EE
9D18: 20 4C 49 4E 45 29 20 20 :66
9D20: 28 43 29 4C 6F 67 69 63 :3F
9D28: 20 47 61 6D 65 73 27 39 :32
9D30: 34 20 20 20 20 20 20 20 :E1
9D38: 20 00 00 00 00 00 00 00 :F5
В заключение Антон просит
опубликовать его адрес:
Ъ-----------------------------ї
і 184364, Мурманская обл., і
і Кольский р-н, пос.Мурмаши, і
і Позднякова, 2-21, і
і Сидоренко Антону. і
А-----------------------------Щ
Или пишите в наш клуб:
Ъ-----------------------------ї
і 184364, Мурманская обл., і
і пос.Мурмаши, КРСЮТ, і
і Кириллову С.В. і
А-----------------------------Щ