/*
ADBSHARE.h
Copyright (C) 2008 Paul C. Pratt
You can redistribute this file and/or modify it under the terms
of version 2 of the GNU General Public License as published by
the Free Software Foundation. You should have received a copy
of the license along with this file; see the file COPYING.
This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
license for more details.
*//*
Apple Desktop Bus SHAREd code
shared by emulation of different implementations of ADB
*/#ifdef ADBSHARE_H#error "header already included"#else#define ADBSHARE_H#endif/*
ReportAbnormalID unused 0x0D08 - 0x0DFF
*/#define ADB_MaxSzDatBuf 8LOCALVARui3bADB_SzDatBuf;LOCALVARblnrADB_TalkDatBuf=falseblnr;LOCALVARui3bADB_DatBuf[ADB_MaxSzDatBuf];LOCALVARui3bADB_CurCmd=0;LOCALVARui3bNotSoRandAddr=1;LOCALVARui3bMouseADBAddress;LOCALVARblnrSavedCurMouseButton=falseblnr;LOCALVARui4rMouseADBDeltaH=0;LOCALVARui4rMouseADBDeltaV=0;LOCALPROCADB_DoMouseTalk(void){switch(ADB_CurCmd&3){case0:{blnroverflow=falseblnr;ui4bpartH;ui4bpartV;blnrMouseButtonChange=falseblnr;MyEvtQEl*p=MyEvtQOutP();if(nullpr!=p){if(MyEvtQElKindMouseDelta==p->kind){MouseADBDeltaH+=p->u.pos.h;MouseADBDeltaV+=p->u.pos.v;MyEvtQOutDone();}}partH=MouseADBDeltaH;partV=MouseADBDeltaV;if((si4b)MouseADBDeltaH<0){partH=-partH;}if((si4b)MouseADBDeltaV<0){partV=-partV;}if((partH>>6)>0){overflow=trueblnr;partH=(1<<6)-1;}if((partV>>6)>0){overflow=trueblnr;partV=(1<<6)-1;}if((si4b)MouseADBDeltaH<0){partH=-partH;}if((si4b)MouseADBDeltaV<0){partV=-partV;}MouseADBDeltaH-=partH;MouseADBDeltaV-=partV;if(!overflow){MyEvtQEl*p=MyEvtQOutP();if(nullpr!=p){if(MyEvtQElKindMouseButton==p->kind){SavedCurMouseButton=p->u.press.down;MouseButtonChange=trueblnr;MyEvtQOutDone();}}}if((0!=partH)||(0!=partV)||MouseButtonChange){ADB_SzDatBuf=2;ADB_TalkDatBuf=trueblnr;ADB_DatBuf[0]=(SavedCurMouseButton?0x00:0x80)|(partV&127);ADB_DatBuf[1]=/* 0x00 */0x80|(partH&127);}}ADBMouseDisabled=0;break;case3:ADB_SzDatBuf=2;ADB_TalkDatBuf=trueblnr;ADB_DatBuf[0]=0x60|(NotSoRandAddr&0x0f);ADB_DatBuf[1]=0x01;NotSoRandAddr+=1;break;default:ReportAbnormalID(0x0D01,"Talk to unknown mouse register");break;}}LOCALPROCADB_DoMouseListen(void){switch(ADB_CurCmd&3){case3:if(ADB_DatBuf[1]==0xFE){/* change address */MouseADBAddress=(ADB_DatBuf[0]&0x0F);}else{ReportAbnormalID(0x0D02,"unknown listen op to mouse register 3");}break;default:ReportAbnormalID(0x0D03,"listen to unknown mouse register");break;}}LOCALVARui3bKeyboardADBAddress;LOCALFUNCblnrCheckForADBkeyEvt(ui3b*NextADBkeyevt){inti;blnrKeyDown;if(!FindKeyEvent(&i,&KeyDown)){returnfalseblnr;}else{#if dbglog_HAVE && 0if(KeyDown){dbglog_WriteNote("Got a KeyDown");}#endifswitch(i){caseMKC_Control:i=0x36;break;caseMKC_Left:i=0x3B;break;caseMKC_Right:i=0x3C;break;caseMKC_Down:i=0x3D;break;caseMKC_Up:i=0x3E;break;default:/* unchanged */break;}*NextADBkeyevt=(KeyDown?0x00:0x80)|i;returntrueblnr;}}LOCALPROCADB_DoKeyboardTalk(void){switch(ADB_CurCmd&3){case0:{ui3bNextADBkeyevt;if(CheckForADBkeyEvt(&NextADBkeyevt)){ADB_SzDatBuf=2;ADB_TalkDatBuf=trueblnr;ADB_DatBuf[0]=NextADBkeyevt;if(!C