From 99b540bd7557a01b8d8d092d3afaa2a3d7435fd5 Mon Sep 17 00:00:00 2001 From: ArthurFerreira2 Date: Mon, 25 Mar 2019 23:30:20 +0100 Subject: [PATCH] Add files via upload --- Makefile | 2 +- README.md | 15 ++++---- appleII+.rom | Bin 0 -> 12288 bytes appleII.rom | Bin 0 -> 12288 bytes reinette-II | Bin 0 -> 44872 bytes reinette-II.c | 92 ++++++++++++++++++++++---------------------------- 6 files changed, 47 insertions(+), 62 deletions(-) create mode 100644 appleII+.rom create mode 100644 appleII.rom create mode 100644 reinette-II diff --git a/Makefile b/Makefile index 3c5719d..3cc6685 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ all:reinette-II reinette-II:reinette-II.c - gcc -Wall -O3 reinette-II.c -o reinette-II -lncurses + gcc -Wall -Werror -O3 reinette-II.c -o reinette-II -lncurses diff --git a/README.md b/README.md index 6922d47..eb04e50 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,18 @@ # reinette-II The french Apple II emulator -A simple Apple II emulator in about 600 lines of code ! +A simple Apple II emulator in less 600 lines of C ! Based on reinette, the french Apple 1 emulator ( https://github.com/ArthurFerreira2/reinette ) -Only supports text, page 1 - No sound, no joystick, no card support and thus no disk support +Very limited hardware support : only supports text, page 1 -Runs Applesoft II and monitor from ROM +runs either the original Apple II ROM with Interger Basic and the Programmers Aid at $D000 or the later Applesoft II ROM : just change the filename at line 548. -Requires ncurses. To be run in a terminal at least 41x26 -- F9 : reset -- F10 : break +Requires ncurses. Meant to be run in a terminal at least 41x25 + +- F7 : reset - F12 : exit -Uncomment lines 566-567 to display some debug info - -Comment line 569 to go full speed Have fun ! diff --git a/appleII+.rom b/appleII+.rom new file mode 100644 index 0000000000000000000000000000000000000000..cb94b9f045b776a6529567d5178c3c8d26c4641f GIT binary patch literal 12288 zcmbVydwf$x+VIJxS1t_~AtLGsrLG< zDBqqc)j~-*jhT=WT1;7ex5ce*-K90@DjuLf%e7pZrY*vu+zO@SdnVO=_xt_6zrI3d z=FH4_=D9!5%$#-Y=HmmWwsq8iKjcp zboe_=?bkJ^V|B;Lj#u0JI<|EC+rMZZd*SWwwiD&;u49&CyH1*p34K#9ebE=soH;+X z?T54B^II?Py^`J&ccu5r)hlz9DrH6Yv0(FsnC`CNqTq``Td*wnR#W#|QujNXdfwrC z-~IG*ZsFNQ*=LJ?yj=X*nH4L}8nX{9$~l~Ee7-Fsz3|)2?A)bo8OHB3GJnW7rXN^* zxDW<%^FPnb{(NCN`+Y8((`I5b4?YV&)8hPnrp1R%3v<|<{6-TU%E(VY{yZ&Ah3Wq= zA}nvm_i5Ki*pK= z{v+R5xHSJ@zVQd>lXDI}m!8>1Q7A}%wmHMtlAH6}=G^?u?6!qD*==lQLEA#sn0|P% zu`SzpyfA%%r|`!`2Mcl+dJ0X(gXwMAIc)`nMtM)I_lq;>*#~kCf7AH)g2e~n_4EZt zmKGdd1lTOh&-UbIe4m?hq#*Bbe)a)2=R4!`@>Dki@5%9S%GkaO=I7_+$1o@}8!@96fY$vshS?v2zebfRut|P|*yQ*|wF=`#jSAaNYgBR! z!Kc+KCC09|jP=Ux9J+7>ziM5ZMn3JT#6=$RS=UZ)s6v@aK27T?!k_vyEuW>4ZP482 zi)|?vv~{1BZ7Y>;)2ijOmhx7)pNqHr+V>*n&B-+7iaAf!H)s*=6zgG@+K4^yVT# z)3QuoS5(IN<=eq!!Iyx(T1Ks;kvCi$@H*>y0QIRk0dI4ywtgn4{MK^x$q|z4%G-KR z^-)+wUUjX-7VBzPLc^e{w5(DdK;~m)m5awk)@6D?rbr$E5WXO*v5%eGCTjiAGw81{ z7kNddtcWbLF#fV4TM=F+9Cnu2euY*KbzTwF&MOk*VAOVHL}OT$QtSw;TICxO;|z-` z4vid2Ddybut)kXCF7cQymgiwj_VDpgBco0nw_Y1S%5^+CFh$w0eo0`ytd;i5#(+W4 z2IdM+TWcj5JER|RmB?5VN^SM6epwx?qOZbh18G+s%H=?boF0`BXqHDcs?>pO<%vL! zVvw3$wIToZK^4%c{3fkuj-m}@%4$3=t>;g&4UYx@%Gu`8%1JsWBrERvU_zZE0z6*0 zS?7=)FhlqC_90bEgA~T~99iY&MHQ~J?X0U*9`^f5-l0lCuV_l;IFefm?U71+X=kr4V)0K#0CODP^#QTm1)v3^fyM){oG{*&4XUKmFG!r zRGu6S=;z`*s%T0EdcGah)DL*VuQ^ZFUd&b0zL{2x5`U7A3#Sx=dXvP!BSH+!lcI1U z%#$DV48LHj#5?8xl19NCkY9vZbq-GVeOgbk*NR2i>JWdlR*B(OB?hG)*9{tON(kmc z+Ykk{d=m-@$rVxw9*-8CK;|QIl--ix-NExx96ELcecqw3FxQ(%gM~4XjVAJ@N%|Hw zok6QlqgAJgGp=}A6|R!L5RX%JWziXFoY;eI_X7EW@8oDo_^Q)rb050z46&IAHc6XI z`)vb2G^uwrxHpCrEq=@Tw#d}g%g>4Gx_Z6xgukvHze$UYurjU})WL?te%*LFIYF8V z2)o}T8-Y9Mxsw!raywA2ELUdsln7%2&-lj2dm2=-sezGAY#qZcIuV$o{5KmolSWqc zs9d~HRf^xWzQ@%vO@S>67(>BPXZUBA643ZmdU@_IsEwqkkvCl%@gJ>!0*3rSJR)e= z$J)RQ<%!P2uD4|kJGPCyg~7d$Kf3;e-?VPz(#RKGt8gyyb@4b4DedTodq~y6LJ94m zd!RSwTx=n{IS;QU`S=(NLN{2Uh6Nk!Zvz*`;JMbPrF=ZkI^TK>)Es;PbPx+DC3JDI zEgO?zW%Dt#<{0~Ahok{Hkp>e1DGdwAX9D)4c^$wPs*LUqvavbOH=-iVT<>lWVnRMG zH68TOG2tOn*`oq2-r2)|7K4R^F$Nvj5%4J^oD))=F9LnQI-YM@pge`&|_ zA`UqUP*eT}ojwf<*e185fuISN)&};-AGB1J~Z;2$Plp%`$=^f=Gf_dJm{m?yk3|n$CN^2oiN%}ePFc^D~}># zv&9!fL{~NYw-cbdB0743eB|1S_gHICTbJYj5q@Odik=L@;70)R-vx)BJ_!UXiAqYK zN%>9SpP=u7RJ}4e@D#X$cTOjcF`PzE{DitMus@!Nn002D1MAldQDFV@BNknXf)j=N zW6_OZAVtxDaFT_XR(n^X5akWEMl6m!egaHG?gt=<2||UY-h|@4lO5GY(q12-g z90M9z$G+SS{cP${_q(q5q>5BFh zWz;m3$+3oF3jEZ`$do!Jag6RUm=qVX)dRdy%1As4!dQ$n2al3c^>{ReYGEJ>qn|FI zr@PTRC)n3dnP|8+@F?pN8H-*%LFE$z3a4RTI~l{sZUGwjuq9J93@a`erJ{8*ie(4Q)a0Ot z0$;noF;0b@1iNhLn{G6{4?4f>+n+WRr&1<1CaCb6jXD+H*fW~RH-KBPTgG^I z04)%&u2KUFp90;}C#He=X?z;aH{|>rEZYYrY$!?NVG#+qgfUh6Gt7$zy z3KPL$jti(}WU7oGG=Ctx1Os4g6{p=F$f>?}EHT0#&0}N@`&kzR$)b33k%#ZtC;L`G z@GzmF)4c0_-9)eQth{W|82gN0784)9AIQh)Jd@DT@Fh6%zse@0J3~HTZKpvKiSwI% zvInxGU=fd(RhYnZNwtZHCbG*!s!YUTT2sV`VP2UUSOM%?ecJjypM@vznDE%m zRkT*S$0$+Y(`q>PSRJ^}IuUXJ(PL-(&$AFhK`xiB+Fc5IZNP(67ufnUf#XU~yvYkA zoj(d_cpXqiwB|JL9cF^v1U{7a*iG#GvuNKL-qUdEM_kr$`bYdR5*T*%X+okLkWdmu z8zF#66;(h0_(9(|;)Q7L#%_s-4BFS{WqoHUb6P$CFM=JmD(f!daY;xUw0W$OH?7N| z#7Zhb>vllYaEjrOzg3QLI}HhXVPu`>P?d7U8TP52s*rugv130yLcC>wW^jS;b_ydX`NANbcQcR} z$)(1~y1+Df92swDfjnkx)F!;i9#=x=**2#|jqjn+@}YBy;|=Qdw}7JY#Nu8pGPa$# z^5PoUcf6uZA)5|W%CTg#|4^l}rc_TVL3huEfx3=19NrK-G9C412 zm_%J}EU&kyypWYsCfUm>QSEtKE#B)YYDth!nah2Dz~vshd7Gf|EBQZfLnS7-*Hx=T zm6mOj2V2Tp_R2Scs>=D^#Oglxx- zw}1z-E8DTvU$@0ns=MQ|qDT9Np}}Z94C032B|s&I-vez@sKpLvh9bk4*?Ir}{o`N} z@F~Ck36khAM76PQNS$mnL(0EM{R(z)&M7uX8)*VXNf*QZx;@Is=242ad9-{DLbytA zbyS%5;97T$pbFXck{U%DP|G7KAoX(Zan+#nUGDtOB00+W-@qZ_C}&7jxr*#6SA(U4 zt1Y#Tu@%smna?d6XUYtxnb*12!(QOPT44mkGaki6<%OZS}8QYV9pY|EPSl_)f|OSvV*;J;AMLOXxpkl^^5SvK8ULNXmo*#+-KDE08k z^0))*<%Emt(cBby84Se)OZ!397g1fEC+bNT`grzTYpglAkt z4Z%YnRlxDoN8Sp^Z_w#T4i8AeUjN@5ssP-F=jyM1lo@8ZAVj-r>OoVKXc~J5f&i!0 zZqhrMs~`F5GsDf*!e2?X?+fZ&A=M~@y^oj2AMtoADTDI^@CeF-96A-GQE;e>8oP%+ zDiP{D(93Q=H|+9J>^Zjx2O+S_U|NHq!r?27V^#uJ;a#_iGa~d(<=7cZlr{S zxzG)07xcMnY#%!bAs*!*O&k)1u~vu6YlSx~;3KUcI~_FLwble~8@}_9nrBrgrYCWa z?m5xXNffn6(lW#5k8w?dmbszD)eRcvh6albYUYL-?`lvnH&nRFr$JRAh=F={m7L|? zWvg00@+z_m%3VZ+QY6(- zR+AbiYl1cM=wP)R9~9;2;4T>s%Q&YIOvL%pms)Ghmzr(bFV)*LU#hmLU9N2^OROQJ z1bbqE3%>CaRD$}ZY9sxp-l*BAUG0}I>A6h|{Ar4dp8eNbCF3ebtSH%-_Q{0JY2K$$ z$&=b^Pi&$^2_z0o$z!ii9DvgoMXl3-RuM-}u?bw7Lz)SPG~aYfk3+SxH*#dNyIa!3 z)91j$g(ru$j~#Uk|CKg-DBCw5UQ~^{~NS5ci2t zR$PfkxL;4qz+y950W4lYUIrGwOqK(Sm#1 zED=wah&^O?*Dk!9xVx&byMlH1O3%m#<0F5#CK(v!#57~uzbm4;TCEM$^GnKLhu|%oHHcI<|Q~U z+uR2Sehl8_ETw8c1De%Xv^j7McCsm`q7Ewk{f6 ziq*w=h%=>RQB@QiJc5^i4sd9q4}n9o)(|K7l#&^eh#jOFj{<~n72btKTkD zd#i3xNC?c7wYJY8gLqVq0$(fq4mN$W0!G$&R$H?RbYWRu_ks_6B#zx8b1mH@z*;AfFpl94lWoC06Rx z!R^q?r}Y@Xtk{<>nLq(~^hqCysJNTDOR^&n54rt{#GQsQpuO?&dh?EWy~w;)4{zZe z?E9B0=l%WRp{lj7Os7RMBRvmy9gqD)HoD)$RW`^L(~#H)XGd_VAgZL9rNBR}e|wn0 zPHU}SGPtRsJa<`QI!oYuIZhfc{)CEqq+58qlmN|reab_+u~PhSQ>`0Ksn{-Grc`a0 zPa&}z`0G@W?RrbRAuce&7i|f9C3RYl8t<@ew}Xcn=c<)v(FN^Fv}B+SYb~(6gjDO_ zT639t+P7Z04BEZxt<{%7(W~CFT*g&!7O6X9P#aFz1ueMPc*|_q4fw5FT(y30N-@9y z9HNK8T5DZf?3v+|5^qzY>~+;PgqhNSK^Xwisr=HT?j6c3U2H@;UTNlbl}a*hXH<6Q z?6go%yl>DlXS+sa->z0k%yz9xi3QNmV&G9!aV6jqm^<+gGfc&&C1ItpiBZ|aaJXFo zHya9v!#iO(9_ldl8xZf{&_!8K2rx7^8XZ8A!4*`!=c>rt7&y2+Q0 za>q8(s=GlT*dcE>k}pf00OEDH8G?ij>3TT~i3ED2Px=JlqK#K1@FZ+;Po(#uzPeic zIf$VG0@hv(c?4Y>D!nC&?pEoW5J4(LrsZ?_B3JQb#@l>y-6HS~UV~l=02gle+Ldm} zEncB&=7s8;Zg(}Q!qqnFKAZ$R28~5%R>%p{*+=`Nm7+pVuz<&}h>F{bih7|ECun_>pOfE%&#uUi_Ay!Fs^ z_lC7C*P16X z!MwWM%y3!mpfE_ye z?J;SNc#@(6=|mevZH+2&DU{#6CYOQq+0K4=FH)7$s?*>bXH%q9dUhOnin68JW^yzq zzI64X;)^8;PQ^1}O7p*`oacrQ%9@gW$600o#r4}=sqoP1QrP<=j~;mXJ5ku=fyhcL zXw_;D=zY7{-wo2P%&<3PyUL{r`j!2h6qeP}eAwPSZo9@w#m;Bs8^ifC$!&g>Rtv{q8np0gcFi$q51>ry@paOGZ=|hk zCvW1LWFx)>*C1>~hwY4ez;+h;PCy@=uj5nXZG4(shwGUeu<5>u-z2y2Mw;A5Zg$8C z=s1Ztl2b6@G;VO8-2n%?un+eQ{^zy!q+_HKZm!`bdzhyqPXu#8Jb7?MNh+IRpz9@{ z3PNLDWf>Q&gpr*=4$7B^rMZ&8UAHgje#ynjs@785YO4kAr)r;Vsx4?@pBbzzY+`>i zh&pbGn&C^<9+gkkis6EWUU~if7QOQ7xCM7xaIjF>oC~KfU3n44(XpX>sY{zu^P3LVu;Ty zF`Sk*`J0l3PLc7Q(vw3eT4kD4Jk9V}l6-%#m$r0chPy}CB^f7AGXOJt=^Esa`ACW; zpkD3!*kI6;>8TAjHYT@RB0Bspq6l-sdsv$a$Zn1bv|C4s!~c``jKD}~J_O%BwAqfjyGdIbMMcn} zzXDoE0r#U2AiuocDtD1X07Y&KP6C-cP(4X*{r`u(^FLra{@<{NU4|>qo!g{>LzxFV z^}hS<^aFxld|Q(*&gOt40x#@q*yw)h?qYp68*kpk7dd9e(&7^D(Qx2fWfW?-iJrR- zh9CG=4pOJraMSAW*xe2^=LQ>l3*NKc=4jbXOA^A9NDqF%?qt551eqR*7c{{K^q#s& z=1FkgGRX{Mwn-FPvm7@JjoJc0n0bqhx=G8IZh{UyjpvKG*13M`yvVKf8{Ssiye>E= z*x(7ts#5FxuDs^8f*MjFT^sd)Fu#Y#A?gzGTy*EIq+!)zI7o+U*?DBAIS-&|>nhQe zPO=TpCFS^OPI?B8Brnh_hVd+1jYk}EvJl^sY=Th4vzKn+MDAaQk7vcA#RJJw0@ZIk z3lz{WZC1o)5i@Wg)i=hEMh^%#LAl|XZ=NaK;KbQ7Sg>^_STTbQD0!e%cat+^rD)=` zcsie=2S~*jRFL`(FlxO;lahc9bVn9t0Q-+DSeKM6XsObrByjFIuBXtaL&$WydX6Vc zh+FN`1)R#rl=ri|jmvMNw+7(oqC{f6jqclcR*DACu1NWdw?fo(!pApRLTpx694eLX z_)FolCz?WT9x&C-K_`ZsDwK8mz-+&8)v0OH3jJ_b({vlBHZXVaOo+Zw(KC}$XOzkV zmj8z9*;e@ytnZrbjPBGZlcQ$|qZ|Kv8~Pg?ZY!F|csEyS=mxN4Rv=V2N9ae--u8l| z{1wn=XJI*wBt|9nX2JRcf9CsT`+8g@#cjT0t|V@K>~k=U?il=rc1V<5#2n z8O)gBT2j#(`hTgD9(#WW^T?*n4D-U0vX5<9*ij?ZeC}~|FzqfEGub|Q>K{IQpxR-7 zaH`|O2dkNs`}bNr_fJhMcmRI)S2L4-_d8-qOx(NIQ=7v4nYnN0t2>D$rNBDwi7~`7 zRcv4WqA6+lw$j23e<7a{+QxhtYu)f=^4bm8zt4KT-(_dKPUnUV8(z=g_dULknZit( zl$7-P>!tn!tx2Yg45uF(c@v1%pjmTIlZ@CfkLU3CsWrg0%>(Gf9o8IfN7j32_8|J? z9{S*3?ek5wFE-Wwp{aIRQ*HRiR9#a$niHMe#TIE}k-^O5-7}KI6D!Ar9zI7m`j_FVh%9lz@bvM>9Om8px z-$RlSKLZ+??i`FrrtzUWARnm_im$RjXdy$0d*Ke#X+&WrtO?KkR+hhS7Ehl%@Q-i9 z{{%()w!K3>QoFuM1Za&bnqadh50r8M&_qLYVN-1$L{eo01XPIE=+^_%csvD0k(7)d zk@R?~G!ai@r`$!)-xXsUVh6X6)|Se*xCo_NuWPu#R#{)eH0j1QeIh3S8)$p5X^WzP zHaj$!#-`r&G??z7&j#T_K5)=?IS>$f1K%q_In?`q{rzltDZf}=GT2!%PUZsd%VXh# z0nc5rNg4@Nt)Zz@zQMT?%aVhMB(eDs-%1Yl^;bN)OM$J*ivc_QO65RHqAo-p!HF%2 zWJ>ci--woJWE%Q*(2M|NW|NX^84{Y56HulqXQ2GO+~Z0l(@ZGwE~>fGg`No}1_286{}(`;Lg$iXJcFd*M_rGU@)lL|RNpAtTbEomqf~d>a1ORN zRd;*QyMbKqk=4h`Kct>v1GvvmW;*?4wS3Gk*a z*_1Lr?wPV=eoYz^%m%e6g`r-iLPH zmA1;ib3N^z3)9gvw?#&(Wq%qXbK_#b%R|HJU{uOl%@hJ&$zQBHP%h79o&CoAWraf+b(uDpr$h)58TAomLwaOC$ z`{l3kV`N_0Gr?zo>U7TaL_=7GALE>=ujZ96D9>os-Qw!zmMuVE-W6!;&;n&LAQHhL zf{o+>^6C}bdBrd%zv>L0-5lPJstyiBlJkj@^~-aEQ6b^YR)RNGHH6 zcoww8M9>J|Z79U2(51VZ<{D=~KLB`AP~f?FmNE)9Mc_gXQ}UpGpUTE$B1ZQj*WzRj z8*PiMi(`2VU*KiJSG@n>^{9`Ny!cmW)e!nFjCO~uPlyvs4WW+j!@!zv!mcOSH^NR0 zjgj$5^OEMb>ITSTa`ad8%bzY!4=LB=Xh_56+2%JeYJa8=4zi9|N&|O%KXB4LQ^SR@ zi980T_89l~ec$Z6a$ukIwc8b49;1#@n7&VTw`|`R_~zRuKRWQ~7ZWEw`tX+GKYahy Q-H8)#Xa+UQ@4OKHKm2p-{r~^~ literal 0 HcmV?d00001 diff --git a/appleII.rom b/appleII.rom new file mode 100644 index 0000000000000000000000000000000000000000..da82eed9236b98f1f620ed95154cb3f556e97da6 GIT binary patch literal 12288 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 HE*SY=kTQZy literal 0 HcmV?d00001 diff --git a/reinette-II b/reinette-II new file mode 100644 index 0000000000000000000000000000000000000000..3654c7477bccd0ee0ee6589f60e5d5449cfadc0b GIT binary patch literal 44872 zcmeI54_utpmG>`@F~kIhXhzZKW{gQiYY<`*Nh>=1OF&72ged+U2n>Nr0AWZ-U7LxZ znW<9QHtpiBzNM>gm+p4EXk8N9S|^F7#CBVZR%6u_t+gPvMXM42B)q?KpL>RxlX=wc z`|jucmq%yLz2AG!x#!+{p8MQ+=3%nEsB~3gLW1HWNnNHWH*uLoJf@)dA58+nqjJIIKIeEatP zro8;h_J5`N>3H$H>14oSNUIkaB)Wsf^<0Wq$}l+8uX9Yd_lM-cJqKWW3?vf=-3 z!|$`isPD#09*+UUtN*YK|FRALmJJWu@Oy0d?``;{;BLI+@g;zG z{+EHfWo6`PDO(tazY7-6&U4^%)qEB1aceC;e-+}psiwWP&DTajyv^F<3Hs7qaR@c_n)T^duUrl|p+PcZ-N6yz&yS1T7ZQb0w#itsY8vLkEF8Ujq z>Y6PFZ}x3#sjgM6)mzmq4Rwv}ZDga?*I2zxQ9rzGKEG=7*BZqdQd*(vnp=ELs;;K7 zxy`5A+Zuho7FE~kgB`E8rlZ(nQ|i^3UdA?BM7Dt{T0%iGUvm_@p|QRS4RaylMZasighL{(zS`FgNQgYL-`ifgCa=+OB zWWfV#E&FMLyFC_97o6?5ZFq*@RqHJ~SvEXJaJKIeJWLA$j$*+B*IT?yaJExv!>ep~ zz2If#mi-nR-XS=*8?fO)!2{OiQ}qbWc6x1ipAGL9eBc_({{b7mM{sU8EI7~Okl-U6 z|B`e3+wc*|O`MO~@Ch3}DLKdgcDL^Maq%yBB>n}D#J}J?K5oHzd@^i!mJQDlob7uA zkHo*=k@y#!?Nr+EDjQxecqIO9c!%KJZoq~I1&_qP;B2SYhWFXklr|B`e3+wc(^J}Nn{|2BM5a*qFiP5cWUiGRT(@h>=!k6Z9a{M+y>8=fOL+xG|_ ziGRT(@h>>rskGr$HoRW&Nc`LI4#BzIfDI1{9*KX!*-ozw@3Z0kf=A-thVK!a+YQ_B zA;~%ZCFl6J;UhMDRC11g8$KyH$NvtS_!m49|AI&2UvM5Dx8N-|DSc!J&gVsz4bKsr z?Rx}|#J}K?_!pe*RNC+=8(uGXB>ru9hv3|9z=j6}kHo*=Y^T?T_u24%!6Wf+!}kcz z?S^gmkmMZyl5_mq@Da&*|6{`^Z1|+)9RIhw6&=Uze{6V~4Nte>ZoxUuGi-R44bKsr z$KNA(B>n}D#J}Kdr_zR33C?j|Z^K&z4_u{(S9J)^?FMXkQ1D3n3(j_WZFrvz?-x80 z|AMpqJvKZnIIojKf=BlMf^+@Df^)kgl5_mq@Ch3}DLKb~r&~|Zaq%xW`KZYu;3ggLxM-*U-EoweK>5xMru9hv3|9 zz=j6}kHo*=Y^T?T_u24%!6Wf+!}kcz?S=)PFmW{`cvgwE-VRG%Wbwl`e8h&2N^a~= z2;Op~Wq(reEYq&KGdBL+c~<>o!P);b!P$Pg;B4P*!!sl|{$~l!_HzVh`yRoEJ(mB) zg0uf+lACd;wBc1Yyk2tSe~aMke}~}ge?agS<9|?a_PGuM}7 z!P$PA;A}r#aJKIjoc+%bob6``&h~QzXZs$(!)E;{7M$&u3C?yZZFrRpuNR!{w+PPu zcL>hy1_TdytoaHG&h~o*XFI(%yw8UB3(ocj1ZV&E2+r+>1y3{g_l5)ynDc8`aJF;U zhL70rQNh{%gy6%b-ATc@T@{Rt{|Phx$%3=}G{M<^y5MZzEqIwZe=`JU`&ojs{T#vB zzDMxkLMwiX1!wzZg0r1U8(w9@>jh`~ErPTE9fEVa0l|CB_y+}N`#plQon9N>XT$pi zXZr(!v;TVp=XS$_yUq9bLxQ*5XwA#8;B4ox4Ii=Lqk^;j3BiYX{TH0uRUx-_jMx7F zum6Ix{WQVZe!Adn-z|6~{sm|IS%S0u9KqSXNALlTf5F*)nc!@v(uP;r@Or`7ev9Dj ze}~}QZb0xpj(@?~evja6r`Lw}+3Zc3N_1%KA{~3a_|5<{w|2cxQ zeUIR2W5}1&;r|Vyk|#;A}rl@G4V3 zU2wMV7M%Uh5S;C23C{lK2+sCBg7=% ztnm*D&h~o*XFI(%yw8UB3(ocj1ZV&E2+r+>1rJKZYe)0DroDbjQ)`4*n-V=4odK-%3Cr9z&C_X!iACBVYPt$biNECNP)gO)Gr$ur8 zyA}r+{XG>Q>Bj$=00|5s-BCO#if2Ue8Bshdic=eWDwqIgvlPl@97Q9Lz@w?uJg6z_=Q{5K<19Ejp`qv{8v_$g7mCyLYGyz$W+ z#ZPAlS={-DwEKA-Xwieq7&{{rP{YR3k2ektW?O2_(i{sPL=RF3uN{6fmp6pjUS{!Gf# z)Qz?1{3(>DDI2TO`I9M6Q#Dqm^NEzFkRS8t{D&Kmr%)fu()o8NPg6MN*7-LnPg6IR zrt_~+o~CR}>HKdfPg6BEaSUMbAR``Z07yFG0HauG|4={**>;bcF@J9RdG_YN+wG2l{@a+WRAwrHs`o(h0p%+P!28#;>${u@_?WOQ6m{M_JK1Dv)vw z-rd;;vyT*apM6fgTODw$0+~ACxEMm!g;Fvh>q5)VhuAxk9NGs>7t*taoeKig;m2z6 zR@%M%^%A!lUtiZ#mpk<<=guR5b-60+?3#!E)#avz*M$C58hWkW4gGx;Zq+%mJ?MDU zN)+EUZ~vOREG>3&@%^ZWxCj!xDPe6%M)vkZeEsaT?3fzdNeu=RTl_ z;u~n;(i!b1|0oCxW4GX~yX@P656{@TzPoIs^QpktO=Nk{accoh>g{-UKT08cz_Ar+ zOlK`bWCAOYnKhh!s4nEV9?9%52Dcaq(2d~t1v>{4iX!R&z~#~{jRukGIfg!%k)=JkCy3KH%^Vz>H0VBr&T$sKi#=kY5nC_ zSo+6EfA6uRVsv5e=;g%;2a2CQ=1+&QtBkQZmN6@SrM*DzT-Z_V=M{J6o(BcE6#AWi z4u<77$c-NT5FMw1xbc8v6d>Wx$NRH47fyFxuG(koFtz+f`v=!qof#vOQ^Pmv^%_CE z*K-a6_hGyzAR_+-a{qMyr2W9+U8wLrTDANSq;w&lJe^^ z)?mt;5Zz@{LD%n)DDHM0LidArC(>>xs(+~eq^|FJjOrIpbv~6AOnF$Vq+S*+@8dyB0y*F^oJV+E4EsO6+_s+&Oajtl^+zF4fiX*g0}^ z8h?11#?kTV+@10wD9pSJ5qNv5KN(k?}GEIzS7@F9ThNoW%#6yWh#nekw2Yc3$=eMdv)72i1|s^E#jM zf zRUh*adOmt4y0=Vuu-*lC>3QicJK8y#h{+1N2DQ5D2M`ns*7Rfi?k6xbBk0(rD>!yQ z@Fm)h^sHe_;;l#^N~g~s_;aJK@461+$P+XCGY>dUgHQS@yCsdT)&4W77uNX%kIzSG za2}m9=x<OJHt-r`BKQFd?9+hkT8CLns z*z$M3i1kM6zm62z|2;%h`_EFj)_=k(|53`ZJ_I9qR&}VB4{|pz{@{)yv@fdvHpRzY!Ckt{+?aj~V?(Z1nGsuRrM8 zVd>vy^xLBJsqqd6+z9OrrrbaVsQo|1w*N&-KiB9ljna?y|7=n}-v2>YqNRUyrPcp; zAi4iB?Z1SAcLp%NZZ1i_n`nMTlK!(hUppFln&v-@DR^yr=;>g}3n;MGmCmOU$KP}=ppNeY#QFai z>4&xcfSvxm@$_%E^lu}5tNj)`{cGdt7g+kaq;IvKZKr?6@%pt-+Ul?Zyoc>D{*$&Lr{PWJADjBD>s6nv7s!IWy$z|v6x z5qc_nU(Q~Pc^NW6*J`|Do{l?JmxAxN_HA^&yc*-5Yc@(@A_d~ezJ&JMa2c(8`prP@ z#0p#}L(jF}fNTC3(np@u7n|>`qKm_h52ha9vJ?WBoAp>3h7u1r9w&v)SC7)ig`&M; zx%dGJaV5hdcrOeD=Q+m@(#|*N`Z@~6ALHv)=THLe+;N?{4%N1gKd7%-QP;mg*G4E{ zNv$9;m~u5l=y^}Z`~C~jbZDq^DB$Uu>Tn=M%LF<@n}L~r{5YO~0`{AaKy=SJMehM;J;gI|#_4|{1v{tj zLm`cK28=O4c^q=RGNJlHKHj{g?(ihEQa;674t-bv$n`~r&)A-jG2(dqVI zTuSXHp#5i%LiDD5ew7j2HgJv=lefM`sbjT?;=5yr|-*J_k+GVPPcYkccTP`{~IjmO&5>n zpyQi_x?Q)U0t*>G*)B%kfDzJU&R}7b9=xAp=Ri4|mF&dfev$L3fd61rUh;HaNfI!?ZBEznBbOh{19op-1uK%V6)!o+Z}pPS=bnJxoVI zi+eFGiHVMnGHHTnoULhcy$*oJUW70q?4hAO2py_1{tMkd#{N9gWYcghnG)E~I?kKCb z9S;NPam4!4rSJbZ2Y1b-8#wq>HftECJ^Z)_mG|-`x$_%zn(0|xrf1dJ z6@ps!i+X0;m!Z9-Xej%T9)$CdbPgUK3zCwKD~{KcbC1GLTHnr^OU>Z|5s7%`&I9^f zru+RbA!U}$Rj~csrFwWn`+|<2Bf0mr6ddU#atCxHUxz?i|qU0I~9VG!^wCh-@jUyahjE<9YKb($}ebeI^S^ub5FMRN6Y!k%_ zuglM@jLg#zk~~ij|5nG#BS56GOa}#e<@yH@9WVDHLGeQ0YevOOC$Nc^4kS5VHj=&F zj?no!UT#FmSX)fITuFLXym&~@#LETR57&jHK;JVR7cZB<;$IRkujNGI<#{A+;^mpi zc(eOi;^lT2)vMJuB%Uik_ij9|65FIZKNW_Vk^}r@xijm}aSxWYHJFY!X z$IB9whm(^@fI8<4{p;JovvG(EIxW>~A{Wtbe=$2z-SN68-K zRQ5r9#5)aE$Iqjc0_)|h_uP@o>GF@4nPHfdhC3)>GaDx%Vnh3iYjCS+#z}Z~V9@m+ zi*N?=b^YhaOkdY;u-ZLvw!sDG;GEOA{jpo4 z*3ZcGef_)9^R=4wF&_)53*F0?Lg)xQMcXr-8Ozkh(17d1i_N^gjf6F?ip@mg751J% zv6fbpdX&Ce!}n^jH{P7PpUTTd!NE`dUhVYk zW1V~J?7vidYawo?Mt`aH3IKLyaLn;*BoV3mmg-^B=dHE34Z0phQFmElXE-V7_yN+N zum{El_-mHUnEqSO;b2#M3kqrFd7L)II-c}0bdgzxW+Wln%%&Kh_Z?@$8?z}s1xeZz zcOv>D`@@t|-!btMZ$Dh8&l}q8{3H^^?X(|0kgbD?_QO9$QtpR;3KnNS{ExsmbEfyh z-IWQUeOXxGUYzv|ox}R%-D^%>=gyz$6g7X8nt#hWg};MzPu-4>sQP~Ao%-`Pa(GqFXe-bw zHE59b`>%oM>+uUnAe_hE(WkR@{eZ?kD%a0HAwie&zS#1A;PQL5{^(e7YRX>j(y6}rJd#NDcRS8s zK&Ro^M>C<8M2{*h2w<|QopB)J*9emA*HedSoLs*kg;A~GiCv$5{a1AUyY`_1E*L?_ zlgR56-MW7j^<@Uu3;lduXo?=O!vk$s&!=Z(x|fh#UlKY}68d%N`FLCg&ou5mnl!rL zc|4JG$6J1PHn#HC_?L#>EDaqggoUYjFBNz0Pbgmba{HTBa7G^5iMpTl=lu$o9N05Y zMJAZ1Y)?MWa#^2D~7{ zQB}9JH2O+PGFzKB(}>v|Gw>ZdUi6Pn1n{DN3?e{JL(YW6D+6Wycx9lhAFm9Q_2ZR+ zvVOeEP&SNL8Onz7Dnr>YUS%j7#w%fd(ii=SO09v(tmmet!bq24m_{M1Aameu%ZmtP z`P)eBh#IRM!LIRvS&6CHspgPerygG@u8 zCm?Bj(y+tzKxRQ!(pW&YK(;^zA$uVEAO|4#KvumrHAQ3A2RRBk0!icV#wVn7$STMz z$Uewo$PvgYDt{gQr*g<1Du<*w8G#H_IX;mergF#$$N|V?%!PUb{iivD%%ME)2+=&1 zLDCbieUJgj3CLc`;||yWmE(@y5TwE#$`Qx_s1DAS)p~ zZ^2LEe}p~AVaPp@eSd;~kRy;2RQ?X^;ECF-chO(Ssw41=p0J(7xIs>QfPO*t;Nh>s zl!u(4JeC|c;wKClgrw(fhpq6}|NaInsDv+<@z^lMhVUG{;zZAR@{0xSW#A{9c&k6q5;N;Kwg6{&S{yGK!J~;Jvo#0P^hr#m& ze+hgNe2?Jog7^JqYHEStb1)(O;BsCT0Z{!eQU6l#bgW^;f>(f-#o>+M!8jb(9~B0d z<8~kTP#pdU_;4Kl3-H5n`0L;!arnpJqjC5=teq3!6nCmHH7)VmsmU~t7lH?|7B3h5 zEd(Ek!*2jT9EbbC71m&B=Wg(fIQ&6yTGM6ypMZD7;m?B8nlJ1B0elENSNK0;2KpO^ zp9P+dYlE!64BQikmx9-W7YX~d;C*rUUxOcx!*_wF;o9>ZVdwkc{or&><%8zs3Gk6P z{3Y;oT%%@NZj;MyhmrQqqfc5M^&E2w@P-bnVr4^sWa z@295SV8vAzI9=;56n5?d-vhoOiqo3>2)M#EZ-h9-=eCnmlMAfBGNSTlQ65J56GcVS`txw@OvAM@UOA1&GL(l=?je11klj-7QSei6Ua8{L zw9dq&lM`Ti6--lkBbDRYx^TKYjmnEn`Q0d=#5Fcv`7-E#ALYrow$hDr-S04z3umvx zd&%r(yywln3Gex{TkuXsagg5Y&}+dp_*K^1i}EYAUf%5OS}$=G#1*p>TT;!%hx&OI zuJsucQ&aboA#>>dgAagT#SoI_t`vL{{OdT+R977Z1sqUnm=w~`m9yv*B zWaqC@zaH2Aa|xKE6ml21``@uQK%A=l)UJ{Mm~2#6~e^put$3gAGI-UuP9=#nCumky)~(x*3=x> zm)6MN3o$m8utU>#;y5t^Cr04J2%H#!6C-e91Wt^=i4iz40w+e`#0Z=iffFNeVgx?> z2t@up+RI~gM)IvZ|2qqjJad-jX7C70=0@_rbKv$Ed!n5G{Q{QU4*$CY{O=4fmy-XT z0G6_xf9GFv&PRTy|C(6;BK}+(%ULhdU+y?+>Q@>6 z`QLGn?GK1@{&yX?9{;-^tS`$yO+U=*i1~7x?Mi89KVbULsdJ{#-s`+P5n&GvjAhK1^R6;ox$%Db z=6YaP&i%J5A29vra<(fam&^A1O#iuD>T#aSr9PMQ?|5^brJLucz#1q1U2-nx-+hnd zS6THq|7rSZ<~;w;w$HzN&iY|99^5`lF6TT;{#|GO9cTXC=FeKrzx&PlRkHsk&*jqo zgc)Bh=XP1TKSh7Q^q2Mdcdb9GKL4&V|Bf%~v6SWfyS`lBXVxv&uM+Fnr|I{Y{v8TrTxE&*f5|e^*zTb(rh3l;vuzh;P$h*7u0``!xL)(|^|IcBSNU*?yI2 zkISVV=eb2>M<(>q_2qzxkLQeh!^k5>p7aGv?KC4lXXFYaR~dP=k#$CH zG4f6$zh&fijT|)cfRXH6znSlZ)ddA#aAy?yHa1i@xmRRfoSC&GJLmJYzKtu}v(LAH zdudkoC0Wa}SFo~;Ou|`{6K7tMRHCA16XlVlk`z6wEsrEMBNFe?Wl72riSt-~lH&6r zmd{iiH?cffKT{sfD4nEcDURdlvLtn~;&_kcvlXBBv3!miF!LJAQ`E4S2P#iescIxH zcPd^-V(p}<@WyCjrIXZL6{v~FPf?TlA*9%{Bz3Cdbt$?e2~SD!dKAlDYL8i`V)|Olke2`h1<`^^Vqc;#HPo};^IyKd*yfrI%skS064k7oY2hL4E)e{VSNx4Hhe z4d>4V%pYL;6fiiL|0B}cf5Z71=zlicZ6<{IzZ%Z_Z00{SocH6*ce8zC#|)GDvEh7Q zhWX=$^XF~m`wi#M-`_!=j-TO0{_{SUpMn0l;k@r={wu@za{=>b4CnhpZ2x(#PYN=Zjm0!;M4z~pizf$uw<*u=Cl_k`5;PI}5K3)I# z>w7CWjf4AgW55W%;Z=g~G<-nt`?dY~YDmNn{cTM`oc+c##twf^%dNkn>mR>wvFq0{ zUH=qS-^3OyNq=*bppNe^mBt&NbR8F`9=9(#U)wo;pR?4|m;0+C&5z%wRcbp}-Nk;U z3H%g_!;O~TS{=!+Xl}9S_xr)!(ZHmCo<#ikebl2icIa<Q-mC4L zsRo2U|727DAUKVK+^;^T?aWsrW#?Fqn9s+*0e4#@=6#Io2dw($&jNE@}g46Yw@a7GZ*5aGt^PKDdtDty)$6^Ypxj$pvcAIW zRkglW-=>B(zpvHn-|VevY;N+kp+;@9cT;2Y#_C3It-rao&0F2xp=z2p<4@)NzS_(c zD=%3Zzmm7Ep{c=J-P&5c&FgFOw{BB)t<{@--rDxfo3}wFD(6K_e@s=ccU5`bnj&w} z+Cq3{xyk96%C*W{c=W;yJ}sm z$(HuUM&+@Yjw?;g zzMA^x=_)Y>wlviGn%DY#wQc1-bhWLX$4-y9cXM?^Q>^2NAoR&=O$hz8g4ergb90jg zFuBbwKA_sRW^a9UQ!NJ2Te1#?wGB<)_BJ2pcY125YwDJUy2kdl`f2y#^Z?_~LX*Ig z7pKZroGdj_R$@B2b#wC;j6bW#mTmI+Z54e@wOeTb;%a)m8{064Ix=aTu*7Xr=xNMs z#c{O`LnH_FiY?x9bG8;VR=2g`RBdT(X!1wRY>d}lFM^a$CyHJ^*JEPW>#gairZb?r zvEj=i0NdLdeZH31xmB5M+cx{FH$wVbEm_YgIOA(=QJGE6eqUx@e#sJl^(K?s)YP82 zvAvHXm2B~~w&8a>VlrNowc?B-1(RxN^s7uAADKvI zZfZu>@9V%jEkmf(tk0}WU%gp)>T6+ybC#;L0$CcI{!$I9kt#I^E84m0%?&khsM$|# zS;Z<7bE`73FmA?T7w7u-m!kPlNWcr*5Pk4{X_oR1A=QmO&P8S>UaZgeuUWdIDy(Ynu^>O*v2k%=4m{QVTS&-&c|E~B4s4D$Vdmi+w~>C-(qssA-F8WY~P z^Y;WSPe)nwLB2*GA!MTU`TGQxZZY6#Mw#U+|;~ zEd64@L{`y#vsAn&HtFE|0R6XFd0C(HEPst^PP|y3zmFOCjQX!am;7ga{@!NKr|3gP zA8+72TA#n)2^)QU_=-8)F*&9Fj69#4RK(u{g}Y5fGqHSraKG7XFRI0~e~()$hVQZT zvn&yLXML7*|1nxWa$lv#Qt69mS_#%;>40*yK7XF?Gx~FF^cl~FGTGws=g*f98U3sY zu4zekY*x{IOlm(%aMoWUIMt;iTJpJLm00g1ru}{jE*yV_7p;}tZ(jfC{AAyej2yu} dEBW7f;WQ=OE?1=SiKoBhyH<@ego4Pb{{bY;ld%8* literal 0 HcmV?d00001 diff --git a/reinette-II.c b/reinette-II.c index a517028..2ef0d53 100644 --- a/reinette-II.c +++ b/reinette-II.c @@ -23,7 +23,6 @@ THE SOFTWARE. */ -#include #include #include // for usleep() @@ -53,8 +52,8 @@ struct Register{ uint16_t PC; }reg; -uint8_t key; -bool videoNeedsRefresh; +uint8_t key = 0; +bool videoNeedsRefresh = true; // MEMORY AND I/O @@ -66,7 +65,7 @@ static uint8_t readMem(uint16_t address){ else if (address >= ROMSTART) return(rom[address - ROMSTART]); else if (address == 0xC000) { // KBD - if (! ++queries) usleep(100); // sleep 100ms every 256 requests + if (!queries++) usleep(100); // sleep 100ms every 256 requests return(key); } else if (address == 0xC010){ // KBDSTRB @@ -77,9 +76,8 @@ static uint8_t readMem(uint16_t address){ } static void writeMem(uint16_t address, uint8_t value){ - if (address>=0x400 && address<=0x7FF) videoNeedsRefresh = true; + if (address & 0x400) videoNeedsRefresh = true; if (address < RAMSIZE) ram[address] = value; - else if (address == 0xC010) key &= 0x7F; // KBDSTRB, similar as in readMem } @@ -107,7 +105,7 @@ uint8_t pull(){ } static void setSZ(uint8_t value){ // update both the Sign & Zero FLAGS - if (value & 0x00FF) reg.SR &= ~ZERO; + if (value) reg.SR &= ~ZERO; else reg.SR |= ZERO; if (value & 0x80) reg.SR |= SIGN; else reg.SR &= ~SIGN; @@ -523,7 +521,7 @@ static void (*addressing[])(void) = { REL, IDY, IMP, IMP, IMP, ZPX, ZPX, IMP, IMP, ABY, IMP, IMP, IMP, ABX, ABX, IMP }; -static int baseForLines[24] = { // helper for video generation +static int offsetsForRows[24] = { // helper for video generation 0x400, 0x480, 0x500, 0x580, 0x600, 0x680, 0x700, 0x780, 0x428, 0x4A8, 0x528, 0x5A8, 0x628, 0x6A8, 0x728, 0x7A8, 0x450, 0x4D0, 0x550, 0x5D0, 0x650, 0x6D0, 0x750, 0x7D0 @@ -533,9 +531,8 @@ static int baseForLines[24] = { // helper for video generation // PROGRAM ENTRY POINT int main(int argc, char *argv[]) { - int ch = 0; - uint8_t opcode = 0; - uint8_t character = 0; + uint8_t opcode, glyph; + int ch; // ncurses initialization initscr(); @@ -543,12 +540,12 @@ int main(int argc, char *argv[]) { noecho(); curs_set(0); qiflush(); - keypad (stdscr, TRUE); - nodelay (stdscr, TRUE); - scrollok(stdscr, TRUE); + keypad (stdscr, TRUE); + nodelay (stdscr, TRUE); + scrollok (stdscr, TRUE); - // load the ROM - FILE *f=fopen("apple2.rom","rb"); + // load the original Apple][ ROM, including the Programmer's Aid at $D000 + FILE *f=fopen("appleII.rom","rb"); if (f != NULL) fread(rom, sizeof(uint8_t), ROMSIZE, f); fclose(f); @@ -561,52 +558,43 @@ int main(int argc, char *argv[]) { opcode = readMem(reg.PC++); // FETCH and increment the Program Counter addressing[opcode](); // DECODE operands against the addressing mode instruction[opcode](); // EXECUTE the instruction - - // DEBUG : print registers values and keypressed - //move(25,0); // at bottom of screen - //printw("PC-%04X A-%02X X-%02X Y-%02X S-%02X P-%02X KEY-%02X",reg.PC ,reg.A, reg.X, reg.Y, reg.SP, reg.SR, key); } - usleep(225); // 225ms for 100 instructions gives roughly the original speed + + // slow down emulation - so you can hit thoses colored monsters + usleep(160); // keyboard controller - if (key < 0x80 && (ch = getch()) != ERR){ // non blocking read - if (ch == KEY_F( 9)) reset(); // F09, reset - else if (ch == KEY_F(10)) BRK(); // F10, break - else if (ch == KEY_F(12)) { // F12, exit program - endwin(); // reset terminal - exit(0); // and terminate - } - else { // the key is sent to the emulator after some translations - switch(key=(uint8_t)ch){ - case 0x0A: key = 0x0D; break; // LF to CR - case 0x04: key = 0x08; break; // LEFT to BS - case 0x05: key = 0x15; break; // RIGHT to LF - case 0x07: key = 0x08; break; // BELL to BS - } - key |= 0x80; // set bit 7 + if ((ch = getch()) != ERR){ + if (ch == KEY_F( 7)) reset(); // F7, reset + if (ch == KEY_F(12)) { endwin(); return(0); } // F12, exit program + switch(key=(uint8_t)ch){ // key translations + case 0x0A: key = 0x0D; break; // LF to CR + case 0x04: key = 0x08; break; // LEFT to BS + case 0x05: key = 0x15; break; // RIGHT to NAK + case 0x07: key = 0x08; break; // BELL to BS ? } + if ((key > 0x60) && (key < 0x7B)) key -= 0x20; // to upper case + key |= 0x80; // set bit 7 } - // video controller only supports page 1 text mode - if (videoNeedsRefresh){ // content changed + // video controller - supports only page 1 text mode + if (videoNeedsRefresh){ // if content changed move(0, 0); - for(int line=0; line<24; line++){ // for each row - for(int col=0; col<40; col++){ // for each column - character = ram[baseForLines[line]+col]; // read video memory - if (character == '`') character = '_'; // change cursor - if (character < 0x40) attrset(A_REVERSE); // is REVERSE ? - else if (character > 0x7F) attrset(A_NORMAL); // is NORMAL ? - else attrset(A_BLINK); // is FLASHING ? - character &= 0x7F; // unset bit 7 - if (character > 0x5F) character &= 0x3F; // shifts to obtain - if (character < 0x20) character |= 0x40; // the ASCII codes - printw("%c", character); // print character - + for(int row=0; row<24; row++){ // for each row + for(int col=0; col<40; col++){ // for each column + glyph = ram[offsetsForRows[row] + col]; // read video memory + if (glyph == '`') glyph = '_'; // change cursor shape + if (glyph < 0x40) attrset(A_REVERSE); // is REVERSE ? + else if (glyph > 0x7F) attrset(A_NORMAL); // is NORMAL ? + else attrset(A_BLINK); // it's FLASHING ! + glyph &= 0x7F; // unset bit 7 + if (glyph > 0x5F) glyph &= 0x3F; // shifts to match + if (glyph < 0x20) glyph |= 0x40; // the ASCII codes + addch(glyph); // print the glyph } - printw("%c", 0x0A); // carriage return + addch(0x0A); // to next row } videoNeedsRefresh = false; - attrset(A_NORMAL); } } }