From 3444289ea9cd7dd227183e595f8af0a05096f6be Mon Sep 17 00:00:00 2001 From: Thiago Auler Date: Sun, 12 Nov 2017 00:31:55 -0200 Subject: [PATCH] adding all the files to the repository --- apple1 | Bin 0 -> 19184 bytes build.sh | 20 +++ obj/6502.o | Bin 0 -> 14896 bytes obj/main.o | Bin 0 -> 1680 bytes obj/memory.o | Bin 0 -> 2240 bytes obj/opcodes.o | Bin 0 -> 10208 bytes obj/ram.o | Bin 0 -> 1656 bytes obj/rom.o | Bin 0 -> 1736 bytes src/6502.c | 176 ++++++++++++++++++++++++ src/inc/6502.h | 7 + src/inc/memory.h | 11 ++ src/inc/opcodes.h | 142 +++++++++++++++++++ src/inc/ram.h | 11 ++ src/inc/rom.h | 10 ++ src/inc/types.h | 16 +++ src/main.c | 11 ++ src/memory.c | 65 +++++++++ src/opcodes.c | 339 ++++++++++++++++++++++++++++++++++++++++++++++ src/ram.c | 14 ++ src/rom.c | 42 ++++++ 20 files changed, 864 insertions(+) create mode 100755 apple1 create mode 100755 build.sh create mode 100644 obj/6502.o create mode 100644 obj/main.o create mode 100644 obj/memory.o create mode 100644 obj/opcodes.o create mode 100644 obj/ram.o create mode 100644 obj/rom.o create mode 100644 src/6502.c create mode 100644 src/inc/6502.h create mode 100644 src/inc/memory.h create mode 100644 src/inc/opcodes.h create mode 100644 src/inc/ram.h create mode 100644 src/inc/rom.h create mode 100644 src/inc/types.h create mode 100644 src/main.c create mode 100644 src/memory.c create mode 100644 src/opcodes.c create mode 100644 src/ram.c create mode 100644 src/rom.c diff --git a/apple1 b/apple1 new file mode 100755 index 0000000000000000000000000000000000000000..c007a8124febb0a271e959b1729fc4d62f35f444 GIT binary patch literal 19184 zcmeHPdw3M(x&L;d?I1O$#y9-&GWW(+T6N{CW zi%B(__Nm9%Vnr;c#p4A}j}&dxAZim&Z3C^Rw8oZtgp-&e>8Y1hBir9Q^L~?^A(`|! z&v~Bn4jKltF zkt{~TCf8NiD6LZVgBanWC5~l14mb*1rd1`3n9P0>WeW+pY3!kgjG3w}Q3$(2P#m@O zSejx2?Mg;sB{c}?CsS3FanwAD>)^N!j+5BW4U;JQM}4EMg!^a2TxgUek}svgvtcjg zTdz>eOR#{;lPKeEMI5#BA5DquSj6=WH!e=DPa=0$+)(AOSaRbHRo=8Je@$I|T7Bk{ zv?VvDhXUyfm3~wC%O?3ZbG|D--Z zzGJY-<0de$R3>qh&Q>%|P;*1?9iZ()NE9?>2>!ZZ_|4$$L-!&ARz4&hI2pCaPL z+Y?n$n`RhC4-MNAQCk-diHhLYgv;frce}RuYur`-JAE+8#}x{@gJD;-+g~GYDag;x zaV<<=n7&xJ@=MmbyuP4st3MR>1xwcER0V2$CGLtUiriWqsNqPL>N=z&waLoI$Eu9E z1$!EMIZx`Y^p7K-#cK1l^GDA2a-Mwce11sY&ivR6yAmmRX`jA9<;jielj%$h&!?s$ z^~CUU?vv0T!^f@RoK0uLUq+MW!H1eOX>;_}W~b$K=gEuVBoz49xoUwEslegN z+m-bx>J@c2ICp3L0s&|l+B4C4Z`K>IdM2UAJx=Uix1EHag_^UA8uqsnC=&f4_szXq z;6b@9zpy<6w=bf{$fxIh9KnR6wgaFNjap?GYGoYXl6i+X>aJL2>I!_?eAz zmM%EgBGa<@1QiXs0v5>i0JZ#YtAVRPG}_i+52q}^?sg0O79l5tkJ{$LYVWZ%<_(}l z*N`t-6tV6;Go~@`3s4g%?o3=`-o=EYc>~AKSesr!=Hj@n#=Iyp(I(qF7!WwVt3Z2` z?JZ=u{CjO3FtQ@(bizH?V!k!CJDaENr9r@fZo`>%?&FN%1H8X%I-MdUPPolrQ^EA_m$=!REW=2V!sF_)$eu1{AC4Wfj2b#H@%s*-7 zO=Nay=GVzQu9=I-{5Q?qPOW-eGoK>$dz#rm>R!$4CUb{o&LnfIW zR5Lrs{E=o>llh=#?jduZW~NffcWCApWLCnw*LMFLOt{E33HNM*shcmg6Jq9z2S&_% z`8hh+J4Y*T1(lbinb(s!PBUMo+4LDEp*jZtL~5UAZpBpT?bggZGT+q9E#&-?X1<3) zd!NzFJIMKfX42sFen&H}rFy@mnQd_H+o87MmuP?AHZ}h=s_462%|C<^`ij*28sb;0 z`R6Hixth--K3&bzsn9o5%?HTm3N?R-${(-h&mylb9(~uS%uhd$@|tr_%dH%UMzL<# zW@B;L+g|sdd`ja&k=S(CfU~KtA8YQW@mS9KKb6smTJ#UG@+oC^%2nz}3JS`KCfqRx zr9MtZlZ`mF1<#`0SVSHJ(P+B|`@Wmtwi6k|T--4aMgRsDCxqRFoErA(C?%{0M5C<` z`@S)++in5M6$o)lVJa1;z?erylfuz@2dmL`J@#sGbaKdkHfJ?sN$Q!3&J9xEAWG<{ z08!^7v0mjw{Xs|FO4KiOR5nrnuA>$a^_Y&DMb!N|YC2J0*HNR1s?<@Rj0LqpNA(bu zt)qTV)D1f74Wg2D)X#|;r=y-E>f=vhyZs1J|D~huC#p+F-A&YsI;xhaCv=pXsE2e^ z5m9?|R1Q(wb<~YS-L9iji290-x`L=o9W{oi6de`8O4>6;NA(gF{W!MUe<12FI_f`& z`n`^7BkFY>^%PM*)lokr>VS@VfT(62wTq}bb<}pEw(6(~qDpiWT^f2EIx3f_bRD&r zsH=3;Y@){Ms4o%q(MPc(F_x%zb=0R=_IrM=)L|X2Jd#av^Z{aY;-h5 z9UC0Dw@x{itlT=M5f9n}%02z@FXDP;pt;Vy=fm~|Z_E4Lf~NNinm*1& z3DIfY&fO<0&Sme^y-)Z2U)}5|b8L3p?r@!G8LaVdCvdr?-w6Dxz=B^78!;bBuqX_- zjmMcYoJPEFg!nIy5FZ{PK6Qln-6O;=9U=a^BgC&BA^x!u;x~*Ce`JJs?+EcPj}RXk zA>QoRlJ+f*|7@6Yelzhszr zx@N@s8}n~+ypjJ$?QV|G8>arxN2tFK@u#u)O~7_1Hp(BwQgS75AKTBuo{Ri<*=~oO ziTn@Q{x$4dkbi>hKf>OK{86^g!>&O76}AUp*C78ZY>wL6DqmW@Jtt6&XGFfBaOCC) z$GTkMC@v7$IXNP`7+c=0B0IlCWUtK^+3WH|b|JK)uZZl8&^8u}oPr!|x!CftZ4^0c z3q?+0DYi`_H!lZUDYi`_Z+(%-UzdZe6x$}T27YUbi$p=L16wJ!O`-tyy7h%(eUU>H zI%z8ug$2NZLQ%B709%nLD#^!IEQ+&pL@~-Q&dbG?FN#YX*h;Z&5+#mOY`|h*sRLWF zDB0w|4+CMjDsBZm<8&h5`av|>iu^HPJFo*-2|RTH#{!tvAB{$U+ki>9*M9?;3EYM; zECoIStOx!E*a|Gbm>vV}rLhLK0wchG1t#In_a$H^@FcJl_#Utx_zAETI3Dxm81QP~ zX;inB<4>Ey%U@34XupamTuoZX^cntU)@HDUk7y-TwOu}XL17If5f_Ya8 zoCd51&H=UpmjjOh*8)!i%YhLfty4+3_1Fi@1U?Kb1wIL^2fhq!1)c&P1D*w*21bAp z-~^l>Nx1vF2ABz404xRO0_%ad0b7CFfX9G$0Z#*4fDz#1z$Dy&9|dLtJAtLZZeTs| z0A=&#RA2pF{i+t<2L9X74`5Df<;VRXjvSIfbz>X< z*JyMRP}6G$%O3!JHS{I1`u0IR*&@Uu=nb*DHLTUY68e46m&NL;tkhoy{Sb8J8My5K zy20{yLT@$E_d~zeL~n!s4HLZ^`gRk20J_&ir)NsHndmE_uQAcfpl6xrJE3Qo==-5x zXQH=3zrsZChCa?jAAml9HFUV+lZ<(F!9-sP{aq8i4EkFp`cCK_Ci;HpKR40apg(P* zcSC>7L?3|uJrg|{YyCYY`by|`n&@TFt4;Ks(92Eq{m_d|^fu_LP4sT)%S`kE=+~R* z$+%X{Fws{+pJJkyLAROcJE2E#Z69v_?T6lHqPIc+qlw-P{iKOL0R2@HJsH>9pPA?@ zp+8}wmqCBTMBfR$#YEo^eYc6;27QN#-VNPvq7OhXGtrZAudv=kUkN?iL@$HB*hJq6 zJ=H|t5B(|=y$yQ2iQWy}VxkW~{}A_>!_B{BT&MrrL|+O04<>pU^f#fW#9klEW3GSD zPnqcZq5p0eJr`xRLGOX?qw=%k6Cbc<$0yw%mltnu9+e%RdY{c1pRsSWGd^?on6>e% zg7KM-_zXvUYIeLGe(=wZAFKS`cNFf)5;0D=99&M9N8s`ZTpoeTBXD^HE|0+F5x6`8 zmq+082>d^efPCLlzF&z)R!Wk{ubGNO{FbFONde=4!-VPOT;+1&Np1JT3ciSc{qcRVkw zoz4Bf?R>iB!~Xux7yA1;PxY_Zm%4B6o_Ub+k93Z28SQWE{H$g2c%*})#?MZjJ@<{S zNJrP1SLgLVG;4lg;-S=U&OSH0>$!7t3UZ@WvqZ-HgVyKfJecy}b#HWi(lt$K#-S8@ zcl6LK><+&`O*??yV`T1|e`wZgsfSX|&OLJc+^jC^xs*e*=8j41aIQhJpN&?|O&E8i z^Mw|xfAsZJx-vd*p3+s0aYztRyq}(vv)rD#p`xxPTxVa3H?A|%GV2s;(OlIwj@YGk z9NuisloL2cj>EeH^1FZ-TEyXBcu4G{#x`Kaf|2suyn{8%C9x1Jv- zs`h?+42`2QP0007&riqqA@*2G$;XK+wDl`ij1yR`_&j|{zjPd` zxg2?2lI76fh%7^lXDj%j+W+V<{J#vtKQj#f{4o5>!|=n6=WFn{;LDBcXCh-rL$&`m ziqF(b=E-~DE#lI7a-RL=by%xH8SqQz?NsoVA?DRw@brC2Cmm=c<=G`Ljrj~dFXXb4 z#eBEH-@*I@1E0tI_Y;)jwes_s|J1;*1#eefb^DoUfPIMh@8@z-4dqlb-)`WyGryK^ zY-E4yn9t)6S5mn4Z-AeSdhPPOgH5T4{pT3UX;ygECwBiR`>!yx=W*uu8Or%F_(ZDL za9+pZ#$YneuUX8)O-WB9Lwt&Xf0oN%$o-Q2eUABu4fQ_H{7$|Rl>RR=|A2u%&b*ax z%ocHbUSs~C!GEd3U%C!=vi}0Z{CSi4#|=EaR8RBvWkdVlV*WWpy}t)f1AJrm5%cE^^WjtGTMYgEg86j@e+$lw zp}tGAgQxjpyk4Y%r*XK+(60qbIq~8)L%oZc_Z#}PjLW&+P|h0WGnhxSm9!STo%69! z#^skA#=o4(v3^My?=P#_f1{y2+nK+|Fg|ru4n|@XuVeDK?_qzp!Jj@qp?S59e~2jW zTA;y=%wI5!&wb1vHSjIWcNp49-?LEp5kr6J_Ym>ziR$S1c#wX={5Iz0x4i+R0L-c>=< zdYQNKd0MVESM)Rgq@kT3GJluhxJQ`(8kbM^F_bJg@2OwEF^s>B`E7=B#_>A8ko${b zl|w||*hj95tJ<9sxZ=S|@4 z>=O&6Tu!c`UuDc&4dYPG{51xDFZ0t4{`B4T%-9M!e^43!OMge~fj`Zk8+m->I`AO# znas=eY8M~Ju%X^oZqHf6_zO=k917QM*^=%NgJ0FU!qqMheODX8H?`h?Yim`Y!d>O^ zh6BNn%UxG5Ja{#;$`|%|)0Zw;v~XxA`l8qGatDL%2A8iU9BdF-Z+m+|!5}dh3!gWi*`fNvmYyIlg#d#&J5=VAHo=enL*1}o& zGT9TVQ~D-qtK7n0(;!fk2#4xTzfBH?{qSoLo~j+xc305n_EPg*YTv+nl`o=Kt&08H z83#vrYB5?quN#$wYDKugjRWNo6~67F!XFmFx*AbY?HAiZK@kX&)*vcsd{l?1*b$@*d%<_j&L_tq8jtL`|Spgeqw43}0L88-T-)iq%i5skx%cTQ4d+AwClL5}OW) z*R?>nsVv?1*Pdz`GH)p0szeL$eRhS%BSJnu#%VoD^!jUDbs?V@lm|muiy?N4irOj+ zDTZ=zsA+B}Lv}~dPmQm43%3^qg)t4QJYtJ4?5V^ck>wZeP!&9A+E#=@+-&6=aG>5lCD zw6J?CTU%@D(ktrx_^%55UXe~#r8`t9(!C8eC{M+3P*ryLf+2sPMrXL71$|X+3gBFA zRam4e#~~fr^sNDyVP8G=bdJL*piIwnUnQT_m0lDgEj3gw{u2AcBI=P>bra% zEFTkX1cyt97Qc%OB#HY}Q`;NI?{+Bk>{!+>pTkMy%eeMDUHVD<8sh0$w6x{(I*E3! z+1P%j#hu8|F_H1|xt_#!b~KKk?EfB)&t|^}6^0~H`ceE9*o@;RmiQK8=~hn0%jdD}X&{lLpK1--lK(RVntL){ zKDU+szmNQXeB}I;aq>9Qb4%*KjF*3(I(7p{B&Q16UdBs&A4+Vz_Pahq4Y89Llk72h z%JyTUvSj`8KHg3XE7B_2P}LN6MhPDwLsf8flE&`=HG7@Ls2SOuSd_;;*44@J9eh7c q*BPoq_FJwCG(BY7W8)KVR;~R8QPwMcCl3?37+w-0rotc~A|8Jg0V^gQ?ePx9>FyC2$4zj2to zyU%Z*J$v@--hH`QUQEx*h>wdiuEd#sl zdAE$t$w%U@2qo^S{h+>m;qpj;w8mIzb&2mra^mWcyy}M^O4VTCcj~W-t|hwc;@UV` zINFHXb2n6_H>wsj#4oOISC#%PXmNc)ReDq6uJpza>f@L1w-Ze_)>Wl9+ll6A%UhR? z#%SEjk+nbCAltj_&Uj;%*Ji%b^(EQ<%vU1wUTzbgnO}z>Gp??=zI7A6d^*7x6=r(F zhrQtdZ`jitcJhYb+P0{g|K<(9@P>8X@B?qS!yCTs4cB~l7KlO%-JmH1P);3(2rKV@9 z=}BrjLro7?)5&VOkDBhLraQDwM^7FXdbdifDR**tsdmn1_A6~$e!X1pf$KeRy$AkJ zJuq&}nBhtNr{v8k4b4eKUuX{pD>ZY-DHSl-3Q zzvtuK;jVpde6NoWx89|tbvUN1J!Xf_cHlC_LM)$YUFwM(lXg0C?AdVvyxNYXEmzt_}f1I3m^Zb zkIT(mtbTsS$KUnw_k8?)AOFzDKl1U9ef(1&|AUYJ(Z@gc@h^P*&p!TFAHU$^U;Fsq zef%Fj{x2VI_VEOJ!ilxt+xd7$A5Zl0TYdaCAMfeoclh{SJ}wVMv9{|zAHUzn2mAO# zKK_W0Kj!0Oe0-dbKjGsOeEccva$c>*iGQ#?4kBgfgDI)W`DS)twkgjyx%sA|+!O~* zS$Te0K_I&zAftlp2N+UKacObLWRJ_5FnUy0_JoX#r_v{9PaZWoD?M8(%MJ!|3rt}k zlwV|`m6$*{kUu9BFnPh}OkR13nN<-qd9#a6FjQ>vD)a5Q!jA2bpKk{{F15LV=S_K0 zxydidH{~VerXpa+MY%REwsEeFi*5CDO=xbe3FXeUUTGU9;{rPl+xZ116t?ri6?T5u zget-|KWs|N%1xea|E$@z&d^*_Qec-UmmzG*g1IKQw7>+)f+n}Xc1S4K&bRB7+&tSy z6(uHER$@wQ`-3*8A{4gsrQUqIPP-j*N=?h1f?W6IZsJ;VwA>o)^~jxy+{-n>d%#_O z6Z{_K9aMg@a$Ub%x24E#*7c8ys4-ms6Uue{lYKnT$BUIqd)#(az_~s1DBo@GLgk5e z+SRj6xo)TYydXukOS@brrHJc#wnp^3F4rX~od2gNM_kS$u04@oF=OO^qw;T2`At6F z!+tNN$a>{2)zvTOEh+3n;nJUSPv`Q}m49FPWaV;jDVxOTp({C?%@m8U5GmGTFa z?^T|v{A1;EEph8Tp?rw)FO@&2yg|AA3BlFVF2M%2$bNaq4$iwNAEx|nZaMK2mwD^2d~a zsyt2kDdnS-f2Dl1@QqOK0*0LxEw$7Ebi93O?fxvyOrOj{C(y6x@J=% zMe3I!MV;4VhVxYHKlyz^iu0jx`F%o)^WkuJuk3szT<#^LI3Ep{YmgM@8F0CFNOA7I zZ%Gkt^)`}VOW)|IC4Um?k#npRSI<V=gD)L?MmE?Qi ztH}4k*O2drSCb!vuOmMUuOZ(cJJXhp(NW8OKZ^X#Nq!o>oBS+% zFZp?RE&1(e{{iyL$Uj7W6@G;L8oZ9Y34V+`zD*R4ledMRB<}#PC;tZRKSSOH`RB;H z!7q}#>)$2v-pIc~-Ur@5?yi@OI*|{DcP4k& zOR`L_@?c}H6JIPPOcaxum?g!<2rcR~I+@^0{p^myqv(SCL0w`7~xF`5xr2BHssJL%ttgO@0u*j{GpZ zhP(%SBl%JIW^&ihTggu#e>?dp_)hZE@ZIER;d{x?!)wW3!0~f{{4(+nkza)$A-@K% zBX5EqBad%u4?0_pledMRB<}#PCoe|*XUMxC{~Y<3$iGP51NoQ8d&94g_klN%_k%Z* z4}cq-Z)CO%$?!JhsqpsXL*ep9uoPF%aCm3(k?^kMqv74jGvK|*$HSAzccVZ1l21Z@ zfAV4Qf#lQS`uAShwwdrDl%EG5MqUUXK|Txao>yGIwMF~KQhpHm^47K#mtP6bBA*AJ zNWK6*nS2p^8u?QA4DuE59P)PX0`k@HBJwxjCFE=2<>c$(A@U9IF!?6uh2-1d zOUQS?tH^i3SCa36uOixJK_{__nbR~-1YM? z@*>0|$d4d)``Pugd(It8`L3Tc$(JC`B0q3|BF-UqzjrSrcfVuSkXNHUCb?qn>`-o=9fyL^agmz}21;_1LxFI}Bp2k` zmu-^sDk@BJM1y5f$uFBdJ5Xv9O3Oll(6of6Ei6^^6o&a?O!DwV@sO6gkp>em9oCCA;aCBs;MR%WIQq&Yc0{?RU%XrV3p99Y1X+ zVr_q&y!2p8I68`Kzck4$-yJUP;dRTbO!*_QE!DV=b+Xg3mKWoFFU!@-%Sg67O&d(1 Veb+qp@|pPmorRHFT0eOCe*^G7BBuZV literal 0 HcmV?d00001 diff --git a/obj/main.o b/obj/main.o new file mode 100644 index 0000000000000000000000000000000000000000..4c55c17e3270342a7dcd8a5e0fa72b95fb785617 GIT binary patch literal 1680 zcmbtU&1(};5TDIz>qjE72nzMEqDV#as0tbdB_HHN2)5J)kK0XLX|TJAyKkim;z3Yy z5d1&9c=YbcoBxE+g9p7A>P+@c`+VKK=!CcPo8Oz?ypP$waH7G$5`rYY|?%SW`>FeF@H2Ky2aE~T;=W1E)C-CW-VTfKIb{ z*IDWhl29hjZE-^^SE|V@x_KpysT#nU)PePC4Xo|5wOE`#_7OLH9(fvMx9CwnReo1! zmgb&g0>wE-XFUSH_p+w#%$oqP@t0*bR?0FPj%LwVWj=?`-mwjHhw>?NLEGo-?8udH zln-SCT+HE@a`;LP4}mud#c<}p?eta}^`5)ZZa-?RyX*BvujK-EHil6+k`N^!Z)HJ& z0(!cY-M!S#DxPleq{d&+_@c&N)p$B9*Krh2^=a&zh+hWM8-R#ql=@9Zk-y~$>2FIA zPdw>?7{oD%Xq*PaaS-?+&V^&?i_XJ-C6?as877d--*lfwUf}Pq^Pj*$J-w4=r)$WO zaevb&&1Fn}5eMC24To+Mbr~CqJb|9p;WzD^;x8-Se8XR;dDBr1-L7FkHUCwA9ko>R zuijzI>z_ufo4NiSoFr~pPeS}&#g`18_3Rrs&sb0Wqz4){a~~_cx&O~fQ`NKt`Tm(+ zLy*a{YOT>sy0mD*l`@Do;b62NI_KEyBSFwA*X4A+@7^=sF7LIdBlq5OKll8&@67Q&ohVMGQz;Tj(FpDB zgc5D<-_!Gvnx|GeM5U>Xuh|dL;lgk|yLv)48xi{m({GrvTM>8>&EH4FY`DJr__W?+ zx3(Al?$-P{a;MF^pX|ha5>Z9?Bi-ID*pUk3<3qWVrMZ>ma3y!a8FU8vFRnzpbEnjv zuX`AGW=TDnq10MOs<*YdWs?hYgc$~89n)xg$Mf`fTT?n@3w3q{oaGWGIakLZv4WcK zqaXFS!%XZiLX_dZILUCNILS~`9Ofv^30zg%JUqyoPTHxbHIz*43A`(TcQfxYzALIF zv!gsZc-V5DK^z}R;05N0FL9&ag4y*1d-6TM8mv1N3S6Ipstaufvc)CNR05wd_yN|%{*LCj4|+g&MRVK-_L6tW;O2cE zS^Ss2|1*nA{Fe#*mBG!ry)n3%_pQNUFZX<>Ilc>hCwX(4&rteMe4h-4ES4 zUc*4Gi=qYI1J?58~|^R{W9d4LEfvSF~imr^eJkTHzDhb`f2*29nb?%QDaDtTIe{h;Py+lqtETd z&X2xF%zyPi%f5&?z{3>Df6RoeOMY303}%{ki-8GaY^OCddkHQ*+W#gthDiMcU1cS% z{sa2ymhVFS@yd(8)E{Z=+>Gd<&i`7k_@9BV?T@&2?HN&vhPSaXM2BmTPS)c5@9F#B KYFH}8_Wuo|3Mx_n literal 0 HcmV?d00001 diff --git a/obj/opcodes.o b/obj/opcodes.o new file mode 100644 index 0000000000000000000000000000000000000000..9b4b39ae8d941df3e32fa3ed4900bbb42831b744 GIT binary patch literal 10208 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 P`FrKSr_9P)8qR+cf0rrM literal 0 HcmV?d00001 diff --git a/obj/ram.o b/obj/ram.o new file mode 100644 index 0000000000000000000000000000000000000000..be62b84bbc418696b76ca3740a56dd779ab79c05 GIT binary patch literal 1656 zcmbW0&ui3B5XUFk+E%-Dw<1!gXbvhZw2!KwQbZz)b`en!7V1H2b{na**@YyFTQA%9@>wNRxWM9*G=|JAheCEe{nY_Gv@c5zYI3(iGJsNvLi3XLi z?PsP>Rhpqz^TUtY;VF>X;n!y8d-Ica4kq0F%o@Jv?Q_+6l(IN)pOG`DI}6pR=^-EZA~QUYt61)zt-p60vy(45 zfnCJzg0qyxb>#SpSxnHc(eVgTrF2r@*08L?3U?}#3Qd+_?lScso(=X$44HHEd*m7_ zJIxsG8BTR=Twrz1I)643W|s{YUo^!*q&isfY(`9K9aLM;AZuj>rE;9o13p{^cmFz`n&?c3nvDVvS z#o=zC(r}QH+6vNuR69vXb$U@0cA0g1X{gqpv{sTd=?A9j`(?oHa5&~hK6H?sKqyg%xgv0Sc4aD`bQHls^b3muIPEv z`s-Yao~!)WBKu#lA=|RQ=rxPksh@4fvZYSYQ#QctyM)*mEG!#Z<*Uq30KQMz{C}E; z@?Mxf{%xt3`IqgD-qYrwp3!GaZLuDGi?c`lqS=25jwPmDPUhGutDiUUd7i0_V*NkS Cb(FyX literal 0 HcmV?d00001 diff --git a/obj/rom.o b/obj/rom.o new file mode 100644 index 0000000000000000000000000000000000000000..5d4f1009213bbba272f283cd76328a35c3c566e7 GIT binary patch literal 1736 zcmbtTUr19?7(ctSsngmYB?6-^w9U=wWz|Ds5DP1pNJSvjL+G40COHS&6|@%(Y8W)w zi$wIYq)`hDUrh3;s9@KpOZd=(kS~s)hi(xS8Qsoz?m2T_uTOpBet&-F`^WE`O`YvK z$5||hi3OcPTMKEkY95-TXcPpXItXmlb zzL17>Pj`10@9!TPACt!U6T&ee)X_OkqT>NQCd4%pjgaN$Wn`IfT3Q-w>vH&_4q_ZW z5HG0H`A?ylOOa00cdWI~96hHoGtCX%U1;-bAY!$nl6lY z!0W5W;DgAMAzaP5=M^ literal 0 HcmV?d00001 diff --git a/src/6502.c b/src/6502.c new file mode 100644 index 0000000..211d5a2 --- /dev/null +++ b/src/6502.c @@ -0,0 +1,176 @@ +#include "inc/types.h" +#include "inc/memory.h" +#include "inc/opcodes.h" + +oc1 opcode_decoded_1; +oc2 opcode_decoded_2; + +void init() +{ + // pc is set using 0xFFFC-0xFFFD + mem.mar = 0xFFFD; + mem_read(); + pc = mem.mdr << 8; + mem.mar = 0xFFFC; + mem_read(); + pc = mem.mdr + pc; +} + +void fetch() +{ + mem.mar = pc; + mem_read(); + ir = mem.mdr; + pc++; +} + +void decode() +{ + // instruction pattern is "aaabbbccc" where: + // aaa cc determines the opcode + // bbb determines the addressing mode + + db aaa = (ir & 0b11100000) >> 5; + db bbb = (ir & 0b00011100) >> 2; + db cc = (ir & 0b00000011); + + db aaacc = (aaa << 2) | cc; + + opcode_decoded_1 = aaacc; + opcode_decoded_2 = ir; +} + +void execute() +{ + switch(opcode_decoded_2) + { + case BRK: + return brk(); + case BPL: + return bpl(); + case JSR: + return jsr(); + case BMI: + return bmi(); + case RTI: + return rti(); + case BVC: + return bvc(); + case RTS: + return rts(); + case BVS: + return bvs(); + case BCC: + return bcc(); + case BCS: + return bcs(); + case BNE: + return bne(); + case BEQ: + return beq(); + case PHP: + return php(); + case CLC: + return clc(); + case PLP: + return plp(); + case SEC: + return sec(); + case PHA: + return pha(); + case CLI: + return cli(); + case PLA: + return pla(); + case SEI: + return sei(); + case DEY: + return dey(); + case TYA: + return tya(); + case TAY: + return tay(); + case CLV: + return clv(); + case INY: + return iny(); + case CLD: + return cld(); + case INX: + return inx(); + case SED: + return sed(); + case TXA: + return txa(); + case TXS: + return txs(); + case TAX: + return tax(); + case TSX: + return tsx(); + case DEX: + return dex(); + case NOP: + return nop(); + } + + switch (opcode_decoded_1) + { + case BIT: + return bit(); + case JMP: + return jmp(); + case JPA: // JMP (absolute) + return jmp(); + case STY: + return sty(); + case LDY: + return ldy(); + case CPY: + return cpy(); + case CPX: + return cpx(); + case ORA: + return ora(); + case AND: + return and(); + case EOR: + return eor(); + case ADC: + return adc(); + case STA: + return sta(); + case LDA: + return lda(); + case CMP: + return cmp(); + case SBC: + return sbc(); + case ASL: + return asl(); + case ROL: + return rol(); + case LSR: + return lsr(); + case ROR: + return ror(); + case STX: + return stx(); + case LDX: + return ldx(); + case DEC: + return dec(); + case INC: + return inc(); + } +} + +void run() +{ + while (pc != 0) + { + fetch(); + decode(); + execute(); + } +} diff --git a/src/inc/6502.h b/src/inc/6502.h new file mode 100644 index 0000000..9ebeba1 --- /dev/null +++ b/src/inc/6502.h @@ -0,0 +1,7 @@ +#ifndef _APPLE_I_6502_H_ +#define _APPLE_I_6502_H_ + +void init(); +void run(); + +#endif diff --git a/src/inc/memory.h b/src/inc/memory.h new file mode 100644 index 0000000..5722ee0 --- /dev/null +++ b/src/inc/memory.h @@ -0,0 +1,11 @@ +#ifndef _APPLE_I_MEMORY_LOGIC_H_ +#define _APPLE_I_MEMORY_LOGIC_H_ + +#include "types.h" + +mr mem; // memory "glue" logic + +void mem_read(); +void mem_write(); + +#endif diff --git a/src/inc/opcodes.h b/src/inc/opcodes.h new file mode 100644 index 0000000..c2252ea --- /dev/null +++ b/src/inc/opcodes.h @@ -0,0 +1,142 @@ +#ifndef _APPLE_I_OPCODES_H_ +#define _APPLE_I_OPCODES_H_ + +#include "types.h" + +dw pc; // program counter +db ac; // accumulator +db x; // x register +db y; // y register +db sp; // stack pointer +db ir; // intruction register + +enum opcodes +{ + BIT = 0b00100, + JMP = 0b01000, + JPA = 0b01100, + STY = 0b10000, + LDY = 0b10100, + CPY = 0b11000, + CPX = 0b11100, + + ORA = 0b00001, + AND = 0b00101, + EOR = 0b01001, + ADC = 0b01101, + STA = 0b10001, + LDA = 0b10101, + CMP = 0b11001, + SBC = 0b11101, + + ASL = 0b00010, + ROL = 0b00110, + LSR = 0b01010, + ROR = 0b01110, + STX = 0b10010, + LDX = 0b10110, + DEC = 0b11010, + INC = 0b11110, +}; + +enum opcodes_comp +{ + BRK = 0x00, + BPL = 0x10, + JSR = 0x20, + BMI = 0x30, + RTI = 0x40, + BVC = 0x50, + RTS = 0x60, + BVS = 0x70, + BCC = 0x90, + BCS = 0xB0, + BNE = 0xD0, + BEQ = 0xF0, + + PHP = 0x08, + CLC = 0x18, + PLP = 0x28, + SEC = 0x38, + PHA = 0x48, + CLI = 0x58, + PLA = 0x68, + SEI = 0x78, + DEY = 0x88, + TYA = 0x98, + TAY = 0xA8, + CLV = 0xB8, + INY = 0xC8, + CLD = 0xD8, + INX = 0xE8, + SED = 0xF8, + + TXA = 0x8A, + TXS = 0x9A, + TAX = 0xAA, + TSX = 0xBA, + DEX = 0xCA, + NOP = 0xEA +}; + +typedef enum opcodes oc1; +typedef enum opcodes_comp oc2; + +void adc(); // add memory to accumalator with carry +void and(); // and memory with accumulator +void asl(); // shift left one bit (memory on accumulator) +void bcc(); // branch on carry clear +void bcs(); // branch on carry set +void beq(); // branch on result zero +void bit(); // test bits in memory with accumulator +void bmi(); // branch on result minus +void bne(); // branch on result not zero +void bpl(); // branch on result plus +void brk(); // force break +void bvc(); // branch on overflow clear +void bvs(); // branch on overflow set +void clc(); // clear carry flag +void cld(); // clear decimal mode +void cli(); // clear interrupt disable bit +void clv(); // clear overflow flag +void cmp(); // compare memory with accumulator +void cpx(); // compare memory and index x +void cpy(); // compare memory and index y +void dec(); // decrement memory by one +void dex(); // decrement index x by one +void dey(); // decrement index y by one +void eor(); // exclusive-or memory with accumulator +void inc(); // increment memory by one +void inx(); // increment index x by one +void iny(); // increment index y by one +void jmp(); // jump to new location +void jsr(); // jump to new location saving return address +void lda(); // load accumulator with memory +void ldx(); // load index x with memory +void ldy(); // load index y with memory +void lsr(); // shift one bit right (memory or accumulator) +void nop(); // no operation +void ora(); // or memory with accumulator +void pha(); // push accumulator on stack +void php(); // push processor status on stack +void pla(); // pull accumulator from stack +void plp(); // pull processor status from stack +void rol(); // rotate on bit left (memory or accumulator) +void ror(); // rotate on bit right (memory or accumulator) +void rti(); // return from interrupt +void rts(); // retrun from subroutine +void sbc(); // subtract memory from accumulator with borrow +void sec(); // set carry flag +void sed(); // set decimal flag +void sei(); // set interrupt disable status +void sta(); // store accumulator in memory +void stx(); // store index x in memory +void sty(); // store index y in memory +void tax(); // transfer accumulator to index x +void tay(); // transfer accumulator to index y +void tsx(); // transfer stack pointer to index x +void txa(); // transfer index x to accumulator +void txs(); // transfer index x to stack pointer +void tya(); // transfer index y to accumulator + +#endif diff --git a/src/inc/ram.h b/src/inc/ram.h new file mode 100644 index 0000000..79c4f3d --- /dev/null +++ b/src/inc/ram.h @@ -0,0 +1,11 @@ +#ifndef _APPLE_I_RAM_H_ +#define _APPLE_I_RAM_H_ + +#include "types.h" + +mr ram; // random access memory + +void ram_read(); +void ram_write(); + +#endif diff --git a/src/inc/rom.h b/src/inc/rom.h new file mode 100644 index 0000000..db3e3e1 --- /dev/null +++ b/src/inc/rom.h @@ -0,0 +1,10 @@ +#ifndef _APPLE_I_ROM_H_ +#define _APPLE_I_ROM_H_ + +#include "types.h" + +mr rom; // read only memory + +void rom_read(); + +#endif diff --git a/src/inc/types.h b/src/inc/types.h new file mode 100644 index 0000000..d822094 --- /dev/null +++ b/src/inc/types.h @@ -0,0 +1,16 @@ +#ifndef _APPLE_I_TYPES_H_ +#define _APPLE_I_TYPES_H_ + +typedef unsigned char db; +typedef unsigned short dw; +typedef unsigned int dd; + +struct memory_registers +{ + dw mar; // memory address register + db mdr; // memory data register +}; + +typedef struct memory_registers mr; + +#endif diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..32ce5d6 --- /dev/null +++ b/src/main.c @@ -0,0 +1,11 @@ +#include + +#include "inc/6502.h" + +int main(int argc, char **argv) +{ + printf("Apple-I Computer\n"); + init(); + run(); + return 0; +} diff --git a/src/memory.c b/src/memory.c new file mode 100644 index 0000000..3529595 --- /dev/null +++ b/src/memory.c @@ -0,0 +1,65 @@ +#include "inc/types.h" +#include "inc/ram.h" +#include "inc/rom.h" +#include "inc/memory.h" + +/* + + + - - - - + + | 0000 | + | | + | | + | RAM | + | | + | | + | 0FFF | + + - - - - + + | | + + . . . + unused + . . . + + | | + + - - - - + + | FF00 | + | | + | ROM | + | | + | FFFF | + + - - - - + + + */ + +void mem_read() +{ + if (mem.mar >= 0x0000 && mem.mar <= 0x0FFF) + { + // 4KB memory RAM + ram.mar = mem.mar; + ram_read(); + mem.mdr = ram.mdr; + } + else if (mem.mar >= 0xFF00 && mem.mar <= 0xFFFF) + { + // wozmon ROM + rom.mar = mem.mar & 0x00FF; + rom_read(); + mem.mdr = rom.mdr; + } + else + { + mem.mdr = 0x00; + } +} + +void mem_write() +{ + if (mem.mar >= 0x0000 && mem.mar <= 0x0FFF) + { + // 4KB memory RAM + ram.mar = mem.mar; + ram.mdr = mem.mdr; + ram_write(); + } +} diff --git a/src/opcodes.c b/src/opcodes.c new file mode 100644 index 0000000..4e01603 --- /dev/null +++ b/src/opcodes.c @@ -0,0 +1,339 @@ +#include + +#include "inc/opcodes.h" + +void adc() +{ + // add memory to accumalator with carry + printf("ADC\n"); +} + +void and() +{ + // and memory with accumulator + printf("AND\n"); +} + +void asl() +{ + // shift left one bit (memory on accumulator) + printf("ASL\n"); +} + +void bcc() +{ + // branch on carry clear + printf("BCC\n"); +} + +void bcs() +{ + // branch on carry set + printf("BSC\n"); +} + +void beq() +{ + // branch on result zero + printf("BEQ\n"); +} + +void bit() +{ + // test bits in memory with accumulator + printf("BIT\n"); +} + +void bmi() +{ + // branch on result minus + printf("BMI\n"); +} + +void bne() +{ + // branch on result not zero + printf("BNE\n"); +} + +void bpl() +{ + // branch on result plus + printf("BPL\n"); +} + +void brk() +{ + // force break + printf("BRK\n"); +} + +void bvc() +{ + // branch on overflow clear + printf("BVC\n"); +} + +void bvs() +{ + // branch on overflow set + printf("BVS\n"); +} + +void clc() +{ + // clear carry flag + printf("CLC\n"); +} + +void cld() +{ + // clear decimal mode + printf("CLD\n"); +} + +void cli() +{ + // clear interrupt disable bit + printf("CLI\n"); +} + +void clv() +{ + // clear overflow flag + printf("CLV\n"); +} + +void cmp() +{ + // compare memory with accumulator + printf("CMP\n"); +} + +void cpx() +{ + // compare memory and index x + printf("CPX\n"); +} + +void cpy() +{ + // compare memory and index y + printf("CPY\n"); +} + +void dec() +{ + // decrement memory by one + printf("DEC\n"); +} + +void dex() +{ + // decrement index x by one + printf("DEX\n"); +} + +void dey() +{ + // decrement index y by one + printf("DEY\n"); +} + +void eor() +{ + // exclusive-or memory with accumulator + printf("EOR\n"); +} + +void inc() +{ + // increment memory by one + printf("INC\n"); +} + +void inx() +{ + // increment index x by one + printf("INX\n"); +} + +void iny() +{ + // increment index y by one + printf("INY\n"); +} + +void jmp() +{ + // jump to new location + printf("JMP\n"); +} + +void jsr() +{ + // jump to new location saving return address + printf("JSR\n"); +} + +void lda() +{ + // load accumulator with memory + printf("LDA\n"); +} + +void ldx() +{ + // load index x with memory + printf("LDX\n"); +} + +void ldy() +{ + // load index y with memory + printf("LDY\n"); +} + +void lsr() +{ + // shift one bit right (memory or accumulator) + printf("LSR\n"); +} + +void nop() +{ + // no operation + printf("NOP\n"); +} + +void ora() +{ + // or memory with accumulator + printf("ORA\n"); +} + +void pha() +{ + // push accumulator on stack + printf("PHA\n"); +} + +void php() +{ + // push processor status on stack + printf("PHP\n"); +} + +void pla() +{ + // pull accumulator from stack + printf("PLA\n"); +} + +void plp() +{ + // pull processor status from stack + printf("PLP\n"); +} + +void rol() +{ + // rotate on bit left (memory or accumulator) + printf("ROL\n"); +} + +void ror() +{ + // rotate on bit right (memory or accumulator) + printf("ROR\n"); +} + +void rti() +{ + // return from interrupt + printf("RTI\n"); +} + +void rts() +{ + // retrun from subroutine + printf("RTS\n"); +} + +void sbc() +{ + // subtract memory from accumulator with borrow + printf("SBC\n"); +} + +void sec() +{ + // set carry flag + printf("SEC\n"); +} + +void sed() +{ + // set decimal flag + printf("SED\n"); +} + +void sei() +{ + // set interrupt disable status + printf("SEI\n"); +} + +void sta() +{ + // store accumulator in memory + printf("STA\n"); +} + +void stx() +{ + // store index x in memory + printf("STX\n"); +} + +void sty() +{ + // store index y in memory + printf("STY\n"); +} + +void tax() +{ + // transfer accumulator to index x + printf("TAX\n"); +} + +void tay() +{ + // transfer accumulator to index y + printf("TAY\n"); +} + +void tsx() +{ + // transfer stack pointer to index x + printf("TSX\n"); +} + +void txa() +{ + // transfer index x to accumulator + printf("TXA\n"); +} + +void txs() +{ + // transfer index x to stack pointer + printf("TXS\n"); +} + +void tya() +{ + // transfer index y to accumulator + printf("TYA\n"); +} diff --git a/src/ram.c b/src/ram.c new file mode 100644 index 0000000..d95f1af --- /dev/null +++ b/src/ram.c @@ -0,0 +1,14 @@ +#include "inc/types.h" +#include "inc/ram.h" + +db ram_memory[4096]; // total memory: 4KB + +void ram_read() +{ + ram.mdr = ram_memory[ram.mar]; +} + +void ram_write() +{ + ram_memory[ram.mar] = ram.mdr; +} diff --git a/src/rom.c b/src/rom.c new file mode 100644 index 0000000..5015dc5 --- /dev/null +++ b/src/rom.c @@ -0,0 +1,42 @@ +#include "inc/types.h" +#include "inc/rom.h" + +db rom_memory[] = { + 0xD8, 0x58, 0xA0, 0x7F, 0x8C, 0x12, 0xD0, 0xA9, + 0xA7, 0x8D, 0x11, 0xD0, 0x8D, 0x13, 0xD0, 0xC9, + 0xDF, 0xF0, 0x13, 0xC9, 0x9B, 0xF0, 0x03, 0xC8, + 0x10, 0x0F, 0xA9, 0xDC, 0x20, 0xEF, 0xFF, 0xA9, + 0x8D, 0x20, 0xEF, 0xFF, 0xA0, 0x01, 0x88, 0x30, + 0xF6, 0xAD, 0x11, 0xD0, 0x10, 0xFB, 0xAD, 0x10, + 0xD0, 0x99, 0x00, 0x02, 0x20, 0xEF, 0xFF, 0xC9, + 0x8D, 0xD0, 0xD4, 0xA0, 0xFF, 0xA9, 0x00, 0xAA, + 0x0A, 0x85, 0x2B, 0xC8, 0xB9, 0x00, 0x02, 0xC9, + 0x8D, 0xF0, 0xD4, 0xC9, 0xAE, 0x90, 0xF4, 0xF0, + 0xF0, 0xC9, 0xBA, 0xF0, 0xEB, 0xC9, 0xD2, 0xF0, + 0x3B, 0x86, 0x28, 0x86, 0x29, 0x84, 0x2A, 0xB9, + 0x00, 0x02, 0x49, 0xB0, 0xC9, 0x0A, 0x90, 0x06, + 0x69, 0x88, 0xC9, 0xFA, 0x90, 0x11, 0x0A, 0x0A, + 0x0A, 0x0A, 0xA2, 0x04, 0x0A, 0x26, 0x28, 0x26, + 0x29, 0xCA, 0xD0, 0xF8, 0xC8, 0xD0, 0xE0, 0xC4, + 0x2A, 0xF0, 0x97, 0x24, 0x2B, 0x50, 0x10, 0xA5, + 0x28, 0x81, 0x26, 0xE6, 0x26, 0xD0, 0xB5, 0xE6, + 0x27, 0x4C, 0x44, 0xFF, 0x6C, 0x24, 0x00, 0x30, + 0x2B, 0xA2, 0x02, 0xB5, 0x27, 0x95, 0x25, 0x95, + 0x23, 0xCA, 0xD0, 0xF7, 0xD0, 0x14, 0xA9, 0x8D, + 0x20, 0xEF, 0xFF, 0xA5, 0x25, 0x20, 0xDC, 0xFF, + 0xA5, 0x24, 0x20, 0xDC, 0xFF, 0xA9, 0xBA, 0x20, + 0xEF, 0xFF, 0xA9, 0xA0, 0x20, 0xEF, 0xFF, 0xA1, + 0x24, 0x20, 0xDC, 0xFF, 0x86, 0x2B, 0xA5, 0x24, + 0xC5, 0x28, 0xA5, 0x25, 0xE5, 0x29, 0xB0, 0xC1, + 0xE6, 0x24, 0xD0, 0x02, 0xE6, 0x25, 0xA5, 0x24, + 0x29, 0x07, 0x10, 0xC8, 0x48, 0x4A, 0x4A, 0x4A, + 0x4A, 0x20, 0xE5, 0xFF, 0x68, 0x29, 0x0F, 0x09, + 0xB0, 0xC9, 0xBA, 0x90, 0x02, 0x69, 0x06, 0x2C, + 0x12, 0xD0, 0x30, 0xFB, 0x8D, 0x12, 0xD0, 0x60, + 0x00, 0x00, 0x00, 0x0F, 0x00, 0xFF, 0x00, 0x00 +}; + +void rom_read() +{ + rom.mdr = rom_memory[rom.mar]; +}