diff options
author | Juan J. Martinez <jjm@usebox.net> | 2021-04-17 22:05:24 +0100 |
---|---|---|
committer | Juan J. Martinez <jjm@usebox.net> | 2021-04-17 22:05:24 +0100 |
commit | a5745813e442b66ae6eed30bba81d1b3dd5cf634 (patch) | |
tree | b302db1780350dc44543b81d49bfc1b2d4dff6a8 /sdcc | |
download | beeper-int-zx-a5745813e442b66ae6eed30bba81d1b3dd5cf634.tar.gz beeper-int-zx-a5745813e442b66ae6eed30bba81d1b3dd5cf634.zip |
Initial public release
Diffstat (limited to 'sdcc')
-rw-r--r-- | sdcc/Makefile | 13 | ||||
-rw-r--r-- | sdcc/README.MD | 23 | ||||
-rw-r--r-- | sdcc/beeper.h | 49 | ||||
-rw-r--r-- | sdcc/beeper.z80 | 158 |
4 files changed, 243 insertions, 0 deletions
diff --git a/sdcc/Makefile b/sdcc/Makefile new file mode 100644 index 0000000..3445ca7 --- /dev/null +++ b/sdcc/Makefile @@ -0,0 +1,13 @@ +all: beeper.lib + +AS=sdasz80 +AR=sdar + +beeper.lib: beeper.z80 + $(AS) -o $< + $(AR) -rcD $@ beeper.rel + +.PHONY: clean +clean: + rm -f *.rel *.bin *.lib + diff --git a/sdcc/README.MD b/sdcc/README.MD new file mode 100644 index 0000000..7ec00a3 --- /dev/null +++ b/sdcc/README.MD @@ -0,0 +1,23 @@ +This is the main implementation of the beeper engine, to be used with SDCC +compiler. + +The assembler syntax specific to this compiler suite, but it should be +easy to convert to your favourite assembler. + +Feel free to contribute your port! + +## Build instructions + +Ensure that SDCC is in your path and run `make`. + +Include this directory in your include and library paths, and link with the +beeper library. + +For example: +``` +CFLAGS += -I$(BEEPER_LIB_DIR) +LDFLAGS += -L$(BEEPER_LIB_DIR) -lbeeper +``` + +It is recommended that the beeper code runs from non-contended memory. + diff --git a/sdcc/beeper.h b/sdcc/beeper.h new file mode 100644 index 0000000..fff5dad --- /dev/null +++ b/sdcc/beeper.h @@ -0,0 +1,49 @@ +// Beeper engine +// Copyright (C) 2021 by Juan J. Martinez <jjm@usebox.net> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +#ifndef _BEEPER_H +#define _BEEPER_H + +#include <stdint.h> + +struct beeper_sfx { + uint8_t type; + uint8_t frames; + uint8_t freq; + uint8_t slide; + uint8_t next; +}; + +// to init the beeper engine, provide a pointer to the effect table +void beeper_init(const struct beeper_sfx *efx_table) __z88dk_fastcall; + +// to queue a new effect +// efx_no is... +// +// 0: no effect (stops sound) +// 1: index 0 of the effect table +// 2: ... +// +void beeper_queue(uint8_t efx_no) __z88dk_fastcall; + +// to be called in the INT handler; call beeper_init first! +void beeper_play(); +#endif diff --git a/sdcc/beeper.z80 b/sdcc/beeper.z80 new file mode 100644 index 0000000..b5b82e7 --- /dev/null +++ b/sdcc/beeper.z80 @@ -0,0 +1,158 @@ +; Beeper engine
+; Copyright (C) 2021 by Juan J. Martinez <jjm@usebox.net>
+;
+; Permission is hereby granted, free of charge, to any person obtaining a copy
+; of this software and associated documentation files (the "Software"), to deal
+; in the Software without restriction, including without limitation the rights
+; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+; copies of the Software, and to permit persons to whom the Software is
+; furnished to do so, subject to the following conditions:
+;
+; The above copyright notice and this permission notice shall be included in
+; all copies or substantial portions of the Software.
+;
+; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+; THE SOFTWARE.
+;
+.globl _beeper_init
+.globl _beeper_queue
+.globl _beeper_play
+
+_beeper_init::
+ di
+ ld (sfx_data), hl
+ xor a
+ ld (sfx_type), a
+ ei
+ ret
+
+_beeper_queue::
+ di
+ ld a, l
+ call queue_next
+ ei
+ ret
+
+queue_next:
+ ld (sfx_type), a
+ or a
+ ret z
+
+ dec a
+
+ ld hl, (sfx_data)
+ ld c, l
+ ld b, h
+
+ ld h, #0
+ ld l, a
+ ld d, h
+ ld e, l
+ add hl, hl
+ add hl, hl
+ add hl, de
+ add hl, bc
+
+ ld de, #sfx_type
+ ld bc, #5
+ ldir
+ ret
+
+_beeper_play::
+ ld a, (sfx_type)
+ or a
+ ret z
+
+ dec a
+ jr z, tone
+
+ dec a
+ ; shouldn't happen!
+ ret nz
+
+ ; noise
+ ld a, (sfx_freq)
+ ld d, a
+
+ ld b, #0
+
+noise_loop:
+ call rnd
+ and #0x10
+ ; FIXME: border ?
+ out (0xfe), a
+
+ ld c, d
+noise_freq_loop:
+ dec b
+ jr z, noise_done
+ dec c
+ jr nz, noise_freq_loop
+ jr noise_loop
+
+tone:
+ ld a, (sfx_freq)
+ ld d, a
+
+ xor a
+ ld b, a
+
+tone_loop:
+ ; FIXME: border ?
+ out (0xfe), a
+ xor #0x10
+
+ ld c, d
+freq_loop:
+ dec b
+ jr z, tone_done
+ dec c
+ jr nz, freq_loop
+ jr tone_loop
+
+tone_done:
+noise_done:
+ ld a, (sfx_next)
+ ld hl, #sfx_frames
+ dec (hl)
+ jr z, queue_next
+
+ ; freq change (slide)
+ ld a, (sfx_freq_chg)
+ add d
+ ld (sfx_freq), a
+
+ ret
+
+rnd:
+ ld hl, #0xf3a1
+ ld a, h
+ rra
+ ld a, l
+ rra
+ xor h
+ ld h, a
+ ld a, l
+ rra
+ ld a, h
+ rra
+ xor l
+ ld l, a
+ xor h
+ ld h, a
+ ld (rnd + 1), hl
+ ret
+
+sfx_type: .ds 1
+sfx_frames: .ds 1
+sfx_freq: .ds 1
+sfx_freq_chg: .ds 1
+sfx_next: .ds 1
+
+sfx_data: .ds 2
+
|