1
0
mirror of https://github.com/samstyle/Xpeccy.git synced 2025-04-19 00:04:05 +03:00

build 20210630

+ Improve keymap file, keys count is up to 7, keys might be written in
single string like this - 'CS' or 'C2' or 'CSj'
+ Fix applying palette on deBUGa window
This commit is contained in:
samstyle 2021-06-30 17:26:11 +03:00
parent 968d1624b0
commit b1d938ce60
16 changed files with 110 additions and 109 deletions

View File

@ -1 +1 @@
0.6.20210628
0.6.20210630

7
keymap
View File

@ -15,8 +15,9 @@ C z x c v b n m S #20 = ' '
[Keymap file]
PCkey ZXkey1 ZXKey2
PCkey Up-to-7-zx-keys (in one string or tab-separated)
example:
example (only such type of lines must be in *.map file):
CAPS C 2
CAPS C2
HOME CSj

View File

@ -342,6 +342,19 @@ xRegBunch cpuGetRegs(CPU* cpu) {
return bunch;
}
int cpuGetReg(CPU* cpu, const char* name) {
xRegBunch bunch = cpuGetRegs(cpu);
int res = -1;
for (int i = 0; (i < 32) && (res == -1); i++) {
if (bunch.regs[i].id != REG_NONE) {
if (!strcmp(name, bunch.regs[i].name)) {
res = bunch.regs[i].value;
}
}
}
return -1;
}
void cpuSetRegs(CPU* cpu, xRegBunch bunch) {
cpu->setregs(cpu, bunch);
// cpu->r7 = cpu->r & 0x80;

View File

@ -26,7 +26,7 @@ typedef struct {
int id;
int byte;
const char* name;
unsigned short value;
int value;
} xRegister;
typedef struct {
@ -198,8 +198,8 @@ typedef struct {
int (*exec)(CPU*); // exec opcode, return T
xAsmScan (*asmbl)(const char*, char*); // compile mnemonic
xMnem (*mnem)(CPU*, unsigned short, cbdmr, void*);
void(*getregs)(CPU*,xRegBunch*); // get cpu registers: name,id,value
void(*setregs)(CPU*,xRegBunch); // set cpu registers
void (*getregs)(CPU*,xRegBunch*); // get cpu registers: name,id,value
void (*setregs)(CPU*,xRegBunch); // set cpu registers
} cpuCore;
CPU* cpuCreate(int,cbmr,cbmw,cbir,cbiw,cbirq,void*);
@ -217,6 +217,7 @@ xAsmScan scanAsmTab(const char*, opCode*);
xRegBunch cpuGetRegs(CPU*);
void cpuSetRegs(CPU*, xRegBunch);
int cpuGetReg(CPU*, const char*);
#ifdef __cplusplus
}

View File

@ -85,7 +85,7 @@ void kbdSetMode(Keyboard* kbd, int mode) {
// key press/release/trigger
void kbd_press_key(Keyboard* kbd, keyScan* tab, int* mtrx, char ch) {
void kbd_press_key(Keyboard* kbd, keyScan* tab, int* mtrx, unsigned char ch) {
if (!ch) return;
// printf("kbd_press_key %c\n", ch);
keyScan key = findKey(tab, ch & 0x7f);
@ -103,9 +103,12 @@ void kbd_press_key(Keyboard* kbd, keyScan* tab, int* mtrx, char ch) {
}
}
void kbd_press(Keyboard* kbd, keyScan* tab, int* mtrx, xKey xk) {
kbd_press_key(kbd, tab, mtrx, xk.key1);
kbd_press_key(kbd, tab, mtrx, xk.key2);
void kbd_press(Keyboard* kbd, keyScan* tab, int* mtrx, unsigned char* xk) {
int pos = 0;
while (xk[pos] != 0x00) {
kbd_press_key(kbd, tab, mtrx, xk[pos]);
pos++;
}
}
void kbdPress(Keyboard* kbd, keyEntry ent) {
@ -120,40 +123,10 @@ void kbdPress(Keyboard* kbd, keyEntry ent) {
case KBD_MSX:
kbd_press(kbd, msxKeyTab, kbd->msxMap, ent.msxKey);
break;
/*
case KBD_ATM2:
switch(ent.key) {
case XKEY_LSHIFT: kbd->flag1 |= KFL_SHIFT; break;
case XKEY_RSHIFT: kbd->flag2 |= KFL_RSHIFT; break;
case XKEY_RCTRL:
case XKEY_LCTRL: kbd->flag1 |= KFL_CTRL; break;
case XKEY_RALT:
case XKEY_LALT: kbd->flag1 |= KFL_ALT; break;
case XKEY_CAPS: kbd->flag1 ^= KFL_CAPS; break;
}
switch (kbd->submode) {
case kbdZX:
kbd_press(kbd, keyTab, kbd->map, ent.zxKey);
//kbd->keycode = ent.atmCode.rowScan;
//kbd->lastkey = kbd->keycode;
//kbd->map[((ent.atmCode.rowScan >> 4) & 7) ^ 7] &= ~(1 << ((ent.atmCode.rowScan & 7) - 1));
//if (ent.atmCode.rowScan & 0x80) kbd->map[0] &= ~2; // sym.shift
//if (ent.atmCode.rowScan & 0x08) kbd->map[7] &= ~1; // cap.shift
break;
case kbdCODE:
case kbdCPM:
kbd->keycode = ent.atmCode.cpmCode;
kbd->lastkey = kbd->keycode;
break;
case kbdDIRECT:
break;
}
break;
*/
}
}
void kbd_release_key(Keyboard* kbd, keyScan* tab, int* mtrx, char ch) {
void kbd_release_key(Keyboard* kbd, keyScan* tab, int* mtrx, unsigned char ch) {
// if (ch) printf("kbd_release_key %c\n", ch);
keyScan key = findKey(tab, ch & 0x7f);
key.row &= 0x0f;
@ -168,9 +141,12 @@ void kbd_release_key(Keyboard* kbd, keyScan* tab, int* mtrx, char ch) {
}
}
void kbd_release(Keyboard* kbd, keyScan* tab, int* mtrx, xKey xk) {
kbd_release_key(kbd, tab, mtrx, xk.key1);
kbd_release_key(kbd, tab, mtrx, xk.key2);
void kbd_release(Keyboard* kbd, keyScan* tab, int* mtrx, unsigned char* xk) {
int pos = 0;
while (xk[pos] != 0x00) {
kbd_release_key(kbd, tab, mtrx, xk[pos]);
pos++;
}
}
void kbdRelease(Keyboard* kbd, keyEntry ent) {
@ -185,33 +161,6 @@ void kbdRelease(Keyboard* kbd, keyEntry ent) {
case KBD_MSX:
kbd_release(kbd, msxKeyTab, kbd->msxMap, ent.msxKey);
break;
/*
case KBD_ATM2:
switch(ent.key) {
case XKEY_LSHIFT: kbd->flag1 &= ~KFL_SHIFT; break;
case XKEY_RSHIFT: kbd->flag2 &= ~KFL_RSHIFT; break;
case XKEY_RCTRL:
case XKEY_LCTRL: kbd->flag1 &= ~KFL_CTRL; break;
case XKEY_RALT:
case XKEY_LALT: kbd->flag1 &= ~KFL_ALT; break;
}
switch (kbd->submode) {
case kbdZX:
kbd_release(kbd, keyTab, kbd->map, ent.zxKey);
//kbd->keycode = 0;
//kbd->map[((ent.atmCode.rowScan >> 4) & 7) ^ 7] |= (1 << ((ent.atmCode.rowScan & 7) - 1));
//if (ent.atmCode.rowScan & 0x80) kbd->map[0] |= 2; // sym.shift
//if (ent.atmCode.rowScan & 0x08) kbd->map[7] |= 1; // cap.shift
break;
case kbdCODE:
case kbdCPM:
kbd->keycode = 0;
break;
case kbdDIRECT:
break;
}
break;
*/
}
}
@ -232,13 +181,16 @@ void kbdReleaseAll(Keyboard* kbd) {
kbd->flag = 0;
}
void kbd_trigger(keyScan* tab, int* mtrx, xKey xk) {
keyScan key = findKey(tab, xk.key1 & 0x7f);
if (xk.key1 & 0x80) key.mask |= 0x20;
mtrx[key.row] ^= key.mask;
key = findKey(tab, xk.key2 & 0x7f);
if (xk.key2 & 0x80) key.mask |= 0x20;
mtrx[key.row] ^= key.mask;
void kbd_trigger(keyScan* tab, int* mtrx, char* xk) {
keyScan key;
int pos = 0;
while (xk[pos] != 0x00) {
key = findKey(tab, xk[pos] & 0x7f);
if (xk[pos] & 0x80)
key.mask |= 0x20;
mtrx[key.row] ^= key.mask;
pos++;
}
}
void kbdTrigger(Keyboard* kbd, keyEntry ent) {

View File

@ -158,22 +158,19 @@ typedef struct {
unsigned char state;
} Joystick;
typedef struct {
unsigned char key1;
unsigned char key2;
} xKey;
typedef struct {
unsigned char cpmCode;
unsigned char rowScan;
} atmKey;
#define KEYSEQ_MAXLEN 8
typedef struct {
const char* name;
signed int key; // XKEY_*
xKey zxKey;
xKey extKey;
xKey msxKey;
unsigned char zxKey[KEYSEQ_MAXLEN];
unsigned char extKey[KEYSEQ_MAXLEN];
unsigned char msxKey[KEYSEQ_MAXLEN];
atmKey atmCode;
int keyCode; // 0xXXYYZZ = ZZ,YY,XX in buffer ([ZZ],[YY],0xf0,XX if released)
} keyEntry;
@ -195,8 +192,8 @@ unsigned char kbdRead(Keyboard*, int);
unsigned char keyReadCode(Keyboard*);
void xt_press(Keyboard*, int);
void xt_release(Keyboard*, int);
void kbd_press(Keyboard* kbd, keyScan* tab, int* mtrx, xKey xk);
void kbd_release(Keyboard* kbd, keyScan* tab, int* mtrx, xKey xk);
void kbd_press(Keyboard* kbd, keyScan* tab, int* mtrx, unsigned char* xk);
void kbd_release(Keyboard* kbd, keyScan* tab, int* mtrx, unsigned char* xk);
Mouse* mouseCreate();
void mouseDestroy(Mouse*);

View File

@ -1 +1 @@
#define VERSION 0.6.20210628
#define VERSION 0.6.20210630

View File

@ -16,8 +16,7 @@ static unsigned char kwMap[4][10] = {
keyWindow::keyWindow(QWidget* p):QDialog(p) {
kb = NULL;
xent.key = ENDKEY;
xent.zxKey.key1 = 0;
xent.zxKey.key2 = 0;
memset(xent.zxKey, 0, 8);
QPixmap pxm(":/images/keymap.png");
setModal(false);
setWindowModality(Qt::NonModal);
@ -75,7 +74,8 @@ void keyWindow::mousePressEvent(QMouseEvent* ev) {
int col;
row = ev->y() * 4 / height();
col = ev->x() * 10 / width();
xent.zxKey.key1 = kwMap[row][col];
xent.zxKey[0] = kwMap[row][col];
xent.zxKey[1] = 0;
switch(ev->button()) {
case Qt::LeftButton:
kbdPress(kb, xent);
@ -87,7 +87,7 @@ void keyWindow::mousePressEvent(QMouseEvent* ev) {
break;
case Qt::MiddleButton:
kbdReleaseAll(kb);
xent.zxKey.key1 = 0;
xent.zxKey[0] = 0;
update();
break;
default:

View File

@ -144,12 +144,12 @@ const char* getKeyNameById(int id) {
return keyMap[idx].name;
}
void setKey(const char* key,const char key1, const char key2) {
void setKey(const char* kname, const char* kstr) {
int idx = 0;
while (keyMap[idx].key != ENDKEY) {
if (!strcmp(key, keyMap[idx].name)) {
keyMap[idx].zxKey.key1 = key1;
keyMap[idx].zxKey.key2 = key2;
if (!strcmp(kname, keyMap[idx].name)) {
memset(keyMap[idx].zxKey, 0, 8);
strncpy((char*)keyMap[idx].zxKey, kstr, 7);
// printf("%s -> %c %c\n", keyMap[idx].name, key1, key2);
}
idx++;
@ -184,19 +184,21 @@ void loadKeys() {
std::pair<std::string,std::string> spl;
std::string line;
std::vector<std::string> vec;
char key1;
char key2;
char keys[8];
int rlen;
while (!file.eof()) {
file.getline(buf,1023);
line = std::string(buf);
vec = splitstr(line,"\t");
memset(keys, 0, 8);
rlen = 0;
if (vec.size() > 0) {
while (vec.size() < 3)
vec.push_back("");
key1 = (vec[1].size() > 0) ? vec[1].at(0) : 0;
key2 = (vec[2].size() > 0) ? vec[2].at(0) : 0;
// printf("%s %c %c\n", vec[0].c_str(), key1, key2);
setKey(vec[0].c_str(),key1,key2);
for(unsigned int i = 1; (rlen < KEYSEQ_MAXLEN) && (i < vec.size()); i++) {
rlen += vec[i].size();
if (rlen < KEYSEQ_MAXLEN)
strcat(keys, vec[i].c_str());
}
setKey(vec[0].c_str(), keys);
}
}
}

View File

@ -5,13 +5,18 @@
#include <QApplication>
#include <QDesktopWidget>
#include <QScreen>
void vid_upd_scale() {
QSize scrsz;
int dwid;
int dhei;
if (conf.vid.fullScreen) {
#if QT_VERSION >= QT_VERSION_CHECK(5,14,0)
scrsz = QApplication::screens().first()->size();
#else
scrsz = QApplication::desktop()->screenGeometry().size();
#endif
dwid = scrsz.width(); // QApplication::desktop()->screenGeometry().width();
dhei = scrsz.height(); // QApplication::desktop()->screenGeometry().height();
xstep = dwid * 0x100 / conf.prof.cur->zx->vid->vsze.x;

View File

@ -239,7 +239,7 @@ enum {
};
void loadKeys();
void setKey(const char*,const char,const char);
void setKey(const char*, const char*);
keyEntry getKeyEntry(int);
int getKeyIdByName(const char*);
const char* getKeyNameById(int);

View File

@ -458,6 +458,10 @@ int xDisasmModel::fill() {
return res;
}
void xDisasmModel::update_data() {
emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
}
int xDisasmModel::update() {
if (cptr == NULL) return 0;
if (*cptr == NULL) return 0;
@ -471,7 +475,7 @@ int xDisasmModel::update() {
}
}
}
emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
update_data();
return res;
}
@ -780,6 +784,11 @@ int xDisasmTable::updContent() {
return res;
}
void xDisasmTable::update() {
model->update_data();
QTableView::update();
}
void xDisasmTable::t_update(int oadr, int nadr) {
if (oadr >= 0) {
history.append(oadr);

View File

@ -37,6 +37,7 @@ class xDisasmModel : public QAbstractTableModel {
Qt::ItemFlags flags(const QModelIndex&) const;
QVariant data(const QModelIndex&, int) const;
bool setData(const QModelIndex&, const QVariant&, int);
void update_data();
Computer** cptr;
QList<dasmData> dasm;
unsigned short disasmAdr;
@ -65,6 +66,7 @@ class xDisasmTable : public QTableView {
void rqRefillAll();
public slots:
int updContent();
void update();
void t_update(int, int);
void setAdr(int, int = 0);
private:

View File

@ -15,6 +15,11 @@ void xDiskDump::setTrack(int tr) {
mod->setTrack(tr);
}
void xDiskDump::update() {
mod->update();
QTableView::update();
}
// model
void xDiskDumpModel::setDrive(int dr) {
@ -35,6 +40,14 @@ int xDiskDumpModel::columnCount(const QModelIndex&) const {
return 9;
}
void xDiskDumpModel::update() {
emit dataChanged(index(0,0), index(rowCount() - 1, columnCount() - 1));
}
QModelIndex xDiskDumpModel::index(int row, int col, const QModelIndex& par) const {
return createIndex(row, col, nullptr);
}
QVariant xDiskDumpModel::data(const QModelIndex& idx, int role) const {
QVariant res;
int row = idx.row();

View File

@ -9,15 +9,18 @@ class xDiskDumpModel : public QAbstractTableModel {
QVariant data(const QModelIndex&, int) const;
void setDrive(int);
void setTrack(int);
void update();
private:
int drv;
int trk;
QModelIndex index(int row, int col, const QModelIndex& = QModelIndex()) const;
};
class xDiskDump : public QTableView {
Q_OBJECT
public:
xDiskDump(QWidget* = NULL);
void update();
public slots:
void setTrack(int);
void setDrive(int);

View File

@ -80,6 +80,9 @@ void DebugWin::chaPal() {
if (dbgRegEdit[i])
dbgRegEdit[i]->updatePal();
}
ui.dasmTable->update();
ui.dumpTable->update();
ui.tabDiskDump->update();
}
void DebugWin::save_mem_map() {
@ -1389,7 +1392,7 @@ void DebugWin::fillFDC() {
ui.flpCurL->setText(QString('A' + comp->dif->fdc->flp->id));
ui.flpRdyL->setText(comp->dif->fdc->flp->insert ? "1" : "0");
ui.flpTrkL->setText(gethexbyte(comp->dif->fdc->flp->trk));
ui.flpPosL->setText(QString::number(comp->dif->fdc->flp->pos));
ui.flpPosL->setText(gethexword(comp->dif->fdc->flp->pos));
ui.flpIdxL->setText(comp->dif->fdc->flp->index ? "1" : "0");
ui.flpDataL->setText(comp->dif->fdc->flp->insert ? gethexbyte(flpRd(comp->dif->fdc->flp, comp->dif->fdc->side)): "--"); comp->dif->fdc->flp->rd = 0;
ui.flpMotL->setText(comp->dif->fdc->flp->motor ? "1" : "0");