uxn

Varvara Ordinator, written in ANSI C(SDL2)
git clone https://git.eamoncaddigan.net/uxn.git
Log | Files | Refs | README | LICENSE

commit cc2b2e77b0b0f6f45410aa7bc961adb3b6fbfcce
parent 491e4b7435bb82dd55ccb4f7a086629f3d5c988c
Author: Devine Lu Linvega <aliceffekt@gmail.com>
Date:   Mon,  2 Jan 2023 09:50:57 -0800

Merge branch 'main' of git.sr.ht:~rabbits/uxn

Diffstat:
M.build.yml | 2+-
Metc/asma-test.sh | 16++++++++--------
Mprojects/library/asma.tal | 7-------
Msrc/devices/audio.c | 21++++++++++-----------
Msrc/devices/audio.h | 19+------------------
Msrc/devices/controller.c | 2+-
Msrc/devices/datetime.c | 2+-
Msrc/devices/file.c | 6++++--
Msrc/devices/mouse.c | 2+-
Msrc/devices/screen.c | 3+--
Msrc/devices/system.c | 2+-
Msrc/uxn.c | 2+-
Msrc/uxnasm.c | 2+-
Msrc/uxncli.c | 2+-
Msrc/uxnemu.c | 62+++++++++++++++++++++++++++++++++-----------------------------
15 files changed, 65 insertions(+), 85 deletions(-)

diff --git a/.build.yml b/.build.yml @@ -46,7 +46,7 @@ tasks: done [ -e ~/.ssh/id_rsa ] || complete-build - build-windows: | - if ssh -o ConnectTimeout=10 win true; then + if false && ssh -o ConnectTimeout=10 win true; then ssh win "export PATH=\"\${PATH}:/mingw64/bin\"; set -ex; cd uxn; git fetch; git checkout .; git clean -xfd; git checkout $(cd uxn && git rev-parse HEAD); MSYSTEM=MSYS ./build.sh --no-run" rsync -rp win:uxn/bin/ build/uxn-win64/uxn/ else diff --git a/etc/asma-test.sh b/etc/asma-test.sh @@ -86,14 +86,14 @@ expect_failure 'Memory overwrite: SUB' <<'EOD' |2000 ADD |1000 SUB EOD -expect_failure 'Recursion level too deep:' <<'EOD' -%me { you } -%you { me } -|1000 me -EOD -expect_failure 'Recursion level too deep: ~asma-test/in.tal' <<'EOD' -~asma-test/in.tal -EOD +# expect_failure 'Recursion level too deep:' <<'EOD' +# %me { you } +# %you { me } +# |1000 me +# EOD +# expect_failure 'Recursion level too deep: ~asma-test/in.tal' <<'EOD' +# ~asma-test/in.tal +# EOD expect_failure 'Label not found: ;blah' <<'EOD' |1000 ;blah EOD diff --git a/projects/library/asma.tal b/projects/library/asma.tal @@ -833,7 +833,6 @@ ( hex short ) ,asma-short-helper/raw JMP &not-hex - .System/rst DEI #e0 GTH ,&too-deep JCN ;asma-trees/macros ;asma-traverse-tree JSR2 ,&not-macro JCN &macro-loop @@ -855,12 +854,7 @@ ;asma-msg-token ;asma/error STA2 JMP2r - &too-deep - ;asma-msg-too-deep ;asma/error STA2 - JMP2r - @asma-include - .System/rst DEI #e0 GTH ,asma-normal-body/too-deep JCN ;heap LDA2 ;asma/token LDA2 ;append-heap-string JSR2 ;asma-assemble-file-pass JSR2 @@ -876,7 +870,6 @@ @asma-msg-token "Unrecognised 20 "token 00 @asma-msg-macro "Macro 20 "already 20 "exists 00 @asma-msg-rewound "Memory 20 "overwrite 00 -@asma-msg-too-deep "Recursion 20 "level 20 "too 20 "deep 00 @asma-msg-redefined "Label 20 "redefined 00 ( trees ) diff --git a/src/devices/audio.c b/src/devices/audio.c @@ -2,8 +2,7 @@ #include "audio.h" /* -Copyright (c) 2021 Devine Lu Linvega -Copyright (c) 2021 Andrew Alderwick +Copyright (c) 2021-2023 Devine Lu Linvega, Andrew Alderwick Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -73,21 +72,21 @@ audio_render(int instance, Sint16 *sample, Sint16 *end) } void -audio_start(int instance, Device *d) +audio_start(int instance, Uint8 *d, Uxn *u) { UxnAudio *c = &uxn_audio[instance]; Uint16 addr, adsr; Uint8 pitch; - DEVPEEK16(adsr, 0x8); - DEVPEEK16(c->len, 0xa); - DEVPEEK16(addr, 0xc); + PEKDEV(adsr, 0x8); + PEKDEV(c->len, 0xa); + PEKDEV(addr, 0xc); if(c->len > 0x10000 - addr) c->len = 0x10000 - addr; - c->addr = &d->u->ram[addr]; - c->volume[0] = d->dat[0xe] >> 4; - c->volume[1] = d->dat[0xe] & 0xf; - c->repeat = !(d->dat[0xf] & 0x80); - pitch = d->dat[0xf] & 0x7f; + c->addr = &u->ram[addr]; + c->volume[0] = d[0xe] >> 4; + c->volume[1] = d[0xe] & 0xf; + c->repeat = !(d[0xf] & 0x80); + pitch = d[0xf] & 0x7f; if(pitch < 108 && c->len) c->advance = advances[pitch % 12] >> (8 - pitch / 12); else { diff --git a/src/devices/audio.h b/src/devices/audio.h @@ -15,25 +15,8 @@ typedef signed int Sint32; #define SAMPLE_FREQUENCY 44100 #define POLYPHONY 4 -#define DEVPEEK16(o, x) \ - { \ - (o) = (d->dat[(x)] << 8) + d->dat[(x) + 1]; \ - } -#define DEVPOKE16(x, y) \ - { \ - d->dat[(x)] = (y) >> 8; \ - d->dat[(x) + 1] = (y); \ - } - -typedef struct Device { - struct Uxn *u; - Uint8 dat[16]; - Uint8 (*dei)(struct Device *d, Uint8); - void (*deo)(struct Device *d, Uint8); -} Device; - Uint8 audio_get_vu(int instance); Uint16 audio_get_position(int instance); int audio_render(int instance, Sint16 *sample, Sint16 *end); -void audio_start(int instance, Device *d); +void audio_start(int instance, Uint8 *d, Uxn *u); void audio_finished_handler(int instance); diff --git a/src/devices/controller.c b/src/devices/controller.c @@ -2,7 +2,7 @@ #include "controller.h" /* -Copyright (c) 2021 Devine Lu Linvega, Andrew Alderwick +Copyright (c) 2021-2023 Devine Lu Linvega, Andrew Alderwick Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/src/devices/datetime.c b/src/devices/datetime.c @@ -4,7 +4,7 @@ #include "datetime.h" /* -Copyright (c) 2021 Devine Lu Linvega, Andrew Alderwick +Copyright (c) 2021-2023 Devine Lu Linvega, Andrew Alderwick Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/src/devices/file.c b/src/devices/file.c @@ -16,7 +16,7 @@ #include "file.h" /* -Copyright (c) 2021 Devine Lu Linvega, Andrew Alderwick +Copyright (c) 2021-2023 Devine Lu Linvega, Andrew Alderwick Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -132,7 +132,9 @@ retry_realpath(const char *file_name) else return NULL; } - return strdup(r); + x = malloc(strlen(r) + 1); + strcpy(x, r); + return x; } static void diff --git a/src/devices/mouse.c b/src/devices/mouse.c @@ -2,7 +2,7 @@ #include "mouse.h" /* -Copyright (c) 2021 Devine Lu Linvega, Andrew Alderwick +Copyright (c) 2021-2023 Devine Lu Linvega, Andrew Alderwick Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/src/devices/screen.c b/src/devices/screen.c @@ -4,8 +4,7 @@ #include "screen.h" /* -Copyright (c) 2021 Devine Lu Linvega -Copyright (c) 2021 Andrew Alderwick +Copyright (c) 2021-2023 Devine Lu Linvega, Andrew Alderwick Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/src/devices/system.c b/src/devices/system.c @@ -4,7 +4,7 @@ #include "system.h" /* -Copyright (c) 2022 Devine Lu Linvega, Andrew Alderwick +Copyright (c) 2022-2023 Devine Lu Linvega, Andrew Alderwick Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/src/uxn.c b/src/uxn.c @@ -1,7 +1,7 @@ #include "uxn.h" /* -Copyright (u) 2022 Devine Lu Linvega, Andrew Alderwick, Andrew Richards +Copyright (u) 2022-2023 Devine Lu Linvega, Andrew Alderwick, Andrew Richards Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/src/uxnasm.c b/src/uxnasm.c @@ -1,7 +1,7 @@ #include <stdio.h> /* -Copyright (c) 2021 Devine Lu Linvega +Copyright (c) 2021-2023 Devine Lu Linvega, Andrew Alderwick Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/src/uxncli.c b/src/uxncli.c @@ -7,7 +7,7 @@ #include "devices/datetime.h" /* -Copyright (c) 2021 Devine Lu Linvega +Copyright (c) 2021-2023 Devine Lu Linvega, Andrew Alderwick Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/src/uxnemu.c b/src/uxnemu.c @@ -23,7 +23,7 @@ #pragma clang diagnostic pop /* -Copyright (c) 2021 Devine Lu Linvega +Copyright (c) 2021-2023 Devine Lu Linvega, Andrew Alderwick Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -48,7 +48,6 @@ static SDL_Thread *stdin_thread; /* devices */ -static Device *devaudio0; static Uint8 zoom = 1; static Uint32 stdin_event, audio0_event; static Uint64 exec_deadline, deadline_interval, ms_interval; @@ -83,11 +82,38 @@ console_deo(Uint8 *d, Uint8 port) } static Uint8 +audio_dei(int instance, Uint8 *d, Uint8 port) +{ + if(!audio_id) return d[port]; + switch(port) { + case 0x4: return audio_get_vu(instance); + case 0x2: POKDEV(0x2, audio_get_position(instance)); /* fall through */ + default: return d[port]; + } +} + +static void +audio_deo(int instance, Uint8 *d, Uint8 port, Uxn *u) +{ + if(!audio_id) return; + if(port == 0xf) { + SDL_LockAudioDevice(audio_id); + audio_start(instance, d, u); + SDL_UnlockAudioDevice(audio_id); + SDL_PauseAudioDevice(audio_id, 0); + } +} + +static Uint8 emu_dei(Uxn *u, Uint8 addr) { Uint8 p = addr & 0x0f, d = addr & 0xf0; switch(d) { case 0x20: return screen_dei(&u->dev[d], p); + case 0x30: return audio_dei(0, &u->dev[d], p); + case 0x40: return audio_dei(1, &u->dev[d], p); + case 0x50: return audio_dei(2, &u->dev[d], p); + case 0x60: return audio_dei(3, &u->dev[d], p); case 0xa0: return file_dei(0, &u->dev[d], p); case 0xb0: return file_dei(1, &u->dev[d], p); case 0xc0: return datetime_dei(&u->dev[d], p); @@ -109,6 +135,10 @@ emu_deo(Uxn *u, Uint8 addr, Uint8 v) break; case 0x10: console_deo(&u->dev[d], p); break; case 0x20: screen_deo(u->ram, &u->dev[d], p); break; + case 0x30: audio_deo(0, &u->dev[d], p, u); break; + case 0x40: audio_deo(1, &u->dev[d], p, u); break; + case 0x50: audio_deo(2, &u->dev[d], p, u); break; + case 0x60: audio_deo(3, &u->dev[d], p, u); break; case 0xa0: file_deo(0, u->ram, &u->dev[d], p); break; case 0xb0: file_deo(1, u->ram, &u->dev[d], p); break; } @@ -227,31 +257,6 @@ init(void) #pragma mark - Devices -static Uint8 -audio_dei(Device *d, Uint8 port) -{ - int instance = d - devaudio0; - if(!audio_id) return d->dat[port]; - switch(port) { - case 0x4: return audio_get_vu(instance); - case 0x2: DEVPOKE16(0x2, audio_get_position(instance)); /* fall through */ - default: return d->dat[port]; - } -} - -static void -audio_deo(Device *d, Uint8 port) -{ - int instance = d - devaudio0; - if(!audio_id) return; - if(port == 0xf) { - SDL_LockAudioDevice(audio_id); - audio_start(instance, d); - SDL_UnlockAudioDevice(audio_id); - SDL_PauseAudioDevice(audio_id, 0); - } -} - /* Boot */ static int @@ -379,8 +384,7 @@ handle_events(Uxn *u) } /* Audio */ else if(event.type >= audio0_event && event.type < audio0_event + POLYPHONY) { - /* Device *d = devaudio0 + (event.type - audio0_event); - uxn_eval(u, GETVECTOR(d)); */ + uxn_eval(u, GETVEC(&u->dev[0x30 + 0x10 * (event.type - audio0_event)])); } /* Mouse */ else if(event.type == SDL_MOUSEMOTION)