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:
parent
968d1624b0
commit
b1d938ce60
7
keymap
7
keymap
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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*);
|
||||
|
@ -1 +1 @@
|
||||
#define VERSION 0.6.20210628
|
||||
#define VERSION 0.6.20210630
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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:
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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");
|
||||
|
Loading…
x
Reference in New Issue
Block a user