осилил pc speaker


Продуктивный был день. С утра написал интро для ZX, потом взялся за работу для msdos. Кое-что ребята из канала sizecoding подсказали.

;flat assembler
org 100h
use16

;#define PIT_FREQ 0x1234DD;
;int notes[11] = {277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494};
;int i, counter;
;
;outb(0x61, inb(0x61) | 3); // enable speaker
;outb(0x43, 0xb6); // program the pit
;
;for (i=0; i<11; i++) {
; counter = (PIT_FREQ / notes[i]); // calculate frequency
; outb(0x42, counter & 0xff); // LSB
; outb(0x42, counter >> 8); // MSB
; ms_delay(100); // wait for a bit

xor bp,bp

mov al,$b6
out $43,al

pl:
mov bx,[cs:notes+bp]
add bp,2
cmp bp,22
jne nolbp
xor bp,bp
nolbp:
mov dx,$14
mov ax,$4f38

div bx
out $42,al
mov al,ah
out $42,al

;    // Tell the 8255 PPI to start the sound
    in al, $61       ;// Read Port B of the 8255 PPI
    or al, $03       ;// Set bits 0 and 1:
      ;// bit 0 -- use the 8253/8254
      ;// bit 1 -- turn speaker on
out $61, al   ;// Write to Port B of the 8255 PPI

mov dx, 3DAh
NoVRT:
    in     al,dx
    test    al,8
    jz     NoVRT ;wait until Verticle Retrace Ends

in al,60h
dec al
jne pl
;    // Tell the 8255 PPI to stop the sound
    in al, $61       ;// Read Port B of the 8255 PPI
    and al, $FE ;NOT 2    ;// Clear bit 1 (turn speaker off)
    out $61, al       ;// Write to Port B of the 8255 PPI
ret
notes:
 dw 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494

Звук вышел убогий, после мучений собрал 256б. В итоге, вернулся к MIDI.

Ссылки по посту: 1, 2, 3

Комментарии