До "УРА" ЕЩЁ КАК ДО ПЕКИНА.
глючит все просто пиндрец.
SfS wrote:Просто у меня есть полный драйвер PS2 клавы. С поддержкой режимов и раскладок. но там таблиц много. Только отдельная страница спасёт
// Standard Input/Output functions
#include <stdio.h>
#include <intrz80.h>
#include <string.h>
#include "conio.h"
const unsigned char scodes[] = {
// 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf
// 0, F9, 0, F5, F3, F1, F2,F12, 0,F10, F8, F6, F4,TAB,'`', 0,
0, 76, 0, 72, 70, 68, 69, 79, 0, 77, 75, 73, 71, 67, 33, 0, //0x00
// 0, 0, 0, 0, 0,'q','1', 0, 0, 0,'z','s','a','w','2', 0,
0, 0, 0, 0, 0, 17, 39, 0, 0, 0, 26, 19, 1, 23, 40, 0, //0x10
// 0,'c','x','d','e','4','3', 0, 0,' ','v','f','t','r','5', 0,
0, 3, 24, 4, 5, 42, 41, 0, 0, 48, 22, 6, 20, 18, 43, 0, //0x20
// 0,'n','b','h','g','y','6', 0, 0, 0,'m','j','u','7','8', 0,
0, 14, 2, 8, 7, 25, 44, 0, 0, 0, 13, 10, 21, 45, 46, 0, //0x30
// 0,',','k','i','o','0','9', 0, 0,'.','/','l',';','p','-', 0,
0, 31, 11, 9, 15, 38, 47, 0, 0, 32, 35, 12, 29, 16, 36, 0, //0x40
// 0, 0, ', 0,'[','=', 0, 0, 0, 0,ENT,']', 0, \, 0, 0,
0, 0, 30, 0, 27, 37, 0, 0, 0, 0, 49, 28, 0, 34, 0, 0, //0x50
// 0, 0, 0, 0, 0, 0, BS, 0, 0,'1', 0,'4','7', 0, 0, 0,
0, 0, 0, 0, 0, 0,127, 0, 0, 51, 0, 54, 57, 0, 0, 0, //0x60
// '0','.','2','5','6','8',ESC, 0,F11,'+','3','-','*','9', 0, 0,
50, 65, 52, 55, 56, 58, 66, 0, 78, 64, 53, 63, 62, 59, 0, 0, //0x70
// 0, 0, 0, F7
0, 0, 0, 74};
const unsigned char unmod[] = " \n0123456789 /*-+.";
const unsigned char stand[] = "[];\',.`\\/-=";
const unsigned char stand_sh[] = "{}:\"<>~|?_+)!@#$%^&*(";
const unsigned char rust[] = {
'ф','и','с','в','у','а','п','р',
'ш','о','л','д','ь','т','щ','з',
'й','к','ы','е','г','м','ц','ч',
'н','ю'+1,'х','ъ','ж','э','б','ю',
'ё','\\','.','-','='};
const unsigned char rust_sh[] = "ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯХЪЖЭБЮЁ/,_+)!\"№;%:?*(";
static unsigned char is_up=0, shift = 0, mode = 0, rus=0, alt=0;
#define KEY_MODE_NONE 0x00
#define KEY_MODE_RUS 0x01
#define KEY_MODE_SHIFT 0x02
#define KEY_MODE_ALT 0x04
#define KEY_MODE_CTRL 0x08
#define KEY_MODE_UP 0x10
#define KEY_MODE_E0 0x20
static unsigned int cur_key=0;
static unsigned char inv=0;
unsigned char get_evo_rtc(unsigned char addr)
{
output(0xdef7,addr);
return input(0xbef7);
}
//***********************************************
// decode scan code
unsigned char get_scan(void)
{
unsigned char sc;
output(0xdef7,0xf0);
sc=input(0xbef7);
if(sc==0xff){
set_evo_rtc(0x0c,1);
sc = 0;
}
return sc;
}
int decode(unsigned char sc) {
if (!(mode&KEY_MODE_UP)){
switch (sc) {
case 0xF0 :// The up-key identifier
mode|=KEY_MODE_UP;
break;
case 0x12 :// Left SHIFT
case 0x59 :// Right SHIFT
mode|=KEY_MODE_SHIFT;
if(mode&KEY_MODE_ALT)
mode^=KEY_MODE_RUS;
mode&=~KEY_MODE_E0;
break;
case 0x11 :// Alt
mode=(mode|KEY_MODE_ALT)&(~KEY_MODE_E0);
if(mode&KEY_MODE_SHIFT)
mode^=KEY_MODE_RUS;
break;
case 0xe0 :
mode|=KEY_MODE_E0;
break;
default:
if(mode&KEY_MODE_E0){
mode&=~KEY_MODE_E0;
return 0x0100|sc;
}
sc=scodes[sc];
if(!sc) return 0;
else if (sc>65) return sc;
else if (sc>47) return unmod[sc-48];
//sc--;
switch(mode&(KEY_MODE_RUS|KEY_MODE_SHIFT)){
case KEY_MODE_NONE :
if(sc<27)return (sc+'a'-1);
else if (sc>37) return (sc+'0'-38);
return stand[sc-27];
case KEY_MODE_SHIFT :
if(sc<27)return (sc+'A'-1);
return stand_sh[sc-27];
case KEY_MODE_RUS :
if(sc<38)return rust[sc-1];
return (sc+'0'-38);
case (KEY_MODE_SHIFT|KEY_MODE_RUS) :
return rust_sh[sc-1];
}
}
}
else {
switch (sc) {
case 0x12 :// Left SHIFT
mode&=~KEY_MODE_SHIFT;
break;
case 0xe0 :
return 0;
case 0x59 :// Right SHIFT
mode&=~KEY_MODE_SHIFT;
break;
case 0x11 :// Alt
mode&=~KEY_MODE_ALT;
break;
}
mode&=~(KEY_MODE_UP|KEY_MODE_E0);// Two 0xF0 in a row not allowed
}
return 0;
}
int _kbhit(void)
{
if (cur_key) return cur_key;
if(!(cur_key=get_scan())) return 0;
cur_key=decode(cur_key);
return cur_key;
}
int getchar(void)
{
int data;
while (!cur_key)_kbhit();
data=cur_key;
cur_key=0;
return data;
}
PUBLIC curs_x
PUBLIC curs_y
PUBLIC curs_c
PUBLIC _low_put_scr
EXTERN ?BANK_WIND_NUM_L08 ;номер очка 0-3 под банкинг.
RSEG RCODE
set_text_page:
pop hl
push bc
ld a,?BANK_WIND_NUM_L08+0x04
in a,(0xbe)
push af
ld bc,LWRD((?BANK_WIND_NUM_L08 << 14)|0x37f7)
ld a,0xf7
out (c),a
jp (hl)
res_text_page:
ld bc,LWRD((?BANK_WIND_NUM_L08 << 14)|0x37f7)
pop hl
pop af
out (c),a
pop bc
jp (hl)
_low_put_scr: BC=символ
call set_text_page
push bc
ld a,?BANK_WIND_NUM_L08+0x04
in a,(0xbe)
push af
ld bc,LWRD((?BANK_WIND_NUM_L08 << 14)|0x37f7)
ld a,0xf7
out (c),a
LD hl,(curs_y)
ld a,h
inc a
ld (curs_x),a
LD A,0x1C
SRL H
RRA
RRA
ADD A,L
LD L,H
LD H,A
XOR A
SRL H
RRA
SRL H
RRA
ADD A,L
LD L,A
ld a,h
or ?BANK_WIND_NUM_L08<<6
ld h,a
ld (hl),e
ld a,0x30
xor h
ld h,a
bit 4,h
jr nz,lps_nodd
inc l
lps_nodd:
ld a,(curs_c)
ld (hl),a
call res_text_page
RET
RSEG UDATA0
curs_y:
DEFS 1
curs_x:
DEFS 1
curs_c: ;color
DEFS 1
END
SfS wrote:Просто в dofork() я портил регистр а инверсией. Номер страницы инвертировался для вывода в пентевный регистр.
Ещё одна команда cpl спасла меня.
Return to Пентева - софт и железо
Users browsing this forum: No registered users and 1 guest