Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 01.04.2011
Сообщений: 4

Почему с AH=2\Int 1ah работает, а с AH=2ch\Int 21h нет

13.06.2012, 23:25. Показов 1004. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
написал вот такой вот таймер, но преподавателю не нравится формат BCD) переписал с AH=2ch\Int 21h - в цикле процедуры ConPlay не обновляется время.... кто-нибудь может подсказать почему?(переделанная прога ниже)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
format MZ
entry code_seg:start ; set entry point
stack 256
include 'macrosvv.inc'  
                      
 
segment data_seg 
                                                                 
    alarm1  db 0d,00d, 00d,  00h,    00h,   00h,  01h,    00h,    00d,0d,00d, 00h
    alarm2  db 0d,00d, 00d,  00h,    00h,   00h,  02h,    00h,    00d,0d,00d, 00h
    alarm3  db 0d,00d, 00d,  00h,    00h,   00h,  03h,    00h,    00d,0d,00d, 0h
    alarm4  db 0d,00d, 00d,  00h,    00h,   00h,  04h,    00h,    00d,0d,00d, 0h 
   ;alarm    0hour,1min,2sec,3vizual,4Sound,5type,6numebr,7on/off,8-10addtime,11long  
    nomer db 0h    
    sr  db 00d,00d,00d
    sr1 db 00d,00d,00d,01h
    sr2 db 00d,00d,00d,02h
    sr3 db 00d,00d,00d,03h
    sr4 db 00d,00d,00d,04h 
    pora db 0h
          ;0-2konec zvonka, 3nomer
 
    mmenu1 db '1. Zavesti budilnik 1 (Push "1")$'
    mmenu2 db '2. Zavesti budilnik 2 (Push "2")$'
    mmenu3 db '3. Zavesti budilnik 3 (Push "3")$'
    mmenu4 db '4. Zavesti budilnik 4 (Push "4")$' 
    mmenu5 db '5. Pokazat sostoyanie budilnikov (Push "5")$'  
    
    text1 db 'VVedite tip zvuka (1-4) ili  vikluchite ego (0): $'
    text2 db 'Vvedite dlitelnoct zvukovogo signala: $'
    text3 db 'Vkluchit vizualnoe otobrazhenie? (1-on,2-off): $'
    text4 db 'VVedite tip budilnika (1-taimer,2-budilnik,3-cycle): $' 
    text5 db 'Vvedite vremya budilnika v formate HH:MM:SS: $'
    text6 db 'Budilnik zaveden, nazhmite lubuu knopku!$' 
    text7 db 'Vvedite vremua taimera v formate HH:MM:SS: $'  
    text8 db 'Timer ustanovlen$'  
    text9 db 'on-1,off-0$'
    stal01 db '!!!!!!!!!!!!!!!!!alarm!!!!!!!!!!!!!!!!!!!!!!!$'
    stal02 db '                                             $'  
    endb db 0h
     
    verh1 db 'time$' 
    verh2 db 'long$'
    verh3 db 'cycle$'
    verh4 db 'vizual$'
    
    
    Buf db 0h
    Buf2 db 0h
    
    onv db 'on$'
    offv db 'off$'
    
    srbud dw 0
    Song db 0
    
nota0 dw    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
nota1 dw 4200,4000,3800,3600,3400,3200,3000,2800,2600,2400,2200,2000
nota2 dw 2000,2000,3000,2000,2000,3000,2000,2000,3000,2000,2000,3000
nota3 dw    0,   0,2000,   0,2000,   0,   0,2000,   0,2000,   0,2000
nota4 dw    0,   0,   0,2000,2000,2000,   0,   0,   0,2000,2000,2000
    
 
segment code_seg   
ViborSr:        ; определяет для какой переменной SR использовать макос SrPlay    
push dx ax 
mov dh,[nomer]  ; nomer определяется в TestA
mov ah,1h
cmp dh,ah
jne v1  
mov [alarm1+7],0
SrPlay sr1 
jmp v4
v1: 
mov dh,[nomer] 
mov ah,2h
cmp dh,ah
jne v2  
mov [alarm2+7],0
SrPlay sr2 
jmp v4
v2: 
mov dh,[nomer] 
mov ah,3h
cmp dh,ah
jne v3  
mov [alarm3+7],0
SrPlay sr3   
jmp v4
v3:  
mov dh,[nomer] 
mov ah,4h
cmp dh,ah
jne v4  
mov [alarm4+7],0
SrPlay sr4
v4:
pop ax dx  
ret
    
ConPlay:         ; процедура подачи сигнала 
call SoundOn     ; включаем звук
call ViborSr     ; начинаем сравнивать текущее время с конечным временем будильника
 
mov cx,100        ;\
mov si,22         ; \
mov bl,[Song]     ;  \
mov bh,0
 
push cx dx si
begin:
call ViborSr
cmp [endb],1h
jne end1
pop si dx cx     ;      >проверяем endb и воспроизводим звук пока она равняется 1, если 0, переходим в end1
 
dec cx
cmp cx,0
jne nocx0
 mov cx,2222
  sub si,2
  cmp si,0
  jne nocx0
  mov si,22
 
nocx0:            ;  /
push cx dx si     ; /
Nota [nota0+si+bx]; 
 
mov ah,2          ;\
int 1Ah
GoXY 71,24
WrHex2 ch,2
WrCh ':'          ;   >обновляем время
WrHex2 cl,2
WrCh ':'
WrHex2 dh,2       ;/
 
push si bx        ;\
mov si,[srbud] 
mov bl,2
cmp [si+3],bl     ;   >проверяем нужно ли визуальное сопровождение, если да, то выводим на экран stal01
pop bx si
je noShow
GoXY 20,13
WrSt stal01 
noShow:           ;/
 
jmp begin         ; возвращаемся к началу воспроизведения
end1:        
cmp [alarm1+5],3h
je ons
cmp [alarm2+5],3h
je ons
cmp [alarm3+5],3h
je ons
cmp [alarm4+5],3h
jne offs
ons: 
ViborOn
ViborAdd
ViborSr2
offs: 
call SoundOff     ;выключаем динамик
GoXY 20,13        
WrSt stal02  ; стираем stal01 
 
jmp Nocon
 
 
SoundOn:
    push ax
    OUT 43h,AL         
    IN AL,61h       ;     включение динамика
    OR AL,3           
    OUT 61h,AL        
    pop ax
    ret
SoundOff:
    push ax
    IN   AL,61h     
    AND  AL,0FCH           ;   Выключение динамика
    OUT  61H,AL        
    pop ax
    ret
     
  
 buttons:    ;\ 
 mov ah,0    ; \
 int 16h 
cmp al,31h
jne n1
SetAl alarm1  
n1: 
cmp al,32h
jne n2
SetAl alarm2 
n2:
cmp al,33h
jne n3
SetAl alarm3     ;         >переход на эту метку осуществляется, если нажата какая-либо кнопка
n3:              ;         >данный блок команд определяет что следует делать после выбора одного из пунктов меню
cmp al,34h
jne n4
SetAl alarm4 
n4:
cmp al,35h 
jne n5
WrSt mmenu5 
n5: 
cmp al,27
jne n6
jmp exit
n6:             ; /
jmp xx2         ;/
 
 
 
    
    start:               ;начало основной программы
    mov ax, data_seg     
    mov ds, ax
    mov es, ax  
    MOV     AH, 1
    MOV     CH, 28h  ;выключение курсора
    MOV     CL, 09h
    INT     10h
 
xx2:                 ; переход на хх2 осуществляется при запуске программы и после сигнала будильника
clrscr               ;\ 
GoXY 40,0
WrSt verh1
GoXY 50,0
WrSt verh2
GoXY 56,0 
WrSt verh3 
WrCh 10,13 
GoXY 0,1
WrSt mmenu1 
ShowInfo alarm1
WrCh 13,10  
WrSt mmenu2
ShowInfo alarm2
WrCh 13,10              ;>очистка экрана и вывод главного меню
WrSt mmenu3 
ShowInfo alarm3
WrCh 13,10
WrSt mmenu4 
ShowInfo alarm4
xx:                  ;\\
 
                                          ;>>цикл проверки TestA, обновления времени, ожидания нажатия кнопки
nchsec:     ;\
mov ah,1     
int 16h 
jnz buttons
               ; >проверка прошла ли секунда и пора ли менять время на экране и проверка на нажатие клавиш
mov ah,2h
int 1ah
cmp bh,dh
je nchsec   ;/ 
 
GoXY 71,24    ;\
WrHex2 ch,2
WrCh ':'
WrHex2 cl,2     ;>вывод системного времени 
WrCh ':'
WrHex2 dh,2  ;/    
 
TestA alarm1,alarm2,alarm3,alarm4
cmp [pora],0h    
je xx               ;//
jmp ConPlay   ;вызов ConPlay если pora=1
Nocon: 
    
mov [pora],0h     ; обнуление pora
jmp xx2           ;переход к главному меню после звучания будильника
 
exit:
mov ah,4ch
int 21h
Macrosvv.inc
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
macro OnTimer [x]{
   local offbud
   cmp [x+5],3h
   jne offbud
   mov [x+7],1h
   offbud:
}
macro ShowInfo x{
  local prc, pr, pro
 
   mov al,[x+6]
   cmp [x+7],0
   je pr   
   GoXY 40,al
   WrHex2 [x+0],2
   WrCh ':'
   WrHex2 [x+1],2
   WrCh ':'
   WrHex2 [x+2],2 
   GoXY 50,al 
   WrHex2 [x+11],2
   cmp [x+5],3
   jne prc
   GoXY 56,al
   WrHex2 [x+8],2
   WrCh ':'
   WrHex2 [x+9],2
   WrCh ':'
   WrHex2 [x+10],2 
   prc:
   jmp pro
   pr:  
   GoXY 35,al
   WrSt offv
   pro:
 
}
macro MyAdd x,y{ ; сложение в BCD
    push ax bx dx
    mov ah,0
    mov al,x
    mov bx,16
    mov dx,0
    div bx
    push dx
    mov bx,10
    mul bx
    pop dx
    add ax,dx
    mov [Buf],al
    
    mov ah,0
    mov al,y
    mov bx,16
    mov dx,0
    div bx
    push dx
    mov bx,10
    mul bx
    pop dx
    add ax,dx
    add al,[Buf]
 
    mov dx,0
    mov bx,10
    div bx    
    push dx
    mov dx,0
    mov bx,16
    mul bx
    pop dx
    add ax,dx
    mov x,al
    pop dx bx ax
}
 
macro MySub x,y{; вычитание в BCD
  push ax bx dx
    
    mov ah,0
    mov al,x
    mov bx,16
    mov dx,0
    div bx
    push dx
    mov bx,10
    mul bx
    pop dx
    add ax,dx
    mov [Buf],al
    
    mov ah,0
    mov al,y
    mov bx,16
    mov dx,0
    div bx
    push dx
    mov bx,10
    mul bx
    pop dx
    add ax,dx
    Sub [Buf],al
    mov al,[Buf]
 
    mov dx,0
    mov bx,10
    div bx    
    push dx
    mov dx,0
    mov bx,16
    mul bx
    pop dx
    add ax,dx
    mov x,al
    
 
 
 
  pop dx bx ax
}
 
 
macro SrPlay [x]{     ; сравнивает текущее время с Sr[x]
  local kon,e1,e2       ; выполняется до тех пор, пока значения не совпадут
  push dx ax bx cx      ; динамик при этом включен
  mov ah,2
  int 1Ah
  cmp [x+0],ch
  jne e1
  cmp [x+1],cl
  jne e1
  cmp [x+2],dh
  je e2
 
  e1:
  mov [endb],1h
  jmp kon
  e2:
  mov [endb],0h
 
 
  kon:
  pop cx bx ax dx
 
}
 
macro WrCh [ascii]{ ;Вывод символов по аски коду
     push dx ax 
     mov dl,ascii
     mov ah,2
     int 21h 
     pop ax dx}  
 
macro GoXY x,y{          ;перенос указателя на нужную позицию
     push dx bx ax
     mov  dl,x
     mov  dh,y
     mov  bx,0
     mov  ah,2
     int  10h 
     pop  ax bx dx}
macro WrSt [string]{ ;Вывод строк на экран
     push dx ax
     mov dx,string
     mov ah,9
     int 21h
     pop ax dx}  
macro WrHex x,long{ ;Вывод числа в десятичном виде
     local write,read
     push ax bx cx dx
     xor ax,ax
     mov al,x    
     mov bx,10
 
     ;write dec from dx in stack
     mov cx,long
     write:
     xor dx,dx
     div bx
     add dl,30h
     push dx
     loop write
 
     ;read dec from stack
     mov cx,long
     read:
     pop dx
     WrCh dl
     Loop read
     pop dx cx bx ax}
 
macro WrHex2 x,long{ ;Вывод числа в десятичном виде
     local write,read
     push ax bx cx dx
     xor ax,ax
     mov al,x    
     mov bx,16
 
     ;write dec from dx in stack
     mov cx,long
     write:
     xor dx,dx
     div bx
     add dl,30h
     push dx
     loop write
 
     ;read dec from stack
     mov cx,long
     read:
     pop dx
     WrCh dl
     Loop read
     pop dx cx bx ax}
 
macro TestA [x]{ ;          макрос проверяет пора ли производить сигнал будильнику
     local exit,noad,noli
     cmp [x+7],0
     je exit
     cmp  [x+0],ch
     jne exit
     cmp  [x+1],cl
     jne exit
     cmp  [x+2],dh
     jne exit
     push ax
     push bx
     mov al,[x+4]
     mov bl,24
     mul bl
     mov [Song],al
         mov dx,x
         mov [srbud], dx
         mov [pora],1h  
         mov dh,[x+6]
         mov [nomer],dh 
     
         
     exit:
     pop bx
     pop ax
     
     }
macro sraddtime x,y{
  local nbigh
  MyAdd [x+2],[y+10]
  MyAdd [x+1],[y+9]
  MyAdd [x+0],[y+8]
  cmp [x+2],89
  jna nbigh
  MySub [x+2],60h
  MyAdd [x+1],1h
  cmp [x+1],89
  jna nbigh
  MySub [x+1],60h
  MyAdd [x+0],1h
  cmp [x+0],35
  jna nbigh
  MySub [x+0],24h
  nbigh:
}
 
macro ViborSr2 {
  local v1,v2,v3,v4
  push cx
  push dx ax 
  mov dh,[nomer]  ; nomer задается в TestA
  mov ah,1h
  cmp dh,ah
  jne v1
  sraddtime sr1,alarm1
 
  jmp v4
  v1: 
  mov dh,[nomer] 
  mov ah,2h
  cmp dh,ah
  jne v2
  sraddtime sr2,alarm2
  jmp v4
  v2: 
  mov dh,[nomer] 
  mov ah,3h
  cmp dh,ah
  jne v3
  sraddtime sr3,alarm3
  jmp v4
  v3:  
  mov dh,[nomer] 
  mov ah,4h
  cmp dh,ah
  jne v4
  sraddtime sr4,alarm4
  v4:
  pop ax dx
  pop cx
  }
 
macro ViborOn {
  local v1,v2,v3,v4
  push cx
  push dx ax 
  mov dh,[nomer]  ; nomer задается в TestA
  mov ah,1h
  cmp dh,ah
  jne v1
  OnTimer alarm1
 
  jmp v4
  v1: 
  mov dh,[nomer] 
  mov ah,2h
  cmp dh,ah
  jne v2
  OnTimer alarm2
  jmp v4
  v2: 
  mov dh,[nomer] 
  mov ah,3h
  cmp dh,ah
  jne v3
  OnTimer alarm3
  jmp v4
  v3:  
  mov dh,[nomer] 
  mov ah,4h
  cmp dh,ah
  jne v4
  OnTimer alarm4
  v4:
  pop ax dx
  pop cx
  }
 
macro ViborAdd {
  local v1,v2,v3,v4
  push cx
  push dx ax 
  mov dh,[nomer]  ; nomer задается в TestA
  mov ah,1h
  cmp dh,ah
  jne v1
  addtime alarm1
 
  jmp v4
  v1: 
  mov dh,[nomer] 
  mov ah,2h
  cmp dh,ah
  jne v2
  addtime alarm2
  jmp v4
  v2: 
  mov dh,[nomer] 
  mov ah,3h
  cmp dh,ah
  jne v3
  addtime alarm3
  jmp v4
  v3:  
  mov dh,[nomer] 
  mov ah,4h
  cmp dh,ah
  jne v4
  addtime alarm4
  v4:
  pop ax dx
  pop cx
  }
macro addtime x{;         обновление времени будильника (цикл)
      local nbigs,nbigm,nbigh
      MyAdd [x+2],[x+10]
      MyAdd [x+1],[x+9]
      MyAdd [x+0],[x+8]
      cmp [x+2], 89
      jna nbigs
      MySub [x+2],60h
      MyAdd [x+1],1h
      nbigs:
      cmp [x+1], 89
      jna nbigm
      MySub [x+1],60h
      MyAdd [x+0],1h
      nbigm:
      cmp [x+0],35
      jna nbigh
      MySub [x+0],24h
      nbigh: 
      
 
}
 
macro Nota x{ 
        push ax
        MOV  AX,x              
        OUT  42h, AL          ;   ставит частоту звука
        xchg al,ah              
        OUT  42h, AL           
        pop ax}
 
 
 
macro SetAl x {  ;установка общих параметров будильника (тип звука, длительность, визуальное сопровождение, тип будильника)
   local vvod1,vvod2,vvod3, vvod4,vvod4f, wron, wroff, vvod5,t1,t2,t3,kon,onsig
 
clrscr
  WrSt text9
  mov ah,7
  int 21h
  cmp al,30h
  jne onsig
  mov [x+7],0
  jmp kon
  onsig:
  WrCh 13,10
  mov[x+7],1
  WrSt text1
  vvod1:
  mov ah, 7
  int 21h
  cmp al,34h
  ja vvod1
  cmp al,30h
  jb vvod1
  sub al, 30h
  mov [x+4],al
  WrHex [x+4],1
  WrCh 13,10
 
  WrSt text2
  vvod2:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod2
  cmp al,30h
  jb vvod2
  sub al,30h
  mov bl,16
  mul bl
  mov [x+11],al
 
  vvod3:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod3
  cmp al,30h
  jb vvod3
  sub al,30h
  add [x+11],al
  WrHex2 [x+11],2
  WrCh 13,10
 
  WrSt text3
  vvod4:
  mov ah, 7
  int 21h
  cmp al,32h
  je wron
  cmp al,31h
  je wroff
  jne vvod4
  wron:
  WrSt offv
  jmp vvod4f
  wroff:
  WrSt onv
  vvod4f:
  sub al, 30h
  mov [x+3],al
  WrCh 13,10
 
  WrSt text4
  vvod5:
  mov ah, 7
  int 21h
  
  cmp al,31h
  jne t1
  mov [x+5],1h
  SetTimer x
  jmp kon
  t1:
  cmp al,32h
  jne t2
  mov [x+5],2h
  SetAlarm x
  jmp kon
  t2:
  cmp al,33h
  jne t3
  mov [x+5],3h
  SetTimer x
  jmp kon
  t3:
  jmp vvod5
  kon:
 
  }
 
 
macro clrscr ; очистка экрана
{
  mov ah,06h
  mov al,0
  mov cx,0
  mov dh,25
  mov dl,80
  mov bh, 07h
  int 10h
  GoXY 0,0
}
 
 
 
macro SetAlarm [x] {; установка времени для типа "будильник"
   local vvod1,vvod2,vvod3,vvod4,vvod5,vvod6,m1,m2,m3,z1,z2,z3,z4
 
  clrscr
 
  WrSt text5
  vvod1:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod2
  cmp al,30h
  jb vvod2
  sub al,30h
  mov bl,16
  mul bl
  mov [x+0],al
 
  vvod2:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod2
  cmp al,30h
  jb vvod2
  sub al,30h
  add [x+0],al
  cmp [x+0],35
  ja vvod1
  WrHex2 [x+0],2
  WrCh 3Ah
  
 
    vvod3:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod3
  cmp al,30h
  jb vvod3
  sub al,30h
  mov bl,16
  mul bl
  mov [x+1],al
 
  vvod4:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod4
  cmp al,30h
  jb vvod4
  sub al,30h
  add [x+1],al
  cmp [x+1],89
  ja vvod3
  WrHex2 [x+1],2
  WrCh 3Ah
 
  vvod5:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod5
  cmp al,30h
  jb vvod5
  sub al,30h
  mov bl,16
  mul bl
  mov [x+2],al
 
  vvod6:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod6
  cmp al,30h
  jb vvod6
  sub al,30h
  add [x+2],al
  cmp [x+2],89
  ja vvod5
 
  push dx
  mov dh,[x+0]
  mov [sr+0],dh
  mov dh,[x+1]
  mov [sr+1],dh
  mov dh,[x+2]
  mov [sr+2],dh  
  mov cl,[sr+2]
  mov ch,[x+11]
  MyAdd cl,ch
  mov [sr+2],cl
  pop dx
  mov dx,0
 
  cmp [sr+2],89
  jb m1
  MySub [sr+2],60h
  MyAdd [sr+1],1h
  m1:
  
 
  cmp [sr+1],89
  jb m2
  MySub [sr+1],60h
  MyAdd [sr+0],1h
  m2:
 
  cmp [sr+0],35
  jb m3
  MySub [sr+0],24h
  m3:
 
  WrHex2 [x+2],2
  WrCh 13,10
  WrSt text6
 
  push ax
  cmp [x+6],1h
  jne z1
  mov al,[sr+0]
  mov [sr1+0],al
  mov al,[sr+1]
  mov [sr1+1],al 
  mov al,[sr+2]
  mov [sr1+2],al 
  jmp z4 
  z1:
 
  cmp [x+6],2h
  jne z2
  mov al,[sr+0]
  mov [sr2+0],al
  mov al,[sr+1]
  mov [sr2+1],al 
  mov al,[sr+2]
  mov [sr2+2],al
  jmp z4  
  z2:
 
  cmp [x+6],3h
  jne z3
  mov al,[sr+0]
  mov [sr3+0],al
  mov al,[sr+1]
  mov [sr3+1],al 
  mov al,[sr+2]
  mov [sr3+2],al  
  jmp z4
  z3:
 
  cmp [x+6],4h
  jne z4
  mov al,[sr+0]
  mov [sr4+0],al
  mov al,[sr+1]
  mov [sr4+1],al 
  mov al,[sr+2]
  mov [sr4+2],al  
  z4:
 
  pop ax
  mov ah,7
  int 21h
  
 } 
 
macro SetTimer [x] {; установка параметров для типа "таймер" и "циклический тамер"
  local vvod1,vvod2,vvod3,vvod4,vvod5,vvod6, m1, m2, m3,z1,z2,z3,z4,nbigs,nbigm,nbigh
  clrscr
 
 
  WrSt text7
  vvod1:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod2
  cmp al,30h
  jb vvod2
  sub al,30h
  mov bl,16
  mul bl
  mov [x+8],al
 
  vvod2:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod2
  cmp al,30h
  jb vvod2
  sub al,30h
  add [x+8],al
  WrHex2 [x+8],2
  WrCh 3Ah
  
 
    vvod3:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod3
  cmp al,30h
  jb vvod3
  sub al,30h
  mov bl,16
  mul bl
  mov [x+9],al
 
  vvod4:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod4
  cmp al,30h
  jb vvod4
  sub al,30h
  add [x+9],al
  cmp [x+9],89
  ja vvod3
  WrHex2 [x+9],2
  WrCh 3Ah
 
  vvod5:
   mov ah, 7
  int 21h
  cmp al,39h
  ja vvod5
  cmp al,30h
  jb vvod5
  sub al,30h
  mov bl,16
  mul bl
  mov [x+10],al
 
  vvod6:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod6
  cmp al,30h
  jb vvod6
  sub al,30h
  add [x+10],al
  cmp [x+10],89
  ja vvod5
  WrHex2 [x+10],2
  WrCh 13,10
  WrSt text6
  mov ah,7
  int 21h
  mov ah,2h
  int 1ah
      mov [x+2],dh
      mov [x+1],cl
      mov [x+0],ch
      MyAdd [x+2],[x+10]
      MyAdd [x+1],[x+9]
      MyAdd [x+0],[x+8]
      cmp [x+2], 89
      jna nbigs
      MySub [x+2],60h
      MyAdd [x+1],1h
      nbigs:
      cmp [x+1], 89
      jna nbigm
      MySub [x+1],60h
      MyAdd [x+0],1h
      nbigm:
      cmp [x+0],35
      jna nbigh
      MySub [x+0],24h
      nbigh: 
 
  push dx
  mov dh,[x+0]
  mov [sr+0],dh
  mov dh,[x+1]
  mov [sr+1],dh
  mov dh,[x+2]
  mov [sr+2],dh  
  mov cl,[sr+2]
  mov ch,[x+11]
  MyAdd cl,ch
  mov [sr+2],cl
  pop dx
  mov dx,0
 
  cmp [sr+2],89
  jb m1
  MySub [sr+2],60h
  MyAdd [sr+1],1h
  m1:
  
 
  cmp [sr+1],89
  jb m2
  MySub [sr+1],60h
  MyAdd [sr+0],1h
  m2:
 
  cmp [sr+0],35
  jb m3
  MySub [sr+0],24h
  m3:
 
  push ax
  cmp [x+6],1h
  jne z1
  mov al,[sr+0]
  mov [sr1+0],al
  mov al,[sr+1]
  mov [sr1+1],al 
  mov al,[sr+2]
  mov [sr1+2],al 
  jmp z4 
  z1:
 
  cmp [x+6],2h
  jne z2
  mov al,[sr+0]
  mov [sr2+0],al
  mov al,[sr+1]
  mov [sr2+1],al 
  mov al,[sr+2]
  mov [sr2+2],al
  jmp z4  
  z2:
 
  cmp [x+6],3h
  jne z3
  mov al,[sr+0]
  mov [sr3+0],al
  mov al,[sr+1]
  mov [sr3+1],al 
  mov al,[sr+2]
  mov [sr3+2],al  
  jmp z4
  z3:
 
  cmp [x+6],4h
  jne z4
  mov al,[sr+0]
  mov [sr4+0],al
  mov al,[sr+1]
  mov [sr4+1],al 
  mov al,[sr+2]
  mov [sr4+2],al  
  z4:
  pop ax
  WrSt text8
}
Добавлено через 1 минуту
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
format MZ
entry code_seg:start ; set entry point
stack 256
include 'macros.inc'    
                      
 
segment data_seg 
                                                                 
    alarm1  db 0d,00d, 00d,  00h,    00h,   00h,  01h,    00h,    00d,0d,00d, 00h
    alarm2  db 0d,00d, 00d,  00h,    00h,   00h,  02h,    00h,    00d,0d,00d, 00h
    alarm3  db 0d,00d, 00d,  00h,    00h,   00h,  03h,    00h,    00d,0d,00d, 0h
    alarm4  db 0d,00d, 00d,  00h,    00h,   00h,  04h,    00h,    00d,0d,00d, 0h 
   ;alarm    0hour,1min,2sec,3vizual,4Sound,5type,6numebr,7on/off,8-10addtime,11long  
    nomer db 0h    
    sr  db 00d,00d,00d
    sr1 db 00d,00d,00d,01h
    sr2 db 00d,00d,00d,02h
    sr3 db 00d,00d,00d,03h
    sr4 db 00d,00d,00d,04h 
    pora db 0h
          ;0-2konec zvonka, 3nomer
 
    mmenu1 db '1. Zavesti budilnik 1 (Push "1")$'
    mmenu2 db '2. Zavesti budilnik 2 (Push "2")$'
    mmenu3 db '3. Zavesti budilnik 3 (Push "3")$'
    mmenu4 db '4. Zavesti budilnik 4 (Push "4")$' 
    mmenu5 db '5. Pokazat sostoyanie budilnikov (Push "5")$'  
    
    text1 db 'VVedite tip zvuka (1-4) ili  vikluchite ego (0): $'
    text2 db 'Vvedite dlitelnoct zvukovogo signala: $'
    text3 db 'Vkluchit vizualnoe otobrazhenie? (1-on,2-off): $'
    text4 db 'VVedite tip budilnika (1-taimer,2-budilnik,3-cycle): $' 
    text5 db 'Vvedite vremya budilnika v formate HH:MM:SS: $'
    text6 db 'Budilnik zaveden, nazhmite lubuu knopku!$' 
    text7 db 'Vvedite vremua taimera v formate HH:MM:SS: $'  
    text8 db 'Timer ustanovlen$'  
    text9 db 'on-1,off-0$'
    stal01 db '!!!!!!!!!!!!!!!!!alarm!!!!!!!!!!!!!!!!!!!!!!!$'
    stal02 db '                                             $'  
    endb db 0h
     
    verh1 db 'time$' 
    verh2 db 'long$'
    verh3 db 'cycle$'
    verh4 db 'vizual$'
    
    
    Buf db 0h
    Buf2 db 0h
    
    onv db 'on$'
    offv db 'off$'
    
    srbud dw 0
    Song db 0
    
nota0 dw    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
nota1 dw 4200,4000,3800,3600,3400,3200,3000,2800,2600,2400,2200,2000
nota2 dw 2000,2000,3000,2000,2000,3000,2000,2000,3000,2000,2000,3000
nota3 dw    0,   0,2000,   0,2000,   0,   0,2000,   0,2000,   0,2000
nota4 dw    0,   0,   0,2000,2000,2000,   0,   0,   0,2000,2000,2000
    
 
segment code_seg   
ViborSr:        ; определяет для какой переменной SR использовать макос SrPlay    
push dx ax 
mov dh,[nomer]  ; nomer определяется в TestA
mov ah,1h
cmp dh,ah
jne v1  
mov [alarm1+7],0
SrPlay sr1 
jmp v4
v1: 
mov dh,[nomer] 
mov ah,2h
cmp dh,ah
jne v2  
mov [alarm2+7],0
SrPlay sr2 
jmp v4
v2: 
mov dh,[nomer] 
mov ah,3h
cmp dh,ah
jne v3  
mov [alarm3+7],0
SrPlay sr3   
jmp v4
v3:  
mov dh,[nomer] 
mov ah,4h
cmp dh,ah
jne v4  
mov [alarm4+7],0
SrPlay sr4
v4:
pop ax dx  
ret
    
ConPlay:         ; процедура подачи сигнала 
call SoundOn     ; включаем звук
call ViborSr     ; начинаем сравнивать текущее время с конечным временем будильника
 
mov cx,100        ;\
mov si,22         ; \
mov bl,[Song]     ;  \
mov bh,0
 
push cx dx si
begin:
call ViborSr
cmp [endb],1h
jne end1
pop si dx cx     ;      >проверяем endb и воспроизводим звук пока она равняется 1, если 0, переходим в end1
 
dec cx
cmp cx,0
jne nocx0
 mov cx,2222
  sub si,2
  cmp si,0
  jne nocx0
  mov si,22
 
nocx0:            ;  /
push cx dx si     ; /
Nota [nota0+si+bx]; 
 
mov ah,2cH          ;\
int 21h
GoXY 71,24
WrHex ch,2
WrCh ':'          ;   >обновляем время
WrHex cl,2
WrCh ':'
WrHex dh,2       ;/
 
push si bx        ;\
mov si,[srbud] 
mov bl,2
cmp [si+3],bl     ;   >проверяем нужно ли визуальное сопровождение, если да, то выводим на экран stal01
pop bx si
je noShow
GoXY 20,13
WrSt stal01 
noShow:           ;/
 
jmp begin         ; возвращаемся к началу воспроизведения
end1:        
cmp [alarm1+5],3h
je ons
cmp [alarm2+5],3h
je ons
cmp [alarm3+5],3h
je ons
cmp [alarm4+5],3h
jne offs
ons: 
ViborOn
ViborAdd
ViborSr2
offs: 
call SoundOff     ;выключаем динамик
GoXY 20,13        
WrSt stal02  ; стираем stal01 
 
jmp Nocon
 
 
SoundOn:
    push ax
    OUT 43h,AL         
    IN AL,61h       ;     включение динамика
    OR AL,3           
    OUT 61h,AL        
    pop ax
    ret
SoundOff:
    push ax
    IN   AL,61h     
    AND  AL,0FCH           ;   Выключение динамика
    OUT  61H,AL        
    pop ax
    ret
     
  
 buttons:    ;\ 
 mov ah,0    ; \
 int 16h 
cmp al,31h
jne n1
SetAl alarm1  
n1: 
cmp al,32h
jne n2
SetAl alarm2 
n2:
cmp al,33h
jne n3
SetAl alarm3     ;         >переход на эту метку осуществляется, если нажата какая-либо кнопка
n3:              ;         >данный блок команд определяет что следует делать после выбора одного из пунктов меню
cmp al,34h
jne n4
SetAl alarm4 
n4:
cmp al,35h 
jne n5
WrSt mmenu5 
n5: 
cmp al,27
jne n6
jmp exit
n6:             ; /
jmp xx2         ;/
 
 
 
    
    start:               ;начало основной программы
    mov ax, data_seg     
    mov ds, ax
    mov es, ax  
    MOV     AH, 1
    MOV     CH, 28h  ;выключение курсора
    MOV     CL, 09h
    INT     10h
 
xx2:                 ; переход на хх2 осуществляется при запуске программы и после сигнала будильника
clrscr               ;\ 
GoXY 40,0
WrSt verh1
GoXY 50,0
WrSt verh2
GoXY 56,0 
WrSt verh3 
WrCh 10,13 
GoXY 0,1
WrSt mmenu1 
ShowInfo alarm1
WrCh 13,10  
WrSt mmenu2
ShowInfo alarm2
WrCh 13,10              ;>очистка экрана и вывод главного меню
WrSt mmenu3 
ShowInfo alarm3
WrCh 13,10
WrSt mmenu4 
ShowInfo alarm4
xx:                  ;\\
 
                                          ;>>цикл проверки TestA, обновления времени, ожидания нажатия кнопки
nchsec:     ;\
mov ah,1     
int 16h 
jnz buttons
               ; >проверка прошла ли секунда и пора ли менять время на экране и проверка на нажатие клавиш
mov ah,2ch
int 21h
cmp bh,dh
je nchsec   ;/ 
 
GoXY 71,24    ;\
WrHex ch,2
WrCh ':'
WrHex cl,2     ;>вывод системного времени 
WrCh ':'
WrHex dh,2  ;/    
 
TestA alarm1,alarm2,alarm3,alarm4
cmp [pora],0h    
je xx               ;//
jmp ConPlay   ;вызов ConPlay если pora=1
Nocon: 
    
mov [pora],0h     ; обнуление pora
jmp xx2           ;переход к главному меню после звучания будильника
 
exit:
mov ah,4ch
int 21h
Macros.inc
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
macro OnTimer [x]{
   local offbud
   cmp [x+5],3h
   jne offbud
   mov [x+7],1h
   offbud:
}
macro ShowInfo x{
  local prc, pr, pro
 
   mov al,[x+6]
   cmp [x+7],0
   je pr   
   GoXY 40,al
   WrHex [x+0],2
   WrCh ':'
   WrHex [x+1],2
   WrCh ':'
   WrHex [x+2],2 
   GoXY 50,al 
   WrHex [x+11],2
   cmp [x+5],3
   jne prc
   GoXY 56,al
   WrHex [x+8],2
   WrCh ':'
   WrHex [x+9],2
   WrCh ':'
   WrHex [x+10],2 
   prc:
   jmp pro
   pr:  
   GoXY 35,al
   WrSt offv
   pro:
 
}
 
 
macro SrPlay [x]{     ; сравнивает текущее время с Sr[x]
  local kon,e1,e2       ; выполняется до тех пор, пока значения не совпадут
  push dx ax bx cx      ; динамик при этом включен
  mov ah,2ch
  int 21h
  cmp [x+0],ch
  jne e1
  cmp [x+1],cl
  jne e1
  cmp [x+2],dh
  je e2
 
  e1:
  mov [endb],1h
  jmp kon
  e2:
  mov [endb],0h
 
 
  kon:
  pop cx bx ax dx
 
}
 
macro WrCh [ascii]{ ;Вывод символов по аски коду
     push dx ax 
     mov dl,ascii
     mov ah,2
     int 21h 
     pop ax dx}  
 
macro GoXY x,y{          ;перенос указателя на нужную позицию
     push dx bx ax
     mov  dl,x
     mov  dh,y
     mov  bx,0
     mov  ah,2
     int  10h 
     pop  ax bx dx}
macro WrSt [string]{ ;Вывод строк на экран
     push dx ax
     mov dx,string
     mov ah,9
     int 21h
     pop ax dx}  
macro WrHex x,long{ ;Вывод числа в десятичном виде
     local write,read
     push ax bx cx dx
     xor ax,ax
     mov al,x    
     mov bx,10
 
     ;write dec from dx in stack
     mov cx,long
     write:
     xor dx,dx
     div bx
     add dl,30h
     push dx
     loop write
 
     ;read dec from stack
     mov cx,long
     read:
     pop dx
     WrCh dl
     Loop read
     pop dx cx bx ax}
 
macro TestA [x]{ ;          макрос проверяет пора ли производить сигнал будильнику
     local exit,noad,noli
     cmp [x+7],0
     je exit
     cmp  [x+0],ch
     jne exit
     cmp  [x+1],cl
     jne exit
     cmp  [x+2],dh
     jne exit
     push ax
     push bx
     mov al,[x+4]
     mov bl,24
     mul bl
     mov [Song],al
         mov dx,x
         mov [srbud], dx
         mov [pora],1h  
         mov dh,[x+6]
         mov [nomer],dh 
     
         
     exit:
     pop bx
     pop ax
     
     }
macro sraddtime x,y{
  local nbigh
  push ax
  mov al,[y+10]
  Add [x+2],al
  mov al,[y+9]
  Add [x+1],al
  mov al,[y+8]
  Add [x+0],al
  cmp [x+2],89
  jna nbigh
  
  Sub [x+2],60h
  Add [x+1],1h
  cmp [x+1],89
  jna nbigh
  Sub [x+1],60h
  Add [x+0],1h
  cmp [x+0],35
  jna nbigh
  Sub [x+0],24h
  nbigh:
  pop ax
}
 
macro ViborSr2 {
  local v1,v2,v3,v4
  push cx
  push dx ax 
  mov dh,[nomer]  ; nomer задается в TestA
  mov ah,1h
  cmp dh,ah
  jne v1
  sraddtime sr1,alarm1
 
  jmp v4
  v1: 
  mov dh,[nomer] 
  mov ah,2h
  cmp dh,ah
  jne v2
  sraddtime sr2,alarm2
  jmp v4
  v2: 
  mov dh,[nomer] 
  mov ah,3h
  cmp dh,ah
  jne v3
  sraddtime sr3,alarm3
  jmp v4
  v3:  
  mov dh,[nomer] 
  mov ah,4h
  cmp dh,ah
  jne v4
  sraddtime sr4,alarm4
  v4:
  pop ax dx
  pop cx
  }
 
macro ViborOn {
  local v1,v2,v3,v4
  push cx
  push dx ax 
  mov dh,[nomer]  ; nomer задается в TestA
  mov ah,1h
  cmp dh,ah
  jne v1
  OnTimer alarm1
 
  jmp v4
  v1: 
  mov dh,[nomer] 
  mov ah,2h
  cmp dh,ah
  jne v2
  OnTimer alarm2
  jmp v4
  v2: 
  mov dh,[nomer] 
  mov ah,3h
  cmp dh,ah
  jne v3
  OnTimer alarm3
  jmp v4
  v3:  
  mov dh,[nomer] 
  mov ah,4h
  cmp dh,ah
  jne v4
  OnTimer alarm4
  v4:
  pop ax dx
  pop cx
  }
 
macro ViborAdd {
  local v1,v2,v3,v4
  push cx
  push dx ax 
  mov dh,[nomer]  ; nomer задается в TestA
  mov ah,1h
  cmp dh,ah
  jne v1
  addtime alarm1
 
  jmp v4
  v1: 
  mov dh,[nomer] 
  mov ah,2h
  cmp dh,ah
  jne v2
  addtime alarm2
  jmp v4
  v2: 
  mov dh,[nomer] 
  mov ah,3h
  cmp dh,ah
  jne v3
  addtime alarm3
  jmp v4
  v3:  
  mov dh,[nomer] 
  mov ah,4h
  cmp dh,ah
  jne v4
  addtime alarm4
  v4:
  pop ax dx
  pop cx
  }
macro addtime x{;         обновление времени будильника (цикл)
      local nbigs,nbigm,nbigh
      push ax
      mov al,[x+10]
      Add [x+2],al
      mov al,[x+9]
      Add [x+1],al
      mov al,[x+8]
      Add [x+0],al
      cmp [x+2], 89
      jna nbigs
      Sub [x+2],60h
      Add [x+1],1h
      nbigs:
      cmp [x+1], 89
      jna nbigm
      Sub [x+1],60h
      Add [x+0],1h
      nbigm:
      cmp [x+0],35
      jna nbigh
      Sub [x+0],24h
      nbigh: 
      pop ax
 
}
 
macro Nota x{ 
        push ax
        MOV  AX,x              
        OUT  42h, AL          ;   ставит частоту звука
        xchg al,ah              
        OUT  42h, AL           
        pop ax}
 
 
 
macro SetAl x {  ;установка общих параметров будильника (тип звука, длительность, визуальное сопровождение, тип будильника)
   local vvod1,vvod2,vvod3, vvod4,vvod4f, wron, wroff, vvod5,t1,t2,t3,kon,onsig
 
clrscr
  WrSt text9
  mov ah,7
  int 21h
  cmp al,30h
  jne onsig
  mov [x+7],0
  jmp kon
  onsig:
  WrCh 13,10
  mov[x+7],1
  WrSt text1
  vvod1:
  mov ah, 7
  int 21h
  cmp al,34h
  ja vvod1
  cmp al,30h
  jb vvod1
  sub al, 30h
  mov [x+4],al
  WrHex [x+4],1
  WrCh 13,10
 
  WrSt text2
  vvod2:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod2
  cmp al,30h
  jb vvod2
  sub al,30h
  mov bl,10
  mul bl
  mov [x+11],al
 
  vvod3:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod3
  cmp al,30h
  jb vvod3
  sub al,30h
  add [x+11],al
  WrHex [x+11],2
  WrCh 13,10
 
  WrSt text3
  vvod4:
  mov ah, 7
  int 21h
  cmp al,32h
  je wron
  cmp al,31h
  je wroff
  jne vvod4
  wron:
  WrSt offv
  jmp vvod4f
  wroff:
  WrSt onv
  vvod4f:
  sub al, 30h
  mov [x+3],al
  WrCh 13,10
 
  WrSt text4
  vvod5:
  mov ah, 7
  int 21h
  
  cmp al,31h
  jne t1
  mov [x+5],1h
  SetTimer x
  jmp kon
  t1:
  cmp al,32h
  jne t2
  mov [x+5],2h
  SetAlarm x
  jmp kon
  t2:
  cmp al,33h
  jne t3
  mov [x+5],3h
  SetTimer x
  jmp kon
  t3:
  jmp vvod5
  kon:
 
  }
 
 
macro clrscr ; очистка экрана
{
  mov ah,06h
  mov al,0
  mov cx,0
  mov dh,25
  mov dl,80
  mov bh, 07h
  int 10h
  GoXY 0,0
}
 
 
 
macro SetAlarm [x] {; установка времени для типа "будильник"
   local vvod1,vvod2,vvod3,vvod4,vvod5,vvod6,m1,m2,m3,z1,z2,z3,z4
 
  clrscr
 
  WrSt text5
  vvod1:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod2
  cmp al,30h
  jb vvod2
  sub al,30h
  mov bl,10
  mul bl
  mov [x+0],al
 
  vvod2:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod2
  cmp al,30h
  jb vvod2
  sub al,30h
  add [x+0],al
  cmp [x+0],35
  ja vvod1
  WrHex [x+0],2
  WrCh 3Ah
  
 
    vvod3:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod3
  cmp al,30h
  jb vvod3
  sub al,30h
  mov bl,10
  mul bl
  mov [x+1],al
 
  vvod4:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod4
  cmp al,30h
  jb vvod4
  sub al,30h
  add [x+1],al
  cmp [x+1],59
  ja vvod3
  WrHex [x+1],2
  WrCh 3Ah
 
  vvod5:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod5
  cmp al,30h
  jb vvod5
  sub al,30h
  mov bl,10
  mul bl
  mov [x+2],al
 
  vvod6:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod6
  cmp al,30h
  jb vvod6
  sub al,30h
  add [x+2],al
  cmp [x+2],59
  ja vvod5
 
  push dx
  mov dh,[x+0]
  mov [sr+0],dh
  mov dh,[x+1]
  mov [sr+1],dh
  mov dh,[x+2]
  mov [sr+2],dh  
  mov cl,[sr+2]
  mov ch,[x+11]
  Add cl,ch
  mov [sr+2],cl
  pop dx
  mov dx,0
 
  cmp [sr+2],59
  jb m1
  Sub [sr+2],60h
  Add [sr+1],1h
  m1:
  
 
  cmp [sr+1],59
  jb m2
  Sub [sr+1],60h
  Add [sr+0],1h
  m2:
 
  cmp [sr+0],23
  jb m3
  Sub [sr+0],24h
  m3:
 
  WrHex [x+2],2
  WrCh 13,10
  WrSt text6
 
  push ax
  cmp [x+6],1h
  jne z1
  mov al,[sr+0]
  mov [sr1+0],al
  mov al,[sr+1]
  mov [sr1+1],al 
  mov al,[sr+2]
  mov [sr1+2],al 
  jmp z4 
  z1:
 
  cmp [x+6],2h
  jne z2
  mov al,[sr+0]
  mov [sr2+0],al
  mov al,[sr+1]
  mov [sr2+1],al 
  mov al,[sr+2]
  mov [sr2+2],al
  jmp z4  
  z2:
 
  cmp [x+6],3h
  jne z3
  mov al,[sr+0]
  mov [sr3+0],al
  mov al,[sr+1]
  mov [sr3+1],al 
  mov al,[sr+2]
  mov [sr3+2],al  
  jmp z4
  z3:
 
  cmp [x+6],4h
  jne z4
  mov al,[sr+0]
  mov [sr4+0],al
  mov al,[sr+1]
  mov [sr4+1],al 
  mov al,[sr+2]
  mov [sr4+2],al  
  z4:
 
  pop ax
  mov ah,7
  int 21h
  
 } 
 
macro SetTimer [x] {; установка параметров для типа "таймер" и "циклический тамер"
  local vvod1,vvod2,vvod3,vvod4,vvod5,vvod6, m1, m2, m3,z1,z2,z3,z4,nbigs,nbigm,nbigh
  clrscr
 
 
  WrSt text7
  vvod1:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod2
  cmp al,30h
  jb vvod2
  sub al,30h
  mov bl,10
  mul bl
  mov [x+8],al
 
  vvod2:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod2
  cmp al,30h
  jb vvod2
  sub al,30h
  add [x+8],al
  WrHex [x+8],2
  WrCh 3Ah
  
 
    vvod3:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod3
  cmp al,30h
  jb vvod3
  sub al,30h
  mov bl,10
  mul bl
  mov [x+9],al
 
  vvod4:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod4
  cmp al,30h
  jb vvod4
  sub al,30h
  add [x+9],al
  cmp [x+9],59
  ja vvod3
  WrHex [x+9],2
  WrCh 3Ah
 
  vvod5:
   mov ah, 7
  int 21h
  cmp al,39h
  ja vvod5
  cmp al,30h
  jb vvod5
  sub al,30h
  mov bl,10
  mul bl
  mov [x+10],al
 
  vvod6:
  mov ah, 7
  int 21h
  cmp al,39h
  ja vvod6
  cmp al,30h
  jb vvod6
  sub al,30h
  add [x+10],al
  cmp [x+10],59
  ja vvod5
  WrHex [x+10],2
  WrCh 13,10
  WrSt text6
  mov ah,7
  int 21h
  mov ah,2ch
  int 21h
      mov [x+2],dh
      mov [x+1],cl
      mov [x+0],ch
      push ax
      mov al,[x+10]
      Add [x+2],al
      mov al,[x+9]
      Add [x+1],al
      mov al,[x+8]
      Add [x+0],al
      cmp [x+2], 59
      jna nbigs
      Sub [x+2],60h
      Add [x+1],1h
      nbigs:
      cmp [x+1], 59
      jna nbigm
      Sub [x+1],60h
      Add [x+0],1h
      nbigm:
      cmp [x+0],23
      jna nbigh
      Sub [x+0],24h
      nbigh: 
 
  push dx
  mov dh,[x+0]
  mov [sr+0],dh
  mov dh,[x+1]
  mov [sr+1],dh
  mov dh,[x+2]
  mov [sr+2],dh  
  mov cl,[sr+2]
  mov ch,[x+11]
  Add cl,ch
  mov [sr+2],cl
  pop dx
  mov dx,0
 
  cmp [sr+2],59
  jb m1
  Sub [sr+2],60h
  Add [sr+1],1h
  m1:
  
 
  cmp [sr+1],59
  jb m2
  Sub [sr+1],60h
  Add [sr+0],1h
  m2:
 
  cmp [sr+0],23
  jb m3
  Sub [sr+0],24h
  m3:
 
  push ax
  cmp [x+6],1h
  jne z1
  mov al,[sr+0]
  mov [sr1+0],al
  mov al,[sr+1]
  mov [sr1+1],al 
  mov al,[sr+2]
  mov [sr1+2],al 
  jmp z4 
  z1:
 
  cmp [x+6],2h
  jne z2
  mov al,[sr+0]
  mov [sr2+0],al
  mov al,[sr+1]
  mov [sr2+1],al 
  mov al,[sr+2]
  mov [sr2+2],al
  jmp z4  
  z2:
 
  cmp [x+6],3h
  jne z3
  mov al,[sr+0]
  mov [sr3+0],al
  mov al,[sr+1]
  mov [sr3+1],al 
  mov al,[sr+2]
  mov [sr3+2],al  
  jmp z4
  z3:
 
  cmp [x+6],4h
  jne z4
  mov al,[sr+0]
  mov [sr4+0],al
  mov al,[sr+1]
  mov [sr4+1],al 
  mov al,[sr+2]
  mov [sr4+2],al  
  z4:
  pop ax
  WrSt text8
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.06.2012, 23:25
Ответы с готовыми решениями:

Не работает перегрузка индексного оператора [], вместо [int][int] почему то нужно ставить [0][int][int]
#include<iostream> #include<string> #include<vector> #include<algorithm> #include<ctime> #include<conio.h> #include<windows.h> ...

Какая из этих функций int Q(int w) int W(int y,int u,int i) сработает быстрее?
Если есть 2 функции(простые или перегруженные) к примеру Q(int w) int W(int y,int u,int i)или int Funkz(int a) int Funkz(int a, int b, int...

Ошибка: cannot convert 'int (*)[50]' to 'int*' for argument '1' to 'void vvod2m(int*, int*, int*, char)'Х2
Матрицы An1*m1 и Bn2*m2 вводить с клавиатуры (размерности >3, m1=n2). Выполнять через подпрограммы. выводит следующие ошибки: 1) cannot...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.06.2012, 23:25
Помогаю со студенческими работами здесь

Int 1ah
что делает int 1ah?

Что не так в коде? прерывание int 1Ah
Есть фигура, по нажатию клавиши происходит смена цвета. Через 7 секунд после нажатия должна смена цвета остановиться. Подскажите, то не...

Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec
Вот есть заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H #include &lt;iostream&gt; using...

[C++ Error] Unit2.cpp(22): E2034 Cannot convert 'int (*)(int,int *)' to 'int'
Всем привет! Пожалуйста , помогите , почему выдает ошибку Unit2.cpp(22): E2034 Cannot convert 'int (*)(int,int *)' to 'int' ?. Мне нужно...

Dictionary<int,List<int>> и IReadOnlyDictionary<int,IReadOnlyList<int>>
Народ, столкнулся с такой ситуацией. Есть Переменная Dictionaty&lt;int,List&lt;int&gt;&gt; Dic = new Dictionaty&lt;int,List&lt;int&gt;&gt;(); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru