; , . , ; , . - , . - . , [2.2.2] [2.2.3]. , .. , - , ( , ). BIOS [2.1.6]. . PLAY . - , , . - A - G . - # +, (-). PLAY "CC#D" PLAY "CD-D" , . 0 84, 0 - , 1 84 84 , . - N: PLAY "N3N72N44". - , C() B(). 0 6 3. , O, . , 4. PLAY "O3CO4CO5CO6C" . > <, , . PLAY "O3C>C>C>C" , . , L. - , . - 1 64, 1 , 64 - 1/64. L4 - . , T, 32 255, , . , L4 120. L. PLAY "L4CDE16FG" E , . , . 1 64 P . P1 - , P64 - 1/64. , - : . . 7/8 . (), ML. 3/4 (), MS. MN. , , . , PLAY, , MB. - MF. , PLAY . , , - PLAY. , S$ = "EEEEE", PLAY "CDXS$;FG" E 5 . , - X, (;). ( , VARPTR$ - . ). . , , , , , , , . - - . 100 PLAY "ML T40 O3 ECD<G P32 G>DEC" PCjr PLAY . -, V, - . V5 ( ) 5. 0 15, 8. 0 . -, PLAY . , - . , SOUND ON. 100 SOUND ON 110 PLAY "...........","..........","............" . 8253. 8 , . . , ( - , ). 8 ; 2 8253 . 1 8, . 0FFH, . , 2. , , , - . . 2-5 . ;--- BEAT DB 10,9,8,7,6,5,4,3,2 ; FREQUENCY DW 2280,2031,1809,1709 ; DW 1521,1353,1207,1139 ; MELODY DB 1,2,3,4,5,6,7,8,0FFH ; ;--- PORT_B EQU 61H COMMAND_REG EQU 43H LATCH2 EQU 42H IN AL,PORT_B ; OR AL,00000011B ; OUT PORT_B,AL ; MOV SI,0 ; MOV AL,0B6H ; 2 OUT COMMAND_REG,AL ; ;--- , 2 NEXT_NOTE: LEA BX,MELODY ; MOV AL,[BX][SI] ; n- CMP AL,0FFH ; JE NO_MORE ; , CBW ; ; MOV BX,OFFSET FREQUENCY ; DEC AX ; 0 SHL AX,1 ; 2, .. MOV DI,AX ; DI MOV DX,[BX][DI] ; ; MOV AL,DL ; OUT LATCH2,AL ; MOV AL,DH ; OUT LATCH2,AL ; ;--- MOV AH,0 ; INT 1AH ; MOV BX,OFFSET BEAT ; MOV CL,[BX][SI] ; MOV CH,0 ; MOV BX,DX ; ADD BX,CX ; STILL_SOUND: INT 1AH ; CMP DX,BX ; JNE STILL_SOUND ; - INC SI ; JMP NEXT_NOTE ; ;--- NO_MORE: IN AL,PORT_B ; B AND AL,0FCH ; OUT 61H,AL ; 2.2.6 , . , . - - 8253 [2.2.3], , 8255 [2.2.2], . , - . - [2.1.7]. , , , 18.2 , - . - - , , , , . . PLAY, [2.2.5]. MB. Music Background ( ); PLAY , - , MF. ( ). 100 PLAY "MB T100 O3 L4;CDEFG>ABC" ' 110 LINE (10,10)-(80,80),1,BF ' . , , . , , - [2.1.7]. - 18.2 , , BIOS. , , , , , - . BIOS - . , - . , , , 2 8253 - . . ;--- BEAT DB 10,9,8,7,6,5,4,3,2 ; FREQUENCY DW 2280,2031,1809,1709 ; DW 1521,1355,1207,1139 ; MELODY DB 1,2,3,4,5,6,7,8,0FFH ; HOLDIP DW 0 ; HOLDCS DW 0 ; SOUND_NOW? DB 1 ; ? FIRST_NOTE? DB 1 ; ? END_NOTE DW 0 ; WHICH_NOTE DW 0 ; ;--- ; PUSH DS ; MOV AX,SEG MELODY2 ; MOV DS,AX ; DS MOV DX,OFFSET MELODY2 ; MOV AL,1CH ; MOV AH,25H ; INT 21H ; POP DS ; ; ;--- , ; ;--- MOV DX,0FF53H ; MOV AX,0F000H ; 1CH MOV DS,AX ; MOV AL,1CH ; MOV AH,25H ; INT 21H ; RET ; ;--- MELODY2 PROC FAR PUSH AX ; PUSH BX ; PUSH CX ; PUSH DX ; PUSH DI ; PUSH SI ; PUSH DS ; MOV AX,SS:[114] ; DS MOV DS,AX ; CMP SOUND_NOW?,1 ; ? JE PLAY_IT ; , JMP NOT_NOW ; PLAY_IT: CMP FIRST_NOTE?,0 ; ? JE TIME_CHECK ; , ;--- PORT_B EQU 61H ; COMMAND_REG EQU 43H ; LATCH2 EQU 42H ; IN AL,PORT_B ; B OR AL,00000011B ; OUT PORT_B,AL ; MOV SI,0 ; MOV AL,0B6H ; 2 OUT COMMAND_REG,AL ; MOV FIRST_NOTE?,0 ; ;--- , , 2 NEXT_NOTE: LEA BX,MELODY ; MOV SI,WHICH_NOTE ; MOV AL,[BX][SI] ; CMP AL,0FFH ; JE NO_MORE ; , CBW ; ; MOV BX,OFFSET FREQUENCY ; DEC AX ; SHL AX,1 ; 2, .. MOV DI,AX ; DI MOV DX,[BX][DI] ; ; MOV AL,DL ; OUT LATCH2,AL ; MOV AL,DH ; OUT LATCH2,AL ; ;--- , TIME_IT: MOV AH,0 ; INT 1AH ; MOV BX,OFFSET BEAT ; MOV CL,[BX][SI] ; MOV CH,0 ; MOV BX,DX ; ADD BX,CX ; MOV END_NOTE,BX ; TIME_CHECK: MOV AH,0 ; INT 1AH ; CMP DX,END_NOTE ; JNE NOT_NOW ; , MOV SI,WHICH_NOTE ;, INC SI ; MOV WHICH_NOTE,SI ; JMP NEXT_NOTE ; ;--- NO_MORE: IN AL,PORT_B ; B AND AL,0FCH ; OUT 61H,AL ; MOV SOUND_NOW?,0 ; MOV FIRST_NOTE?,1 ; NOT_NOW: POP DS ; POP SI ; POP DI ; POP DX ; POP CX ; POP BX ; POP AX ; IRET ; MELODY2 ENDP 2.2.7 . - . , - . , - . . SOUND [2.2.2] , . . [2.2.8], PLAY . 100 FOR N = 1 TO 500 STEP 15 110 SOUND 400 + N,1 120 NEXT . , 8255. 1 B 0 1, , [2.2.2]. , CX, - . : ;--- PB EQU 61H ; B 8255 IN AL,PB ; OR AL,1 ; 0 OUT PB,AL ; ;--- MOV BX,9000 ; MOV DX,3000 ; 3000 REPEAT: ; ;--- OR AL,00000010B ; 1 OUT PB,AL ; B MOV CX,BX ; 1/2 CYCLE1: LOOP CYCLE1 ; 1000 ;--- AND AL,11111101B ; 1 OUT PB,AL ; MOV CX,BX ; CYCLE2: LOOP CYCLE2 ; ;--- DEC BX ; , DEC BX ; DEC DX ; JNZ REPEAT ; DX 0, , , . , , , DX . 2.2.8 . . PCjr (. [2.2.1]). - . . SOUND PLAY - . , , , . , "" , : 100 FOR N = 1 TO 100 ' 110 PLAY "L64 T255" ' 120 PLAY "O1A" ' A 130 PLAY "O5A" ' A 140 NEXT ' : 100 FOR N = 1 TO 100 ' 110 SOUND 440,1 ' A 120 SOUND 445,1 ' 130 NEXT ' , . . 2-6 - . : 100 FOR I = 1 TO 10 ' 110 FOR J = 1 TO 6 ' 120 PLAY "MBL64T255O=J;BA#AG#GF#FED#DC#CC#DD#EFF#GG#AA#B" 130 NEXT ' 140 NEXT ' PCjr , , . NOISE , : NOISE , , - 0 7, : 0 1 2 3 , 3 4 5 6 7 , 3 0 15, 0 - . - , 18.2 . . , , , , - . , , , , , - . - . , 50 1, . 10 - 20 , . - 8255, [2.2.2]. : NUMBER_CYCLES EQU 300 ; FREQUENCY1 EQU 50 ;, FREQUENCY2 EQU 3200 ;, PORT_B EQU 61H ; B 8255 CLI ; MOV DX,NUMBER_CYCLES;DX IN AL,PORT_B ; AND AL,11111110B ; NEXT_CYCLE: OR AL,00000010B ; OUT PORT_B,AL ; MOV CX,FREQUENCY1 ; FIRST_HALF: LOOP FIRST_HALF ; AND AL,11111101B ; OUT PORT_B,AL ; MOV CX,FREQUENCY2 ; SECND_HALF: LOOP SECND_HALF ; DEC DX ; JNZ NEXT_CYCLE ; 0, STI ; , FREQUENCY2 40000. 2.2.9 . , PCjr, - (. [2.2.1]). - , . - . , , . . . , [2.2.2] [2.2.3]. 2 - . , 1 B . . . ;--- 2 IN AL,61H ; B OR AL,3 ; OUT 61H,AL ; MOV AL,10110110B ; 8253 OUT 43H,AL ; MOV AX,600H ; 2 OUT 42H,AL ; MOV AL,AH ; OUT 42H,AL ; ;--- 8255 NUMBER_CYCLES EQU 9000 ; FREQUENCY EQU 150 ; CLI ; MOV DX,NUMBER_CYCLES ;DX IN AL,61H ; AND AL,11111111B ; NEXT_CYCLE: OR AL,00000010B ; OUT 61H,AL ; MOV CX,FREQUENCY ; 1/2 FIRST_HALF: LOOP FIRST_HALF ; AND AL,11111101B ; OUT 61H,AL ; MOV CX,FREQUENCY ; 1/2 SECOND_HALF: LOOP SECOND_HALF ; DEC DX ; JNZ NEXT_CYCLE ; 0, STI ; ;--- 2 IN AL,61H ; AND AL,11111100B ; 2 OUT 61H,AL ;  3. .  1. . , - - A [1.1.1], . - , 7 , . - [3.3.2]. , AT, , ( = 1, ) ( = 0, - ). , 7- - B - 48, 110000 . , A - 10110000, - 00110000. , - 8255. 8255 . AT -, - -, F0H, . - A, (INT 9). , -. , . - - , , - ( , - ). - , - , ( "a" "A"?). , , 15 - , , . . 3-1 , , . , ASCII . ASCII - , - ASCII IBM PC, [3.3.3]. IBM PC , . ASCII 32 , , ; - , , [4.3.1]. (- , 128 - ASCII, ASCII - . ASCII, . - , "ASCII 8" "Backspace", "8" - , ASCII 56). , , , ASCII, Alt. 2 , ASCII 0. - , [3.3.5]. , 0:30 Alt-A. ASCII . , - -. - <Ctrl-Break>, <Ctrl-Alt-Del> <PrtSc>, <SysReq> AT <Ctrl-Alt- , - , -CapsLock, -Ins> PCjr. - [3.3.2]. - , , , . - , . , , - . , . 3.1.1 . , , , , . 15 , , ASCII - . , . ASCII, - - . ASCII 0, . - - , , - . , FIFO ( - ). . , " " . , . , ( ) - . , , , ; , , . , , . . 3-2 . - , - . , . 15 16- , 2 (ASCII 13) - <Enter>, 28. . 32 0040:001E. 0040:001A 0040:001C, - . 2 , . 30 60, - BIOS. 0040:001A - 0040:001C. , , . , MS DOS . . PEEK POKE: 100 DEF SEG = &H40 ' 110 POKE &H1C, PEEK(&H1A) ' . - , , , 110 - , . - . , , ASCII 0, , : 100 IF INKEY$<>"" THEN 100 ' . 0C 21H 1, 6, 7, 8 A ( ), . AL ( - 1): ;--- MOV AH,0CH ; DOS 0CH MOV AL,1 ; INT 21H ; , . . : ;--- CLI ; SUB AX,AX ; MOV ES,AX ; - MOV AL,ES:[41AH] ; MOV ES:[41CH],AL ; STI ; 3.1.2 . , . , , . , . 0040:001A 0040:001C. ( , , [3.1.1].) . PEEK , : 100 DEF SEG = &H40 ' 110 IF PEEK(&H1A)<>PEEK(&H1C) THEN ... '... . 0BH 21H 0FFH AL, 0, : ;--- MOV AH,0BH ; INT 21H ; 21H CMP AL,0FFH ; 0FFH JE GET_KEYSTROKE ; 1 BIOS 16H , , , . (ZF) , , , . , , AX, . AL ASCII, ASCII 0 , - AH. ;--- MOV AH,1 ; INT 16H ; JZ NO_CHARACTER ; ZF = 1 ;--- - CMP AL,0 ; ? JE EXTENDED_CODE ; , . : ;--- MOV AX,0 ; MOV ES,AX ; MOV AL,ES:[41AH] ; MOV AH,ES:[41CH] ; CMP AH,AL ; JNE GET_KEYSTROKE ; , 3.1.3 . , , . - . , . . , , - , , (ASCII 0) , . . INKEY$ . 1 ASCII 2 . INKEY$ , , , . , INKEY$, - , C$. , INKEY$ , .. , , (""). INKEY$ "" - : 100 C$=INKEY$:IF C$="" THEN 100. , . A, B, C ... ( 1- ASCII) Alt-A, Alt-B, Alt-C ... ( 2- ). LEN, 1 2 .