464 lines
6.0 KiB
ArmAsm
464 lines
6.0 KiB
ArmAsm
|
|
rel
|
|
xc
|
|
xc
|
|
|
|
|
|
tbx on
|
|
|
|
SoundCtrl equ $e0c03c
|
|
SoundData equ $e0c03d
|
|
SoundAddr equ $e0c03e ; and $3f
|
|
|
|
beep_left equ 0
|
|
beep_right equ 1
|
|
noise_left equ 2
|
|
noise_right equ 3
|
|
timer_1 equ 4
|
|
timer_3 equ 5
|
|
timer_7 equ 6
|
|
|
|
|
|
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 >SoundCtrl
|
|
bmi wait
|
|
<<<
|
|
|
|
main
|
|
mx %00
|
|
phk
|
|
plb
|
|
|
|
|
|
jsr init
|
|
jsr start
|
|
|
|
sep $30
|
|
]wait lda _active
|
|
beq :done
|
|
|
|
lda >$e0c000 ; keydown - exit.
|
|
bpl ]wait
|
|
sta >$e0c010
|
|
|
|
:done
|
|
rep $30
|
|
jsr shutdown
|
|
|
|
|
|
lda #0
|
|
rtl
|
|
|
|
start
|
|
mx %00
|
|
|
|
stz _index
|
|
stz _template
|
|
stz _template+2
|
|
stz _on
|
|
stz _active
|
|
|
|
sep $30
|
|
*]wait lda >SoundCtrl
|
|
* bmi ]wait
|
|
docwait
|
|
|
|
* start osc 0-3 w/ volume 0.
|
|
|
|
lda #$40
|
|
sta >SoundAddr
|
|
lda #0
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
|
|
lda #$a0
|
|
sta >SoundAddr
|
|
lda #%0000_0_01_0 ; free-run, enabled
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
|
|
|
|
|
|
* trigger the timing oscillator.
|
|
lda #$a0+timer_1
|
|
sta >SoundAddr
|
|
lda #%0000_1_01_0 ; one-shot, enabled, interrupt
|
|
sta >SoundData
|
|
rep $30
|
|
|
|
inc _active
|
|
|
|
rts
|
|
|
|
shutdown
|
|
mx %00
|
|
jsr stop
|
|
|
|
psw #$b
|
|
psl old_irq
|
|
_SetVector
|
|
rts
|
|
|
|
stop
|
|
mx %00
|
|
stz _active
|
|
|
|
* shut off all oscillators.
|
|
sep $30
|
|
*]wait lda >SoundCtrl
|
|
* bmi ]wait
|
|
docwait
|
|
|
|
lda #$a0
|
|
sta >SoundAddr
|
|
lda #%0000_0_01_1 ; one-shot, disabled, nointerrupt
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
|
|
rep #$30
|
|
rts
|
|
|
|
sound_irq
|
|
mx %11
|
|
|
|
lda >_active
|
|
beq :ok
|
|
clc
|
|
rtl
|
|
|
|
:ok
|
|
phb
|
|
phk
|
|
plb
|
|
rep $30
|
|
|
|
lsr _template+2
|
|
ror _template
|
|
|
|
sep $30
|
|
bcc :off
|
|
lda _on
|
|
bne :trigger1
|
|
ldx #$ff
|
|
stx _on
|
|
jsr setvolume
|
|
|
|
:trigger1 ; osc 5 interrupt on
|
|
lda #$a0+timer_1
|
|
sta >SoundAddr
|
|
lda #%0000_1_01_0 ; one-shot, enabled, interrupt
|
|
sta >SoundData
|
|
bra :exit
|
|
|
|
:off
|
|
* turn off sound generators.
|
|
stz _on
|
|
ldx #0
|
|
jsr setvolume
|
|
* check for advance...
|
|
lda _template
|
|
bne :trigger1
|
|
|
|
rep $30
|
|
ldx _index
|
|
lda _buffer,x
|
|
and #$ff
|
|
beq :fini
|
|
|
|
inx
|
|
stx _index
|
|
cmp #' '+1
|
|
blt :space
|
|
|
|
asl
|
|
asl
|
|
tax
|
|
lda table,x
|
|
sta _template
|
|
lda table+2,x
|
|
sta _template+2
|
|
sep $30
|
|
* bra :trigger3 ; inter-char delay.
|
|
|
|
:trigger3 ; osc 6 interrupt on
|
|
lda #$a0+timer_3
|
|
sta >SoundAddr
|
|
lda #%0000_1_01_0 ; one-shot, enabled, interrupt
|
|
sta >SoundData
|
|
bra :exit
|
|
|
|
|
|
|
|
:fini mx %00
|
|
* stz _index
|
|
stz _active
|
|
bra :exit
|
|
|
|
:space mx %00
|
|
stz _template ; should already be 0.
|
|
stz _template+2
|
|
sep $30
|
|
* bra :trigger7 ; inter-word delay
|
|
|
|
:trigger7 ; osc 7 interrupt on
|
|
lda #$a0+timer_7
|
|
sta >SoundAddr
|
|
lda #%0000_1_01_0 ; one-shot, enabled, interrupt
|
|
sta >SoundData
|
|
bra :exit
|
|
|
|
:exit
|
|
plb
|
|
clc
|
|
rtl
|
|
|
|
setvolume
|
|
mx %11
|
|
lda #$40
|
|
sta >SoundAddr
|
|
txa
|
|
sta >SoundData
|
|
sta >SoundData
|
|
rts
|
|
|
|
|
|
|
|
init
|
|
mx %00
|
|
|
|
pha
|
|
pha
|
|
psw #$b
|
|
_GetVector
|
|
pll old_irq
|
|
|
|
psw #$b
|
|
psl #sound_irq
|
|
_SetVector
|
|
|
|
sep $30
|
|
|
|
*]wait lda >SoundCtrl
|
|
* bmi ]wait
|
|
docwait
|
|
|
|
ora #%00100000 ; auto increment (for later)
|
|
bic #%01000000 ; DOC mode
|
|
sta >SoundCtrl
|
|
|
|
|
|
* halt all oscillators.
|
|
ldy #$20-7
|
|
lda #$a0
|
|
sta >SoundAddr
|
|
|
|
* osc 1-4 are free-run, halted, stereo pairs.
|
|
lda #%0000_0_00_1 ; free-run, halted
|
|
sta >SoundData
|
|
lda #%0001_0_00_1 ; free-run, halted
|
|
sta >SoundData
|
|
lda #%0000_0_00_1 ; free-run, halted
|
|
sta >SoundData
|
|
lda #%0001_0_00_1 ; free-run, halted
|
|
sta >SoundData
|
|
|
|
* 5-7 are one-shot, interrupt enabled, halted.
|
|
lda #%0000_1_00_1 ; one-shot, halted, interrupt enabled.
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
|
|
* all others - halted.
|
|
lda #%0000_0_01_1 ; one-shot, halted
|
|
]loop sta >SoundData
|
|
dey
|
|
bne ]loop
|
|
|
|
|
|
* volume 0
|
|
ldy #$20
|
|
lda #$40
|
|
sta >SoundAddr
|
|
lda #0
|
|
]loop sta >SoundData
|
|
dey
|
|
bne ]loop
|
|
|
|
|
|
* 32 oscillators.
|
|
|
|
lda #$e1
|
|
sta >SoundAddr
|
|
lda #31*2
|
|
sta >SoundData
|
|
|
|
* osc 1/2 are 256 bytes, running at the natural rate.
|
|
|
|
* osc 5/6/7 are 256 bytes, running at 1 / 3 / 6 time units
|
|
|
|
* frequency low registers
|
|
lda #$00
|
|
sta >SoundAddr
|
|
lda #<$0100 ; low
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
|
|
lda #<5103
|
|
sta >SoundData
|
|
lda #<1701
|
|
sta >SoundData
|
|
lda #<729
|
|
sta >SoundData
|
|
|
|
* freq high
|
|
lda #$20
|
|
sta >SoundAddr
|
|
lda #>$0100
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
|
|
lda #>5103
|
|
sta >SoundData
|
|
lda #>1701
|
|
sta >SoundData
|
|
lda #>729
|
|
sta >SoundData
|
|
|
|
|
|
|
|
* wave table pointer
|
|
lda #$80
|
|
sta >SoundAddr
|
|
lda #$00 ; page 0
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
lda #$01 ; page 1
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
|
|
* wave table size registers
|
|
lda #$c0
|
|
sta >SoundAddr
|
|
* 1-4 use 256 byte date, 9-bit shift.
|
|
lda #%00000000
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
* 5-7 use 256 byte data, 16-bit shift
|
|
lda #%00_000_111
|
|
sta >SoundData
|
|
sta >SoundData
|
|
sta >SoundData
|
|
|
|
|
|
* now load data...
|
|
|
|
*]wait lda >SoundCtrl
|
|
* bmi ]wait
|
|
docwait
|
|
|
|
ora #%01000000 ; ram mode
|
|
sta >SoundCtrl
|
|
|
|
lda #0
|
|
sta >SoundAddr
|
|
sta >SoundAddr+1
|
|
|
|
ldx #0
|
|
]loop lda b5,x
|
|
sta >SoundData
|
|
inx
|
|
bne ]loop
|
|
|
|
* 256 silent bytes for the timer.
|
|
lda #$80
|
|
]loop sta >SoundData
|
|
inx
|
|
bne ]loop
|
|
|
|
* swap back to register mode.
|
|
|
|
*]wait lda >SoundCtrl
|
|
* bmi ]wait
|
|
docwait
|
|
|
|
bic #%01000000 ; DOC mode
|
|
sta >SoundCtrl
|
|
|
|
|
|
rep #$30
|
|
rts
|
|
|
|
|
|
lst off
|
|
|
|
* 26300 hz
|
|
* want a 256-byte B5 sine wav
|
|
* coeff = 2 * PI * 987.767 / 26300 = 0.23598186697022278
|
|
* PI/2/coeff = 6.656428084760879
|
|
* PI/2/6.4 = 0.2454369260617026
|
|
* pcm = [128 + round(127 * sin(n*xx)) for n in range(0,256)]
|
|
|
|
|
|
b5
|
|
hex 809fbcd5eaf8fefef5e6d1b6997a5b3f
|
|
hex 26130601030d1e344f6d8cabc7def0fb
|
|
hex fffbf0dec7ab8c6d4f341e0d03010613
|
|
hex 263f5b7a99b6d1e6f5fefef8ead5bc9f
|
|
hex 8061442b160802020b1a2f4a6786a5c1
|
|
hex daedfafffdf3e2ccb193745539221005
|
|
hex 0105102239557493b1cce2f3fdfffaed
|
|
hex dac1a586674a2f1a0b020208162b4461
|
|
hex 809fbcd5eaf8fefef5e6d1b6997a5b3f
|
|
hex 26130601030d1e344f6d8cabc7def0fb
|
|
hex fffbf0dec7ab8c6d4f341e0d03010613
|
|
hex 263f5b7a99b6d1e6f5fefef8ead5bc9f
|
|
hex 8061442b160802020b1a2f4a6786a5c1
|
|
hex daedfafffdf3e2ccb193745539221005
|
|
hex 0105102239557493b1cce2f3fdfffaed
|
|
hex dac1a586674a2f1a0b020208162b4461
|
|
|
|
|
|
table
|
|
|
|
old_irq ds 4
|
|
quit ds 2
|
|
_active ds 2
|
|
_template ds 4
|
|
_on ds 2
|
|
_index ds 2
|
|
_buffer ds 256
|
|
|
|
sav morse.l
|
|
lst on
|
|
sym
|
|
|