From a5745813e442b66ae6eed30bba81d1b3dd5cf634 Mon Sep 17 00:00:00 2001 From: "Juan J. Martinez" Date: Sat, 17 Apr 2021 22:05:24 +0100 Subject: Initial public release --- sdcc/Makefile | 13 +++++ sdcc/README.MD | 23 +++++++++ sdcc/beeper.h | 49 ++++++++++++++++++ sdcc/beeper.z80 | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 243 insertions(+) create mode 100644 sdcc/Makefile create mode 100644 sdcc/README.MD create mode 100644 sdcc/beeper.h create mode 100644 sdcc/beeper.z80 (limited to 'sdcc') 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 +// +// 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 + +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 +; +; 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 + -- cgit v1.2.3