ГЛАВА 4
В данной главе собраны программы более сложные и объемные, чем в
предыдущих главах. Они могут иметь не только учебную, но и некоторую
практическую ценность. Программа-редактор позволит составлять
программы в машинных кодах, программа ведения домашнего хозяйства
поможет вести его более экономно. Однако основное их предназначение
- учебное. Переходя от простого к сложному совершенствуйте Вайю
мастерство.
4.1 ПРОГРАММА "МИНИ-МОНИТОР".
Компьютер SPECTRUM не имеет встроенных средств для написания
программ на языках программирования(кроме БЕЙСИКА) или в машинных
кодах. Для решения такого рода задач созданы различные программные
средства. Для составления программ в машинных код ах для компьютера
SPECTRUM необходима специальная программа-редактор. Наличие в
БЕЙСИКЕ компьютера SPECTRUM инструкций РЕЕК и РОКЕ
позволяет работать с информацией хранящейся в ячейках памяти с
заданным адресом. Поэтому возможно составление программ в
машинных кодах и без использования дополнительных средств, но
программа-редактор позволит работать более эффективно. Такая
программа составленная на БЕЙСИКЕ приведена ниже:
10 CLEAR 32299
20 LOAD"" CODE
100 LET BYTE-900
110 LET ADRESS-2000
120 LET MENU-1000
200 GO TO MENU
300 PRINT" ";
305 LET B-N
310 IF 0-1 THEN GOSUB 9S0
320 Г0-0 THEN PRINT N
330 RETURN
900 REM HEX BYTE
910 LET B-PEEK L
920 LET B1- (INT (B/16)+48)
925 GOSUB 980
930 LET B1-(B-(INT (B/16)*16)+48)
935 GOSUB 980
940 RETURN
950 REM HEX ADRESS
952 LET H-4096
955 LET B1-(INT (B/H)+48)
958 GOSUB 980
960 LET B-B-INT(B/H)*H
965 LET H-H/16
970 IF H>-1 THEN GO TO 955
975 PRINT "H"; TAB 7;
979 RETURN
980 IF Bl>57 THEN LET B1-B1+7
985 PRINT CHRSB1;
989 RETURN
990 CLS
992 LET 1-0
999 RETURN
1000 REM MENU
1010 PRINT TAB 7;"MINI-MONITOR"
1020 PRINT
1030 PRINT TAB 7;"I)NPUT"
1040 PRINT TAB 7;'D)UMP*
1050 PRINT TAB 7;*SJTARr
1070 PRINT TAB 7;"E)ND*
1080 IF INKEYS THEN GO TO 1080
1090 IF INKEYS -T THEN GOSUB 2500
1100 IF INKEYS -*DI" THEN GOSUB 4600
1110 IF INKEYS -"E" THEN GOSUB 3900
1115 IF INKEYS -*S" THEN GOSUB 3000
1120 CLS
1130 GO TO MENU
2000 REM ADRESS
2005 LET D-1
2010 CLS
2020 PRINT "ADRESS:*;
2030 INPUT A$
2040 PRINT AS;
2045 IF A$( LEN A$)-"H" THEN LET D-0: GO TO 2100
2060 LET N-VAL AS
2070 RETURN
2100 LET N-0
2110 FORX-1 TOLENAS-l
2115 LET B-CODE A$(X)-48
2118 IF B>9 THEN LET B-B-7
2120 LET N-N*16+B
2130 NEXT X
2140 RETURN
250Q REM INPUT
2505 LET 1-0
2510 CLS
2520 GOSUB ADRESS
2521 GOSUB 300
2522 LET l-N
2525 PRINT AT 21,1 ;"E)ND ENTERjFORVARD RJETURN"
2527 PRINT AT 2,0;
2530 IF D-1 THEN PRINT L; TAB7;
2532 LET D-L
2535 IF D-0 THEN GOSUB 950
2540 GOSUB BYTE
2550 PRINT" »> ";
2560 INPUT AS
2570 IF AS о "" THEN GO TO 2600
2580 LET L-L+1
2585 PRINT
2587 LET 1-1+1
2590 IF l>18 THEN GOSUB 990
2595 GO TO 2530
2600 IF LEN A$>3 THEN GO TO 2560
2610 IF A$-"R" THEN GO TO 2700
2620 IF A$-"E" THEN RETURN
2625 LET N-0
2630 FOR X-l TOLENAS
2632 LET B- CODE A$(X)-48
2633 IF B>9 THEN LET B-B-7
2634 LET N-N'16+В
2635 NEXT X
2636 LET B-N
2640 GOSUB 920
2650 POKE L,N
2660 GO TO 2580
2700 LET L-L-l
2710 GO TO 2585
3000 REM START
3010 GOSUB ADRESS
3015 GOSUB 300
3020 PRINT USR N
3030 PAUSE 4E4
3040 RETURN
3900 CLS
3910 STOP
4600 REM DUMP
4610 GOSUB ADRESS
4612 GOSUB 300
4615 PRINT AT 20,0;"N)EXT MJENU"
4618 PRINT AT 2,0
4620 FOR S-0 TO 15
4630 IF D-1 THEN PRINT N+S*8; TAB 7;
4632 LET B-N+S*8
4635 IF D-0 THEN GOSUB 950
4640 FOR X-0 TO 7
4650 LET L-N+S*8+X
4660 GOSUB BYTE
4670PRINT' ";:REM2SPASE
4680 NEXT X
4690 PRINT
4692 IF INKEYS THEN GO TO 4692
4695 IF INKEYS -"MTHEN GO TO 4760
4700 NEXT S
4710 PRINT
4740 LET N-L+1
4745 CLS
4750 GO TO 4615
4760 RETURN
Программа 4.1 Программа МИНИ-МОНИТОР.
При запуске программа ожидает ввода с магнитофона программы
в машинных кодах, которую предстоит редактировать. Если необходимо
набирать новую программу, то запуск следует осуществить со строки 100,
выполнив RUN 100. После запуска появляется меню:
MINI-MONITOR
INPUT
DUMP
START
END
Выбирая одну из букв задаем режим работы, в котором будем работать.
Выбрав I входим в режим ввода информации начиная с указанного адреса.
На экране появляется новое меню:
END
ENTER
EORVARD
RETURM
Задается адрес начала программы в десятичном виде и автоматически
вычисляется его шестнадцатиричный эквивалент. Например: 32500
соответствует 7EF4H. После чего на экране появляется адрес,
содержимое ячейки памяти, и приглашение для ввод а новой информации в
выбранную ячейку — >.
32500 21 —>Если набрать, например, ЗЕ, то на экране появится:
32500 21 -->ЗЕ
3250100->
и программа предложит произвести ввод в следующую ячейку памяти.
В случае если нет необходимости изменить содержимое ячейки, то нажав
ENTER можно перейти к ячейке с очередным адресом, а нажав R можно
вернуться к предыдущему и исправить ошибочно введенную информацию.
Быстро просмотреть содержимое области памяти можно выбрав в меню
J2UMP. При этом на экран выводится:
ADRESS 1000Н
4096 9А <Ю D6 С4 38 F9 01 ЕС
4104 C900000000 FFFFFF
Запустить программу с указанного адреса можно выбрав в меню
START. В качестве примера попробуйте с помощью редактора ввести в
память компьютера и выполнить короткую программу в машинных кодах.
При выполнении эта программа выводит на экран цифру.
ЗЕ 01 LD А,1
С6 01 ADD АЛ
4F LDC,A
06 00 LD В,0
С9 RET
В левом столбце приведены машинные коды, а в правом мнемонические
обозначения этих команд. В память компьютера, естественно, вводятся
только машинные коды.
После окончания пользования редактором выберите в меню E)ND для
возвращения в БЕЙСИК.
4.2 ПРОГРАММА "ДОМАШНЕЕ ХОЗЯЙСТВО,
РАСХОДЫ**.
Следующая программа позволяет подсчитывать расходы
при ведении домашнего хозяйства. При запуске программы на экран
выводится следующая картинка:
MONTH: JAN
SUM 135.50
RENT
TRANSPORT
ENERGY 125.00
FOOD
RELAXATION 10.50
BILL-1
BILL-2
ETC
END
MONTH
RESULT
В этом меню предусмотрены основные виды расходов, атакже некоторые
управляющие слова. Например для выбора нового месяца необходимо
набрать:
MONTH FEB
и на экране будет меню с расходами за февраль. Дополнить записи
можно в любой момент и на экране будет произвед ено суммирование по
д анному виду расходов и подведен общий итог за месяц. Если, например,
необходимо учесть расходы на энергию, то следует сделать запись:
ENERGY 125.00
BILL-1, BILL-2 - счета состоящие из нескольких статей затрат. При
их выборе в главном меню на экране появляется подменю, работа с
которым ведется по прежним правилам.
При выборе RESULT подводится итог по всем статьям затрат завесь год.
Названия расходов выбраны условно, поэтому Вы можете в программе
д ать им и другие названия.
Работа программы эквивалентна заполнению таблицы
расходов:
Каждой клеточке таблицы в программе соответствует элемент массива
К(13,9).
100 DIM А$(4,10): DIM В$(5,10)
110 DIM К$(24,10): DIM V$(1,10)
115 DIM l$(20)
120 DIM А(13,3): DIM В{13,5)
130 DIM K{13,9)
140 LET LK-24: LET V-4: LET M-1
145 LET L$-'
150 LET ERR-9000
200 LET K$(1)-*SUM*
210 LET K$(2)-'RENT
220 LET K$(3)-TRANSPORr
230 LET K${4)-*ENERGY"
240 LET K$(5)-"FOOD"
250. LET K$(6)-*RELAXATION"
260 LET K$|7)-"BILL-r
270 LET K$(8)-"BILL-2"
280 LET K$(9)-"ETC."
290 LET K$(10)-"END"
295 LET K$(11)-"MONTH"
297 LET K$(12)-'RESULr
300 LET A$(1)-"POST"
aioiETMPKSCHOOi'
320 LET A$|3)-"SPORr
325 LET A$(4)-"RETURN"
350 LET B$(l)-"TELEFONE"
360 LET В$|2)-'МЕАГ
370 LET B${3)-"GREENS"
380 LET B$|4)-*CLOTHES"
390 LET B${5)-"SHOP"
395 LET K$(13)-"JAN"
400 LET K$|14)-"FEB"
405 LET K$(15)-"MAR"
410 LET K$(16)-"APR"
415 LET K$(17)-*MAY"
420 LET K$(18)-"JUN"
425 LET K$|19)-"JUL"
430 LET K$(20)-"AUG"
435 LET K$(21)-"SEP"
440 LET К$(22)-"01СГ
445 LET K$(23)-"NOV*
450 LET K$(24)-*DEC"
500 CLS: IF M-13 THEN LET M-1
502 LET N-M+12
505 PRINT AT 0,2;"MONTH: ";IC$(N)
510 PRINT AT 2,9,K$(1)
520 FOR 1-2 TO 12
530 PRINT AT l+V,2;K$(l): NEXT I
550 FOR N-2 TO 9
555 LET W-K(M,N): GOSUB 1400
560 NEXT N
565 LET W-K(M,1): LET N--2: GOSUB 1400
599 GO TO 1000
1000 INPUT T;l$
1005 PRINT AT 20,0;L$
1010 LETL-LEN 1$
1020 FOR 1-1 TO L
1030 IF l$flK * THEN GO TO 1100
1040 NEXT I
1050 GO TO ERR
1100 LET V$(1H$(TO И)
1110 FOR N-1 TOUC
1120 IF V$(1)-K$tN) THEN GO TO 1200
1130 NEXT N
1140 FOR N-1 TO 4
1150 IF V$(1)-A$N THEN GO TO 2100
1160 NEXT N
1170 TOR N-1 TO 5
1180 IF V$(1)-B$(N) THEN GO TO 3100
1190 NEXT N
1199 GOTO ERR
1200 IF V$(l,1 TO 3KEND* THEN STOP
1201 IF V$(1,1 TO 3j-"RES" THEN GO TO 1700
1202 IF V$(1,1 TO 3KMON" THEN GO TO 1500
1204 IF V$(1,1 TO 3J-m* THEN GO TO 1600
1206 GOSUB 1210
1208 GO TO 1260
1210 IF M-13 THEN GO TO ERR
1215 IF N-1 OR N>12 THEN GO TO ERR
1220 LET H+1
1230 FOR X TO I
1240 IF l$(4-V THEN LET l$(JH$(J<-1):
LET l$(JHH5(M): IET l$(*2K'
1250 NEXT i RETURN
1260 IET W-VAl t$(l TO 1-1)
1270 LET KHN-KHN+W
1280 LET K(13,NK(13,NH-W
1290 LET K(M,1H4M.1)+W
1295 LET iqi3,iHqi3,iH-w
1300 LET W-KHN): GOSUB 1400
1310 LET W-K(M,1): LET N-2: GOSUB 1400
1320 GO TO 1000
1400 LET l$- STR$ W: LET L- LEN (STR$W): LET L-L+1
1405 IF L<3 THEN GO TO 1430
1410 LET l$(L)-l$(L-1): LET l$(L-1)-l$fl.-2J:
LET l$(L-2J-V
1420 PRINT AT N+V, 30-L;I${TO L)
1430 RETURN
1500 LET V$(1H$fl+1 TOL)
1510 FOR N-13 TO 24
1520 IF V$(1K${N) THEN GO TO 1560
1530 NEXT N
1550 GO TO ERR
1560 LET M-N-12: GO TO 500
1600 IF M-13 THEN GO TO 1800
1605 LET W- VALK$(N,6)
1610 CLS: LET N-M+12
1620 PRINT AT OA-MONTH*: *;K$(N)
1650 LET W-W+l: GO TO 1000*W
1700 CLS: PRINT AT 0,2;K$(12)
1710 LET M-13: GO TO 510
1800 CLS: PRINT AT 0,2;K$(12)
1810 LET W-VAL K$(N,6)
1820 LET W-W+1: GO TO 1000*W
2000 PRINT AT 2,9;K$|7)
2010 FOR 1-1 TO 4
2020 PRINT AT l+V,2;A$(l)
2030 NEXT I
2040 FOR N-1 TO 3
2050 LET W-A|M,N): GOSUB 1400
2060 NEXT N
2070 LET W-K(M,7): LET N-2:GOSUB 1400
2080 GO TO 1000
2100 IF V$(l,l TO 3)-'REr THEN GO TO 500
2105 GOSUB 1210
2110 LET W- VAL l$(l TO L-1)
2130 LET A|M,N)-A|M,N)+W
2140 LET A(13,N)-A(13,N)+W
2145 LET K(M,lhK|Mfl)+W
2150 llET K|M,7)-K|M(7)+W
2155 LET K(13,7)-K(13,7)+W
2157 LET K|13,1K(13,1)+W
2160 LET W-A|M,N): GOSUB 1400
2170 LET W-K(M,7): LET N-2: GOSUB 1400
2180 GO TO 1000
3000 PRINT AT 2,9;K$(8)
3010 FOR hi TO 5
3020 PRINT AT l+V,2;B${l)
3030 NEXT I
3035 PRINT AT 10,2;A$(4)
3040 FOR N-1 TO 5
3050 LET W-B(M,N|.<30SUB 1400
3060 NEXT N
3070 GO TO 1000
3100 IF V$(1,l TO 3)-*RET THEN GO TO 500
3105 GOSUB 1210
3110 LET W-VAL l$(l TO L-1)
3130 LET B(M,N|-B(M,NJ+W
3140 LET B(13,Kfl-B|l 3,N)+W
31 $0 LET K(M,8)-K(M,8)+W
3155 LET K(13,8HC(13,8)+W
3157 LET K(13,1)-K(13,1)+W
3160 LET W-B(M,N): GOSUB 1400
3170 GO TO 1000
9000 PRINT AT 20,0;V$(1);" V
9020 GO TO 1000
Программа 4.2Программа "Домашнеехозяйство. Радходы".
4.3 ПРОГРАММА "АНАЛИЗ ФУРЬЕ".
Программа выполняющая анализ Фурье.
Анализ Фурье основываетсянатом, что любую периодическую функцию
можно представить в виде суммы гармоник и постоянной составляющей:
т - с(0) +SUMM (s(n)Sin nwt + с(п) Cos nwf),
где
я от нт1 до я"Л
Поскольку формула представления произвольной периодической
функции известна, то анализ сводится к вычислению коэффициентов
с(0), s(n) и с(п). В программе приведенной ниже производится
вычисление коэффициентов для трех типов функций:
1. Периодическая линейно-возрастающая функция.
2. Периодическая линейно-возрастаюгцая функция с возвращением
к нулю.
3. Функция типа "меандр".
Рассмотрим более подробно функцию третьего типа. График этой
функции на интервале одного периода приведен на рисунке 4.1:
В программе зад ается количество точе к на исходном графике
функции через которые должна пройти кривая построенная
по найденным коэффициентам. Известно, что поставленная
задача имеет решение, если выполняется условие:
NP > NH*2+1>
где
NP - число точек
NH - число гармоник
В данном случае выбрано NP=16, NH=7
После выполнения вычислений на экран выводится таблица вида:
a cos sin
0 0 0
1 0 0.9426
2 0 0
3 0 0.2806
4 0 0
5 0 0.1252
6 0 О
7 0 0.0372
Далее выводится гистограмма амплитудных значений гармонических
составляющих:
Наконец на экране вычерчиваются трафики гармоник и трафик их
суммы, приближенный по своему виду к исходной функции.
20 CIS: PRINT AT 1,2;TOURIER ANALYSE*
22 PRINT AT 3,2;*1.EXAMPLE *
24 PRINT AT 4,2;"2 EXAMPLE "
26 PRINT AT 5,2;"3.EXAMPLE "
28 PRINT AT 7,2;"INPUT 1/2/3"
29 PRINT AT 9,2;"END"
30 INPUT N
31 IF N<1 OR N>3 THEN STOP
32 GO TO 100*N
45 CLS
46 PRINT "
47 PRINT -
48 PRINT -
49 PRINT" NP>2*NH+1 "
50 INPUT "NUMBER OF HARMONICS - ",NH
60 INPUT "NUMBER OF POINTS - ",NP
70 DIM F(NP+1) DIM S(NP+1): DIM C(NP+1)
75 IF NP<2*NH+1 THEN GO TO 50
80 RETURN
100 REM 1
110 GOSUB 45
115 LET F(1)--1: LET DY-2/NP
120 FOR 1-2 TO NP
125 LET F(I)-F(M)+DY: NEXT I
130 LET F(1)-0: LET F(NP+1)-F(1)
140 GO TO 500
200 REM 2
205 GOSUB 45
210 DIM F(NP+1)
215 LET F(1)-0- LET DY-2/NP
220 FOR 1-2 TO NP/2
225 LET F(I)-F(M)+DY: NEXT I
230 LET F(NP/2+1)-0.5
235 FOR l-NP/2+2 TO NP+1
240 LET F(IJ—0:NEXT I
250 GO TO 500
300 REM 3
305 GOSUB 45
310 LET F(1)—0: LET F(N/2+1)-0
315 LET F(NP+1H>
320 TOR 1-2 TO NP/2
325 LET F(I)-0.75:NEXT I
330 FOR l-NP/2+2 TO NP
335 LET F(l)--0.75: NEXT1
340 GO TO 500
500 REM FOURIER -ANALYSE
502 CIS
505 PRINT AT 1,2;*N"; AT 1,10;"COS"; AT 1,20;"SIN"
510 LET Z-2/NP: LET P-0
520 LET CI-COS (Z*PI): LET SI- SIN (Z*PI)
530 LET C-1: LET S-0; LET P-0
540 LET U1-0: LET U2-0
550 LET N-NP
560 LET U0-F(N)+2*C*U 1-U2
570 LETU2-U1: LET U1-U0: LET N-N-1
580 IF N-1 THEN GO TO 600
590 GO TO 560
600 LET A-Z*(F(1)+C*U1-U2)
610 LET B-Z*S*U1
615 LET EPS-1E-6
620 IF ABS (A)<EPS THEN LET A-0
630 IF ABS |B)<EPS THEN LET B-0
632 LET J-10000
634 LET A-INT (/A)/! LET C(P+1)-A
636 LET B-INT (ГВ)/>. LET S(P+1)-B
638 IF P-0 THEN LET A-A/2
640 PRINT AT P+3,2;P; AT P+3,10A
AT P+3,20;B
650 IF P-NH THEN GO TO 900
660 LET Q-Cl *C-S1 *S
670 LETS-CrS+SrC
680 LET C-Q: LET P-P+1: GO TO 540
900 GOSUB 1990
999 IF INKEYS-" THEN GO TO 999
1000 REM SPECTR.UNE
1010 CLS
1012 PRINT AT 1,2;*FOURIER KOEFF."
1015 PRINT AT 3,2;'SINUS';AT 3,16;"COSINUS'
1020 PLOT 10,30: DRAW 100,0
1040 PLOT 130,30: DRAW 100,0
1060 FOR 1-0 TO NH
1070 PLOT 10*1+10,30: DRAW 0,100*ABS S|l+1)
1080 NEXT I
1090 FOR 1-0 TO NH
1100 PLOT 10*1+130,30:DRAW 0,100*ABS C(l+1)
1110 NEXT I
1115 GOSUB 1900
1120 IF INKEYS THEN GO TO 1120
1200 REM
1210 CIS
1220 PLOT 20,95: DRAW 180,0
1230 LET C(1)-qi)/2
1240 FOR P-1 TO NH
1250 IF S(P)-0 THEN GOTO 1310
1260 FOR 1-0 TO 360 STEP 5
1270 LET Y-S(P)*SIN (|P-1)*2*P11/360): LET Y-Y*70+95
1280 LET X- INT (1/2+20)
1290 PLOT X,Y
1300 NEXT I
1310 IF C(P)-0 THEN GO TO 1390
1320 FOR 1-0 TO 360 STEP 5
1330 LET Y-qP)*COS |(P-1)*2'PI '1/360): LET Y-Y*70+95
1340 LET X- INT (1/2+20)
1350 PLOT X,Y
1360 NEXT I
1390 NEXT P
1392 GOSUB 1990
1395 IF INKEYS-" THEN GO TO 1395
1400 REM SUMM
1410 CLS
1415 PRINT AT 1,2;"SUMM"
1420 PLOT 20,95:DRAW 180, 0
1430 FOR 1-0 TO 360 STEP 5
1440 LET Y-0
1450 FOR P-1 TO NH
1460 LET Vy-{P-1)*2*PI 4/360
1470 LET Y*Y+S(P)*SIN W+C(P)* COS W
1480 NEXT P
1490 LET Y-INT (Y'70+95): LET X- INT (1/2+20)
1500 PLOT X,Y
1510 NEXT I
1520 LET X-180/NP
1530 LET Y-F(11*70+95
1535 LET XP-20
1540 PLOT XP,Y
1550 FOR 1-2 TO NP+1
1560 LET Y1 -Y: LET XI -XP
1570 LET XP-F(l)*70+95
1575 LET XP- INT (X'(l-l)+20.5)
1580 DRAW XP-X1,Y-Y1
1590 NEXT I
1600 GOSUB 1990
1610 IF INKEYS-" THEN GO TO 1610
1620 GO TO 20
1990 PRINT AT 20,2;"CONTINUE Г: RETURN
1999 STOP
2000 FOR 1-1 TO NP+1
2010 PRINT F(l)
2020 NEXT I
Программа 4.3 Программа "Анализ Фурье".