diff --git a/hardware.h b/hardware.h index 3549505..b9c9340 100644 --- a/hardware.h +++ b/hardware.h @@ -6,35 +6,23 @@ #define __HARDWARE_H__ // TFT display... -// NOTE: edit memorysaver.h to select the correct chip for your display! -// Daniel Rebollo's boosterpack -#define TFT_BACKLIGHT PD_6 -#define TFT_MODEL SSD1289 -// TFT01_2.4: http://www.elecfreaks.com/store/24-tft-lcd-tft0124-p-110.html -// #undef TFT_BACKLIGHT -// #define TFT_MODEL S6D1121_8 -#define TFT_RS PC_6 -#define TFT_WR PC_5 -#define TFT_CS PC_7 -#define TFT_RST PC_4 +#undef TFT_BACKLIGHT +#define TFT_MODEL ILI9325C +#define TFT_RS 32 +#define TFT_WR 33 +#define TFT_CS 27 +#define TFT_RST 26 // PS/2 keyboard -#define KBD_DATA PE_4 -#define KBD_IRQ PE_5 +#define KBD_DATA 14 +#define KBD_IRQ 12 // SPI-RAM -#define SPIRAM_CS PE_0 -//#define SPIRAM_CS PF_3 -#define SPIRAM_SPI 1 -#define SPIRAM_DEV SPI_for_SD -#define SPIRAM_SIZE 65536 +#undef SPIRAM_CS // "tape" storage... -#define SD_CS PF_3 -//#define SD_CS PE_0 -#define SD_SPI 1 - -#define SPI_CS PF_3 +#undef SD_CS +#define USE_SPIFFS 1 bool hardware_reset(); void hardware_init(class CPU &); diff --git a/r6502.h b/r6502.h index cd25b02..624fc27 100644 --- a/r6502.h +++ b/r6502.h @@ -2,6 +2,8 @@ #define __R6502_H__ #undef PC +#undef cli +#undef sei class Stream; class r6502: public CPU { diff --git a/r65emu.h b/r65emu.h index 7f53c3c..83c98a7 100644 --- a/r65emu.h +++ b/r65emu.h @@ -13,5 +13,6 @@ #include "timed.h" #include "hardware.h" #include "checkpoint.h" +#include "sound.h" #endif diff --git a/sound.cpp b/sound.cpp new file mode 100644 index 0000000..36c0a80 --- /dev/null +++ b/sound.cpp @@ -0,0 +1,67 @@ +#include +#include +#include "timed.h" +#include "sound.h" + +#if defined(DAC_SOUND) && defined(ESP_PLATFORM) +#include + +static portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED; + +static dac_channel_t channel; + +static volatile const uint8_t *_bytes; +static volatile unsigned _size, _off; +static hw_timer_t *timer; + +void IRAM_ATTR timer_callback() { + portENTER_CRITICAL_ISR(&mux); + + if (_off < _size) + dac_output_voltage(channel, _bytes[_off++]); + else { + _bytes = 0; + dac_output_disable(channel); + timerAlarmDisable(timer); + } + + portEXIT_CRITICAL_ISR(&mux); +} + +void Sound::begin(unsigned pin, unsigned freq) { + if (pin == 25) + channel = DAC_CHANNEL_1; + else if (pin == 26) + channel = DAC_CHANNEL_2; + + timer = timerBegin(1, 80, true); + timerAttachInterrupt(timer, &timer_callback, true); + timerAlarmWrite(timer, 1000000 / freq, true); +} + +const uint8_t *Sound::play(const uint8_t *bytes, unsigned size) { + portENTER_CRITICAL_ISR(&mux); + + const uint8_t *play = (const uint8_t *)_bytes; + if (_off == _size) { + _bytes = bytes; + _size = size; + _off = 0; + dac_output_enable(channel); + timerAlarmEnable(timer); + play = bytes; + } + + portEXIT_CRITICAL_ISR(&mux); + return play; +} + +#else +// does nothing by default +void Sound::begin(unsigned channel, unsigned freq) { +} + +const uint8_t *Sound::play(const uint8_t *bytes, unsigned size) { + return 0; +} +#endif diff --git a/sound.h b/sound.h new file mode 100644 index 0000000..a3a6ed5 --- /dev/null +++ b/sound.h @@ -0,0 +1,10 @@ +#ifndef __SOUND_H__ +#define __SOUND_H__ + +class Sound { +public: + void begin(unsigned pin, unsigned freq); + const uint8_t *play(const uint8_t *bytes, unsigned size); +}; + +#endif diff --git a/timed.cpp b/timed.cpp index c7ed696..9bdd7ba 100644 --- a/timed.cpp +++ b/timed.cpp @@ -1,5 +1,4 @@ #include -#include #if defined(__LM4F120H5QR__) #include @@ -29,4 +28,16 @@ void timer_create(unsigned freq, Timed *client) { ROM_TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, ROM_SysCtlClockGet() / freq); } +#elif defined(ESP_PLATFORM) + +void IRAM_ATTR onTimer() { + t->tick(); +} + +void timer_create(unsigned freq, Timed *client) { + hw_timer_t *timer = timerBegin(3, 80, true); // prescaler of 80 + timerAttachInterrupt(timer, &onTimer, true); + timerAlarmWrite(timer, 1000000 / freq, true); + timerAlarmEnable(timer); +} #endif