emu51.cpp 61 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528
  1. typedef unsigned char BYTE;
  2. typedef unsigned short int WORD;
  3. #include <stdio.h>
  4. #define USE_CONSOLE
  5. #include "allegro.h"
  6. #include <string.h>
  7. #include <stdlib.h>
  8. FONT *mainf;
  9. #include "gui.h"
  10. #define bit0 0x01
  11. #define bit1 0x02
  12. #define bit2 0x04
  13. #define bit3 0x08
  14. #define bit4 0x10
  15. #define bit5 0x20
  16. #define bit6 0x40
  17. #define bit7 0x80
  18. unsigned long c_time=0;
  19. BYTE SFR[0x100]; // internal memory and sfr area 256 bytes
  20. BYTE EXT_RAM[0x10000]; // external memory 64kB
  21. BYTE *Acc = &SFR[0xe0]; // 8-bit accumlator
  22. WORD *DPTR = (WORD*) &SFR[0x82]; // 16-bit register
  23. BYTE *DPH = &SFR[0x83]; // high byte of DPTR
  24. BYTE *DPL = &SFR[0x82]; // low byte of DPTR
  25. BYTE *B = &SFR[0xf0]; // B register
  26. BYTE *SP = &SFR[0x81]; // Stack Pointer
  27. BYTE *PSW = &SFR[0xd0]; // Program Status Word
  28. BYTE *P0 = &SFR[0x80]; // 1st Port
  29. BYTE *P1 = &SFR[0x90]; // 2nd Port
  30. BYTE *P2 = &SFR[0xa0]; // 3rd Port
  31. BYTE *P3 = &SFR[0xb0]; // 4th port
  32. BYTE *SBUF = &SFR[0x99]; // Serial transmission Buffer
  33. BYTE *IE = &SFR[0xa8]; // Int Enable
  34. BYTE *SCON = &SFR[0x98]; // Serial Control
  35. BYTE *TH1 = &SFR[0x8d]; // Timer1 High
  36. BYTE *TH0 = &SFR[0x8c]; // Timer0 High
  37. BYTE *TL1 = &SFR[0x8b]; // Timer1 Low
  38. BYTE *TL0 = &SFR[0x8a]; // Timer0 Low
  39. BYTE *TMOD = &SFR[0x89]; // Timer Mode
  40. BYTE *TCON = &SFR[0x88]; // Timer Control
  41. BYTE *PCON = &SFR[0x87]; // Power Control
  42. BYTE *R = &SFR[0x00]; // Additional 8 Rx Registers
  43. WORD PC=0x0000; // Progam Counter
  44. void init_8051 (void) // initialize the emulator
  45. {
  46. int i;
  47. c_time=0; // cycles counter
  48. for (i=0;i<256;i++)
  49. {
  50. SFR[i]=0xA5; // all regs in internal RAM & SFR
  51. }
  52. *P0=0xff; //
  53. *P1=0xff; //
  54. *P2=0xff; // Some SFR registers
  55. *P3=0xff; // and Program Counter
  56. PC=0x0000; //
  57. *SP=0x07; //
  58. }
  59. BYTE check_C (void) // 1 or 0
  60. {
  61. if (*PSW & bit7) return 1;
  62. else return 0;
  63. }
  64. BYTE check_AC (void) // 1 or 0
  65. {
  66. if (*PSW & bit6) return 1;
  67. else return 0;
  68. }
  69. BYTE check_OV (void) // 1 or 0
  70. {
  71. if (*PSW & bit2) return 1;
  72. else return 0;
  73. }
  74. void set_C (void) // C <- 1
  75. {
  76. *PSW=*PSW | bit7;
  77. }
  78. void set_AC (void) // AC <- 1
  79. {
  80. *PSW=*PSW | bit6;
  81. }
  82. void set_OV (void) // OV <- 1
  83. {
  84. *PSW=*PSW | bit2;
  85. }
  86. void clr_C (void) // C <- 0
  87. {
  88. *PSW=*PSW & 0x7f;
  89. }
  90. void clr_AC (void) // AC <- 0
  91. {
  92. *PSW=*PSW & 0xbf;
  93. }
  94. void clr_OV (void) // OV <- 0
  95. {
  96. *PSW=*PSW & 0xfb;
  97. }
  98. BYTE check_P(void) // 1 or 0
  99. {
  100. if (*PSW & bit0) return 1;
  101. else return 0;
  102. }
  103. void set_P (void) // P <- 1
  104. {
  105. *PSW=*PSW | bit0;
  106. }
  107. void clr_P (void) // P <- 0
  108. {
  109. *PSW=*PSW & 0xfe;
  110. }
  111. void setB (BYTE bit) // (bit) <- 1
  112. {
  113. BYTE tmpB;
  114. BYTE tmpbit;
  115. tmpbit=bit & 0x07;
  116. tmpB=bit & 0xf8;
  117. if (bit>=128)
  118. { // bit set in SFR area
  119. SFR[tmpB]=SFR[tmpB] | (1<<tmpbit);
  120. } else { // bit set in int. RAM
  121. tmpB=(tmpB>>3)+32;
  122. SFR[tmpB]=SFR[tmpB] | (1<<tmpbit);
  123. }
  124. }
  125. void clrB (BYTE bit) // (bit) <- 0
  126. {
  127. BYTE tmpB;
  128. BYTE tmpbit;
  129. tmpbit=bit & 0x07;
  130. tmpB=bit & 0xf8;
  131. if (bit>=128)
  132. { // bit clear in SFR area
  133. SFR[tmpB]=SFR[tmpB] & ~(1<<tmpbit);
  134. } else { // bit clear in int. RAM
  135. tmpB=(tmpB>>3)+32;
  136. SFR[tmpB]=SFR[tmpB] & ~(1<<tmpbit);
  137. }
  138. }
  139. BYTE checkB (BYTE bit) // returns (bit) 1 or 0
  140. {
  141. BYTE tmpB;
  142. BYTE tmpbit;
  143. tmpbit=bit & 0x07;
  144. tmpB=bit & 0xf8;
  145. if (bit>=128)
  146. { // bit check in SFR area
  147. if ( SFR[tmpB] & 1<<tmpbit)
  148. {
  149. return 1;
  150. } else {
  151. return 0;
  152. }
  153. } else { // bit check in int. RAM
  154. tmpB=(tmpB>>3)+32;
  155. if (SFR[tmpB] & 1<<tmpbit)
  156. {
  157. return 1;
  158. } else {
  159. return 0;
  160. }
  161. }
  162. }
  163. BYTE check_RS0 (void)
  164. {
  165. if (*PSW & bit3) return 1;
  166. else return 0;
  167. }
  168. void set_RS0 (void)
  169. {
  170. *PSW=*PSW | bit3;
  171. }
  172. void clr_RS0 (void)
  173. {
  174. *PSW=*PSW & 0xf7;
  175. }
  176. BYTE check_RS1 (void)
  177. {
  178. if (*PSW & bit4) return 1;
  179. else return 0;
  180. }
  181. void set_RS1 (void)
  182. {
  183. *PSW=*PSW | bit4;
  184. }
  185. void clr_RS1 (void)
  186. {
  187. *PSW=*PSW & 0xef;
  188. }
  189. // 8051 assebmler macros
  190. inline void _add (BYTE &a, BYTE &b)
  191. {
  192. int tmp1,tmp2;
  193. ((0xf & a) + (0xf & b)) > 0xf ? set_AC() : clr_AC();
  194. tmp1 = ((0x7f & a) + (0x7f & b)) > 0x7f ? 1 : 0;
  195. (tmp2=a + b) > 0xff ? (set_C(), tmp1 ? clr_OV() : set_OV()) :
  196. (clr_C(), tmp1 ? set_OV() : clr_OV()) ;
  197. a=(BYTE)tmp2 & 0xff;
  198. }
  199. inline void _addc (BYTE &a, BYTE &b)
  200. {
  201. int tmp1,tmp2,c;
  202. c=check_C();
  203. ((0xf & a) + (0xf & b + c )) > 0xf ? set_AC() : clr_AC();
  204. tmp1 = ( (0x7f & a) + (0x7f & b) + c ) > 0x7f ? 1 : 0;
  205. (tmp2=a + b + c) > 0xff ? (set_C(), tmp1 ? clr_OV() : set_OV()) :
  206. (clr_C(), tmp1 ? set_OV() : clr_OV()) ;
  207. a=(BYTE)tmp2 & 0xff;
  208. }
  209. class code_51
  210. {
  211. public:
  212. char mnem[6]; // instruction mnemonic (2-4 characters)
  213. BYTE code; // instruction code
  214. BYTE lenght; // bytes which are needed to write this
  215. // instruction into memory
  216. BYTE cycles; // time unit
  217. char display_string[20]; // string which is ready for displaying,
  218. // it's made by make_ds(WORD) method
  219. char datas[12]; // string which contains datas which
  220. // will be displayed after mnemonic
  221. void make_ds (WORD); // make display string
  222. void process (); // process the instruction
  223. };
  224. void code_51::make_ds (WORD ram_pl)
  225. {
  226. int c,i;
  227. char tmp[3],tmpW[5];
  228. display_string[0]=mnem[0];
  229. display_string[1]=mnem[1];
  230. display_string[2]=(mnem[2]>=0x61 && mnem[2]<=0x7a) ? mnem[2] : (char)32;
  231. display_string[3]=(mnem[3]>=0x61 && mnem[3]<=0x7a) ? mnem[3] : (char)32;
  232. display_string[4]=(mnem[4]>=0x61 && mnem[4]<=0x7a) ? mnem[4] : (char)32;
  233. display_string[5]=(char)32;
  234. for (c=0;c<=10;c++)
  235. {
  236. if (datas[c]!='%')
  237. {
  238. if (datas[c]=='O' && datas[c+1]=='%')
  239. {
  240. if (datas[c+2]=='1')
  241. {
  242. sprintf(tmpW,"%4x",(signed char)EXT_RAM[ram_pl+1]+ram_pl+2);
  243. for (i=0;i<4;i++) display_string[c+6+i]=(tmpW[i]==' ') ? '0' : tmpW[i];
  244. }
  245. if (datas[c+2]=='2')
  246. {
  247. sprintf(tmpW,"%4x",(signed char)EXT_RAM[ram_pl+2]+ram_pl+3);
  248. for (i=0;i<4;i++) display_string[c+6+i]=(tmpW[i]==' ') ? '0' : tmpW[i];
  249. }
  250. c+=3;
  251. } else display_string[c+6]=datas[c];
  252. } else
  253. {
  254. if (datas[c+1]=='1')
  255. {
  256. sprintf(tmp,"%2x",EXT_RAM[ram_pl+1]);
  257. for (i=0;i<2;i++) display_string[c+6+i]= tmp[i]==' ' ? '0' : tmp[i];
  258. }
  259. if (datas[c+1]=='2')
  260. {
  261. sprintf(tmp,"%2x",EXT_RAM[ram_pl+2]);
  262. for (i=0;i<2;i++) display_string[c+6+i]= tmp[i]==' ' ? '0' : tmp[i];
  263. }
  264. c++;
  265. }
  266. }
  267. }
  268. void code_51::process (void)
  269. {
  270. BYTE tmpB;
  271. WORD tmpW;
  272. switch (code)
  273. {
  274. case 0x00: //nop 00
  275. PC++;
  276. break;
  277. case 0x74: // mov a,#(byte) 74 xx
  278. PC++;
  279. *Acc=EXT_RAM[PC];
  280. PC++;
  281. break;
  282. case 0x75: // mov (adress),#(byte) 75 xx yy
  283. PC++;
  284. SFR[EXT_RAM[PC]]=EXT_RAM[PC+1];
  285. PC+=2;
  286. break;
  287. case 0x02: // ljmp 16bit_adres 02 xx yy
  288. PC++;
  289. PC=(WORD)EXT_RAM[PC]<<8 | EXT_RAM[PC+1];
  290. break;
  291. case 0x80: // sjmp offset 80 oo
  292. PC++;
  293. PC+=(signed char)EXT_RAM[PC]+1;
  294. break;
  295. case 0x85: // mov (adress1),(ardess2) 85 yy xx
  296. PC++;
  297. SFR[EXT_RAM[PC+1]]=SFR[EXT_RAM[PC]];
  298. PC+=2;
  299. break;
  300. case 0xe5: // mov A,(adress)
  301. PC++;
  302. *Acc=SFR[EXT_RAM[PC]];
  303. PC++;
  304. break;
  305. case 0x92: // mov (bit),C
  306. PC++;
  307. if (check_C()) setB(EXT_RAM[PC]);
  308. else clrB(EXT_RAM[PC]);
  309. PC++;
  310. break;
  311. /* 2003-12-04 : Added */
  312. case 0xA2: // mov C,(bit)
  313. PC++;
  314. if (checkB(EXT_RAM[PC])) set_C();
  315. else clr_C();
  316. PC++;
  317. break;
  318. /* End Added */
  319. case 0x04: // inc a
  320. SFR[0xe0]++;
  321. PC++;
  322. break;
  323. case 0x05: // inc (adress)
  324. PC++;
  325. SFR[EXT_RAM[PC]]++;
  326. PC++;
  327. break;
  328. case 0xa3: // inc DPTR
  329. *DPTR=*DPTR+1;
  330. PC++;
  331. break;
  332. case 0x06: //inc @R0
  333. SFR[R[0]]++;
  334. PC++;
  335. break;
  336. case 0x07: //inc @R1
  337. SFR[R[1]]++;
  338. PC++;
  339. break;
  340. case 0x08: //inc R0
  341. R[0]++;
  342. PC++;
  343. break;
  344. case 0x09: //inc R1
  345. R[1]++;
  346. PC++;
  347. break;
  348. case 0x0a: //inc R2
  349. R[2]++;
  350. PC++;
  351. break;
  352. case 0x0b: //inc R3
  353. R[3]++;
  354. PC++;
  355. break;
  356. case 0x0c: //inc R4
  357. R[4]++;
  358. PC++;
  359. break;
  360. case 0x0d: //inc R5
  361. R[5]++;
  362. PC++;
  363. break;
  364. case 0x0e: //inc R6
  365. R[6]++;
  366. PC++;
  367. break;
  368. case 0x0f: //inc R7
  369. R[7]++;
  370. PC++;
  371. break;
  372. case 0x14: //dec A
  373. *Acc=*Acc-1;
  374. PC++;
  375. break;
  376. case 0x15: //dec (adress)
  377. PC++;
  378. SFR[EXT_RAM[PC]]--;
  379. PC++;
  380. break;
  381. case 0x16: //dec @R0
  382. SFR[R[0]]--;
  383. PC++;
  384. break;
  385. case 0x17: //dec @R1
  386. SFR[R[1]]--;
  387. PC++;
  388. break;
  389. case 0x18: // dec R0
  390. R[0]--;
  391. PC++;
  392. break;
  393. case 0x19: // dec R1
  394. R[1]--;
  395. PC++;
  396. break;
  397. case 0x1a: // dec R2
  398. R[2]--;
  399. PC++;
  400. break;
  401. case 0x1b: // dec R3
  402. R[3]--;
  403. PC++;
  404. break;
  405. case 0x1c: // dec R4
  406. R[4]--;
  407. PC++;
  408. break;
  409. case 0x1d: // dec R5
  410. R[5]--;
  411. PC++;
  412. break;
  413. case 0x1e: // dec R6
  414. R[6]--;
  415. PC++;
  416. break;
  417. case 0x1f: // dec R7
  418. R[7]--;
  419. PC++;
  420. break;
  421. case 0x84: // div AB
  422. clr_C();
  423. if (*B!=0)
  424. {
  425. tmpB=*Acc;
  426. *Acc=tmpB / *B;
  427. *B=tmpB % *B;
  428. } else set_OV();
  429. PC++;
  430. break;
  431. case 0xa4: // mul AB
  432. tmpW=(WORD)*Acc * (WORD)*B;
  433. if (tmpW>255) set_OV();
  434. else clr_OV();
  435. *B=(BYTE) tmpW>>8;
  436. *Acc=(BYTE) (tmpW&0xff);
  437. PC++;
  438. break;
  439. case 0x23: // rl A
  440. tmpB=*Acc;
  441. *Acc=tmpB<<1 | tmpB>>7;
  442. PC++;
  443. break;
  444. case 0x03: // rr A
  445. tmpB=*Acc;
  446. *Acc=tmpB>>1 | tmpB<<7;
  447. PC++;
  448. break;
  449. case 0x33: // rlc A
  450. tmpB=*Acc;
  451. *Acc=tmpB<<1 | check_C();
  452. if (tmpB&0x80) set_C();
  453. else clr_C();
  454. PC++;
  455. break;
  456. case 0x13: // rrc A
  457. tmpB=*Acc;
  458. *Acc=tmpB>>1 | check_C()<<7;
  459. if (tmpB&0x01) set_C();
  460. else clr_C();
  461. PC++;
  462. break;
  463. case 0x90: // mov DPTR,#(16-bit data)
  464. PC++;
  465. *DPH=EXT_RAM[PC];
  466. PC++;
  467. *DPL=EXT_RAM[PC];
  468. PC++;
  469. break;
  470. case 0xf5: // mov (adress),A
  471. PC++;
  472. SFR[EXT_RAM[PC]]=*Acc;
  473. PC++;
  474. break;
  475. // ADD (full functional)
  476. case 0x24: // add A,#(data)
  477. PC++;
  478. _add(*Acc, EXT_RAM[PC]);
  479. PC++;
  480. break;
  481. case 0x25: // add A,(adres)
  482. PC++;
  483. _add(*Acc, SFR[EXT_RAM[PC]]);
  484. PC++;
  485. break;
  486. case 0x26: // add A,@R0
  487. _add(*Acc, SFR[R[0]]);
  488. PC++;
  489. break;
  490. case 0x27: // add A,@R1
  491. _add(*Acc, SFR[R[1]]);
  492. PC++;
  493. break;
  494. case 0x28: //add A,R0
  495. _add(*Acc, R[0]);
  496. PC++;
  497. break;
  498. case 0x29: //add A,R1
  499. _add(*Acc, R[1]);
  500. PC++;
  501. break;
  502. case 0x2a: //add A,R2
  503. _add(*Acc, R[2]);
  504. PC++;
  505. break;
  506. case 0x2b: //add A,R3
  507. _add(*Acc, R[3]);
  508. PC++;
  509. break;
  510. case 0x2c: //add A,R4
  511. _add(*Acc, R[4]);
  512. PC++;
  513. break;
  514. case 0x2d: //add A,R5
  515. _add(*Acc, R[5]);
  516. PC++;
  517. break;
  518. case 0x2e: //add A,R6
  519. _add(*Acc, R[6]);
  520. PC++;
  521. break;
  522. case 0x2f: //add A,R7
  523. _add(*Acc, R[7]);
  524. PC++;
  525. break;
  526. // ADDC
  527. case 0x34: // addc A,#(data)
  528. PC++;
  529. _addc(*Acc, EXT_RAM[PC]);
  530. PC++;
  531. break;
  532. case 0x35: // addc A,(adres)
  533. PC++;
  534. _addc(*Acc, SFR[EXT_RAM[PC]]);
  535. PC++;
  536. break;
  537. case 0x36: // addc A,@R0
  538. _addc(*Acc, SFR[R[0]]);
  539. PC++;
  540. break;
  541. case 0x37: // addc A,@R1
  542. _addc(*Acc, SFR[R[1]]);
  543. PC++;
  544. break;
  545. case 0x38: //addc A,R0
  546. _addc(*Acc, R[0]);
  547. PC++;
  548. break;
  549. case 0x39: //addc A,R1
  550. _addc(*Acc, R[1]);
  551. PC++;
  552. break;
  553. case 0x3a: //addc A,R2
  554. _addc(*Acc, R[2]);
  555. PC++;
  556. break;
  557. case 0x3b: //addc A,R3
  558. _addc(*Acc, R[3]);
  559. PC++;
  560. break;
  561. case 0x3c: //addc A,R4
  562. _addc(*Acc, R[4]);
  563. PC++;
  564. break;
  565. case 0x3d: //addc A,R5
  566. _addc(*Acc, R[5]);
  567. PC++;
  568. break;
  569. case 0x3e: //addc A,R6
  570. _addc(*Acc, R[6]);
  571. PC++;
  572. break;
  573. case 0x3f: //addc A,R7
  574. _addc(*Acc, R[7]);
  575. PC++;
  576. break;
  577. case 0xe0: // movx A,@DPTR
  578. *Acc=EXT_RAM[*DPTR];
  579. PC++;
  580. break;
  581. case 0xf0: // movx @DPTR,A
  582. EXT_RAM[*DPTR]=*Acc;
  583. PC++;
  584. break;
  585. case 0xc0: // push (adress)
  586. *SP=*SP+1;
  587. PC++;
  588. SFR[*SP]=SFR[EXT_RAM[PC]];
  589. PC++;
  590. break;
  591. case 0xd0: // pop (adress)
  592. PC++;
  593. SFR[EXT_RAM[PC]]=SFR[*SP];
  594. *SP=*SP-1;
  595. PC++;
  596. break;
  597. case 0xc3: // clr C
  598. clr_C();
  599. PC++;
  600. break;
  601. case 0xd3: // setb C
  602. set_C();
  603. PC++;
  604. break;
  605. case 0xd2: // setb (bit)
  606. PC++;
  607. setB(EXT_RAM[PC]);
  608. PC++;
  609. break;
  610. case 0xc2: // clr (bit)
  611. PC++;
  612. clrB(EXT_RAM[PC]);
  613. PC++;
  614. break;
  615. case 0x64: // xrl A,#(data)
  616. PC++;
  617. *Acc=*Acc^EXT_RAM[PC];
  618. PC++;
  619. break;
  620. case 0x65: // xrl A,(adress)
  621. PC++;
  622. *Acc=*Acc^SFR[EXT_RAM[PC]];
  623. PC++;
  624. break;
  625. case 0x63: // xrl (adress),#(data)
  626. PC++;
  627. SFR[EXT_RAM[PC]] ^= EXT_RAM[PC+1];
  628. PC+=2;
  629. break;
  630. case 0xc5: // xch A,(adress)
  631. PC++;
  632. tmpB=*Acc;
  633. *Acc=SFR[EXT_RAM[PC]];
  634. SFR[EXT_RAM[PC]]=tmpB;
  635. PC++;
  636. break;
  637. case 0xc8: // xch A,R0
  638. tmpB=*Acc;
  639. *Acc=R[0];
  640. R[0]=tmpB;
  641. PC++;
  642. break;
  643. case 0xc9: // xch A,R0
  644. tmpB=*Acc;
  645. *Acc=R[1];
  646. R[1]=tmpB;
  647. PC++;
  648. break;
  649. case 0xca: // xch A,R0
  650. tmpB=*Acc;
  651. *Acc=R[2];
  652. R[2]=tmpB;
  653. PC++;
  654. break;
  655. case 0xcb: // xch A,R0
  656. tmpB=*Acc;
  657. *Acc=R[3];
  658. R[3]=tmpB;
  659. PC++;
  660. break;
  661. case 0xcc: // xch A,R0
  662. tmpB=*Acc;
  663. *Acc=R[4];
  664. R[4]=tmpB;
  665. PC++;
  666. break;
  667. case 0xcd: // xch A,R0
  668. tmpB=*Acc;
  669. *Acc=R[5];
  670. R[5]=tmpB;
  671. PC++;
  672. break;
  673. case 0xce: // xch A,R0
  674. tmpB=*Acc;
  675. *Acc=R[6];
  676. R[6]=tmpB;
  677. PC++;
  678. break;
  679. case 0xcf: // xch A,R0
  680. tmpB=*Acc;
  681. *Acc=R[7];
  682. R[7]=tmpB;
  683. PC++;
  684. break;
  685. case 0x12: // lcall 16bit_adres 02 xx yy
  686. tmpW=PC+3;
  687. PC++;
  688. PC=(WORD)EXT_RAM[PC]<<8 | EXT_RAM[PC+1];
  689. *SP=*SP+1;
  690. SFR[*SP]=(BYTE) (tmpW&0x00ff);
  691. *SP=*SP+1;
  692. SFR[*SP]=(BYTE) (tmpW>>8);
  693. break;
  694. case 0x22: // ret
  695. PC=(WORD)SFR[*SP]<<8 | (WORD)SFR[*SP-1];
  696. *SP=*SP-2;
  697. break;
  698. case 0x70: // jnz (offset)
  699. PC++;
  700. if (*Acc!=0) PC+=(signed char)EXT_RAM[PC]+1;
  701. else PC++;
  702. break;
  703. case 0x60: // jz (offset)
  704. PC++;
  705. if (*Acc==0) PC+=(signed char)EXT_RAM[PC]+1;
  706. else PC++;
  707. break;
  708. case 0x40: // jc (offset)
  709. PC++;
  710. if (check_C()) PC+=(signed char)EXT_RAM[PC]+1;
  711. else PC++;
  712. break;
  713. case 0x50: // jnc (offset)
  714. PC++;
  715. if (!check_C()) PC+=(signed char)EXT_RAM[PC]+1;
  716. else PC++;
  717. break;
  718. case 0xc4: // swap A
  719. tmpB=*Acc;
  720. tmpB=(tmpB<<4) & 0xf0;
  721. *Acc=(*Acc>>4) & 0x0f;
  722. *Acc=*Acc | tmpB;
  723. PC++;
  724. break;
  725. case 0x93: // movc A,@DPTR+A
  726. *Acc=EXT_RAM[*Acc+*DPTR];
  727. PC++;
  728. break;
  729. case 0x83: // movc A,@PC+A
  730. *Acc=EXT_RAM[*Acc+PC];
  731. PC++;
  732. break;
  733. case 0xe6: // mov A,@R0
  734. *Acc=SFR[R[0]];
  735. PC++;
  736. break;
  737. case 0xe7: // mov A,@R1
  738. *Acc=SFR[R[1]];
  739. PC++;
  740. break;
  741. case 0xf6: // mov @R0,A
  742. SFR[R[0]]=*Acc;
  743. PC++;
  744. break;
  745. case 0xf7: // mov @R1,a
  746. SFR[R[1]]=*Acc;
  747. PC++;
  748. break;
  749. case 0x78: // mov R0,#(data)
  750. PC++;
  751. R[0]=EXT_RAM[PC];
  752. PC++;
  753. break;
  754. case 0x79: // mov R1,#(data)
  755. PC++;
  756. R[1]=EXT_RAM[PC];
  757. PC++;
  758. break;
  759. case 0x7a: // mov R2,#(data)
  760. PC++;
  761. R[2]=EXT_RAM[PC];
  762. PC++;
  763. break;
  764. case 0x7b: // mov R3,#(data)
  765. PC++;
  766. R[3]=EXT_RAM[PC];
  767. PC++;
  768. break;
  769. case 0x7c: // mov R4,#(data)
  770. PC++;
  771. R[4]=EXT_RAM[PC];
  772. PC++;
  773. break;
  774. case 0x7d: // mov R5,#(data)
  775. PC++;
  776. R[5]=EXT_RAM[PC];
  777. PC++;
  778. break;
  779. case 0x7e: // mov R6,#(data)
  780. PC++;
  781. R[6]=EXT_RAM[PC];
  782. PC++;
  783. break;
  784. case 0x7f: // mov R7,#(data)
  785. PC++;
  786. R[7]=EXT_RAM[PC];
  787. PC++;
  788. break;
  789. case 0xa8: // mov R0,(adress)
  790. PC++;
  791. R[0]=SFR[EXT_RAM[PC]];
  792. PC++;
  793. break;
  794. case 0xa9: // mov R1,(adress)
  795. PC++;
  796. R[1]=SFR[EXT_RAM[PC]];
  797. PC++;
  798. break;
  799. case 0xaa: // mov R2,(adress)
  800. PC++;
  801. R[2]=SFR[EXT_RAM[PC]];
  802. PC++;
  803. break;
  804. case 0xab: // mov R3,(adress)
  805. PC++;
  806. R[3]=SFR[EXT_RAM[PC]];
  807. PC++;
  808. break;
  809. case 0xac: // mov R4,(adress)
  810. PC++;
  811. R[4]=SFR[EXT_RAM[PC]];
  812. PC++;
  813. break;
  814. case 0xad: // mov R5,(adress)
  815. PC++;
  816. R[5]=SFR[EXT_RAM[PC]];
  817. PC++;
  818. break;
  819. case 0xae: // mov R6,(adress)
  820. PC++;
  821. R[6]=SFR[EXT_RAM[PC]];
  822. PC++;
  823. break;
  824. case 0xaf: // mov R7,(adress)
  825. PC++;
  826. R[7]=SFR[EXT_RAM[PC]];
  827. PC++;
  828. break;
  829. case 0x88: // mov (adress),R0
  830. PC++;
  831. SFR[EXT_RAM[PC]]=R[0];
  832. PC++;
  833. break;
  834. case 0x89: // mov (adress),R1
  835. PC++;
  836. SFR[EXT_RAM[PC]]=R[1];
  837. PC++;
  838. break;
  839. case 0x8a: // mov (adress),R2
  840. PC++;
  841. SFR[EXT_RAM[PC]]=R[2];
  842. PC++;
  843. break;
  844. case 0x8b: // mov (adress),R3
  845. PC++;
  846. SFR[EXT_RAM[PC]]=R[3];
  847. PC++;
  848. break;
  849. case 0x8c: // mov (adress),R4
  850. PC++;
  851. SFR[EXT_RAM[PC]]=R[4];
  852. PC++;
  853. break;
  854. case 0x8d: // mov (adress),R5
  855. PC++;
  856. SFR[EXT_RAM[PC]]=R[5];
  857. PC++;
  858. break;
  859. case 0x8e: // mov (adress),R6
  860. PC++;
  861. SFR[EXT_RAM[PC]]=R[6];
  862. PC++;
  863. break;
  864. case 0x8f: // mov (adress),R7
  865. PC++;
  866. SFR[EXT_RAM[PC]]=R[7];
  867. PC++;
  868. break;
  869. case 0xf8: // mov R0,A
  870. PC++;
  871. R[0]=*Acc;
  872. break;
  873. case 0xf9: // mov R1,A
  874. PC++;
  875. R[1]=*Acc;
  876. break;
  877. case 0xfa: // mov R2,A
  878. PC++;
  879. R[2]=*Acc;
  880. break;
  881. case 0xfb: // mov R3,A
  882. PC++;
  883. R[3]=*Acc;
  884. break;
  885. case 0xfc: // mov R4,A
  886. PC++;
  887. R[4]=*Acc;
  888. break;
  889. case 0xfd: // mov R5,A
  890. PC++;
  891. R[5]=*Acc;
  892. break;
  893. case 0xfe: // mov R6,A
  894. PC++;
  895. R[6]=*Acc;
  896. break;
  897. case 0xff: // mov R7,A
  898. PC++;
  899. R[7]=*Acc;
  900. break;
  901. case 0xe8: // mov A,R0
  902. PC++;
  903. *Acc=R[0];
  904. break;
  905. case 0xe9: // mov A,R1
  906. PC++;
  907. *Acc=R[1];
  908. break;
  909. case 0xea: // mov A,R2
  910. PC++;
  911. *Acc=R[2];
  912. break;
  913. case 0xeb: // mov A,R3
  914. PC++;
  915. *Acc=R[3];
  916. break;
  917. case 0xec: // mov A,R4
  918. PC++;
  919. *Acc=R[4];
  920. break;
  921. case 0xed: // mov A,R5
  922. PC++;
  923. *Acc=R[5];
  924. break;
  925. case 0xee: // mov A,R6
  926. PC++;
  927. *Acc=R[6];
  928. break;
  929. case 0xef: // mov A,R7
  930. PC++;
  931. *Acc=R[7];
  932. break;
  933. case 0xe4: //clr A
  934. PC++;
  935. *Acc=0;
  936. break;
  937. case 0x01: // ajmp 00xx
  938. PC++;
  939. PC=(WORD)EXT_RAM[PC];
  940. break;
  941. case 0x21: // ajmp 01xx
  942. PC++;
  943. PC=0x0100 | (WORD)EXT_RAM[PC];
  944. break;
  945. case 0x41: // ajmp 02xx
  946. PC++;
  947. PC=0x0200 | (WORD)EXT_RAM[PC];
  948. break;
  949. case 0x61: // ajmp 03xx
  950. PC++;
  951. PC=0x0300 | (WORD)EXT_RAM[PC];
  952. break;
  953. case 0x81: // ajmp 04xx
  954. PC++;
  955. PC=0x0400 | (WORD)EXT_RAM[PC];
  956. break;
  957. case 0xa1: // ajmp 05xx
  958. PC++;
  959. PC=0x0500 | (WORD)EXT_RAM[PC];
  960. break;
  961. case 0xc1: // ajmp 06xx
  962. PC++;
  963. PC=0x0600 | (WORD)EXT_RAM[PC];
  964. break;
  965. case 0xe1: // ajmp 07xx
  966. PC++;
  967. PC=0x0700 | (WORD)EXT_RAM[PC];
  968. break;
  969. case 0x11: // acall 00xx
  970. tmpW=PC+2;
  971. PC++;
  972. PC=(WORD) EXT_RAM[PC];
  973. *SP=*SP+1;
  974. SFR[*SP]=(BYTE) (tmpW&0x00ff);
  975. *SP=*SP+1;
  976. SFR[*SP]=(BYTE) (tmpW>>8);
  977. break;
  978. case 0x31: // acall 01xx
  979. tmpW=PC+2;
  980. PC++;
  981. PC=0x0100 | EXT_RAM[PC];
  982. *SP=*SP+1;
  983. SFR[*SP]=(BYTE) (tmpW&0x00ff);
  984. *SP=*SP+1;
  985. SFR[*SP]=(BYTE) (tmpW>>8);
  986. break;
  987. case 0x51: // acall 02xx
  988. tmpW=PC+2;
  989. PC++;
  990. PC=0x0200 | EXT_RAM[PC];
  991. *SP=*SP+1;
  992. SFR[*SP]=(BYTE) (tmpW&0x00ff);
  993. *SP=*SP+1;
  994. SFR[*SP]=(BYTE) (tmpW>>8);
  995. break;
  996. case 0x71: // acall 03xx
  997. tmpW=PC+2;
  998. PC++;
  999. PC=0x0300 | EXT_RAM[PC];
  1000. *SP=*SP+1;
  1001. SFR[*SP]=(BYTE) (tmpW&0x00ff);
  1002. *SP=*SP+1;
  1003. SFR[*SP]=(BYTE) (tmpW>>8);
  1004. break;
  1005. case 0x91: // acall 04xx
  1006. tmpW=PC+2;
  1007. PC++;
  1008. PC=0x0400 | EXT_RAM[PC];
  1009. *SP=*SP+1;
  1010. SFR[*SP]=(BYTE) (tmpW&0x00ff);
  1011. *SP=*SP+1;
  1012. SFR[*SP]=(BYTE) (tmpW>>8);
  1013. break;
  1014. case 0xb1: // acall 05xx
  1015. tmpW=PC+2;
  1016. PC++;
  1017. PC=0x0500 | EXT_RAM[PC];
  1018. *SP=*SP+1;
  1019. SFR[*SP]=(BYTE) (tmpW&0x00ff);
  1020. *SP=*SP+1;
  1021. SFR[*SP]=(BYTE) (tmpW>>8);
  1022. break;
  1023. case 0xd1: // acall 06xx
  1024. tmpW=PC+2;
  1025. PC++;
  1026. PC=0x0600 | EXT_RAM[PC];
  1027. *SP=*SP+1;
  1028. SFR[*SP]=(BYTE) (tmpW&0x00ff);
  1029. *SP=*SP+1;
  1030. SFR[*SP]=(BYTE) (tmpW>>8);
  1031. break;
  1032. case 0xf1: // acall 07xx
  1033. tmpW=PC+2;
  1034. PC++;
  1035. PC=0x0700 | EXT_RAM[PC];
  1036. *SP=*SP+1;
  1037. SFR[*SP]=(BYTE) (tmpW&0x00ff);
  1038. *SP=*SP+1;
  1039. SFR[*SP]=(BYTE) (tmpW>>8);
  1040. break;
  1041. case 0xd8: // djnz R0,(offset)
  1042. PC++;
  1043. R[0]--;
  1044. if (R[0]!=0) PC+=(signed char)EXT_RAM[PC];
  1045. PC++;
  1046. break;
  1047. case 0xd9: // djnz R1,(offset)
  1048. PC++;
  1049. R[1]--;
  1050. if (R[1]!=0) PC+=(signed char)EXT_RAM[PC];
  1051. PC++;
  1052. break;
  1053. case 0xda: // djnz R2,(offset)
  1054. PC++;
  1055. R[2]--;
  1056. if (R[2]!=0) PC+=(signed char)EXT_RAM[PC];
  1057. PC++;
  1058. break;
  1059. case 0xdb: // djnz R3,(offset)
  1060. PC++;
  1061. R[3]--;
  1062. if (R[3]!=0) PC+=(signed char)EXT_RAM[PC];
  1063. PC++;
  1064. break;
  1065. case 0xdc: // djnz R4,(offset)
  1066. PC++;
  1067. R[4]--;
  1068. if (R[4]!=0) PC+=(signed char)EXT_RAM[PC];
  1069. PC++;
  1070. break;
  1071. case 0xdd: // djnz R5,(offset)
  1072. PC++;
  1073. R[5]--;
  1074. if (R[5]!=0) PC+=(signed char)EXT_RAM[PC];
  1075. PC++;
  1076. break;
  1077. case 0xde: // djnz R6,(offset)
  1078. PC++;
  1079. R[6]--;
  1080. if (R[6]!=0) PC+=(signed char)EXT_RAM[PC];
  1081. PC++;
  1082. break;
  1083. case 0xdf: // djnz R7,(offset)
  1084. PC++;
  1085. R[7]--;
  1086. if (R[7]!=0) PC+=(signed char)EXT_RAM[PC];
  1087. PC++;
  1088. break;
  1089. case 0xd5: // djnz (adress),(offset)
  1090. PC++;
  1091. tmpB=EXT_RAM[PC];
  1092. PC++;
  1093. SFR[tmpB]--;
  1094. if (SFR[tmpB]!=0) PC+=(signed char)EXT_RAM[PC];
  1095. PC++;
  1096. break;
  1097. case 0x43: // orl (adress),#(data)
  1098. PC++;
  1099. SFR[EXT_RAM[PC]]=SFR[EXT_RAM[PC]] | EXT_RAM[PC+1];
  1100. PC+=2;
  1101. break;
  1102. case 0x44: // orl A,#(data)
  1103. PC++;
  1104. *Acc=EXT_RAM[PC] | *Acc;
  1105. PC++;
  1106. break;
  1107. case 0x45: // orl A,(adress)
  1108. PC++;
  1109. *Acc=SFR[EXT_RAM[PC]] | *Acc;
  1110. PC++;
  1111. break;
  1112. case 0x42: // orl (adress),A
  1113. PC++;
  1114. SFR[EXT_RAM[PC]] = SFR[EXT_RAM[PC]] | *Acc;
  1115. PC++;
  1116. break;
  1117. case 0x48: // orl A,R0
  1118. *Acc=*Acc | R[0];
  1119. PC++;
  1120. break;
  1121. case 0x49: // orl A,R1
  1122. *Acc=*Acc | R[1];
  1123. PC++;
  1124. break;
  1125. case 0x4a: // orl A,R2
  1126. *Acc=*Acc | R[2];
  1127. PC++;
  1128. break;
  1129. case 0x4b: // orl A,R3
  1130. *Acc=*Acc | R[3];
  1131. PC++;
  1132. break;
  1133. case 0x4c: // orl A,R4
  1134. *Acc=*Acc | R[4];
  1135. PC++;
  1136. break;
  1137. case 0x4d: // orl A,R5
  1138. *Acc=*Acc | R[5];
  1139. PC++;
  1140. break;
  1141. case 0x4e: // orl A,R6
  1142. *Acc=*Acc | R[6];
  1143. PC++;
  1144. break;
  1145. case 0x4f: // orl A,R7
  1146. *Acc=*Acc | R[7];
  1147. PC++;
  1148. break;
  1149. case 0x46: // orl A,@R0
  1150. *Acc=*Acc | SFR[R[0]];
  1151. PC++;
  1152. break;
  1153. case 0x47: // orl A,@R1
  1154. *Acc=*Acc | SFR[R[1]];
  1155. PC++;
  1156. break;
  1157. case 0x54: // anl A,#(data)
  1158. PC++;
  1159. *Acc=*Acc & EXT_RAM[PC];
  1160. PC++;
  1161. break;
  1162. case 0x55: // anl A,(adress)
  1163. PC++;
  1164. *Acc=SFR[EXT_RAM[PC]] & *Acc;
  1165. PC++;
  1166. break;
  1167. case 0x52: // anl (adress),A
  1168. PC++;
  1169. SFR[EXT_RAM[PC]] = SFR[EXT_RAM[PC]] & *Acc;
  1170. PC++;
  1171. break;
  1172. case 0x53: // anl (adress),#(data)
  1173. PC++;
  1174. SFR[EXT_RAM[PC]] = SFR[EXT_RAM[PC]] & EXT_RAM[PC+1];
  1175. PC++;
  1176. PC++;
  1177. break;
  1178. case 0x58: // anl A,R0
  1179. *Acc=*Acc & R[0];
  1180. PC++;
  1181. break;
  1182. case 0x59: // anl A,R1
  1183. *Acc=*Acc & R[1];
  1184. PC++;
  1185. break;
  1186. case 0x5a: // anl A,R2
  1187. *Acc=*Acc & R[2];
  1188. PC++;
  1189. break;
  1190. case 0x5b: // anl A,R3
  1191. *Acc=*Acc & R[3];
  1192. PC++;
  1193. break;
  1194. case 0x5c: // anl A,R4
  1195. *Acc=*Acc & R[4];
  1196. PC++;
  1197. break;
  1198. case 0x5d: // anl A,R5
  1199. *Acc=*Acc & R[5];
  1200. PC++;
  1201. break;
  1202. case 0x5e: // anl A,R6
  1203. *Acc=*Acc & R[6];
  1204. PC++;
  1205. break;
  1206. case 0x5f: // anl A,R7
  1207. *Acc=*Acc & R[7];
  1208. PC++;
  1209. break;
  1210. case 0x56: // anl A,@R0
  1211. *Acc=*Acc & SFR[R[0]];
  1212. PC++;
  1213. break;
  1214. case 0x57: // anl A,@R1
  1215. *Acc=*Acc & SFR[R[1]];
  1216. PC++;
  1217. break;
  1218. case 0x82: // anl C,(bit)
  1219. PC++;
  1220. if (check_C() && checkB(EXT_RAM[PC])) set_C();
  1221. else clr_C();
  1222. PC++;
  1223. break;
  1224. case 0xb0: // anl C,/(bit)
  1225. PC++;
  1226. if (check_C() && !checkB(EXT_RAM[PC])) set_C();
  1227. else clr_C();
  1228. PC++;
  1229. break;
  1230. case 0xf4: // cpl A
  1231. *Acc=*Acc^0xff;
  1232. PC++;
  1233. break;
  1234. /* 2003-12-04 : Added */
  1235. case 0xB3: // cpl C
  1236. if (check_C()) clr_C();
  1237. else set_C();
  1238. PC++;
  1239. break;
  1240. /* End Added */
  1241. case 0xa6: // mov @R0,(adress)
  1242. PC++;
  1243. SFR[R[0]]=SFR[EXT_RAM[PC]];
  1244. PC++;
  1245. break;
  1246. case 0xa7: // mov @R1,(adress)
  1247. PC++;
  1248. SFR[R[1]]=SFR[EXT_RAM[PC]];
  1249. PC++;
  1250. break;
  1251. case 0x76: // mov @R0,#(data)
  1252. PC++;
  1253. SFR[R[0]]=EXT_RAM[PC];
  1254. PC++;
  1255. break;
  1256. case 0x77: // mov @R1,#(data)
  1257. PC++;
  1258. SFR[R[1]]=EXT_RAM[PC];
  1259. PC++;
  1260. break;
  1261. case 0x86: // mov (adress),@R0
  1262. PC++;
  1263. SFR[EXT_RAM[PC]]=SFR[R[0]];
  1264. PC++;
  1265. break;
  1266. case 0x87: // mov (adress),@R1
  1267. PC++;
  1268. SFR[EXT_RAM[PC]]=SFR[R[1]];
  1269. PC++;
  1270. break;
  1271. case 0x73: // jmp @A+DPTR
  1272. PC=(WORD)(*Acc + *DPTR);
  1273. break;
  1274. case 0xb4: // cjne A,#(byte),offset
  1275. PC++;
  1276. if (*Acc < EXT_RAM[PC]) set_C();
  1277. else clr_C();
  1278. if (*Acc!=EXT_RAM[PC])
  1279. {
  1280. PC++;
  1281. PC+=(signed char)EXT_RAM[PC]+1;
  1282. } else
  1283. {
  1284. PC+=2;
  1285. }
  1286. break;
  1287. case 0xb5: // cjne A,(adress),offset
  1288. PC++;
  1289. if (*Acc < SFR[EXT_RAM[PC]]) set_C();
  1290. else clr_C();
  1291. if (*Acc!=SFR[EXT_RAM[PC]])
  1292. {
  1293. PC++;
  1294. PC+=(signed char)EXT_RAM[PC]+1;
  1295. } else
  1296. {
  1297. PC+=2;
  1298. }
  1299. break;
  1300. case 0xb8: // cjne R0,#(byte),offset
  1301. PC++;
  1302. if (R[0] < EXT_RAM[PC]) set_C();
  1303. else clr_C();
  1304. if (R[0]!=EXT_RAM[PC])
  1305. {
  1306. PC++;
  1307. PC+=(signed char)EXT_RAM[PC]+1;
  1308. } else
  1309. {
  1310. PC+=2;
  1311. }
  1312. break;
  1313. case 0xb9: // cjne R1,#(byte),offset
  1314. PC++;
  1315. if (R[1] < EXT_RAM[PC]) set_C();
  1316. else clr_C();
  1317. if (R[1]!=EXT_RAM[PC])
  1318. {
  1319. PC++;
  1320. PC+=(signed char)EXT_RAM[PC]+1;
  1321. } else
  1322. {
  1323. PC+=2;
  1324. }
  1325. break;
  1326. case 0xba: // cjne R2,#(byte),offset
  1327. PC++;
  1328. if (R[2] < EXT_RAM[PC]) set_C();
  1329. else clr_C();
  1330. if (R[2]!=EXT_RAM[PC])
  1331. {
  1332. PC++;
  1333. PC+=(signed char)EXT_RAM[PC]+1;
  1334. } else
  1335. {
  1336. PC+=2;
  1337. }
  1338. break;
  1339. case 0xbb: // cjne R3,#(byte),offset
  1340. PC++;
  1341. if (R[3] < EXT_RAM[PC]) set_C();
  1342. else clr_C();
  1343. if (R[3]!=EXT_RAM[PC])
  1344. {
  1345. PC++;
  1346. PC+=(signed char)EXT_RAM[PC]+1;
  1347. } else
  1348. {
  1349. PC+=2;
  1350. }
  1351. break;
  1352. case 0xbc: // cjne R4,#(byte),offset
  1353. PC++;
  1354. if (R[4] < EXT_RAM[PC]) set_C();
  1355. else clr_C();
  1356. if (R[4]!=EXT_RAM[PC])
  1357. {
  1358. PC++;
  1359. PC+=(signed char)EXT_RAM[PC]+1;
  1360. } else
  1361. {
  1362. PC+=2;
  1363. }
  1364. break;
  1365. case 0xbd: // cjne R5,#(byte),offset
  1366. PC++;
  1367. if (R[5] < EXT_RAM[PC]) set_C();
  1368. else clr_C();
  1369. if (R[5]!=EXT_RAM[PC])
  1370. {
  1371. PC++;
  1372. PC+=(signed char)EXT_RAM[PC]+1;
  1373. } else
  1374. {
  1375. PC+=2;
  1376. }
  1377. break;
  1378. case 0xbe: // cjne R6,#(byte),offset
  1379. PC++;
  1380. if (R[6] < EXT_RAM[PC]) set_C();
  1381. else clr_C();
  1382. if (R[6]!=EXT_RAM[PC])
  1383. {
  1384. PC++;
  1385. PC+=(signed char)EXT_RAM[PC]+1;
  1386. } else
  1387. {
  1388. PC+=2;
  1389. }
  1390. break;
  1391. case 0xbf: // cjne R7,#(byte),offset
  1392. PC++;
  1393. if (R[7] < EXT_RAM[PC]) set_C();
  1394. else clr_C();
  1395. if (R[7]!=EXT_RAM[PC])
  1396. {
  1397. PC++;
  1398. PC+=(signed char)EXT_RAM[PC]+1;
  1399. } else
  1400. {
  1401. PC+=2;
  1402. }
  1403. break;
  1404. case 0x32: // reti
  1405. PC=(WORD)SFR[*SP]<<8 | (WORD)SFR[*SP-1];
  1406. *SP=*SP-2;
  1407. break;
  1408. case 0x30: //jnb (bit),(offset)
  1409. PC++;
  1410. if (!checkB(EXT_RAM[PC]))
  1411. {
  1412. PC++;
  1413. PC+=(signed char)EXT_RAM[PC]+1;
  1414. } else PC+=2;
  1415. break;
  1416. case 0x20: //jb (bit),(offset)
  1417. PC++;
  1418. if (checkB(EXT_RAM[PC]))
  1419. {
  1420. PC++;
  1421. PC+=(signed char)EXT_RAM[PC]+1;
  1422. } else PC+=2;
  1423. break;
  1424. case 0x94: // subb A,#(data)
  1425. PC++;
  1426. *Acc=*Acc-EXT_RAM[PC];
  1427. PC++;
  1428. break;
  1429. case 0x95: // subb A,(adress)
  1430. PC++;
  1431. *Acc=*Acc-SFR[EXT_RAM[PC]];
  1432. PC++;
  1433. break;
  1434. case 0x98: // subb A,R0
  1435. PC++;
  1436. *Acc=*Acc-R[0];
  1437. PC++;
  1438. break;
  1439. case 0x99: // subb A,R1
  1440. PC++;
  1441. *Acc=*Acc-R[1];
  1442. PC++;
  1443. break;
  1444. case 0x9a: // subb A,R2
  1445. PC++;
  1446. *Acc=*Acc-R[2];
  1447. PC++;
  1448. break;
  1449. case 0x9b: // subb A,R3
  1450. PC++;
  1451. *Acc=*Acc-R[3];
  1452. PC++;
  1453. break;
  1454. case 0x9c: // subb A,R4
  1455. PC++;
  1456. *Acc=*Acc-R[4];
  1457. PC++;
  1458. break;
  1459. case 0x9d: // subb A,R5
  1460. PC++;
  1461. *Acc=*Acc-R[5];
  1462. PC++;
  1463. break;
  1464. case 0x9e: // subb A,R6
  1465. PC++;
  1466. *Acc=*Acc-R[6];
  1467. PC++;
  1468. break;
  1469. case 0x9f: // subb A,R7
  1470. PC++;
  1471. *Acc=*Acc-R[7];
  1472. PC++;
  1473. break;
  1474. }
  1475. BYTE cnt=0;
  1476. // count cycles
  1477. c_time+=cycles;
  1478. // count bits in Acc
  1479. for (BYTE c=0;c<=7;c++)
  1480. {
  1481. if ((1<<c) & *Acc) cnt++;
  1482. }
  1483. // parrity check
  1484. if (cnt%2) // if cnt parity isn't true
  1485. {
  1486. clr_P();
  1487. } else { // if cnt parity is true
  1488. set_P();
  1489. }
  1490. // setup Rx bank
  1491. tmpB = check_RS1()<<1 | check_RS0();
  1492. R=&SFR[tmpB<<3];
  1493. BYTE modeT0,modeT1;
  1494. // timers & interrupts
  1495. modeT0= *TMOD & 0x03;
  1496. modeT1= (*TMOD & 0x30)>>4;
  1497. // Timer 0
  1498. clrB(0x8d); // clr bit TF0 - T0 overflow
  1499. if(checkB(0x8c)) // if TR0
  1500. {
  1501. switch (modeT0)
  1502. {
  1503. case 0:
  1504. break;
  1505. case 1:
  1506. if ((int)(*TL0)+(int)cycles <= 0xff) *TL0+=cycles;
  1507. else
  1508. {
  1509. *TL0=(BYTE)((int)*TL0-(int)0x100+cycles);
  1510. if ((int)(*TH0)<0xff) *TH0+=1;
  1511. else
  1512. {
  1513. *TH0=0;
  1514. setB(0x8d); // set bit TF0 - T0 overflow
  1515. }
  1516. }
  1517. break;
  1518. case 2:
  1519. if ((int)(*TL0)+(int)cycles <= 0xff) *TL0+=cycles;
  1520. else
  1521. {
  1522. *TL0=*TH0;
  1523. setB(0x8d); // set bit TF0 - T0 overflow
  1524. }
  1525. break;
  1526. case 3:
  1527. break;
  1528. }
  1529. }
  1530. clrB(0x8f); // clr bit TF1 - T1 overflow
  1531. if(checkB(0x8e)) // if TR1
  1532. {
  1533. switch (modeT1)
  1534. {
  1535. case 0:
  1536. break;
  1537. case 1:
  1538. if ((int)(*TL1)+(int)cycles <= 0xff)
  1539. {
  1540. *TL1+=cycles;
  1541. }
  1542. else
  1543. {
  1544. *TL1=(BYTE)((int)*TL1-(int)0x100+cycles);
  1545. if ((int)(*TH1)<0xff)
  1546. {
  1547. *TH1+=1;
  1548. }
  1549. else
  1550. {
  1551. *TH1=0;
  1552. setB(0x8f); // set bit TF0 - T0 overflow
  1553. }
  1554. }
  1555. break;
  1556. case 2:
  1557. if ((int)(*TL1)+(int)cycles <= 0xff)
  1558. {
  1559. *TL1+=cycles;
  1560. }
  1561. else
  1562. {
  1563. *TL1=*TH1;
  1564. setB(0x8f); // set bit TF0 - T0 overflow
  1565. }
  1566. break;
  1567. case 3:
  1568. break;
  1569. }
  1570. }
  1571. // Interrupts
  1572. if (checkB(0xaf)) //if EA is 1
  1573. {
  1574. // T0 int
  1575. if (checkB(0x8d) && checkB(0xa9)) // if TF0 and ET0
  1576. {
  1577. *SP=*SP+1;
  1578. SFR[*SP]=(BYTE) (PC&0x00ff);
  1579. *SP=*SP+1;
  1580. SFR[*SP]=(BYTE) (PC>>8);
  1581. PC=0x0000b;
  1582. }
  1583. // T1 int
  1584. if (checkB(0x8f) && checkB(0xab)) // if TF1 and ET1
  1585. {
  1586. *SP=*SP+1;
  1587. SFR[*SP]=(BYTE) (PC&0x00ff);
  1588. *SP=*SP+1;
  1589. SFR[*SP]=(BYTE) (PC>>8);
  1590. PC=0x001b;
  1591. }
  1592. }
  1593. }
  1594. code_51 asm51[256];
  1595. class dis_asm // display code class
  1596. {
  1597. private:
  1598. void hexoutB (int,int,int,BYTE);
  1599. public:
  1600. BYTE *ram; // pointer to external ram table
  1601. BITMAP *buf, *surface; // screen buffer, work surface
  1602. int frame;
  1603. int left;
  1604. bool changed;
  1605. dis_asm (BYTE*, BITMAP*); // ext. ram, draw bitmap, constructor
  1606. void blit_it (int, int);
  1607. void draw (WORD); // x,y,PC (PC is an adr. of register which
  1608. // string is displayed in the middle
  1609. // of the code monitor)
  1610. ~dis_asm ();
  1611. };
  1612. class regs
  1613. {
  1614. private:
  1615. void hexoutB(int,int,int color,BYTE numb); //x,y,color,byte
  1616. public:
  1617. int frame;
  1618. int left;
  1619. bool changed;
  1620. BYTE *sfr;
  1621. BYTE reg[25];
  1622. char reg_label[25][10];
  1623. BITMAP *surface, *buf;
  1624. void draw ();
  1625. void blit_it (int, int);
  1626. int red;
  1627. int white;
  1628. int lblue;
  1629. int green;
  1630. int lred;
  1631. regs (BYTE*, BITMAP*);
  1632. ~regs ();
  1633. };
  1634. regs::regs (BYTE *tmpB, BITMAP *tmpBMP)
  1635. {
  1636. red = makecol(255,0,0);
  1637. white = makecol(255,255,255);
  1638. lblue = makecol(0,128,255);
  1639. green = makecol(0,255,0);
  1640. lred = makecol(255,64,0);
  1641. frame=2;
  1642. left=12;
  1643. changed=true;
  1644. sfr=tmpB;
  1645. buf=tmpBMP;
  1646. surface=create_bitmap(400,300);
  1647. clear (surface);
  1648. };
  1649. regs::~regs ()
  1650. {};
  1651. void regs::blit_it (int x, int y)
  1652. {
  1653. blit(surface,buf,0,0,x,y,surface->w,surface->h);
  1654. };
  1655. void regs::draw ()
  1656. {
  1657. clear (surface);
  1658. int c2=0, c;
  1659. textprintf (surface,mainf,left,frame+20,lblue,
  1660. "nr label adress hex dec ascii SEG LED(bin)");
  1661. for (c=frame+30;c<surface->h-20;c+=10)
  1662. {
  1663. textprintf (surface,mainf,left,c,white,
  1664. "%2d: %9s (%2x) = %2x %3d %c",
  1665. c2+1,reg_label[c2],reg[c2],sfr[reg[c2]],sfr[reg[c2]],sfr[reg[c2]]);
  1666. draw_SEG_digit (surface,left+288,c,green,4,sfr[reg[c2]]);
  1667. draw_LED_bin (surface,left+314,c+4,lred,sfr[reg[c2]]);
  1668. c2++;
  1669. if (c2==25) break;
  1670. };
  1671. hline (surface,frame,surface->h-frame,surface->w-frame,white);
  1672. vline (surface,frame,frame,surface->h-frame,white);
  1673. vline (surface,surface->w-frame,frame,surface->h-frame,white);
  1674. for (c=frame;c<=frame+10;c+=2)
  1675. {
  1676. hline (surface,frame,c,surface->w-frame,white);
  1677. }
  1678. textprintf_centre (surface,mainf,surface->w/2,frame+2,white," SFR Registers ");
  1679. }
  1680. void regs::hexoutB (int x,int y,int color,BYTE numb)
  1681. {
  1682. if (numb>0x10)
  1683. {
  1684. textprintf (surface,mainf,x,y,color,"%2x",numb);
  1685. } else
  1686. {
  1687. textprintf (surface,mainf,x,y,color,"%2x",numb);
  1688. textprintf (surface,mainf,x,y,color,"0");
  1689. }
  1690. }
  1691. dis_asm::dis_asm (BYTE *tmpB, BITMAP *tmp_buf)
  1692. {
  1693. frame=2;
  1694. left=12;
  1695. changed=true;
  1696. ram = tmpB;
  1697. buf = tmp_buf;
  1698. surface = create_bitmap(300,500);
  1699. clear (surface);
  1700. }
  1701. void dis_asm::hexoutB (int x,int y,int color,BYTE numb)
  1702. {
  1703. if (numb>0x10)
  1704. {
  1705. textprintf (surface,mainf,x,y,color,"%2x",numb);
  1706. } else
  1707. {
  1708. textprintf (surface,mainf,x,y,color,"%2x",numb);
  1709. textprintf (surface,mainf,x,y,color,"0");
  1710. }
  1711. }
  1712. void dis_asm::draw (WORD adress)
  1713. {
  1714. int red = makecol(255,0,0);
  1715. int white = makecol(255,255,255);
  1716. int lblue = makecol(0,128,255);
  1717. int color = white;
  1718. int colPC = white;
  1719. int c, cnt;
  1720. clear (surface);
  1721. for (c=20;c<surface->h-10;c+=10)
  1722. {
  1723. if (PC==adress)
  1724. {
  1725. color = red;
  1726. } else {
  1727. color = white;
  1728. }
  1729. asm51[ram[adress]].make_ds(adress);
  1730. if (asm51[ram[adress]].code==ram[adress])
  1731. {
  1732. textprintf (surface,mainf,left,c,color,"%4x:",adress);
  1733. for (cnt=0;cnt<asm51[ram[adress]].lenght;cnt++)
  1734. {
  1735. if (PC==(adress+cnt)) colPC=lblue;
  1736. else colPC=color;
  1737. hexoutB (left+50+cnt*24,c,colPC,ram[adress+cnt]);
  1738. }
  1739. textprintf (surface,mainf,left+144,c,color,"%s",asm51[ram[adress]].display_string);
  1740. adress+=asm51[ram[adress]].lenght;
  1741. } else
  1742. {
  1743. textprintf (surface,mainf,left,c,color,"%4x: ",adress);
  1744. if (PC==adress) colPC=lblue;
  1745. else colPC=color;
  1746. hexoutB (left+50,c,colPC,ram[adress]);
  1747. textprintf (surface,mainf,left+144,c,color,"???");
  1748. adress++;
  1749. }
  1750. }
  1751. hline (surface,frame,surface->h-frame,surface->w-frame,white);
  1752. vline (surface,frame,frame,surface->h-frame,white);
  1753. vline (surface,surface->w-frame,frame,surface->h-frame,white);
  1754. for (c=frame;c<=frame+10;c+=2)
  1755. {
  1756. hline (surface,frame,c,surface->w-frame,white);
  1757. }
  1758. textprintf_centre (surface,mainf,surface->w/2,frame+2,white," Disassembler ");
  1759. }
  1760. void dis_asm::blit_it (int x,int y)
  1761. {
  1762. blit(surface,buf,0,0,x,y,surface->w,surface->h);
  1763. }
  1764. dis_asm::~dis_asm (void)
  1765. {
  1766. }
  1767. int get_lenght (BYTE code)
  1768. {
  1769. if (asm51[code].code==code) return asm51[code].lenght;
  1770. else return 1;
  1771. }
  1772. class flags
  1773. {
  1774. private:
  1775. void hexoutB(int,int,int color,BYTE numb); //x,y,color,byte
  1776. public:
  1777. int frame;
  1778. int left;
  1779. bool changed;
  1780. BYTE *sfr;
  1781. BITMAP *surface, *buf;
  1782. void draw ();
  1783. void blit_it (int, int);
  1784. flags (BITMAP*);
  1785. ~flags ();
  1786. };
  1787. flags::flags (BITMAP *tmp_buf)
  1788. {
  1789. buf=tmp_buf;
  1790. surface=create_bitmap (100,300);
  1791. frame=2;
  1792. left=12;
  1793. changed=false;
  1794. }
  1795. flags::~flags ()
  1796. {
  1797. }
  1798. void flags::draw ()
  1799. {
  1800. int red = makecol(255,0,0);
  1801. int white = makecol(255,255,255);
  1802. int lblue = makecol(0,128,255);
  1803. clear (surface);
  1804. textprintf (surface,mainf,left,frame+20,white,
  1805. "C : %d",check_C());
  1806. textprintf (surface,mainf,left,frame+30,white,
  1807. "AC : %d",check_AC());
  1808. textprintf (surface,mainf,left,frame+40,white,
  1809. "OV : %d",check_OV());
  1810. textprintf (surface,mainf,left,frame+50,white,
  1811. "P : %d",check_P());
  1812. textprintf (surface,mainf,left,frame+60,red,
  1813. "PC : %4x",PC);
  1814. textprintf (surface,mainf,left,frame+70,lblue,
  1815. "SP : %2x",*SP);
  1816. textprintf (surface,mainf,left,frame+80,lblue,
  1817. "Acc: %2x",*Acc);
  1818. textprintf (surface,mainf,left,frame+90,lblue,
  1819. "B : %2x",*B);
  1820. textprintf (surface,mainf,left,frame+100,lblue,
  1821. "R0 : %2x",R[0]);
  1822. textprintf (surface,mainf,left,frame+110,lblue,
  1823. "R1 : %2x",R[1]);
  1824. textprintf (surface,mainf,left,frame+120,lblue,
  1825. "R2 : %2x",R[2]);
  1826. textprintf (surface,mainf,left,frame+130,lblue,
  1827. "R3 : %2x",R[3]);
  1828. textprintf (surface,mainf,left,frame+140,lblue,
  1829. "R4 : %2x",R[4]);
  1830. textprintf (surface,mainf,left,frame+150,lblue,
  1831. "R5 : %2x",R[5]);
  1832. textprintf (surface,mainf,left,frame+160,lblue,
  1833. "R6 : %2x",R[6]);
  1834. textprintf (surface,mainf,left,frame+170,lblue,
  1835. "R7 : %2x",R[7]);
  1836. textprintf (surface,mainf,left,frame+180,lblue,
  1837. "DPTR: %4x",*DPTR);
  1838. textprintf (surface,mainf,left,frame+270,red,
  1839. "cycles :");
  1840. textprintf (surface,mainf,left,frame+280,red,
  1841. "%lld",c_time);
  1842. hline (surface,frame,surface->h-frame,surface->w-frame,white);
  1843. vline (surface,frame,frame,surface->h-frame,white);
  1844. vline (surface,surface->w-frame,frame,surface->h-frame,white);
  1845. for (int c=frame;c<=frame+10;c+=2)
  1846. {
  1847. hline (surface,frame,c,surface->w-frame,white);
  1848. }
  1849. textprintf_centre (surface,mainf,surface->w/2,frame+2,white," RegFlag ");
  1850. }
  1851. void flags::blit_it (int x,int y)
  1852. {
  1853. blit(surface,buf,0,0,x,y,surface->w,surface->h);
  1854. }
  1855. class ramv
  1856. {
  1857. private:
  1858. void hexoutB(int,int,int color,BYTE numb); //x,y,color,byte
  1859. public:
  1860. int frame;
  1861. int left;
  1862. bool changed;
  1863. BYTE *ram;
  1864. BYTE reg[25];
  1865. char reg_label[25][10];
  1866. BITMAP *surface, *buf;
  1867. void draw (WORD);
  1868. void blit_it (int, int);
  1869. ramv (BYTE*, BITMAP*);
  1870. ~ramv ();
  1871. };
  1872. ramv::ramv (BYTE *tmpB, BITMAP *tmpBMP) // extram, screen
  1873. {
  1874. frame=2;
  1875. left=12;
  1876. changed=true;
  1877. ram = tmpB;
  1878. buf = tmpBMP;
  1879. surface=create_bitmap(500,200);
  1880. clear (surface);
  1881. }
  1882. ramv::~ramv ()
  1883. {
  1884. }
  1885. void ramv::blit_it (int x, int y)
  1886. {
  1887. blit(surface,buf,0,0,x,y,surface->w,surface->h);
  1888. }
  1889. void ramv::draw (WORD cur)
  1890. {
  1891. int red = makecol(255,0,0);
  1892. int white = makecol(255,255,255);
  1893. int lgreen = makecol(128,255,128);
  1894. int green = makecol(0,255,0);
  1895. int lblue = makecol(0,128,255);
  1896. int yellow = makecol (255,255,0);
  1897. clear (surface);
  1898. int c2=0, c;
  1899. int y;
  1900. y=frame+20;
  1901. int curcol=white;
  1902. for (c=cur;true;c+=8)
  1903. {
  1904. if (!(y<surface->h-10)) break;
  1905. textprintf (surface,mainf,left,y,lblue,"%4X: ",(WORD)(c));
  1906. for (c2=0;c2<8;c2++)
  1907. {
  1908. if (PC==(WORD)(c+c2))
  1909. {
  1910. curcol=red;
  1911. draw_SEG_digit (surface,left+326+c2*8,y, yellow,3,ram[(WORD)(c+c2)]);
  1912. } else if (*DPTR==(WORD)(c+c2))
  1913. {
  1914. curcol=lgreen;
  1915. draw_SEG_digit (surface,left+326+c2*8,y, yellow,3,ram[(WORD)(c+c2)]);
  1916. } else
  1917. {
  1918. curcol=white;
  1919. draw_SEG_digit (surface,left+326+c2*8,y, green,3,ram[(WORD)(c+c2)]);
  1920. }
  1921. hexoutB (left+48+c2*24,y,curcol,ram[(WORD)(c+c2)]);
  1922. textprintf (surface,font,left+252+c2*8,y,curcol,"%c",ram[(WORD)(c+c2)]);
  1923. }
  1924. y+=10;
  1925. }
  1926. hline (surface,frame,surface->h-frame,surface->w-frame,white);
  1927. vline (surface,frame,frame,surface->h-frame,white);
  1928. vline (surface,surface->w-frame,frame,surface->h-frame,white);
  1929. for (c=frame;c<=frame+10;c+=2)
  1930. {
  1931. hline (surface,frame,c,surface->w-frame,white);
  1932. }
  1933. textprintf_centre (surface,mainf,surface->w/2,frame+2,white," RAM Monitor ");
  1934. }
  1935. void ramv::hexoutB (int x,int y,int color,BYTE numb)
  1936. {
  1937. if (numb>0x10)
  1938. {
  1939. textprintf (surface,mainf,x,y,color,"%2x",numb);
  1940. } else
  1941. {
  1942. textprintf (surface,mainf,x,y,color,"%2x",numb);
  1943. textprintf (surface,mainf,x,y,color,"0");
  1944. }
  1945. }
  1946. /*bool vret (void)
  1947. {
  1948. if (inportb(0x3da) & 8) return true;
  1949. else return false;
  1950. }*/
  1951. void wait_for_retrace (void)
  1952. {
  1953. /*while (!vret())
  1954. {
  1955. }*/
  1956. //vsync();
  1957. }
  1958. int load_code_table (code_51 *tmp_tab)
  1959. {
  1960. FILE *strio;
  1961. char _mnem[6];
  1962. int _code;
  1963. int _lenght;
  1964. int _cycles;
  1965. char _datas[12];
  1966. if ( (strio = fopen ( "list51.txt" , "r" )) == NULL )
  1967. {
  1968. fprintf(stderr,"Can't find file list51.txt !!!!\n");
  1969. exit(-1);
  1970. }
  1971. for (int c=0;c<256;c++)
  1972. {
  1973. fscanf (strio,"%x",&_code);
  1974. fscanf (strio,"%s",_mnem);
  1975. fscanf (strio,"%s",_datas);
  1976. fscanf (strio,"%d",&_lenght);
  1977. fscanf (strio,"%d",&_cycles);
  1978. if (_mnem[0]=='E' && _mnem[1]=='N' && _mnem[2]=='D') break;
  1979. tmp_tab[_code].code=(BYTE)_code;
  1980. strcpy (tmp_tab[_code].mnem,_mnem);
  1981. strcpy (tmp_tab[_code].datas,_datas);
  1982. tmp_tab[_code].lenght=(BYTE)_lenght;
  1983. tmp_tab[_code].cycles=(BYTE)_cycles;
  1984. }
  1985. fclose (strio);
  1986. return 0;
  1987. }
  1988. int load_ram (char *filename,BYTE *ram)
  1989. {
  1990. FILE *strin;
  1991. strin=NULL;
  1992. if (*filename!=0)
  1993. {
  1994. strin = fopen (filename,"rb");
  1995. }
  1996. if ( strin == NULL)
  1997. {
  1998. ShowMessage ("Can't open the file",screen,250,100,200,100,"Error!");
  1999. } else {
  2000. WORD c=0;
  2001. for (c;!feof(strin);c++)
  2002. ram[c]=fgetc(strin);
  2003. fclose (strin);
  2004. }
  2005. return 0;
  2006. }
  2007. int load_hex (char *filename,BYTE *ram)
  2008. {
  2009. FILE *strin;
  2010. int Adr=0;
  2011. int Cnt;
  2012. //int to_mem;
  2013. int i;
  2014. char line[50];
  2015. char word[5];
  2016. char byte[3];
  2017. byte[2]=word[4]=0;
  2018. strin=NULL;
  2019. if (*filename != 0) strin = fopen (filename,"r");
  2020. if ( strin == NULL)
  2021. {
  2022. ShowMessage ("Can't open the file",screen,250,100,200,100,"Error!");
  2023. return -1;
  2024. } else {
  2025. while (!feof(strin))
  2026. {
  2027. fscanf (strin, "%s", line);
  2028. //fprintf (out,"%s\n", line);
  2029. byte[0]=line[1];
  2030. byte[1]=line[2];
  2031. sscanf (byte,"%x",&Cnt);
  2032. word[0]=line[3];
  2033. word[1]=line[4];
  2034. word[2]=line[5];
  2035. word[3]=line[6];
  2036. sscanf (word,"%x",&Adr);
  2037. byte[0]=line[7];
  2038. byte[1]=line[8];
  2039. sscanf (byte,"%x",&i);
  2040. if (i==1) break;
  2041. else
  2042. {
  2043. byte[2]=0;
  2044. for (i=9;i<9+Cnt*2;i+=2)
  2045. {
  2046. byte[0]=line[i];
  2047. byte[1]=line[i+1];
  2048. sscanf (byte, "%x", (ram+Adr));
  2049. Adr++;
  2050. }
  2051. }
  2052. }
  2053. fclose (strin);
  2054. //fclose (out);
  2055. }
  2056. return 0;
  2057. }
  2058. void
  2059. ChangeMonitedSFRRegister
  2060. (regs* regwnd)
  2061. {
  2062. char lab[10];
  2063. char ln[3];
  2064. int line_num=0;
  2065. int reg_adr=0;
  2066. GetText (ln,screen,50,50,300,70,3,"Enter line number (dec)");
  2067. sscanf (ln,"%d", &line_num);
  2068. if (line_num<1 || line_num>25) return;
  2069. GetText (lab,screen,50,80,300,70,10,"Enter reg. label (ascii)");
  2070. GetText (ln,screen,50,100,300,70,3,"Enter register number (hex)");
  2071. sscanf (ln,"%x", &reg_adr);
  2072. line_num--;
  2073. strcpy (regwnd->reg_label[line_num], lab);
  2074. regwnd->reg [line_num] = (BYTE)reg_adr;
  2075. return;
  2076. }
  2077. void reset51 (void)
  2078. {
  2079. if (QuestionBox("Are you sure want to reset 8051",screen,250,240,300,60,"Confirm!",makecol(255,255,255)))
  2080. init_8051();
  2081. return;
  2082. }
  2083. WORD ViewAt (void)
  2084. {
  2085. char hex4[6];
  2086. int tmp_adr;
  2087. GetText (hex4,screen,50,80,300,70,5,"Enter new view point (hex)");
  2088. if (hex4[0]==32) return 0;
  2089. sscanf (hex4,"%x",&tmp_adr);
  2090. return (WORD) tmp_adr;
  2091. }
  2092. void ChangePC (void)
  2093. {
  2094. char hex4[5];
  2095. int tmpPC=0;
  2096. GetText (hex4,screen,50,80,300,70,5,"Enter new PC (hex)");
  2097. if (hex4[0]==32) return;
  2098. sscanf (hex4,"%x",&tmpPC);
  2099. PC=(WORD)tmpPC;
  2100. return;
  2101. }
  2102. void ChangeRegValue_SFR (void)
  2103. {
  2104. char hex2[3];
  2105. char hex2_a[3];
  2106. int tmp_adr;
  2107. int tmp_dat;
  2108. GetText (hex2_a,screen,50,80,300,70,3,"Enter adress from SFR (hex)");
  2109. if (hex2_a[0]==32) return;
  2110. GetText (hex2,screen,60,90,300,70,3,"Enter byte (hex)");
  2111. sscanf (hex2_a,"%x",&tmp_adr);
  2112. sscanf (hex2,"%x",&tmp_dat);
  2113. SFR [(BYTE) tmp_adr] = (BYTE) tmp_dat;
  2114. return;
  2115. }
  2116. void ChangeRegValue_RAM (void)
  2117. {
  2118. char hex2[3];
  2119. char hex4_a[5];
  2120. int tmp_adr;
  2121. int tmp_dat;
  2122. GetText (hex4_a,screen,50,80,400,70,5,"Enter adress from External Memory (hex)");
  2123. if (hex4_a[0]==32) return;
  2124. GetText (hex2,screen,60,90,300,70,3,"Enter byte (hex)");
  2125. sscanf (hex4_a,"%x",&tmp_adr);
  2126. sscanf (hex2,"%x",&tmp_dat);
  2127. EXT_RAM [(WORD) tmp_adr] = (BYTE) tmp_dat;
  2128. return;
  2129. }
  2130. void LoadRAM (void)
  2131. {
  2132. char filename[40];
  2133. GetText (filename,screen,30,80,700,70,40,"Load *.bin file");
  2134. for (int c=38;filename[c]==' ' || filename[c]=='\r';c--)
  2135. {
  2136. filename[c]=0;
  2137. }
  2138. load_ram (filename,EXT_RAM);
  2139. return;
  2140. }
  2141. void LoadHEX (void)
  2142. {
  2143. char filename[40];
  2144. GetText (filename,screen,30,80,700,70,40,"Load *.hex file");
  2145. for (int c=38;filename[c]==' ' || filename[c]=='\r';c--) filename[c]=0;
  2146. load_hex (filename,EXT_RAM);
  2147. return;
  2148. }
  2149. void LoadSrc (void)
  2150. {
  2151. char cmd[256];
  2152. char filename[256];
  2153. char comp_msg[512];
  2154. FILE *msgin;
  2155. int c=0;
  2156. GetText (filename,screen,30,80,700,70,40,"Load and compile source file (*.*)");
  2157. sprintf (cmd,"asm51.exe %s > out.tmp",filename);
  2158. system (cmd);
  2159. msgin=NULL;
  2160. msgin = fopen ("out.tmp","rb");
  2161. if ( msgin == NULL)
  2162. {
  2163. ShowMessage ("Can't open the file: out.tmp",screen,250,100,200,100,"Error!");
  2164. } else {
  2165. for (c;c<=0xffff;c++)
  2166. {
  2167. comp_msg[c]=fgetc(msgin);
  2168. if (feof(msgin)) break;
  2169. }
  2170. fclose (msgin);
  2171. }
  2172. ShowMsgEx(comp_msg,screen,100,80,600,140,"Assembling status",makecol(255,255,255));
  2173. for (c=512;c>0;c--)
  2174. {
  2175. if (comp_msg[c]==',' && comp_msg[c+2]=='0')
  2176. {
  2177. change_ext (filename);
  2178. if (load_hex (filename,EXT_RAM)==0) ShowMessage ("Compiled file is loaded.",screen,250,100,300,80,"Message!");
  2179. break;
  2180. }
  2181. }
  2182. return;
  2183. }
  2184. void EditSrc (void)
  2185. {
  2186. code_editor ed1;
  2187. ed1.process();
  2188. return;
  2189. }
  2190. void ChMaxI (int *maxi)
  2191. {
  2192. char dec6_a[7];
  2193. GetText (dec6_a,screen,50,80,400,70,7,"Enter number of instructions per frame");
  2194. if (dec6_a[0]==32) return;
  2195. sscanf (dec6_a,"%d",maxi);
  2196. return;
  2197. }
  2198. void FillExt (void)
  2199. {
  2200. char h4beg[5], h4end[5], h2f[3];
  2201. int from, to, i, ic=1, fill;
  2202. GetText (h4beg,screen,50,80,400,70,5,"From adress... (16bit hex)");
  2203. GetText (h4end,screen,50,80,400,70,5,"...to adress (16bit hex)");
  2204. GetText (h2f,screen,50,80,400,70,3,"with byte (8bit hex)");
  2205. sscanf (h4beg,"%x",&from);
  2206. sscanf (h4end,"%x",&to);
  2207. sscanf (h2f,"%x",&fill);
  2208. if (from>to) ic=-1;
  2209. for (i=from;i!=to;i+=ic)
  2210. EXT_RAM[i]=fill;
  2211. EXT_RAM[to]=fill;
  2212. return;
  2213. }
  2214. void main_init (void)
  2215. {
  2216. load_code_table (asm51);
  2217. //load_ram ("lekcja3.bin",EXT_RAM);
  2218. //load_ram ("avt.bin",EXT_RAM);
  2219. init_8051();
  2220. allegro_init();
  2221. install_timer();
  2222. install_keyboard();
  2223. //install_mouse();
  2224. set_color_depth (8);
  2225. set_gfx_mode (GFX_AUTODETECT_WINDOWED, 800, 600,0,0);
  2226. //set_gfx_mode (GFX_AUTODETECT, 800, 600,0,0);
  2227. set_palette (desktop_palette);
  2228. //show_mouse (screen);
  2229. RGB col;
  2230. col.r=0;
  2231. col.g=0;
  2232. col.b=0;
  2233. set_color (0,&col);
  2234. col.r=63;
  2235. col.g=15;
  2236. col.b=0;
  2237. set_color (1,&col);
  2238. col.r=20;
  2239. col.g=0;
  2240. col.b=0;
  2241. set_color (2,&col);
  2242. col.r=255;
  2243. col.g=255;
  2244. col.b=255;
  2245. set_color (255,&col);
  2246. DATAFILE *dataf;
  2247. dataf=load_datafile("data.dat");
  2248. mainf=(FONT*) dataf[0].dat;
  2249. }
  2250. int main (void)
  2251. {
  2252. main_init();
  2253. int white,red,lred,green,blue;
  2254. white=makecol (255,255,255);
  2255. red=makecol (255,0,0);
  2256. lred=makecol (255,64,0);
  2257. green=makecol (0,255,0);
  2258. blue=makecol (0,0,255);
  2259. dis_asm disasm(EXT_RAM,screen);
  2260. regs SFRregs(SFR,screen);
  2261. flags FlagWnd (screen);
  2262. ramv RMon (EXT_RAM,screen);
  2263. strcpy(SFRregs.reg_label[0],"Delay AVT");
  2264. SFRregs.reg[0]=0x75;
  2265. strcpy(SFRregs.reg_label[1],"Key AVT ");
  2266. SFRregs.reg[1]=0x76;
  2267. strcpy(SFRregs.reg_label[2],"B ");
  2268. SFRregs.reg[2]=0xF0;
  2269. strcpy(SFRregs.reg_label[3],"Acc ");
  2270. SFRregs.reg[3]=0xE0;
  2271. strcpy(SFRregs.reg_label[4],"PSW ");
  2272. SFRregs.reg[4]=0xD0;
  2273. strcpy(SFRregs.reg_label[5],"P0 ");
  2274. SFRregs.reg[5]=0x80;
  2275. strcpy(SFRregs.reg_label[6],"P1 ");
  2276. SFRregs.reg[6]=0x90;
  2277. strcpy(SFRregs.reg_label[7],"P2 ");
  2278. SFRregs.reg[7]=0xa0;
  2279. strcpy(SFRregs.reg_label[8],"P3 ");
  2280. SFRregs.reg[8]=0xb0;
  2281. strcpy(SFRregs.reg_label[9],"IP ");
  2282. SFRregs.reg[9]=0xB8;
  2283. strcpy(SFRregs.reg_label[10],"IE ");
  2284. SFRregs.reg[10]=0xA8;
  2285. strcpy(SFRregs.reg_label[11],"SCON ");
  2286. SFRregs.reg[11]=0x98;
  2287. strcpy(SFRregs.reg_label[12],"SBUF ");
  2288. SFRregs.reg[12]=0x99;
  2289. strcpy(SFRregs.reg_label[13],"TCON ");
  2290. SFRregs.reg[13]=0x88;
  2291. strcpy(SFRregs.reg_label[14],"TMOD ");
  2292. SFRregs.reg[14]=0x89;
  2293. strcpy(SFRregs.reg_label[15],"TL0 ");
  2294. SFRregs.reg[15]=0x8A;
  2295. strcpy(SFRregs.reg_label[16],"TL1 ");
  2296. SFRregs.reg[16]=0x8B;
  2297. strcpy(SFRregs.reg_label[17],"TH0 ");
  2298. SFRregs.reg[17]=0x8C;
  2299. strcpy(SFRregs.reg_label[18],"TH1 ");
  2300. SFRregs.reg[18]=0x8D;
  2301. strcpy(SFRregs.reg_label[19],"SP ");
  2302. SFRregs.reg[19]=0x81;
  2303. strcpy(SFRregs.reg_label[20],"DPL ");
  2304. SFRregs.reg[20]=0x82;
  2305. strcpy(SFRregs.reg_label[21],"DPH ");
  2306. SFRregs.reg[21]=0x83;
  2307. strcpy(SFRregs.reg_label[22],"PCON ");
  2308. SFRregs.reg[22]=0x87;
  2309. strcpy(SFRregs.reg_label[23],"1 ");
  2310. SFRregs.reg[23]=0x09;
  2311. strcpy(SFRregs.reg_label[24],"0 ");
  2312. SFRregs.reg[24]=0x08;
  2313. PC=0x0000;
  2314. WORD aadr=0x0000;
  2315. WORD madr=0x0000;
  2316. bool manual_scrolling=true;
  2317. bool step=true;
  2318. bool into=false;
  2319. bool over=false;
  2320. unsigned long cnt=0;
  2321. int break_point=-1; char break_str[5];
  2322. //load_ram("avt.bin",EXT_RAM);
  2323. int i=0,maxi=45000;
  2324. while (!(key[KEY_X] && key[KEY_ALT]))
  2325. {
  2326. rect (screen,2,2,798,18,white);
  2327. // key shortcuts disp
  2328. rect (screen,2,521,798,598,white);
  2329. textprintf (screen,mainf,128,528,white,
  2330. "F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12" );
  2331. textprintf (screen,mainf,128,548,white,
  2332. "Help ChSFR ManS Debug DView WrPC TInto SOver SrcEd FillE Speed Reset");
  2333. textprintf (screen,mainf,128,568,white,
  2334. "WrRAM WrSFR AutoS Run MView LdBIN LdHEX ScrCpl BrkPt");
  2335. hline (screen,2,540,798,white);
  2336. textprintf (screen,mainf,6,548,white,"Function key :");
  2337. hline (screen,2,560,798,white);
  2338. textprintf (screen,mainf,6,568,white,"Shift+key :");
  2339. hline (screen,2,580,798,white);
  2340. textprintf (screen,mainf,6,587,white,"Alt+X: Exit ");
  2341. textout (screen, mainf, "emu51 v0.02a alpha (Mariusz Kasolik Changes:Trapier Manoel)",6,7,white);
  2342. textout (screen, mainf, "AVT-2250 Segment display:",490,7,white);
  2343. cnt++;
  2344. if (manual_scrolling)
  2345. {
  2346. disasm.draw (aadr);
  2347. } else {
  2348. disasm.draw (PC);
  2349. }
  2350. disasm.blit_it (0, 20);
  2351. RMon.draw (madr);
  2352. RMon.blit_it(300,320);
  2353. SFRregs.draw ();
  2354. SFRregs.blit_it (400, 20);
  2355. FlagWnd.draw ();
  2356. FlagWnd.blit_it (300,20);
  2357. if (!step)
  2358. {
  2359. for (i=0;i<maxi;i++)
  2360. {
  2361. if (PC==break_point || *SP==0)
  2362. {
  2363. step=true;
  2364. break;
  2365. }
  2366. asm51[EXT_RAM[PC]].process();
  2367. }
  2368. }
  2369. else {
  2370. if (over)
  2371. {
  2372. asm51[EXT_RAM[PC]].process();
  2373. over=false;
  2374. }
  2375. if (into)
  2376. {
  2377. asm51[EXT_RAM[PC]].process();
  2378. into=false;
  2379. }
  2380. }
  2381. for (i=0;i<=7;i++) // for compatibility with avt2250
  2382. draw_SEG_digit (screen,700+8*i,6,lred,4,SFR[i+0x78]);
  2383. if (key[KEY_LCONTROL])
  2384. {
  2385. if (key[KEY_0_PAD]) SFR[0x76]=0x30;
  2386. if (key[KEY_1_PAD]) SFR[0x76]=0x31;
  2387. if (key[KEY_2_PAD]) SFR[0x76]=0x32;
  2388. if (key[KEY_3_PAD]) SFR[0x76]=0x33;
  2389. if (key[KEY_4_PAD]) SFR[0x76]=0x34;
  2390. if (key[KEY_5_PAD]) SFR[0x76]=0x35;
  2391. if (key[KEY_6_PAD]) SFR[0x76]=0x36;
  2392. if (key[KEY_7_PAD]) SFR[0x76]=0x37;
  2393. if (key[KEY_8_PAD]) SFR[0x76]=0x38;
  2394. if (key[KEY_9_PAD]) SFR[0x76]=0x39;
  2395. if (key[KEY_INSERT]) SFR[0x76]=0x41;
  2396. if (key[KEY_HOME]) SFR[0x76]=0x42;
  2397. if (key[KEY_PGUP]) SFR[0x76]=0x43;
  2398. if (key[KEY_DEL]) SFR[0x76]=0x44;
  2399. if (key[KEY_END]) SFR[0x76]=0x45;
  2400. if (key[KEY_PGDN]) SFR[0x76]=0x46;
  2401. if (key[KEY_ENTER_PAD]) SFR[0x76]=0x0d;
  2402. } else
  2403. {
  2404. if (key[KEY_UP]) aadr-=3;
  2405. if (key[KEY_DOWN])
  2406. {
  2407. aadr+=get_lenght(EXT_RAM[aadr]);
  2408. aadr+=get_lenght(EXT_RAM[aadr]);
  2409. }
  2410. if (key[KEY_PGUP] && !(key[KEY_LSHIFT] || key[KEY_RSHIFT])) madr-=16;
  2411. if (key[KEY_PGDN] && !(key[KEY_LSHIFT] || key[KEY_RSHIFT])) madr+=16;
  2412. if (key[KEY_PGUP] && (key[KEY_LSHIFT] || key[KEY_RSHIFT])) madr-=1;
  2413. if (key[KEY_PGDN] && (key[KEY_LSHIFT] || key[KEY_RSHIFT])) madr+=1;
  2414. if (!(key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F2]) ChangeMonitedSFRRegister(&SFRregs);
  2415. if ((key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F2]) ChangeRegValue_SFR();
  2416. if ((key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F1]) ChangeRegValue_RAM();
  2417. if (!(key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F3]) manual_scrolling=true;
  2418. if ((key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F3]) manual_scrolling=false;
  2419. if (!(key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F4]) step=true;
  2420. if ((key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F4]) step=false;
  2421. if (step)
  2422. {
  2423. if (!(key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F7]) into=true;
  2424. while (!(key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F7])
  2425. {
  2426. }
  2427. if (!(key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F8]) over=true;
  2428. while (!(key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F8])
  2429. {
  2430. }
  2431. }
  2432. if (!(key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F5]) aadr=ViewAt();
  2433. if ((key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F5]) madr=ViewAt();
  2434. if (!(key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F6]) ChangePC();
  2435. if ((key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F7]) LoadRAM();
  2436. if ((key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F8]) LoadHEX();
  2437. if ((key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F9]) LoadSrc();
  2438. if (!(key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F9]) EditSrc();
  2439. if (!(key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F12]) reset51();
  2440. if (!(key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F11]) ChMaxI(&maxi);
  2441. if (!(key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F10]) FillExt();
  2442. if ((key[KEY_LSHIFT] || key[KEY_RSHIFT]) && key[KEY_F10])
  2443. {
  2444. GetText (break_str,screen,50,80,400,70,5,"Enter break piont adress");
  2445. sscanf (break_str,"%x",&break_point);
  2446. }
  2447. }
  2448. }
  2449. return 0;
  2450. } END_OF_MAIN();