diff --git a/apple2gs.equ.S b/apple2gs.equ.S index 842fabe..92d4331 100644 --- a/apple2gs.equ.S +++ b/apple2gs.equ.S @@ -15,6 +15,13 @@ SCCAREG equ $c039 SCCBDATA equ $c03a SCCADATA equ $c03b +* Sound GLU +SGCONTROL equ $c03c ; Sound GLU control register +SGDATA equ $c03d ; Sound GLU data register +SGADDRL equ $c03e ; Sound GLU address reg low +SGADDRH equ $c03f ; Sound GLU address reg high + + * interrupt vectors. JMP ABSLONG. IRQ1SEC equ $e10054 IRQQTR equ $e10038 diff --git a/vt100.beep.S b/vt100.beep.S new file mode 100644 index 0000000..89891dd --- /dev/null +++ b/vt100.beep.S @@ -0,0 +1,199 @@ + + lst off + cas se + + rel + xc + xc + + use apple2gs.equ + + + mx %11 + + + +* +* +* keypress @ 44.1 - 28 samples of $40, 29 samples of $b0 +* +* beep - repeat keypress 53 times +* +* by adjusting rate, only need 1 sample each. +* +* w/ 2 oscillators, scan rate = 223.7 kHz ~5x 44.1 +* 28 samples * 5 = 142 +* res = 7. (1 << 16) / 142 = ~ 461 +* freq = 461, res = 7, wave size = 256 --> n * 461 >> 16 +* +* + + +* +* vt52 +* keypress - ~730 samples, $40, curve to 0 or $b0, curve to 0 +* beep 14 keypresses +* +* + + +bic mac + if #=]1 + and ]1!$ffff + else + err 1 ; immediate only. + fin + <<< + +docwait mac + if MX<2 + err 1 ; 8-bit m only + fin +wait lda SGCONTROL + bmi wait + <<< + +docmode mac + docwait + bic #%01000000 ; DOC mode + ora #%00100000 ; auto-incr + ors #%0000_1111 ; max volume. + sta SGCONTROL + <<< + +rammode mac + docwait + ora #%01100000 ; RAM mode, auto-incr + sta SGCONTROL + <<< + + +init_audio ent + + docmode + +* 4 oscillators. -- (2 for key, 2 for beep -- stereo!) + lda #$e1 + sta SGADDRL + + lda #4*2 + sta SGDATA + +* control registers +* just set them off. channels will be set when they fire. + + lda #$a0 + sta SGADDRL + lda #%0000_0_01_1 ; ch 0, interrupts off, 1-shot, halted. + sta SGDATA + sta SGDATA + sta SGDATA + sta SGDATA + + + +* freq low + lda #$00 + sta SGADDRL + lda #<650 + sta SGDATA + sta SGDATA + sta SGDATA + sta SGDATA + +* freq high + lda #$20 + sta SGADDRL + lda #>650 + sta SGDATA + sta SGDATA + sta SGDATA + sta SGDATA + +* volume + lda #$40 + sta SGADDRL + lda #$ff + sta SGDATA + sta SGDATA + sta SGDATA + sta SGDATA + +* wave table + lda #$80 + sta SGADDRL + lda #0 ; page 0 + sta SGDATA + sta SGDATA + inc ; page 1 + sta SGDATA + sta SGDATA + + + +* wave table size + lda #$c0 + sta SGADDRL + lda #%00_000_111 ; 256 bytes, 16-bit shift + sta SGDATA + sta SGDATA + sta SGDATA + sta SGDATA + + +; now copy the data.... + rammode + stz SGADDRL + stz SGADDRH + + ldy #key_size + ldx #0 +]loop lda key_data,x + sta SGDATA + inx + dey + bpl ]loop + + stz SGADDRL + lda #1 + sta SGADDRH + ldy #beep_size + ldx #0 +]loop lda beep_data,x + sta SGDATA + inx + dey + bpl ]loop + + rts + + +beep ent + ; fire osc 2 + 3 + docmode + + lda #$a0+2 + sta SGADDRL + lda #%0000_0_01_0 ; ch 0, interrupts off, 1-shot, running. + ldx #%0001_0_01_0 ; ch 1, interrupts off, 1-shot, running. + sta SGDATA + stx SGDATA + + rts + + +key_data + db $01 + db $ff + db $00 +key_size equ *-key_data + +beep_data + lup 53 + db $01 + db $ff + --^ + db $0 +beep_size equ *-beep_data + + sav vt100.beep.L diff --git a/vt100.link.S b/vt100.link.S index 6e9c2d7..b96ce8e 100644 --- a/vt100.link.S +++ b/vt100.link.S @@ -14,6 +14,7 @@ asm vt100.screen.S asm vt100.modem.S asm vt100.key.S + asm vt100.beep.S * lnk boot.S @@ -32,6 +33,7 @@ lnk vt100.screen.L lnk vt100.modem.L lnk vt100.key.L + lnk vt100.beep.L typ $ff sav vt100.sys diff --git a/vt100.main.S b/vt100.main.S index 02dbb05..1b775b6 100644 --- a/vt100.main.S +++ b/vt100.main.S @@ -15,6 +15,7 @@ ext disable_cursor,enable_cursor,cursor_vector ext erase_screen ext init_tabs + ext init_audio main debug main @@ -96,6 +97,7 @@ init jsr erase_screen jsr init_modem jsr init_tabs + jsr init_audio rts @@ -185,7 +187,8 @@ ctrl_1f ctrl_07 ; ring the bell. - rts + ext beep + jmp beep ctrl_1b ; escape - * vt100 - aborts current escape sequence and starts a new one.