Skip to content

Commit

Permalink
AY-3-8910
Browse files Browse the repository at this point in the history
  • Loading branch information
andrzejlisek committed Jan 13, 2023
1 parent 717c6c3 commit fa0aae5
Show file tree
Hide file tree
Showing 11 changed files with 610 additions and 86 deletions.
2 changes: 2 additions & 0 deletions Cobra1.pro
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ TEMPLATE = app


SOURCES += main.cpp\
audioay.cpp \
configfile.cpp \
mainwindow.cpp \
eden.cpp \
Expand All @@ -28,6 +29,7 @@ SOURCES += main.cpp\
helpsettings.cpp

HEADERS += mainwindow.h \
audioay.h \
binary.h \
configfile.h \
eden.h \
Expand Down
13 changes: 11 additions & 2 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,14 @@ W przypadku trybu **PC**, tempo wykonywania poszczególnych czynności na emulow

## Dźwięk

Wygenerowanie dźwięku polega na wysłaniu dowolnej wartości na adres XX18\. Istotna jest czynność wysyłania, wysyłany znak nie jest istotny\. Dźwięk ma charakter impulsowy, jest odtwarzany z pliku **sound\.wav**\.
Emulator posiada cztery moduły generujące dźwięk:

Dodatkowo, możliwe jest generowanie dźwięku o kształcie prostokątnym poprzez wysyłanie dowolnej wartości na adres XXFE\. Wysyłana wartość nie jest istotna, każda czynność wysłania zmienia stan przebiegu na przeciwny\. Wysyłanie wykonywane ze stałą częstotliwością powoduje wygenerowanie dźwięku o częstotliwości podstawowej równej połowie częstotliwości wysyłania\.

* **Sygnalizator** \- wyzwolenie dźwięku polega na wysłaniu dowolnej wartości na adres XX18\. Istotna jest czynność wysyłania, wysyłana wartość nie ma znaczenia\. Dźwięk ma charakter impulsowy, jest odtwarzany z pliku **sound\.wav**\.
* **Generator** \- zawiera dwa kanały generujące dźwięk o kształcie prostokątnym poprzez wysyłanie ze stałą częstotliwością odpowiednich wartości, co powoduje wygenerowanie dźwięku o częstotliwości podstawowej równej połowie częstotliwości wysyłania\. Różny jest sposób wysterowania każdego konałau:
* **Kanał 1** \- wysyłanie dowolnej wartości na adres XXFE\. Wysyłana wartość nie jest istotna, każda czynność wysłania zmienia stan przebiegu na przeciwny\.
* **Kanał 2** \- wysyłanie wartości na adres XX00 lub XX08 pozwala zmieniać stan generatora\. Wysłanie wartości zerowej zmienia stan na niski, a wysłanie wartości niezerowej zmienia stan na wysoki\. W przypadku wartości niezerowej, konkretna wartość nie ma znaczenia\. Wielokrotne wysyłanie wartości zerowej z rzędu lub wielokrotne wysyłanie wartości niezerowej z rzędu nie zmienia stanu generoatora\.
* **AY\-3\-8910** \- trzykanałowy generator dźwieku i szumu, zawiera 15 rejestrów, w tym 13 rejestrów związanych z generowaniem dźwięku\. Sterowanie odbywa się poprzez wysłanie numeru rejestru na adres FFFD, a następnie wysłanie wartości na adres BFFD\.

## Ustawienia

Expand All @@ -47,8 +52,12 @@ Dostępne są następujące opcje:
* **Negatyw** \- Wyświetlanie czarnych znaków na białym tle zamiast białych znaków na czarnym tle \(odwrócone kolory\)\.
* **Kolory** \- Używanie kolorów według danych zapisanych w obszarze od FC00 do FEFF\. Ta funkcjonalność nie jest dostepna w oryginalnym komputerze\.
* **Zamiana kolorów** \- Zamiana koloru tła z kolorem znaku\.
* **Wspólna pamięć F800\-FBFF i FC00\-FFFF** \- Wskazanie, że pamięć z tych dwóch zakresów ma być wspólna, co miało miejsce w pierwotnej konstrukcji Cobra1, ale uniemożliwia zastosowanie kolorowego obrazu\.
* **Częstotliwość AY\-3\-8910 \(Hz\)** \- częstotliwość zegara taktującego generator AY\-3\-8910\.
* **Okres przerwania INT \(ms\)** \- okres między dwoma wyzwoleniami przerwania maskowalnego\. Wpisanie wartości **0** spowoduje wyłączenie generowania przerwania\.
* **Głośność sygnalizatora** \- Głośność dźwięku sygnalizatora \(dźwięk odtwarzany z pliku **sound\.wav**\), zbyt duża wartość głośności może spowodować przesterowanie\.
* **Głośność generatora** \- Głośność dźwięku generatora przebiegu prostokątnego, zbyt duża wartość głośności może spowodować przesterowanie\.
* **Głośnosć AY\-3\-8910** \- Głośnośćdźwięku generatora AY\-3\-8910, zbyt duża wartość głośności może spowodować przesterowanie\.
* **Okres timera \(ms\)** \- Okres wewnętrznego timera sterującego odświeżaniem obrazu i buforowaniem dźwięku, wartość należy ustawić doświadczalnie\.
* **Długość bufora \(smp\)** \- Bufor karty dźwiękowych wyrażona w próbkach dźwięku, wartość należy ustawić doświadczalnie\.
* **Długość elementu \(smp\)** \- Długość jednego elementu buforowanego dźwięku wyrażona w próbkach, wartość należy ustawić doświadczalnie\.
Expand Down
21 changes: 18 additions & 3 deletions appcore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,12 @@ AppCore::AppCore()

Screen_ = new Screen();
Keyboard_ = new Keyboard();
AudioAY_ = new AudioAY();
CpuMem_ = new CpuMem();
Screen_->CpuMem_ = CpuMem_;
CpuMem_->Keyboard_ = Keyboard_;
CpuMem_->Tape_ = Tape_;
CpuMem_->AudioAY_ = AudioAY_;

EdenClass::ConfigFile CF;
CF.FileLoad(Eden::ApplicationDirectory() + "cobra1.cfg");
Expand All @@ -56,8 +58,10 @@ AppCore::AppCore()
CF.ParamGet("CpuMem_Printer", CpuMem_->Printer);
CF.ParamGet("Screen_ScreenNegative", Screen_->ScreenNegative);
CF.ParamGet("Screen_ScreenColor", Screen_->ScreenColor);
CF.ParamGet("CpuMem_ScreenMemCommon", CpuMem_->ScreenMemCommon);
CF.ParamGet("SoundVolumeBeep", SoundVolumeBeep);
CF.ParamGet("SoundVolumeGen", SoundVolumeGen);
CF.ParamGet("SoundVolumeAY", SoundVolumeAY);
CF.ParamGet("SoundTimerPeriod", SoundTimerPeriod);
CF.ParamGet("SoundBufSize", SoundBufSize);
CF.ParamGet("SoundChunkSize", SoundChunkSize);
Expand All @@ -77,6 +81,8 @@ AppCore::AppCore()
CF.ParamGet("FileLst", FileLst);
CF.ParamGet("FileChr", FileChr);
CF.ParamGet("FileRam", FileRam);
CF.ParamGet("AudioAY_ChipClock", AudioAY_->ChipClock);
CF.ParamGet("CpuMem_InterruptPeriod", CpuMem_->InterruptPeriod);

CpuMem_->LoadRom(AppDir, FileRom, FileLst, FileRam);
Screen_->LoadRom(AppDir, FileChr);
Expand Down Expand Up @@ -104,8 +110,10 @@ void AppCore::SettingsSave()
CF.ParamSet("CpuMem_Printer", CpuMem_->Printer);
CF.ParamSet("Screen_ScreenNegative", Screen_->ScreenNegative);
CF.ParamSet("Screen_ScreenColor", Screen_->ScreenColor);
CF.ParamSet("CpuMem_ScreenMemCommon", CpuMem_->ScreenMemCommon);
CF.ParamSet("SoundVolumeBeep", SoundVolumeBeep);
CF.ParamSet("SoundVolumeGen", SoundVolumeGen);
CF.ParamSet("SoundVolumeAY", SoundVolumeAY);
CF.ParamSet("SoundTimerPeriod", SoundTimerPeriod);
CF.ParamSet("SoundBufSize", SoundBufSize);
CF.ParamSet("SoundChunkSize", SoundChunkSize);
Expand All @@ -125,6 +133,8 @@ void AppCore::SettingsSave()
CF.ParamSet("FileLst", FileLst);
CF.ParamSet("FileChr", FileChr);
CF.ParamSet("FileRam", FileRam);
CF.ParamSet("AudioAY_ChipClock", AudioAY_->ChipClock);
CF.ParamSet("CpuMem_InterruptPeriod", CpuMem_->InterruptPeriod);
CF.FileSave(Eden::ApplicationDirectory() + "cobra1.cfg");
}

Expand All @@ -149,14 +159,16 @@ short AppCore::GetSample()
switch (XX)
{
case 0:
SoundSample = 16000 * SoundVolumeGen;
SoundSample = 0;
break;
case 1:
SoundSample = 0;
SoundSample = 16000 * SoundVolumeGen;
break;
case 2:
SoundSample = -16000 * SoundVolumeGen;
break;
case 3:
SoundSample = -16000 * SoundVolumeGen;
SoundSample = 0;
break;
}

Expand All @@ -166,6 +178,9 @@ short AppCore::GetSample()
SoundSample += (X * SoundVolumeBeep);
BeepSoundI++;
}

SoundSample += AudioAY_->Sample() * SoundVolumeAY;

return SoundSample >> 8;
}

Expand Down
3 changes: 3 additions & 0 deletions appcore.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <QSound>
#include "audioplayer.h"
#include "configfile.h"
#include "audioay.h"


using namespace std;
Expand All @@ -31,13 +32,15 @@ class AppCore
int SoundTimerPeriod = 20;
int SoundVolumeBeep = 100;
int SoundVolumeGen = 100;
int SoundVolumeAY = 100;

int KeybMode = 0;

Screen * Screen_;
Keyboard * Keyboard_;
CpuMem * CpuMem_;
Tape * Tape_;
AudioAY * AudioAY_;
AppCore();
~AppCore();
void SettingsSave();
Expand Down
Loading

0 comments on commit fa0aae5

Please sign in to comment.