From 54a61e6104b780674edc5fdbf133fe96c2595f36 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Wed, 31 Mar 2021 07:15:26 -0400 Subject: [PATCH 01/10] Fix inability to build --- Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 377eef4..64f35c2 100644 --- a/Makefile +++ b/Makefile @@ -35,17 +35,17 @@ obj/util.o: obj util.c cc65 util.c $(cflags) -o obj/util.s ca65 obj/util.s -o obj/util.o -obj/ramtest.o: obj ramtest.c - cc65 ramtest.c $(cflags) -o obj/ramtest.s - ca65 obj/ramtest.s -o obj/ramtest.o +#obj/ramtest.o: obj ramtest.c +# cc65 ramtest.c $(cflags) -o obj/ramtest.s +# ca65 obj/ramtest.s -o obj/ramtest.o obj/gwconio.o: obj gwconio.s ca65 gwconio.s -o obj/gwconio.o -bin/main.sys: bin obj/main.o obj/ram2e.o obj/ram2gs.o obj/ram2gs_asm.o obj/util.o obj/ramtest.o obj/gwconio.o +bin/main.sys: bin obj/main.o obj/ram2e.o obj/ram2gs.o obj/ram2gs_asm.o obj/util.o obj/gwconio.o ld65 -o bin/main.sys obj/main.o obj/ram2gs.o obj/ram2e.o obj/ram2gs_asm.o obj/util.o obj/gwconio.o -C apple2-system.cfg --lib apple2.lib -D __EXEHDR__=0 -bin/main.dbg.sys: bin obj/main.o obj/ram2e.dbg.o obj/ram2gs.dbg.o obj/ram2gs_asm.o obj/util.o obj/ramtest.o obj/gwconio.o +bin/main.dbg.sys: bin obj/main.o obj/ram2e.dbg.o obj/ram2gs.dbg.o obj/ram2gs_asm.o obj/util.o obj/gwconio.o ld65 -o bin/main.dbg.sys obj/main.o obj/ram2gs.dbg.o obj/ram2e.dbg.o obj/ram2gs_asm.o obj/util.o obj/gwconio.o -C apple2-system.cfg --lib apple2.lib -D __EXEHDR__=0 GWRAM.po: bin/main.sys From bb0ae40761f4616b3d7af639448056cffd04ed3a Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Wed, 31 Mar 2021 07:17:53 -0400 Subject: [PATCH 02/10] Add bypass in spin(...) in case VBL not working --- bin/GWRAM.dbg.po | Bin 143360 -> 143360 bytes bin/GWRAM.po | Bin 143360 -> 143360 bytes util.c | 5 +++-- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/GWRAM.dbg.po b/bin/GWRAM.dbg.po index 4b8027cc24d2667f4a0b628963b39d5d724b496f..88c6d68256b568fb403a59db9e585bd688c33483 100644 GIT binary patch delta 3922 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 delta 3853 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 diff --git a/bin/GWRAM.po b/bin/GWRAM.po index ea530066f1ca7db514664775cf55a5fd0c6a8977..338020c3d2f996f0ede9bc0985a2758874599faf 100644 GIT binary patch delta 3953 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 aKokteAJWcv;@!UEKldGHW3z%uWBVV~X1Uq` diff --git a/util.c b/util.c index 4584d13..4058569 100644 --- a/util.c +++ b/util.c @@ -40,8 +40,9 @@ void spin(uint8_t x, uint8_t y) { // Wait specificed number of frames for (k = 0; k < SPIN_FRAMESPERCHAR; k++) { - while (*VBL < 0); - while (*VBL >= 0); + unsigned char l; + for (l = 0; *VBL < 0 && l < 255; l++); + for (l = 0; *VBL >= 0 && l < 255; l++); } } } From 214c3f27eaa0f4e6e40c748570730c1ae2bbcccc Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Wed, 31 Mar 2021 07:41:46 -0400 Subject: [PATCH 03/10] Improve VBL bypass in spin(...) --- bin/GWRAM.dbg.po | Bin 143360 -> 143360 bytes bin/GWRAM.po | Bin 143360 -> 143360 bytes util.c | 12 ++++++------ 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/bin/GWRAM.dbg.po b/bin/GWRAM.dbg.po index 88c6d68256b568fb403a59db9e585bd688c33483..0c4a1b2a10bba629b6ac765ed3dacd703e762221 100644 GIT binary patch delta 4107 zcmZ`+4RBLc7Jhm8=^up@thD^N7n;&GNlDVQrKK+y=&D=w4JhlD0s>EIv8YIuU6-A4 zHi0%Z4Sg~30Tz@szG=FBwXfUCD3-O-83hSD<35Mknbp}@JF8n^7iz#C7dsDi> zSu>gQ?mh3^@0@$?`OZyz6Pdn=%;6Tpyga7l4#sOO%V3yy8AJx`aUC1by>7}d=~f-j zob~-(4yOkVSD}7~T&N&a?X>S7N1r=nb_{urUDcm6Uy}>ROrAr&bLQ)E@+kkNm1_`hQ<~w?=Z>;6GvY%*2l6_| z)PNpzD?-YGE;o^Nhtn`|b*qA>+R75PMQTbjju zqPRj8`~eqw+=*r_QJAPc;tNE4187Ahq(ElMyvSE6UHSNd!j+noRU**{zELa<#Ot zafz3{1o2GT7SceXdPw0Zq%8UWD9v&;|JBm8SmsffC_CayOdk@>VO1LXECTiC=>&Pn zB$tRmfLd3Sf}(4#q^-%Bwt%!lw)pi$V%E6Kg!YWT!5l00T+qITVN53$;}|P0!!f;B zg2l{n;ilDCvF8wzvQmq&U#Bj^epW5Pe*FSs2H;WMh)*oV0gz>Qs1y&DVd>k9)he) zOv9tzB69wq`PVHPgEWZ=m96Nf}A@m4L9xe(lX#*v!IZL?{`5#rx77T zUJ02Ydx$fd5jGKLhmDGn7mCx!@oO*wa+u{h!UjEh$Mpkl%z`&yKBw*&~yDFO)-aHOr#Xl4W&~gt$rz;`cr5fwna}DEGPw! zuY71g2Z5ul(?vQ|IPRQ73ot8HfbWHkP}6xAM||UQ)bX# zfk6~+cnh!ws=KyQEga8Qn1S#eBo*9iE8*)+zYC|+VR+RSe=iJf7ulwh@wFAqh|9UR zX3WID?t<^M)gqfe(AkCdxcK|&2>b>Tv(I*f(POsWuy%E_v`d>38o;16o|{-0&rU45 z#}}Un>&xL1K4zP=#4M+mgfmdcCWW`79jMhIF2_o8K!C?UA`4mEpdxbsK0J9?V<%q} z)RkDQ!f3Z$sgg0Y3G|$s4|1`CH5Xa`!D05yAwgY*wLFw-=U;V@p@|G%a)9*j?`%h( zNnP6(>E4(6w%NUF@YEW7q#g@Oy^ITXt-)d41-{Q6>*+fJ5A=a;st#+{r#P&ADS$_{ z5f5!3KGh~Xw2=(Jb4LJOccF*vu>fCMkv7>`(GWF`9%PO|-Sy;bqS@$WJ6ZIkmQM~4strn^ClY{cMFOz<_-?HPmU#zjabkW$ zXV@4v?l-pQdT=fV5XFf$*juBS(;#hHF5Jkg@C8VOvR5mK@6l$F;2KG=#LKU=9F(wu zQ-wO+3z0TyWeqBTXHzVt2>^+S8BAK^d$p`oO?XjLB>+G`(=}3GDK_EIMy#eH$sh9I zOHEkCxc~A-JZuUz;qHyNMy4vA)qg;6VB|T6TPHuUq0_7mtYG7C8I_l@i4Lh_?Oo_&)e&U8~QZ) zjUY47%~w}VFq#2c>uhK@Jz0iGkDLth|DY|mfpjxJu*By-(#oqY@geLFgtlNP1>H!X zOs8cjW@r-waBafWpj{zd2>LDf%R=u!7bXHmE)=T(FSFtINA`VDBPgQT{L>ENJE;}K zliF=6K~}e5KShQp0$Pl~5L@&@B{)!vJdi51(p}K9)L)Dm5DcZMW^3Nl4oEf#BM~ML zlBETEA9qIev39t;WBWk_BfeI+9Rz=vbbw&z0e^R=i0*ci8FVHAnJfC*d&A?|T5W8< zvCA0H@+N#*ZZv1KxGoY5n6LBEilBM1QXXX@!O0*T=7CtCuM2(XBD~@YiL7(yv}?*-*zQ;@C%v*`VeL^@cNEs>B}8!v!O2OQvN0BzDF0WpxfsCPH`J1_M(78593&{ z?|}FS4sFLhP$?gCVMCnPvf(mNoAFQ!7Wm`R?;fpi*VL7<2~)7<;si7T?cbAK+UI1Y z0H>SNKU!0FZ%aSR zX}PgL!LAz|41>FpoS5X`$Qyueph|M&`WIP`awFn{S`_sjg@Xe{Z`#!x+)$De(6{d4 zmVwbfauD3+pwmJ|s}uR5ZCLqGW??srhwoKBprhe6qbIrOpZJW*zF_P?s2PhbSek4t zHCro{3|_JE$8CzmA5c8U@7Vc)sq6`EH}^EhGxQ_A!iA!o*vEx_&jm)4NpU#!_ygDd zx|H9xykv?CZN=&+m&lK;ZHTRFK+Gv-D;{X|uWR+Mh5xX+8i8Rxsg!i=((O?LkiJO9 zg!FRZ8@^*E5Baamj$PFsLomEH$ebGIwfXAqQ*oVUhHKI(p5Q`nad7LL(hRXZeZTbk zI`_%5=-+Q-@!0o`!&fPZV*g7WFO#SAMVqB)loM*uPi_on^kn(OB99;^FN}TXdHcL4 iapfcCyTsKCZ=aW{pZbMi$aB=w9(n3Se25a+l=pa)N=|=SWA#)9!#nTSQS@3xt40P;@43 zt+)KSxVdDHi<>~GjUG!bX3uPzl%XvSfkOp3M7m6!DYY{-qirU11Qz^5)YkNS?*g8V zW-@QT_wDz7-}k=v{l2#+j^v6Xxr6I%H#wQzw=yBuGzY`H$si)I2Q92*`9qE)#}Yc2 zTkzj|JY5_rS%}I#YN>|Mpr?9A3O(*o*K#BcfA6#t6y z+%^u~iO~CA<d%2?3lIb_|}>Y^JMG|preD2?+lRjkXnoKDvCWVS* zEM^eJL)3yF_oDM2R8XcdacjFMwTnsgiXT#-GF2fo=2tHMq#Tanisi+XMV6V$)RmhQ|ABCSK}0kGR5AfnG!Cbp!_onq2fz)wdU!>Oy7v z%CZoB3By0LHjo7pw?YDsA+7BDQO>9f`A^HUV)-?NiL*nZ>CdQX2D`J+3kcL5lZp_T z6q4a)brHY3B5Tb4d zIX5L-w;GnYP9|fe%Q$S&qd3g!yK&e$lb8W`+%hD}F)YE@jt646za1;DKUimRC>I~R zJJf*zDL&D*Ewzi0QWM7Kr&IZu^751RjcOQT&TI)?A5&@Nq<;ECRWnuw5dXO+QKO(9wa{A-mcTFDptpq#U4uti-A znIU^fGlm^Dk!A<&nw=NsW>MnO93-}S zFuBe*S|#(d6!ef9vJ~`OAIwrrB^besg1Vt(`XcL~DVdxZztn<~>707UOyZYnD4Y7# zdQkAt68`N`?s~ZR0RX0CaAwdM;)#~tI0d`WWcWEgR9i_nw`eYUz5-}y&(JW=qW#%K zOgvm;nWOymVee{4)D+8*7NVr&!mQC;4Do|-1Z#`UZ(1d9i?DoQsF15qDOT%KrLL5F`>DWvm&CW z3l@-ewD{nXN0Jr@99r{0Y0CMP#`Lv|X=}{N54b>=nc84_zy)y}My_vVmUC7~!!<|6%%s2WgRRnSHOS%_eS6FIp zK_g!Nw2MfvKr)L??TVp)xq4#8)zKE?k`P2A$lI7MG-svr&Dr;f>5-VV2JXHY?$OFb z<%zPG1LZ2xW992Vtd;j*Z6YbaBWdQLwmS4-Etv!Cp3yx9JGxiURV;U7biu84s~Fgc zF4yr_1Bs6M3v9S!kUiNc=&xd98hXLa&+-s4hls@<7{fc7ccL}QRAIJdsZuRehctXi z!~2q0(2^=H*{tE1WsEQKC%Ss~!2<=|mkwZK{8A4#J`up9eiRQJBR=&M9ym?}@VrYx zf)D+}osjsLFKcqn7mV8vcQE_*V##@}G2GGIi6*?^JYtlLtXMG z0Wy9XP%a357HE3g<0y1BfUrAhOi}H_dvRw6d^rf|xkld59x|e(ZuDa}zqVRq)G6IB z4Eg!(q9vo^*;I>{2sI|r{YMN!YirOV`lp6dBJT{ue>1Uu~H<`I<-n6BEVNB5` zTB8U~L{4Ijkzd37j@tA(ShUfoQ5hZLWmOc?VFRq{ zj`m^nth;BYcS?UBTo`Rha%k~(t#4|Zf`sEak9>;nnlH!2` z{y2s8Ufg%_I3CQ2rf}PFT(2L%7gLLHQt!b;ZPl3MeG_sIj=*>T>n~%&iav3puiYS; zL<9%&8zhx)VrA>v#i7pv1D^*-p-0=)ByiQfN+;mcP3DG7Nss*^#SVf++c1ebg*!xFgiCe_e4d^ zmM9O;<&~EnD^eD%b2|4e=@AX~ob-O9ahPFOa|()rNRK^slZe zi|K|j$CxV(b)f=3T&6YT@>UsWvwgRZFoq5KVi7UTv$c1r6A^wn+%-dDkhG~V@JI~r zYvgD8?T{^MHWd%`G5PZ&4r1X(|U!xR~!kcq^!`CQuN8 z2;@ z)^J<1j0Wn+44RmLntZ)Gdt#}4V{u}Ky~QpW(?&$2Fh1q5yrexMImh|jx`^{uttQU2 zM@A!X*sTevw*@Vx?V5kj2LKuqj3bT7k><6`+oAlj!O8w+iPG9o&JNTmzi)8e^3%HJ zmL91$+AQsg#&h{Kb>S#Ppj>XKUl$LUd8bbs*R<)d*WvvES~El9sAyV*(d`0cT@1It zr&U;jua36!Sick)xJ=40A@*)B*?gY#SxQ+ro}@G+kvAl~(Cz)_F=Rxu@C8cihGmaJ z1=FQ`uJ=$!a7gUzXlxfx9qJ@vCx`;cO(rk=Rge5OCNT0T98Kdyq_%j(V%Cz4BZA6=qs_YsW}fm=Yv7E+gjBM*fdetJc>^bJ;GhbEKt)h(;7EDOn>eij z!UpLHPUGNck+)iJ;088u0{XdsaDDP{1y{wIt0Ue@BHd*cN8iTUIhBR5Zymf}J4>a( zrH9M8_&fX-e{Uqw8a;#Mcd_#P#s$t7{hEWXaPu{8tt~8R+`&I?JeyPXUf^$m_X9jb z|6~Uj&E@1GE;^Ny4o^(TC7H(zu5G5GZ>^oTl8c_idKqUHCzb^h%Y%qH#+<~-#_;mS z@G|(dX{i?&=3d3})PgmwDkhCVEj=W5Kgp5bv+VFyYqtdAwSMMUiZ^EHTaKkIhEqGD zdgM7=6u~cB^_XExZ0mg{EH-af3+PW|)W%hBPr<*oJC4II?fM;gDla@$Sy9Fb^=Qu5 zgO08|QEue~bz*FIEj|*!=9RxQUzu0Ojs%pmPyNhx3uf_7-_w8cJ#G2Ru;OIZ{{y&{ BgyH}I diff --git a/bin/GWRAM.po b/bin/GWRAM.po index 338020c3d2f996f0ede9bc0985a2758874599faf..b2cd446fd1b0b34603291f0c8db0212f438bea77 100644 GIT binary patch delta 4188 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 YNhxdl&rPAgqk-o2+yAtFJ8M1pKkHRFCjbBd delta 4012 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 diff --git a/util.c b/util.c index 4058569..6474d50 100644 --- a/util.c +++ b/util.c @@ -13,9 +13,10 @@ char read_applekey(void) { return ((*PB0) | (*PB1)) & 0x80; } #define SPIN_FRAMESPERCHAR 4 void spin(uint8_t x, uint8_t y) { char i; + unsigned int l; // Sync to frame before starting - while (*VBL >= 0); + for (l = 0; *VBL >= 0 && l < 2500; l++); // Wait and animate spinner. // Spin_half @@ -40,14 +41,13 @@ void spin(uint8_t x, uint8_t y) { // Wait specificed number of frames for (k = 0; k < SPIN_FRAMESPERCHAR; k++) { - unsigned char l; - for (l = 0; *VBL < 0 && l < 255; l++); - for (l = 0; *VBL >= 0 && l < 255; l++); + for (l = 0; *VBL < 0 && l < 2500; l++); + for (l = 0; *VBL >= 0 && l < 2500; l++); } } } // Wait a frame when finished - while (*VBL < 0); - while (*VBL >= 0); + for (l = 0; *VBL < 0 && l < 2500; l++); + for (l = 0; *VBL >= 0 && l < 2500; l++); } From c93999003d1ab00ec95b085b58eec959cc0f4da1 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Sat, 24 Apr 2021 03:51:07 -0400 Subject: [PATCH 04/10] Add commands for RAM2GS with AGM CPLD --- bin/GWRAM.dbg.po | Bin 143360 -> 143360 bytes bin/GWRAM.po | Bin 143360 -> 143360 bytes ram2gs.c | 65 ++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 53 insertions(+), 12 deletions(-) diff --git a/bin/GWRAM.dbg.po b/bin/GWRAM.dbg.po index 0c4a1b2a10bba629b6ac765ed3dacd703e762221..be1d2a3bd11bc7341821b3d0ec656e183223ce28 100644 GIT binary patch delta 4842 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 diff --git a/ram2gs.c b/ram2gs.c index ca1d0a0..21e399e 100644 --- a/ram2gs.c +++ b/ram2gs.c @@ -9,11 +9,14 @@ #include "gwconio.h" #include "ram2gs_asm.h" -static void ram2gs_erase() { ram2gs_cmd(0x28); } -static void ram2gs_program() { ram2gs_cmd(0x24); } +// Commands common to Altera and AGM static void ram2gs_set4mb() { ram2gs_cmd(0x10); } static void ram2gs_set8mb() { ram2gs_cmd(0x11); } -static void ram2gs_setnvm(char en8meg) { + +// Commands for just altera +static void ram2gs_altera_erase() { ram2gs_cmd(0x28); } +static void ram2gs_altera_program() { ram2gs_cmd(0x24); } +static void ram2gs_altera_setnvm(char en8meg) { char i; // Clock in 0 to enable this setting entry ram2gs_cmd(0x20); @@ -35,7 +38,44 @@ static void ram2gs_setnvm(char en8meg) { ram2gs_cmd(0x23); } - ram2gs_program(); + ram2gs_altera_program(); +} + +// Commands for just AGM +static void ram2gs_agm_select() { ram2gs_cmd(0x34); } +static void ram2gs_agm_deselect() { ram2gs_cmd(0x30); } +static void ram2gs_agm_tx8(char data) { + char i; + for (i = 0; i < 8; i++) { + ram2gs_cmd(0x34 + ((data >> (7-i)) & 1)); + ram2gs_cmd(0x36 + ((data >> (7-i)) & 1)); + } +} +static void ram2gs_agm_write_en() { + ram2gs_agm_deselect(); + ram2gs_agm_select(); + ram2gs_agm_tx8(0x06); // 0x06 is write enable + ram2gs_agm_deselect(); +} +static void ram2gs_agm_erase() { + ram2gs_agm_write_en(); + ram2gs_agm_select(); + ram2gs_agm_tx8(0x20); // 0x20 is sector erase (4 kB) + ram2gs_agm_tx8(0x00); // address[23:16] + ram2gs_agm_tx8(0x10); // address[15:8] + ram2gs_agm_tx8(0x00); // address[7:0] + ram2gs_agm_deselect(); +} +static void ram2gs_agm_write_nvm(char en8meg) { + ram2gs_agm_write_en(); + ram2gs_agm_select(); + ram2gs_agm_tx8(0x02); // 0x02 is page (byte) program + ram2gs_agm_tx8(0x00); // address[23:16] + ram2gs_agm_tx8(0x10); // address[15:8] + ram2gs_agm_tx8(0x00); // address[7:0] + if (en8meg) { ram2gs_agm_tx8(0xFF); } // data[7:0] + else { ram2gs_agm_tx8(0x00); } // data[7:0] + ram2gs_agm_deselect(); } static void menu(void) @@ -102,11 +142,11 @@ int ram2gs_main(void) gwcputsxy(1, 8, "Resetting RAM2GS settings."); gwcputsxy(1, 9, "Do not turn off your Apple."); - ram2gs_erase(); // Erase RAM2GS settings memory - ram2gs_set8mb(); // Enable 8 megabytes now - - // Wait for >= 500ms on even the fastest systems. - spin(32, 8); + // Erase RAM2GS settings memory + ram2gs_altera_erase(); // Erase for Altera CPLD + ram2gs_agm_erase(); // Erase for AGM CPLD + spin(32, 8); // Wait for >= 500ms on even the fastest systems. + ram2gs_set8mb(); // Enable 8 megabytes now (default) // Show success message and quit clrscr(); // Clear screen @@ -130,9 +170,10 @@ int ram2gs_main(void) gwcputsxy(1, 8, "Saving RAM2GS capacity setting."); gwcputsxy(1, 9, "Do not turn off your Apple."); // Save capacity in nonvolatile memory. - ram2gs_setnvm(en8meg); - // Wait for >= 500ms on even the fastest systems. - spin(33, 8); + ram2gs_altera_setnvm(en8meg); // Save for Altera CPLD + ram2gs_agm_erase(); // Erase for AGM CPLD + spin(33, 8); // Wait for >= 500ms on even the fastest systems. + ram2gs_agm_write_nvm(en8meg); // Write for AGM CPLD // Print success message clrscr(); // Clear screen gwcputsxy(1, 8, "RAM2GS capacity saved successfully."); From ac1d41f28247b1aac7bbfc27a99747b52f5d4be8 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Sun, 13 Aug 2023 01:49:47 -0400 Subject: [PATCH 05/10] Revert "Add commands for RAM2GS with AGM CPLD" This reverts commit c93999003d1ab00ec95b085b58eec959cc0f4da1. --- bin/GWRAM.dbg.po | Bin 143360 -> 143360 bytes bin/GWRAM.po | Bin 143360 -> 143360 bytes ram2gs.c | 65 +++++++++-------------------------------------- 3 files changed, 12 insertions(+), 53 deletions(-) diff --git a/bin/GWRAM.dbg.po b/bin/GWRAM.dbg.po index be1d2a3bd11bc7341821b3d0ec656e183223ce28..0c4a1b2a10bba629b6ac765ed3dacd703e762221 100644 GIT binary patch delta 4538 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 delta 4971 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 (7-i)) & 1)); - ram2gs_cmd(0x36 + ((data >> (7-i)) & 1)); - } -} -static void ram2gs_agm_write_en() { - ram2gs_agm_deselect(); - ram2gs_agm_select(); - ram2gs_agm_tx8(0x06); // 0x06 is write enable - ram2gs_agm_deselect(); -} -static void ram2gs_agm_erase() { - ram2gs_agm_write_en(); - ram2gs_agm_select(); - ram2gs_agm_tx8(0x20); // 0x20 is sector erase (4 kB) - ram2gs_agm_tx8(0x00); // address[23:16] - ram2gs_agm_tx8(0x10); // address[15:8] - ram2gs_agm_tx8(0x00); // address[7:0] - ram2gs_agm_deselect(); -} -static void ram2gs_agm_write_nvm(char en8meg) { - ram2gs_agm_write_en(); - ram2gs_agm_select(); - ram2gs_agm_tx8(0x02); // 0x02 is page (byte) program - ram2gs_agm_tx8(0x00); // address[23:16] - ram2gs_agm_tx8(0x10); // address[15:8] - ram2gs_agm_tx8(0x00); // address[7:0] - if (en8meg) { ram2gs_agm_tx8(0xFF); } // data[7:0] - else { ram2gs_agm_tx8(0x00); } // data[7:0] - ram2gs_agm_deselect(); + ram2gs_program(); } static void menu(void) @@ -142,11 +102,11 @@ int ram2gs_main(void) gwcputsxy(1, 8, "Resetting RAM2GS settings."); gwcputsxy(1, 9, "Do not turn off your Apple."); - // Erase RAM2GS settings memory - ram2gs_altera_erase(); // Erase for Altera CPLD - ram2gs_agm_erase(); // Erase for AGM CPLD - spin(32, 8); // Wait for >= 500ms on even the fastest systems. - ram2gs_set8mb(); // Enable 8 megabytes now (default) + ram2gs_erase(); // Erase RAM2GS settings memory + ram2gs_set8mb(); // Enable 8 megabytes now + + // Wait for >= 500ms on even the fastest systems. + spin(32, 8); // Show success message and quit clrscr(); // Clear screen @@ -170,10 +130,9 @@ int ram2gs_main(void) gwcputsxy(1, 8, "Saving RAM2GS capacity setting."); gwcputsxy(1, 9, "Do not turn off your Apple."); // Save capacity in nonvolatile memory. - ram2gs_altera_setnvm(en8meg); // Save for Altera CPLD - ram2gs_agm_erase(); // Erase for AGM CPLD - spin(33, 8); // Wait for >= 500ms on even the fastest systems. - ram2gs_agm_write_nvm(en8meg); // Write for AGM CPLD + ram2gs_setnvm(en8meg); + // Wait for >= 500ms on even the fastest systems. + spin(33, 8); // Print success message clrscr(); // Clear screen gwcputsxy(1, 8, "RAM2GS capacity saved successfully."); From 0dc8b9b981789ac990e3b1423eec9377fb80d7bb Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Wed, 16 Aug 2023 03:53:59 -0400 Subject: [PATCH 06/10] Fixed up Altera support --- bin/GWRAM.dbg.po | Bin 143360 -> 143360 bytes bin/GWRAM.po | Bin 143360 -> 143360 bytes ram2gs.c | 75 ++++++++++++----- ram2gs_asm.h | 4 +- ram2gs_asm.s | 205 +++++++++++------------------------------------ 5 files changed, 103 insertions(+), 181 deletions(-) diff --git a/bin/GWRAM.dbg.po b/bin/GWRAM.dbg.po index 0c4a1b2a10bba629b6ac765ed3dacd703e762221..f3f8c8c390c24161df0c53ddd2821c82d669e5f2 100644 GIT binary patch delta 5214 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 G&_U5iH_BRX9-D-Zz_s1^K^o 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 fj`bA=N<6i`#MJHE+{gDgn4P*L63w`o`MnF$n diff --git a/bin/GWRAM.po b/bin/GWRAM.po index b2cd446fd1b0b34603291f0c8db0212f438bea77..70cdb07c0c742a520505cabe0492befa13b49c52 100644 GIT binary patch delta 5365 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 W;CDUZ+H$Pv&&Qf{_;u0D9{(@vQ$v6N diff --git a/ram2gs.c b/ram2gs.c index ca1d0a0..ed84b3e 100644 --- a/ram2gs.c +++ b/ram2gs.c @@ -11,9 +11,13 @@ static void ram2gs_erase() { ram2gs_cmd(0x28); } static void ram2gs_program() { ram2gs_cmd(0x24); } -static void ram2gs_set4mb() { ram2gs_cmd(0x10); } -static void ram2gs_set8mb() { ram2gs_cmd(0x11); } -static void ram2gs_setnvm(char en8meg) { +static void ram2gs_set(char en8meg, char enled) { + char cmd = 0x10; + if (en8meg) { cmd |= 0x01; } + if (enled) { cmd |= 0x02; } + ram2gs_cmd(cmd); +} +static void ram2gs_set_nvm(char en8meg, char enled) { char i; // Clock in 0 to enable this setting entry ram2gs_cmd(0x20); @@ -29,8 +33,18 @@ static void ram2gs_setnvm(char en8meg) { ram2gs_cmd(0x22); } - // Clock in 14 dummy "1"s - for (i = 0; i < 14; i++) { + if (enled) { + // Clock in 0 to enable LED + ram2gs_cmd(0x20); + ram2gs_cmd(0x22); + } else { + // Clock in 1 to disable LED + ram2gs_cmd(0x21); + ram2gs_cmd(0x23); + } + + // Clock in 13 dummy "1"s + for (i = 0; i < 13; i++) { ram2gs_cmd(0x21); ram2gs_cmd(0x23); } @@ -38,7 +52,15 @@ static void ram2gs_setnvm(char en8meg) { ram2gs_program(); } -static void menu(void) +static void menu_led(char enled) { + if (enled) { + gwcputsxy(1, 15, "LED enabled. Press [L] to disable LED."); + } else { + gwcputsxy(1, 15, "LED disabled. Press [L] to enable LED."); + } +} + +static void menu() { uint8_t bankcount = ram2gs_getsize(); gwcputsxy(5, 1, "-- RAM2GS Capacity Settings --"); @@ -63,28 +85,32 @@ static void menu(void) int ram2gs_main(void) { - char en8meg; - char nvm; - int reset_count; + char hasled = 1; + char typecode = 0; + char enled = 0; + char en8meg = 1; + char nvm = 0; + int reset_count = 0; - // Check for RAM2GS - #ifndef SKIP_RAM2GS_DETECT - if(!ram2gs_detect()) { + if (ram2gs_detect(0 << 2)) { + hasled = !ram2gs_detect(0x04); + typecode = 0x0; + } else { + #ifndef SKIP_RAM2GS_DETECT // If no RAM2GS, show an error message and quit gwcputsxy(0, 8, " No RAM2GS II detected."); gwcputsxy(0, 10, " Press any key to quit."); cgetc(); // Wait for key clrscr(); // Clear screen before quitting return EXIT_SUCCESS; + #endif } - #endif - menu(); // Print menu + if (hasled) { enled = !ram2gs_detect(typecode | 0x02); } + menu(); + if (hasled) { menu_led(enled); } // Get user choice from menu - en8meg = 0; - nvm = 0; - reset_count = 0; while (true) { // Set capacity or quit according to keypress. switch (toupper(cgetc() & 0x7F)) { @@ -92,9 +118,14 @@ int ram2gs_main(void) clrscr(); return EXIT_SUCCESS; } - case '1': en8meg = 0; ram2gs_set4mb(); break; - case '2': en8meg = 1; ram2gs_set8mb(); break; - case 'R': { + case '1': en8meg = 0; ram2gs_set(0, enled); break; + case '2': en8meg = 1; ram2gs_set(1, enled); break; + case 'L': { + if (enled == 0) { enled = 1; } + else { enled = 0; } + if (hasled) { menu_led(enled); }; + continue; + } case 'R': { reset_count++; if (reset_count >= 25) { // Show message about resetting. @@ -103,7 +134,7 @@ int ram2gs_main(void) gwcputsxy(1, 9, "Do not turn off your Apple."); ram2gs_erase(); // Erase RAM2GS settings memory - ram2gs_set8mb(); // Enable 8 megabytes now + ram2gs_set(1, 0); // Enable 8 megabytes and disable LED // Wait for >= 500ms on even the fastest systems. spin(32, 8); @@ -130,7 +161,7 @@ int ram2gs_main(void) gwcputsxy(1, 8, "Saving RAM2GS capacity setting."); gwcputsxy(1, 9, "Do not turn off your Apple."); // Save capacity in nonvolatile memory. - ram2gs_setnvm(en8meg); + ram2gs_set_nvm(en8meg, enled); // Wait for >= 500ms on even the fastest systems. spin(33, 8); // Print success message diff --git a/ram2gs_asm.h b/ram2gs_asm.h index fa3e6ec..d4dbea5 100644 --- a/ram2gs_asm.h +++ b/ram2gs_asm.h @@ -1,8 +1,8 @@ #ifndef RAM2GS_ASM_H #define RAM2GS_ASM_H -uint8_t __fastcall__ ram2gs_getsize(void); -uint8_t __fastcall__ ram2gs_detect(void); uint8_t __fastcall__ ram2gs_cmd(char cmd); +uint8_t __fastcall__ ram2gs_detect(char typecode); +uint8_t __fastcall__ ram2gs_getsize(void); #endif /* RAM2GS_ASM_H */ diff --git a/ram2gs_asm.s b/ram2gs_asm.s index 23c4c12..40464b5 100644 --- a/ram2gs_asm.s +++ b/ram2gs_asm.s @@ -2,9 +2,9 @@ .autoimport on .importzp sp +.export _ram2gs_cmd .export _ram2gs_getsize .export _ram2gs_detect -.export _ram2gs_cmd .define GetTWConfig $BCFF3C .define SetTWConfig $BCFF40 @@ -44,7 +44,6 @@ .segment "CODE" - .proc _thrash: near .A8 .I8 @@ -125,12 +124,18 @@ rts .endproc -.proc _unswap: near +.proc _ram2gs_cmd: near .A8 .I8 - ; Save current bank and accumulator - phb - pha + ; Preamble + php ; Push status + sei ; Disable interrupts + clc ; Clear carry + xce ; Clear emulation bit + php ; Push status again, reflecting emulation bit + phb ; Push bank + pha ; Push command in accumulator + AI8 ; Switch to bank 0xFB lda #$FB pha @@ -141,36 +146,30 @@ lda #$AD sta $FFFF ; Pull and submit command - lda #$00 - sta $FFFD - ; Restore accumulator and bank and return pla - plb + sta $FFFD + ; Postamble + plb ; Restore bank + plp ; Restore status + xce ; Restore emulation bit + plp ; Pull status again to pull I flag rts .endproc +.proc _unswap: near +.A8 +.I8 + tya + ora #$00 + jmp _ram2gs_cmd +.endproc + .proc _swap: near .A8 .I8 - ; Save current bank and accumulator - phb - pha - ; Switch to bank 0xFB - lda #$FB - pha - plb - ; Submit C1AD - lda #$C1 - sta $FFFE - lda #$AD - sta $FFFF - ; Pull and submit command - lda #$01 - sta $FFFD - ; Restore accumulator and bank and return - pla - plb - rts + tya + ora #$01 + jmp _ram2gs_cmd .endproc .proc _ram2gs_getsize: near @@ -183,40 +182,8 @@ xce ; Clear emulation bit php ; Push status again, reflecting emulation bit phb ; Push bank - - ; Check for TranswarpGS AI8 - lda #0 - pha ; Push "TWGS absent" flag -; AI16 -; lda $BCFF00 -; cmp #$5754 ; "WT" -; bne _ram2gs_getsize_notwgs1 -; lda $BCFF02 -; cmp #$5347 ; "SG" -; bne _ram2gs_getsize_notwgs1 -; -; ; Get and push TWGS config -; jsl GetTWConfig -; pha -; ; Disable TWGS data cache -; jsl DisableDataCache ; Disable data cache -; -; ; Pull to restore TWGS settings into A -; pla -; ; Pull "TWGS absent" flag into x, and discard it -; AI8 -; plx -; AI16 -; ; Push TWGS settings -; pha -; ; Push "TWGS exists" flag -; AI8 -; ldx #1 -; phx - _ram2gs_getsize_notwgs1: - AI8 ; Go to bank 3F ldy #$3F phy @@ -261,27 +228,13 @@ stx $3456 ; Check result - ldx #$80 + lda #$80 plp beq _ram2gs_getsize_return - ldx #$40 - ; Restore TWGS config - _ram2gs_getsize_return: - pla ; Pull TWGS flag - phx ; Push to save return value -; beq _ram2gs_getsize_post ; Skip if no TWGS -; plx ; Get return value back -; AI16 -; pla ; Pull TWGS config -; AI8 -; phx -; AI16 -; jsl SetTWConfig -; AI8 + lda #$40 ; Postamble - _ram2gs_getsize_post: - pla ; Pull return value + _ram2gs_getsize_return: plb ; Restore bank plp ; Restore status xce ; Restore emulation bit @@ -289,50 +242,9 @@ rts .endproc -.proc _ram2gs_detect: near +.proc _ram2gs_detect_internal: near .A8 .I8 - ; Preamble - php ; Push status - sei ; Disable interrupts - clc ; Clear carry - xce ; Clear emulation bit - php ; Push status again, reflecting emulation bit - phb ; Push bank - - ; Check for TranswarpGS - AI8 - lda #0 - pha ; Push "TWGS absent" flag -; AI16 -; lda $BCFF00 -; cmp #$5754 ; "WT" -; bne _ram2gs_detect_notwgs1 -; lda $BCFF02 -; cmp #$5347 ; "SG" -; bne _ram2gs_detect_notwgs1 -; -; ; Get and push TWGS config -; jsl GetTWConfig -; pha -; ; Disable TWGS data cache -; jsl DisableDataCache ; Disable data cache -; -; ; Pull to restore TWGS settings into A -; pla -; ; Pull "TWGS absent" flag into x, and discard it -; AI8 -; plx -; AI16 -; ; Push TWGS settings -; pha -; ; Push "TWGS exists" flag -; AI8 -; ldx #1 -; phx - - _ram2gs_detect_notwgs1: - AI8 ; Switch to bank 0x3F lda #$3F pha @@ -389,65 +301,44 @@ ; Done, now put back clobbered bytes _ram2gs_detect_done: - jsr _swap ; Swap + jsr _swap ; Swap pla ; Get value to restore to swapped bank 3F sta $8000 ; Restore - jsr _unswap ; Unswap + jsr _unswap ; Unswap pla ; Get value to restore to unswapped bank 3F sta $8000 ; Restore - ; Restore TWGS config - _ram2gs_detect_return: - pla ; Pull TWGS flag - phx ; Push to save return value -; beq _ram2gs_detect_post ; Skip if no TWGS -; plx ; Get return value back -; AI16 -; pla ; Pull TWGS config -; AI8 -; phx -; AI16 -; jsl SetTWConfig -; AI8 - - ; Postamble - _ram2gs_detect_post: - pla ; Pull return value - plb ; Restore bank - plp ; Restore status - xce ; Restore emulation bit - plp ; Pull status again to pull I flag + ; Return rts .endproc -.proc _ram2gs_cmd: near +.proc _ram2gs_detect: near .A8 .I8 ; Preamble + phx ; Push X + phy ; Push Y php ; Push status sei ; Disable interrupts clc ; Clear carry xce ; Clear emulation bit php ; Push status again, reflecting emulation bit phb ; Push bank - pha ; Push command in accumulator AI8 - ; Switch to bank 0xFB - lda #$FB - pha - plb - ; Submit C1AD - lda #$C1 - sta $FFFE - lda #$AD - sta $FFFF - ; Pull and submit command - pla - sta $FFFD + + ; Transfer typecode (shifted) to Y register + and #$0E + tay + + jsr _ram2gs_detect_internal + ; Postamble + txa ; Get return value plb ; Restore bank plp ; Restore status xce ; Restore emulation bit plp ; Pull status again to pull I flag + ply ; Pull X + plx ; Pull Y rts .endproc From 44bd31fe503a85f8473d67af0ea991f342329dba Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Wed, 16 Aug 2023 05:19:15 -0400 Subject: [PATCH 07/10] Now supporting Altera MAX II/V UFM and SPI flash --- bin/GWRAM.dbg.po | Bin 143360 -> 143360 bytes bin/GWRAM.po | Bin 143360 -> 143360 bytes ram2gs.c | 122 +++++++++++++++++++++++++++++++++++++---------- 3 files changed, 97 insertions(+), 25 deletions(-) diff --git a/bin/GWRAM.dbg.po b/bin/GWRAM.dbg.po index f3f8c8c390c24161df0c53ddd2821c82d669e5f2..7d0f5df085db5f16b7adeadd03ea0f989c8bb5f2 100644 GIT binary patch delta 5525 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 Z0a7}$yUTFUy~};@+U}RH?Pg8C{6GG$A+G=c delta 4896 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 (7-i)) & 1)); + ram2gs_cmd(0x36 + ((data >> (7-i)) & 1)); + } +} +static void ram2gs_spi_wren() { + ram2gs_spi_deselect(); + ram2gs_spi_select(); + ram2gs_spi_tx8(0x06); // 0x06 is write enable + ram2gs_spi_deselect(); +} +static void ram2gs_spi_erase() { + ram2gs_spi_wren(); + ram2gs_spi_select(); + ram2gs_spi_tx8(0x20); // 0x20 is sector erase (4 kB) + ram2gs_spi_tx8(0x00); // address[23:16] + ram2gs_spi_tx8(0x10); // address[15:8] + ram2gs_spi_tx8(0x00); // address[7:0] + ram2gs_spi_deselect(); +} +static void ram2gs_spi_set_nvm(char en8meg, char enled) { + ram2gs_spi_erase(); // First erase + spin(33, 8); // Wait for >= 500ms on even the fastest systems. + ram2gs_spi_wren(); + ram2gs_spi_select(); + ram2gs_spi_tx8(0x02); // 0x02 is page (byte) program + ram2gs_spi_tx8(0x00); // address[23:16] + ram2gs_spi_tx8(0x10); // address[15:8] + ram2gs_spi_tx8(0x00); // address[7:0] + // data[7:0] + if (!en8meg && !enled) { ram2gs_spi_tx8(0x7F); } + else if (!en8meg && enled) { ram2gs_spi_tx8(0x3F); } + else if ( en8meg && !enled) { ram2gs_spi_tx8(0xFF); } + else if ( en8meg && enled) { ram2gs_spi_tx8(0xBF); } + ram2gs_spi_deselect(); +} + +static void ram2gs_erase(char typecode) { + switch (typecode) { + case 0x00: ram2gs_max_erase(); break; // Altera MAX II / V + case 0x04: ram2gs_spi_erase(); break; // Lattice MachXO / iCE40 / AGM AG256 + //case 0x08: ram2gs_erase_lcmxo2(); break; // Lattice MachXO2 + } +} +static void ram2gs_set_nvm(char typecode, char en8meg, char enled) { + switch (typecode) { + case 0x00: ram2gs_max_set_nvm(en8meg, enled); break; // Altera MAX II / V + case 0x04: ram2gs_spi_set_nvm(en8meg, enled); break; // Lattice MachXO / iCE40 / AGM AG256 + //case 0x08: ram2gs_set_nvm_lcmxo2(en8meg, enled); break; // Lattice MachXO2 + } } static void menu_led(char enled) { @@ -62,13 +119,11 @@ static void menu_led(char enled) { static void menu() { - uint8_t bankcount = ram2gs_getsize(); + uint8_t bankcount; + clrscr(); // Clear screen + gwcputsxy(5, 1, "-- RAM2GS Capacity Settings --"); - - gotoxy(4, 3); - gwcputs("Current RAM2GS capacity: "); - printf("%d", bankcount * 64); - gwcputs(" kB"); + gwcputsxy(4, 3, "Current RAM2GS capacity: ..."); gwcputsxy(1, 6, "Select desired memory capacity:"); @@ -77,24 +132,40 @@ static void menu() gwcputsxy(1, 18, "Capacity will be saved until power-off."); - gwcputsxy(1, 20, "To remember capacity setting in"); + gwcputsxy(1, 20, "To remember capacity and LED setting in"); gwcputsxy(1, 21, "nonvolatile memory, press Apple+number."); gwcputsxy(1, 23, "Press [Q] to quit without saving."); + + bankcount = ram2gs_getsize(); + gotoxy(29, 3); + printf("%d", bankcount * 64); + gwcputs(" kB"); +} + +static void loading_screen() +{ + clrscr(); // Clear screen + gwcputsxy(8, 1, "Loading RAM2GS settings..."); } int ram2gs_main(void) { - char hasled = 1; - char typecode = 0; - char enled = 0; - char en8meg = 1; - char nvm = 0; - int reset_count = 0; + char hasled = true; + char typecode = false; + char enled = false; + char en8meg = true; + char nvm = false; + int reset_count = false; - if (ram2gs_detect(0 << 2)) { + loading_screen(); + + if (ram2gs_detect(0x00)) { + typecode = 0x00; hasled = !ram2gs_detect(0x04); - typecode = 0x0; + } else if (ram2gs_detect(0x04)) { + typecode = 0x04; + hasled = true; } else { #ifndef SKIP_RAM2GS_DETECT // If no RAM2GS, show an error message and quit @@ -118,11 +189,11 @@ int ram2gs_main(void) clrscr(); return EXIT_SUCCESS; } - case '1': en8meg = 0; ram2gs_set(0, enled); break; - case '2': en8meg = 1; ram2gs_set(1, enled); break; + case '1': en8meg = false; ram2gs_set(en8meg, enled); break; + case '2': en8meg = true; ram2gs_set(en8meg, enled); break; case 'L': { - if (enled == 0) { enled = 1; } - else { enled = 0; } + enled = !enled; + ram2gs_set(en8meg, enled); if (hasled) { menu_led(enled); }; continue; } case 'R': { @@ -133,7 +204,7 @@ int ram2gs_main(void) gwcputsxy(1, 8, "Resetting RAM2GS settings."); gwcputsxy(1, 9, "Do not turn off your Apple."); - ram2gs_erase(); // Erase RAM2GS settings memory + ram2gs_erase(typecode); // Erase RAM2GS settings memory ram2gs_set(1, 0); // Enable 8 megabytes and disable LED // Wait for >= 500ms on even the fastest systems. @@ -142,6 +213,7 @@ int ram2gs_main(void) // Show success message and quit clrscr(); // Clear screen gwcputsxy(1, 8, "RAM2GS settings reset successfully."); + nvm = true; goto end; } continue; @@ -161,7 +233,7 @@ int ram2gs_main(void) gwcputsxy(1, 8, "Saving RAM2GS capacity setting."); gwcputsxy(1, 9, "Do not turn off your Apple."); // Save capacity in nonvolatile memory. - ram2gs_set_nvm(en8meg, enled); + ram2gs_set_nvm(typecode, en8meg, enled); // Wait for >= 500ms on even the fastest systems. spin(33, 8); // Print success message From 8622e2776a4647c6614e3ef7098ca21768adab25 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Thu, 21 Sep 2023 04:25:33 -0400 Subject: [PATCH 08/10] RC --- .gitignore | 1 + Makefile | 46 +++--- bin/GWRAM.dbg.po | Bin 143360 -> 143360 bytes bin/GWRAM.po | Bin 143360 -> 143360 bytes bnc.sh | 4 + ram2e.c | 394 +++++++++++++------------------------------- ram2e_hal.c | 242 +++++++++++++++++++++++++++ ram2e_hal.h | 72 ++++++++ ram2e_hal_lcmxo2.c | 89 ++++++++++ ram2e_hal_max.c | 34 ++++ ram2e_hal_spi.c | 42 +++++ ram2gs.c | 178 ++++++-------------- ram2gs_asm.h | 8 - ram2gs_asm.s | 46 +++++- ram2gs_hal.c | 54 ++++++ ram2gs_hal.h | 19 +++ ram2gs_hal_lcmxo2.c | 88 ++++++++++ ram2gs_hal_max.c | 16 ++ ram2gs_hal_spi.c | 38 +++++ ramtest.c | 103 ------------ ramtest.h | 6 - ramtest.s | 190 --------------------- ramtestpat.c | 4 - util.c | 23 +-- util.h | 3 + 25 files changed, 944 insertions(+), 756 deletions(-) create mode 100755 bnc.sh create mode 100644 ram2e_hal.c create mode 100644 ram2e_hal.h create mode 100644 ram2e_hal_lcmxo2.c create mode 100644 ram2e_hal_max.c create mode 100644 ram2e_hal_spi.c delete mode 100644 ram2gs_asm.h create mode 100644 ram2gs_hal.c create mode 100644 ram2gs_hal.h create mode 100644 ram2gs_hal_lcmxo2.c create mode 100644 ram2gs_hal_max.c create mode 100644 ram2gs_hal_spi.c delete mode 100644 ramtest.c delete mode 100644 ramtest.h delete mode 100644 ramtest.s delete mode 100644 ramtestpat.c diff --git a/.gitignore b/.gitignore index f0b678a..34bd2e8 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ *.o *.sys obj/*.s +.vscode/* diff --git a/Makefile b/Makefile index 64f35c2..82912a0 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ cflags = -O --cpu 6502 -t apple2 -all: GWRAM.po GWRAM.dbg.po +all: bin/GWRAM.po bin/GWRAM.dbg.po obj: @mkdir obj @@ -10,51 +10,55 @@ bin: obj/main.o: obj main.c cc65 main.c $(cflags) -o obj/main.s - ca65 obj/main.s -o obj/main.o + ca65 obj/main.s -o $@ + +obj/ram2e_hal.o: obj ram2e_hal.c + cc65 ram2e_hal.c $(cflags) -o obj/ram2e_hal.s + ca65 obj/ram2e_hal.s -o $@ obj/ram2e.o: obj ram2e.c cc65 ram2e.c $(cflags) -o obj/ram2e.s - ca65 obj/ram2e.s -o obj/ram2e.o + ca65 obj/ram2e.s -o $@ obj/ram2e.dbg.o: obj ram2e.c cc65 ram2e.c $(cflags) -o obj/ram2e.dbg.s -DSKIP_RAM2E_DETECT - ca65 obj/ram2e.dbg.s -o obj/ram2e.dbg.o + ca65 obj/ram2e.dbg.s -o $@ obj/ram2gs_asm.o: obj ram2gs_asm.s - ca65 ram2gs_asm.s -o obj/ram2gs_asm.o + ca65 ram2gs_asm.s -o $@ + +obj/ram2gs_hal.o: obj ram2gs_hal.c + cc65 ram2gs_hal.c $(cflags) -o obj/ram2gs_hal.s + ca65 obj/ram2gs_hal.s -o $@ obj/ram2gs.o: obj ram2gs.c cc65 ram2gs.c $(cflags) -o obj/ram2gs.s - ca65 obj/ram2gs.s -o obj/ram2gs.o + ca65 obj/ram2gs.s -o $@ obj/ram2gs.dbg.o: obj ram2gs.c cc65 ram2gs.c $(cflags) -o obj/ram2gs.dbg.s -DSKIP_RAM2GS_DETECT - ca65 obj/ram2gs.dbg.s -o obj/ram2gs.dbg.o + ca65 obj/ram2gs.dbg.s -o $@ obj/util.o: obj util.c cc65 util.c $(cflags) -o obj/util.s - ca65 obj/util.s -o obj/util.o - -#obj/ramtest.o: obj ramtest.c -# cc65 ramtest.c $(cflags) -o obj/ramtest.s -# ca65 obj/ramtest.s -o obj/ramtest.o + ca65 obj/util.s -o $@ obj/gwconio.o: obj gwconio.s - ca65 gwconio.s -o obj/gwconio.o + ca65 gwconio.s -o $@ -bin/main.sys: bin obj/main.o obj/ram2e.o obj/ram2gs.o obj/ram2gs_asm.o obj/util.o obj/gwconio.o - ld65 -o bin/main.sys obj/main.o obj/ram2gs.o obj/ram2e.o obj/ram2gs_asm.o obj/util.o obj/gwconio.o -C apple2-system.cfg --lib apple2.lib -D __EXEHDR__=0 +bin/main.sys: bin obj/main.o obj/ram2e.o obj/ram2gs_hal.o obj/ram2gs.o obj/ram2e_hal.o obj/ram2gs_asm.o obj/util.o obj/gwconio.o + ld65 -o $@ obj/main.o obj/ram2gs_hal.o obj/ram2gs.o obj/ram2e_hal.o obj/ram2e.o obj/ram2gs_asm.o obj/util.o obj/gwconio.o -C apple2-system.cfg --lib apple2.lib -D __EXEHDR__=0 -bin/main.dbg.sys: bin obj/main.o obj/ram2e.dbg.o obj/ram2gs.dbg.o obj/ram2gs_asm.o obj/util.o obj/gwconio.o - ld65 -o bin/main.dbg.sys obj/main.o obj/ram2gs.dbg.o obj/ram2e.dbg.o obj/ram2gs_asm.o obj/util.o obj/gwconio.o -C apple2-system.cfg --lib apple2.lib -D __EXEHDR__=0 +bin/main.dbg.sys: bin obj/main.o obj/ram2e.dbg.o obj/ram2gs_hal.o obj/ram2gs.dbg.o obj/ram2e_hal.o obj/ram2gs_asm.o obj/util.o obj/gwconio.o + ld65 -o $@ obj/main.o obj/ram2gs_hal.o obj/ram2gs.dbg.o obj/ram2e.dbg.o obj/ram2e_hal.o obj/ram2gs_asm.o obj/util.o obj/gwconio.o -C apple2-system.cfg --lib apple2.lib -D __EXEHDR__=0 -GWRAM.po: bin/main.sys +bin/GWRAM.po: bin/main.sys cp prodos140.po bin/GWRAM.po - cat bin/main.sys | java -jar ./ac-1.6.0.jar -p bin/GWRAM.po gwram.system sys 0x2000 + cat bin/main.sys | java -jar ./ac-1.6.0.jar -p $@ gwram.system sys 0x2000 -GWRAM.dbg.po: bin/main.dbg.sys +bin/GWRAM.dbg.po: bin/main.dbg.sys cp prodos140.po bin/GWRAM.dbg.po - cat bin/main.dbg.sys | java -jar ./ac-1.6.0.jar -p bin/GWRAM.dbg.po gwram.system sys 0x2000 + cat bin/main.dbg.sys | java -jar ./ac-1.6.0.jar -p $@ gwram.system sys 0x2000 .PHONY: clean clean: diff --git a/bin/GWRAM.dbg.po b/bin/GWRAM.dbg.po index 7d0f5df085db5f16b7adeadd03ea0f989c8bb5f2..5d02111cab85294bcca13f2cc84bca73b640f558 100644 GIT binary patch delta 7775 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 HsnP!j1-nU1 delta 5589 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 delta 5630 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 1) & 0x40)); - ufm_bitbang(0x80 | ((mask >> 0) & 0x40)); - ufm_bitbang(0x80 | ((mask << 1) & 0x40)); - ufm_bitbang(0x80 | ((mask << 2) & 0x40)); - ufm_bitbang(0x80 | ((mask << 3) & 0x40)); - ufm_bitbang(0x80 | ((mask << 4) & 0x40)); - ufm_bitbang(0x80 | ((mask << 5) & 0x40)); - ufm_bitbang(0x80 | ((mask << 6) & 0x40)); - } - // Program UFM - ufm_program(); -} - -static void menu(uint16_t bankcount) +static void menu() { - gwcputsxy(5, 1, "-- RAM2E Capacity Settings --"); + clrscr(); // Clear screen + gwcputsxy(5, 1, "-- RAM2E Capacity Settings --"); + + gwcputsxy(1, 6, "Select desired memory capacity:"); + + gwcputsxy(4, 7, "1. 64 kilobytes"); + gwcputsxy(4, 8, "2. 512 kilobytes"); + gwcputsxy(4, 9, "3. 1 megabyte"); + gwcputsxy(4, 10, "4. 4 megabytes"); + gwcputsxy(4, 11, "5. 8 megabytes"); + + gwcputsxy(1, 17, "Capacity will be saved until power-off."); + + gwcputsxy(1, 19, "To remember capacity setting in"); + gwcputsxy(1, 20, "nonvolatile memory, press Apple+number."); + + gwcputsxy(1, 22, "Press [Q] to quit without saving."); +} + +static void menu_size(uint16_t bankcount, char has16m) { if (bankcount < 2) { gotoxy(5, 3); } else { gotoxy(4, 3); } gwcputs("Current RAM2E capacity: "); printf("%d", bankcount * 64); gwcputs(" kB"); - gwcputsxy(1, 5, "Select desired memory capacity:"); + if(has16m) { gwcputsxy(4, 12, "6. 16 megabytes"); } +} - gwcputsxy(4, 7, "1. 64 kilobytes"); - gwcputsxy(4, 9, "2. 512 kilobytes"); - gwcputsxy(4, 11, "3. 1 megabyte"); - gwcputsxy(4, 13, "4. 4 megabytes"); - gwcputsxy(4, 15, "5. 8 megabytes"); - - gwcputsxy(1, 18, "Capacity will be saved until power-off."); - - gwcputsxy(1, 20, "To remember capacity setting in"); - gwcputsxy(1, 21, "nonvolatile memory, press Apple+number."); - - gwcputsxy(1, 23, "Press [Q] to quit without saving."); +static void menu_led(char enled) { + if (enled) { + gwcputsxy(1, 14, "LED enabled. Press [L] to disable LED."); + } else { + gwcputsxy(1, 14, "LED disabled. Press [L] to enable LED."); + } } int ram2e_main(void) { - char mask; - char nvm; - int reset_count; + char type; uint16_t bankcount; + char mask = 0; + char has16m = false; + char hasled = false; + char enled = false; + + char nvm = false; + int reset_count = 0; - // Check for RAM2E ramworks_save(); // Save what will be clobbered - if(!auxram_detect() || !ram2e_detect()) { + if (auxram_detect()) { + if (ram2e_detect(0xFF)) { // MAX + type = 0xFF; + /*} else if (ram2e_detect(0xFE)) { // SPI + type = 0xFE;*/ + } else if (ram2e_detect(0xFD)) { // MachXO2 + type = 0xFD; + } else { type = 0; } + } + + if (type == 0) { + #ifndef SKIP_RAM2E_DETECT ramworks_restore(); // If no RAM2E, show an error message and quit - gwcputsxy(0, 8, " No RAM2E II detected."); + gwcputsxy(0, 8, " No RAM2E II detected."); gwcputsxy(0, 10, " Press any key to quit."); cgetc(); // Wait for key clrscr(); // Clear screen before quitting return EXIT_SUCCESS; + #endif } - // Get size and print menu + // Set chip type + ram2e_hal_set_type(type); + + // Print menu + menu(); + + // Detect and print current capacity plus 16 MB option + #ifndef SKIP_RAM2E_DETECT bankcount = ramworks_getsize(); - menu(bankcount); // Print menu + // If set for 8 MB, check for 16 MB capability + if (bankcount >= 128) { + ram2e_set_mask(0xFF); + has16m = ramworks_getsize() == 256; + ram2e_set_mask(0x7F); + } + #else + bankcount = 128; + #endif + menu_size(bankcount, has16m); // Print size + + // Detect and print LED menu + #ifndef SKIP_RAM2E_DETECT + hasled = ram2e_detect(0xF0); + if (hasled) { + enled = ram2e_detect(0xE3); + menu_led(enled); + } + #else + hasled = true; + #endif + ramworks_restore(); // Restore RAMWorks contents // Get user choice from menu - mask = 0; - nvm = 0; - reset_count = 0; while (true) { // Set capacity mask or quit according to keypress. switch (toupper(cgetc() & 0x7F)) { @@ -327,7 +130,28 @@ int ram2e_main(void) case '3': mask = 0x0F; break; case '4': mask = 0x3F; break; case '5': mask = 0x7F; break; - case 'R': { + case '6': { + if (has16m) { mask = 0xFF; break; } + else { continue; } + #ifdef SKIP_RAM2E_DETECT + } case '7': { + menu_size(bankcount, 1); + continue; + #endif + } case 'L': { + if (hasled) { + enled = !enled; + ram2e_set_led(enled); + menu_led(enled); + if (enled) { + wait(1); + ram2e_flashled(10); + wait(10); + ram2e_flashled(10); + } + } + continue; + } case 'R': { reset_count++; if (reset_count >= 25) { // Show message about resetting. @@ -335,8 +159,8 @@ int ram2e_main(void) gwcputsxy(1, 8, "Resetting RAM2E settings."); gwcputsxy(1, 9, "Do not turn off your Apple."); - ufm_erase(); // Erase RAM2E settings memory - set_mask_temp(0x7F); // Set mask to default (0x7F) + ram2e_erase(); // Erase RAM2E settings memory + ram2e_set_mask(0x7F); // Set mask to default (0x7F) // Wait for >= 500ms on even the fastest systems. spin(32, 8); @@ -356,7 +180,7 @@ int ram2e_main(void) } // Set capacity in volatile memory. - set_mask_temp(mask); + ram2e_set_mask(mask); // Clear screen in preparation to show saving or success message. clrscr(); @@ -366,9 +190,11 @@ int ram2e_main(void) gwcputsxy(1, 8, "Saving RAM2E capacity setting."); gwcputsxy(1, 9, "Do not turn off your Apple."); // Save capacity in nonvolatile memory. - set_nvm(mask); + ram2e_save_start(mask, enled); // Wait for >= 500ms on even the fastest systems. spin(32, 8); + // Finish saving + ram2e_save_end(mask, enled); // Print success message clrscr(); // Clear screen gwcputsxy(1, 8, "RAM2E capacity saved successfully."); diff --git a/ram2e_hal.c b/ram2e_hal.c new file mode 100644 index 0000000..c82c63a --- /dev/null +++ b/ram2e_hal.c @@ -0,0 +1,242 @@ +#include +#include +#include +#include +#include +#include "util.h" +#include "ram2e_hal.h" + +static char _cmd_cmd; +static char _cmd_arg; +/* ram2e_cmd(...) issues a coded command+argument sequence to the RAM2E */ +static void ram2e_cmd(char cmd, char arg) { + // Load operation and data bytes into X and Y registers + // in preparation for command sequence + _cmd_cmd = cmd; + _cmd_arg = arg; + __asm__("ldx %v", _cmd_cmd); // X = command + __asm__("ldy %v", _cmd_arg); // Y = argument + + // First, reset command sequence just in case it, + // for some reason, has not timed out. (e.g. crazy fast accelerator?) + // Write 0 twice because command and argument steps always advance seq. + __asm__("lda #0"); + __asm__("sta $C073"); + __asm__("sta $C073"); + + // Command sequence + __asm__("lda #$FF"); + __asm__("sta $C073"); + __asm__("lda #$00"); + __asm__("sta $C073"); + __asm__("lda #$55"); + __asm__("sta $C073"); + __asm__("lda #$AA"); + __asm__("sta $C073"); + __asm__("lda #$C1"); + __asm__("sta $C073"); + __asm__("lda #$AD"); + __asm__("sta $C073"); + // Command + __asm__("stx $C073"); + // Argument + __asm__("sty $C073"); + + // Reset RAMWorks bank register just in case + __asm__("lda #0"); + __asm__("sta $C073"); +} + +/* auxram_detect() returns true if a RAMWorks memory is detected */ +char auxram_detect() { + // Switch to RW bank 0 for ZP + __asm__("lda #$00"); // Get 0x00 + __asm__("sta $C009"); // Store in ALTZP + __asm__("sta $C073"); // Set RW bank 0 + + // Store 00 FF 55 AA in RW bank 0 ZP + __asm__("lda #$00"); + __asm__("sta $00"); + __asm__("lda #$FF"); + __asm__("sta $01"); + __asm__("lda #$55"); + __asm__("sta $02"); + __asm__("lda #$AA"); + __asm__("sta $03"); + + // Check for 00 FF 55 AA + __asm__("lda $00"); + __asm__("cmp #$00"); + __asm__("bne %g", noramworks); + __asm__("lda $01"); + __asm__("cmp #$FF"); + __asm__("bne %g", noramworks); + __asm__("lda $02"); + __asm__("cmp #$55"); + __asm__("bne %g", noramworks); + __asm__("lda $03"); + __asm__("cmp #$AA"); + __asm__("bne %g", noramworks); + + // Found aux ram card + __asm__("sta $C008"); // Don't store in ALTZP + return true; + + // Not found + noramworks: + __asm__("sta $C008"); // Don't store in ALTZP + return false; +} + +/* ram2e_detect() returns true if a RAM2E II has been detected */ +static uint8_t _detect; +char ram2e_detect(char command) { + #ifdef SKIP_RAM2E_DETECT + return true; + #endif + // Move command into X register + _detect = command; + __asm__("lda %v", _detect); // Save in _detect + __asm__("tax"); + + // Store in ALTZP + __asm__("sta $C009"); + + // Store 0x00 at beginning of bank 0x00 + __asm__("lda #$00"); + __asm__("sta $C073"); + __asm__("sta $00"); + + // Send SetRWBankFF-class command + __asm__("lda #$FF"); + __asm__("sta $C073"); + __asm__("lda #$00"); + __asm__("sta $C073"); + __asm__("lda #$55"); + __asm__("sta $C073"); + __asm__("lda #$AA"); + __asm__("sta $C073"); + __asm__("lda #$C1"); + __asm__("sta $C073"); + __asm__("lda #$AD"); + __asm__("sta $C073"); + __asm__("stx $C073"); + __asm__("lda #$00"); + __asm__("sta $C073"); + // Now bank should be 0xFF if we are running on a RAM2E II + // Other RAMWorks cards will instead set the bank to 0x00 + + // Store 0xFF in this bank + __asm__("lda #$FF"); + __asm__("sta $00"); + + // Go back to bank 0 + __asm__("lda #$00"); + __asm__("sta $C073"); + __asm__("sta $C073"); + + // Save result and return + __asm__("lda $00"); // Get beginning of bank 0 + __asm__("sta $C008"); // Store in STDZP + __asm__("sta %v", _detect); // Save in _detect + return _detect == 0x00; +} + +/* ramworks_getsize() returns the number of banks of RAM2E aux memory */ +static uint8_t _rwsize; +static uint8_t _rwnot16mb; +uint16_t ramworks_getsize() { + _rwnot16mb = 1; // Set "not 16 mb" flag + + // Store bank number at address 0 in each bnak + __asm__("sta $C009"); // ALTZP + __asm__("ldy #$FF"); // Start at bank 0xFF + BankSetLoop: + __asm__("sty $C073"); // Set bank + __asm__("sty $00"); // Store bank number at 0 + __asm__("dey"); // Prev. bank + __asm__("cpy #$FF"); // Have we wrapped around? + __asm__("bne %g", BankSetLoop); // If not, repeat + + // Count banks with matching bank number + __asm__("ldy #$00"); // Y is bank + __asm__("ldx #$00"); // X is count + CountLoop: + __asm__("sty $C073"); // Set bank + __asm__("cpy $00"); // Is bank num stored at address 0? + __asm__("bne %g", AfterInc); // If not, skip increment + __asm__("inx"); // If so, increment bank count + __asm__("bne %g", AfterInc); // Skip next if x!=0 + __asm__("stx %v", _rwnot16mb); // Othwerwise rolled over so clear rwnot16mb + AfterInc: + __asm__("iny"); // Move to next bank + __asm__("bne %g", CountLoop); // Repeat if not on bank 0 + + // Done. Switch back to regular zeropage and get result. + __asm__("sta $C008"); // STDZP + __asm__("stx %v", _rwsize); // _rwsize = X (bank count) + + if (_rwnot16mb) { return _rwsize; } + else { return 256; } +} + +/* ram2e_set_mask(...) sends the "Set RAMWorks Capacity Mask" to the RAM2E */ +void ram2e_set_mask(char mask) { ram2e_cmd(0xE0, mask); } + +/* ram2e_set_led(...) */ +void ram2e_set_led(char enled) { ram2e_cmd(0xE2, enled); } + + +static void ram2e_flashled1() { + __asm__("sta $C009"); // ALTZP + + // Save address 0x0000 in every bank + __asm__("lda $0"); + __asm__("lda $0"); + __asm__("lda $0"); + __asm__("lda $0"); + __asm__("lda $0"); + __asm__("lda $0"); + __asm__("lda $0"); + __asm__("lda $0"); + + __asm__("sta $C008"); // No ALTZP +} +void ram2e_flashled(char frames) { + char i; + for (i = 0; i < frames; i++) { + unsigned int l; + for (l = 0; *VBL < 0 && l < 2500; l++) { ram2e_flashled1(); } + for (l = 0; *VBL >= 0 && l < 2500; l++) { ram2e_flashled1(); } + } +} + +#include "ram2e_hal_max.c" +#include "ram2e_hal_spi.c" +#include "ram2e_hal_lcmxo2.c" + +static char _type; +void ram2e_hal_set_type(char type) { _type = type; } + +void ram2e_erase() { + switch (_type) { + case 0xFF: ram2e_max_erase(); break; // Altera MAX II / V + case 0xFE: ram2e_spi_erase(); break; // Lattice MachXO / iCE40 / AGM AG256 + case 0xFD: ram2e_lcmxo2_erase(); break; // Lattice MachXO2 + } +} +void ram2e_save_start(char mask, char enled) { + switch (_type) { + case 0xFF: ram2e_max_save(mask, enled); break; // Altera MAX II / V + case 0xFE: ram2e_spi_erase(); break; // Lattice MachXO / iCE40 / AGM AG256 + case 0xFD: ram2e_lcmxo2_erase(); break; // Lattice MachXO2 + } +} +void ram2e_save_end(char mask, char enled) { + switch (_type) { + case 0xFF: break; // Altera MAX II / V + case 0xFE: ram2e_spi_save(mask, enled); break; // Lattice MachXO / iCE40 / AGM AG256 + case 0xFD: ram2e_lcmxo2_save(mask, enled); break; // Lattice MachXO2 + } +} + diff --git a/ram2e_hal.h b/ram2e_hal.h new file mode 100644 index 0000000..04b53b0 --- /dev/null +++ b/ram2e_hal.h @@ -0,0 +1,72 @@ +#ifndef RAM2GS_HAL_H +#define RAM2GS_HAL_H +#include +#include + +char auxram_detect(); +char ram2e_detect(char type); +uint16_t ramworks_getsize(); +void ram2e_set_mask(char mask); +void ram2e_set_led(char enled); +void ram2e_flashled(char frames); + +void ram2e_hal_set_type(char type); +void ram2e_erase(); +void ram2e_save_start(char mask, char enled); +void ram2e_save_end(char mask, char enled); + +static char _rwsave[256]; +static char _rwsave0_1; +static char _rwsave0_2; +static char _rwsave0_3; +static void ramworks_save() { + __asm__("sta $C009"); // Store in ALTZP + + // Save address 0x0000 in every bank + __asm__("ldx #0"); + saveloop: + __asm__("stx $C073"); + __asm__("lda $00,X"); + __asm__("sta %v,X", _rwsave); + __asm__("inx"); + __asm__("bne %g", saveloop); + + // Save addresses 0x0001-3 in bank 0 + __asm__("ldx #0"); + __asm__("stx $C073"); + __asm__("lda $01"); + __asm__("sta %v", _rwsave0_1); + __asm__("lda $02"); + __asm__("sta %v", _rwsave0_2); + __asm__("lda $03"); + __asm__("sta %v", _rwsave0_3); + + __asm__("sta $C008"); // Don't store in ALTZP +} + +static void ramworks_restore() { + __asm__("sta $C009"); // Store in ALTZP + + // Restore address 0x0000 in every bank + __asm__("ldx #0"); + restoreloop: + __asm__("stx $C073"); + __asm__("lda %v,X", _rwsave); + __asm__("sta $00,X"); + __asm__("inx"); + __asm__("bne %g", restoreloop); + + // Restore addresses 0x0001-3 in bank 0 + __asm__("ldx #0"); + __asm__("stx $C073"); + __asm__("lda %v", _rwsave0_1); + __asm__("sta $01"); + __asm__("lda %v", _rwsave0_2); + __asm__("sta $02"); + __asm__("lda %v", _rwsave0_3); + __asm__("sta $03"); + + __asm__("sta $C008"); // Don't store in ALTZP +} + +#endif \ No newline at end of file diff --git a/ram2e_hal_lcmxo2.c b/ram2e_hal_lcmxo2.c new file mode 100644 index 0000000..a5b9403 --- /dev/null +++ b/ram2e_hal_lcmxo2.c @@ -0,0 +1,89 @@ +/* _spi_erase(...) */ +static void ram2e_lcmxo2_rw(char we, char addr, char data) { + ram2e_cmd(0xEC, data); + ram2e_cmd(0xEC, addr); + ram2e_cmd(0xED, we ? 1 : 0); +} +static void ram2e_lcmxo2_open() { ram2e_lcmxo2_rw(1, 0x70, 0x80); } +static void ram2e_lcmxo2_close() { ram2e_lcmxo2_rw(1, 0x70, 0x00); } +static void ram2e_lcmxo2_cmd_op3(char cmd, char op1, char op2, char op3) { + ram2e_lcmxo2_open(); + ram2e_lcmxo2_rw(1, 0x71, cmd); // Command + ram2e_lcmxo2_rw(1, 0x71, op1); // Operand 1/3 + ram2e_lcmxo2_rw(1, 0x71, op2); // Operand 2/3 + ram2e_lcmxo2_rw(1, 0x71, op3); // Operand 3/3 +} + +static void ram2e_lcmxo2_encfg() { + ram2e_lcmxo2_cmd_op3(0x74, 0x08, 0x00, 0x00); + ram2e_lcmxo2_close(); +} +static void ram2e_lcmxo2_discfg() { + ram2e_lcmxo2_cmd_op3(0x26, 0x08, 0x00, 0x00); + ram2e_lcmxo2_close(); +} +static void ram2e_lcmxo2_bypass() { + ram2e_lcmxo2_open(); + ram2e_lcmxo2_rw(1, 0x71, 0xFF); // Command + ram2e_lcmxo2_close(); +} +static void ram2e_lcmxo2_pollstat() { + ram2e_lcmxo2_cmd_op3(0x3C, 0x00, 0x00, 0x00); + ram2e_lcmxo2_rw(0, 0x73, 0x00); // Data 1/4 + ram2e_lcmxo2_rw(0, 0x73, 0x00); // Data 2/4 + ram2e_lcmxo2_rw(0, 0x73, 0x00); // Data 3/4 + ram2e_lcmxo2_rw(0, 0x73, 0x00); // Data 4/4 + ram2e_lcmxo2_close(); +} +static void ram2e_lcmxo2_erase() { + // Enable configuration interface + ram2e_lcmxo2_encfg(); + // Poll status register + ram2e_lcmxo2_pollstat(); + + // Erase UFM + ram2e_lcmxo2_cmd_op3(0xCB, 0x00, 0x00, 0x00); + ram2e_lcmxo2_close(); +} +static void ram2e_lcmxo2_save(char mask, char enled) { + char i; + // Poll status register + ram2e_lcmxo2_pollstat(); + // Disable configuration interface + ram2e_lcmxo2_discfg(); + // Bypass + ram2e_lcmxo2_bypass(); + // Enable configuration interface + ram2e_lcmxo2_encfg(); + // Poll status register + ram2e_lcmxo2_pollstat(); + + // Set UFM address + ram2e_lcmxo2_cmd_op3(0xB4, 0x00, 0x00, 0x00); + ram2e_lcmxo2_rw(1, 0x71, 0x40); // Data 1/4 + ram2e_lcmxo2_rw(1, 0x71, 0x00); // Data 2/4 + ram2e_lcmxo2_rw(1, 0x71, 0x00); // Data 3/4 + ram2e_lcmxo2_rw(1, 0x71, 190); // Data 4/4 + ram2e_lcmxo2_close(); + + // Write UFM page + ram2e_lcmxo2_cmd_op3(0xC9, 0x00, 0x00, 0x01); + // Data 0 + mask = (mask & 0x80) | (~mask & 0x7F); + ram2e_lcmxo2_rw(1, 0x71, mask); + // Data 1 + if (enled) ram2e_lcmxo2_rw(1, 0x71, 1); + else ram2e_lcmxo2_rw(1, 0x71, 0); + // Data 2-15 + for (i = 2; i < 16; i++) { + ram2e_lcmxo2_rw(1, 0x71, 0x00); + } + ram2e_lcmxo2_close(); + + // Poll status register + ram2e_lcmxo2_pollstat(); + // Disable configuration interface + ram2e_lcmxo2_discfg(); + // Bypass + ram2e_lcmxo2_bypass(); +} diff --git a/ram2e_hal_max.c b/ram2e_hal_max.c new file mode 100644 index 0000000..5e9d47d --- /dev/null +++ b/ram2e_hal_max.c @@ -0,0 +1,34 @@ +/* ram2e_max_bitbang(...) sends the "Set UFM Bitbang Outputs" to the RAM2E */ +static void ram2e_max_bitbang(char bitbang) { ram2e_cmd(0xEA, bitbang); } + +/* ram2e_max_program(...) sends the "UFM Program Once" command to the RAM2E */ +static void ram2e_max_program() { ram2e_cmd(0xEF, 0x00); } + +/* ram2e_max_erase(...) sends the "UFM Erase Once" command to the RAM2E */ +static void ram2e_max_erase() { ram2e_cmd(0xEE, 0x00); } + +/* ram2e_max_save(...) */ +static void ram2e_max_save(char mask, char enled) { + char i; + char led; + if (mask == 0xFF) { mask = 0x80; } // Encode 0xFF mask properly + + // Shift mask into UFMD + for (i = 0; i < 8; i++) { + ram2e_max_bitbang(0x80 | ((mask << (i-1)) & 0x40)); + } + + // Shift LED setting into UFMD + if (( enled && (mask >> 7)) || + (!enled && !(mask >> 7))) { led = 0x80; } + else { led = 0xC0; } + ram2e_max_bitbang(led); + + // Shift low six bits of mask into UFMD again + for (i = 1; i < 8; i++) { + ram2e_max_bitbang(0x80 | ((mask << (i-1)) & 0x40)); + } + + // Program UFM + ram2e_max_program(); +} diff --git a/ram2e_hal_spi.c b/ram2e_hal_spi.c new file mode 100644 index 0000000..555892d --- /dev/null +++ b/ram2e_hal_spi.c @@ -0,0 +1,42 @@ +static void ram2e_spi_select() { ram2e_cmd(0xEB, 0x04); } +static void ram2e_spi_deselect() { ram2e_cmd(0xEB, 0x00); } +static void ram2e_spi_tx8(char data) { + char i; + for (i = 0; i < 8; i++) { + char d = (data >> (7-i)) & 1; + d <<= 1; + d |= 0x04; + ram2e_cmd(0xEB, d); + d |= 0x01; + ram2e_cmd(0xEB, d); + } +} +static void ram2e_spi_wren() { + ram2e_spi_deselect(); + ram2e_spi_select(); + ram2e_spi_tx8(0x06); // 0x06 is write enable + ram2e_spi_deselect(); +} +static void ram2e_spi_erase() { + ram2e_spi_wren(); + ram2e_spi_select(); + ram2e_spi_tx8(0x20); // 0x20 is sector erase (4 kB) + ram2e_spi_tx8(0x00); // address[23:16] + ram2e_spi_tx8(0x10); // address[15:8] + ram2e_spi_tx8(0x00); // address[7:0] + ram2e_spi_deselect(); +} +static void ram2e_spi_save(char en8meg, char enled) { + ram2e_spi_wren(); + ram2e_spi_select(); + ram2e_spi_tx8(0x02); // 0x02 is page (byte) program + ram2e_spi_tx8(0x00); // address[23:16] + ram2e_spi_tx8(0x10); // address[15:8] + ram2e_spi_tx8(0x00); // address[7:0] + // data[7:0] + if (!en8meg && !enled) { ram2e_spi_tx8(0x7F); } + else if (!en8meg && enled) { ram2e_spi_tx8(0x3F); } + else if ( en8meg && !enled) { ram2e_spi_tx8(0xFF); } + else if ( en8meg && enled) { ram2e_spi_tx8(0xBF); } + ram2e_spi_deselect(); +} \ No newline at end of file diff --git a/ram2gs.c b/ram2gs.c index 7533edf..ddd5b67 100644 --- a/ram2gs.c +++ b/ram2gs.c @@ -7,119 +7,10 @@ #include "util.h" #include "gwconio.h" -#include "ram2gs_asm.h" - -static void ram2gs_set(char en8meg, char enled) { - char cmd = 0x10; - if (en8meg) { cmd |= 0x01; } - if (enled) { cmd |= 0x02; } - ram2gs_cmd(cmd); -} - -static void ram2gs_max_erase() { ram2gs_cmd(0x28); } -static void ram2gs_max_set_nvm(char en8meg, char enled) { - char i; - // Clock in 0 to enable this setting entry - ram2gs_cmd(0x20); - ram2gs_cmd(0x22); - - if (en8meg) { - // Clock in 1 to enable 8mb - ram2gs_cmd(0x21); - ram2gs_cmd(0x23); - } else { - // Clock in 0 to disable 8mb - ram2gs_cmd(0x20); - ram2gs_cmd(0x22); - } - - if (enled) { - // Clock in 0 to enable LED - ram2gs_cmd(0x20); - ram2gs_cmd(0x22); - } else { - // Clock in 1 to disable LED - ram2gs_cmd(0x21); - ram2gs_cmd(0x23); - } - - // Clock in 13 dummy "1"s - for (i = 0; i < 13; i++) { - ram2gs_cmd(0x21); - ram2gs_cmd(0x23); - } - - // Program - ram2gs_cmd(0x24); -} - -static void ram2gs_spi_select() { ram2gs_cmd(0x34); } -static void ram2gs_spi_deselect() { ram2gs_cmd(0x30); } -static void ram2gs_spi_tx8(char data) { - char i; - for (i = 0; i < 8; i++) { - ram2gs_cmd(0x34 + ((data >> (7-i)) & 1)); - ram2gs_cmd(0x36 + ((data >> (7-i)) & 1)); - } -} -static void ram2gs_spi_wren() { - ram2gs_spi_deselect(); - ram2gs_spi_select(); - ram2gs_spi_tx8(0x06); // 0x06 is write enable - ram2gs_spi_deselect(); -} -static void ram2gs_spi_erase() { - ram2gs_spi_wren(); - ram2gs_spi_select(); - ram2gs_spi_tx8(0x20); // 0x20 is sector erase (4 kB) - ram2gs_spi_tx8(0x00); // address[23:16] - ram2gs_spi_tx8(0x10); // address[15:8] - ram2gs_spi_tx8(0x00); // address[7:0] - ram2gs_spi_deselect(); -} -static void ram2gs_spi_set_nvm(char en8meg, char enled) { - ram2gs_spi_erase(); // First erase - spin(33, 8); // Wait for >= 500ms on even the fastest systems. - ram2gs_spi_wren(); - ram2gs_spi_select(); - ram2gs_spi_tx8(0x02); // 0x02 is page (byte) program - ram2gs_spi_tx8(0x00); // address[23:16] - ram2gs_spi_tx8(0x10); // address[15:8] - ram2gs_spi_tx8(0x00); // address[7:0] - // data[7:0] - if (!en8meg && !enled) { ram2gs_spi_tx8(0x7F); } - else if (!en8meg && enled) { ram2gs_spi_tx8(0x3F); } - else if ( en8meg && !enled) { ram2gs_spi_tx8(0xFF); } - else if ( en8meg && enled) { ram2gs_spi_tx8(0xBF); } - ram2gs_spi_deselect(); -} - -static void ram2gs_erase(char typecode) { - switch (typecode) { - case 0x00: ram2gs_max_erase(); break; // Altera MAX II / V - case 0x04: ram2gs_spi_erase(); break; // Lattice MachXO / iCE40 / AGM AG256 - //case 0x08: ram2gs_erase_lcmxo2(); break; // Lattice MachXO2 - } -} -static void ram2gs_set_nvm(char typecode, char en8meg, char enled) { - switch (typecode) { - case 0x00: ram2gs_max_set_nvm(en8meg, enled); break; // Altera MAX II / V - case 0x04: ram2gs_spi_set_nvm(en8meg, enled); break; // Lattice MachXO / iCE40 / AGM AG256 - //case 0x08: ram2gs_set_nvm_lcmxo2(en8meg, enled); break; // Lattice MachXO2 - } -} - -static void menu_led(char enled) { - if (enled) { - gwcputsxy(1, 15, "LED enabled. Press [L] to disable LED."); - } else { - gwcputsxy(1, 15, "LED disabled. Press [L] to enable LED."); - } -} +#include "ram2gs_hal.h" static void menu() { - uint8_t bankcount; clrscr(); // Clear screen gwcputsxy(5, 1, "-- RAM2GS Capacity Settings --"); @@ -136,13 +27,19 @@ static void menu() gwcputsxy(1, 21, "nonvolatile memory, press Apple+number."); gwcputsxy(1, 23, "Press [Q] to quit without saving."); +} - bankcount = ram2gs_getsize(); +static void menu_size(uint16_t bankcount) { gotoxy(29, 3); printf("%d", bankcount * 64); gwcputs(" kB"); } +static void menu_led(char enled) { + if (enled) { gwcputsxy(1, 15, "LED enabled. Press [L] to disable LED."); } + else { gwcputsxy(1, 15, "LED disabled. Press [L] to enable LED."); } +} + static void loading_screen() { clrscr(); // Clear screen @@ -151,35 +48,56 @@ static void loading_screen() int ram2gs_main(void) { - char hasled = true; - char typecode = false; - char enled = false; + char type; + uint16_t bankcount; char en8meg = true; + char hasled = true; + char enled = false; + char nvm = false; - int reset_count = false; + int reset_count = 0; loading_screen(); - if (ram2gs_detect(0x00)) { - typecode = 0x00; + if (ram2gs_detect(0x00)) { // Altera MAX II / V + type = 0x00; hasled = !ram2gs_detect(0x04); - } else if (ram2gs_detect(0x04)) { - typecode = 0x04; + } else if (ram2gs_detect(0x04)) { // Lattice MachXO / iCE40 / AGM AG256 + type = 0x04; + hasled = true; + } else if (ram2gs_detect(0x08)) { // Lattice MachXO2 + type = 0x08; hasled = true; } else { #ifndef SKIP_RAM2GS_DETECT // If no RAM2GS, show an error message and quit - gwcputsxy(0, 8, " No RAM2GS II detected."); + gwcputsxy(0, 8, " No RAM2GS II detected."); gwcputsxy(0, 10, " Press any key to quit."); cgetc(); // Wait for key clrscr(); // Clear screen before quitting return EXIT_SUCCESS; + #else + hasled = true; #endif } - if (hasled) { enled = !ram2gs_detect(typecode | 0x02); } + // Set chip type + ram2gs_hal_set_type(type); + + // Print menu menu(); - if (hasled) { menu_led(enled); } + + // Detect and print current capacity + bankcount = ram2gs_getsize(); + menu_size(bankcount); + + // Detect and print LED menu + #ifndef SKIP_RAM2GS_DETECT + if (hasled) { + enled = !ram2gs_detect(type | 0x02); + menu_led(enled); + } + #endif // Get user choice from menu while (true) { @@ -194,7 +112,15 @@ int ram2gs_main(void) case 'L': { enled = !enled; ram2gs_set(en8meg, enled); - if (hasled) { menu_led(enled); }; + if (hasled) { + menu_led(enled); + if (enled) { + wait(1); + ram2gs_flashled(10); + wait(10); + ram2gs_flashled(10); + } + }; continue; } case 'R': { reset_count++; @@ -204,7 +130,7 @@ int ram2gs_main(void) gwcputsxy(1, 8, "Resetting RAM2GS settings."); gwcputsxy(1, 9, "Do not turn off your Apple."); - ram2gs_erase(typecode); // Erase RAM2GS settings memory + ram2gs_erase(); // Erase RAM2GS settings memory ram2gs_set(1, 0); // Enable 8 megabytes and disable LED // Wait for >= 500ms on even the fastest systems. @@ -233,9 +159,11 @@ int ram2gs_main(void) gwcputsxy(1, 8, "Saving RAM2GS capacity setting."); gwcputsxy(1, 9, "Do not turn off your Apple."); // Save capacity in nonvolatile memory. - ram2gs_set_nvm(typecode, en8meg, enled); + ram2gs_save_start(en8meg, enled); // Wait for >= 500ms on even the fastest systems. spin(33, 8); + // Finish saving + ram2gs_save_end(en8meg, enled); // Print success message clrscr(); // Clear screen gwcputsxy(1, 8, "RAM2GS capacity saved successfully."); diff --git a/ram2gs_asm.h b/ram2gs_asm.h deleted file mode 100644 index d4dbea5..0000000 --- a/ram2gs_asm.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef RAM2GS_ASM_H -#define RAM2GS_ASM_H - -uint8_t __fastcall__ ram2gs_cmd(char cmd); -uint8_t __fastcall__ ram2gs_detect(char typecode); -uint8_t __fastcall__ ram2gs_getsize(void); - -#endif /* RAM2GS_ASM_H */ diff --git a/ram2gs_asm.s b/ram2gs_asm.s index 40464b5..996c52e 100644 --- a/ram2gs_asm.s +++ b/ram2gs_asm.s @@ -5,10 +5,7 @@ .export _ram2gs_cmd .export _ram2gs_getsize .export _ram2gs_detect - -.define GetTWConfig $BCFF3C -.define SetTWConfig $BCFF40 -.define DisableDataCache $BCFF4C +.export _ram2gs_flashled1 .macro A8 sep #$20 ; put the 65C816 in 8-bit accumulator mode @@ -342,3 +339,44 @@ plx ; Pull Y rts .endproc + +.proc _ram2gs_flashled1: near +.A8 +.I8 + ; Preamble + phx ; Push X + phy ; Push Y + php ; Push status + sei ; Disable interrupts + clc ; Clear carry + xce ; Clear emulation bit + php ; Push status again, reflecting emulation bit + phb ; Push bank + AI8 + + lda #$20 + pha + plb + ldx #0 + _ram2gs_flashled1_loop: + lda $3456 + lda $3456 + lda $3456 + lda $3456 + lda $3456 + lda $3456 + lda $3456 + lda $3456 + inx + cpx #0 + bne _ram2gs_flashled1_loop + + ; Postamble + plb ; Restore bank + plp ; Restore status + xce ; Restore emulation bit + plp ; Pull status again to pull I flag + ply ; Pull X + plx ; Pull Y + rts +.endproc diff --git a/ram2gs_hal.c b/ram2gs_hal.c new file mode 100644 index 0000000..62a3758 --- /dev/null +++ b/ram2gs_hal.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include +#include +#include "util.h" +#include "ram2gs_hal.h" + +uint8_t __fastcall__ ram2gs_cmd(char cmd); + +void ram2gs_set(char en8meg, char enled) { + char cmd = 0x10; + if (en8meg) { cmd |= 0x01; } + if (enled) { cmd |= 0x02; } + ram2gs_cmd(cmd); +} + +void ram2gs_flashled(char frames) { + char i; + for (i = 0; i < frames; i++) { + unsigned int l; + for (l = 0; *VBL < 0 && l < 2500; l++) { ram2gs_flashled1(); } + for (l = 0; *VBL >= 0 && l < 2500; l++) { ram2gs_flashled1(); } + } +} + +#include "ram2gs_hal_max.c" +#include "ram2gs_hal_spi.c" +#include "ram2gs_hal_lcmxo2.c" + +static char _type; +void ram2gs_hal_set_type(char type) { _type = type; } + +void ram2gs_erase() { + switch (_type) { + case 0x00: ram2gs_max_erase(); break; // Altera MAX II / V + case 0x04: ram2gs_spi_erase(); break; // Lattice MachXO / iCE40 / AGM AG256 + case 0x08: ram2gs_lcmxo2_erase(); break; // Lattice MachXO2 + } +} +void ram2gs_save_start(char en8meg, char enled) { + switch (_type) { + case 0x00: ram2gs_max_save(en8meg, enled); break; // Altera MAX II / V + case 0x04: ram2gs_spi_erase(); break; // Lattice MachXO / iCE40 / AGM AG256 + case 0x08: ram2gs_lcmxo2_erase(); break; // Lattice MachXO2 + } +} +void ram2gs_save_end(char en8meg, char enled) { + switch (_type) { + case 0x00: break; // Altera MAX II / V + case 0x04: ram2gs_spi_save(en8meg, enled); break; // Lattice MachXO / iCE40 / AGM AG256 + case 0x08: ram2gs_lcmxo2_save(en8meg, enled); break; // Lattice MachXO2 + } +} diff --git a/ram2gs_hal.h b/ram2gs_hal.h new file mode 100644 index 0000000..490138a --- /dev/null +++ b/ram2gs_hal.h @@ -0,0 +1,19 @@ +#ifndef RAM2GS_HAL_H +#define RAM2GS_HAL_H +#include +#include + +uint8_t __fastcall__ ram2gs_detect(char typecode); +uint8_t __fastcall__ ram2gs_getsize(void); +uint8_t __fastcall__ ram2gs_flashled1(void); + +void ram2gs_set(char en8meg, char enled); + +void ram2gs_flashled(char frames); + +void ram2gs_hal_set_type(char typecode); +void ram2gs_erase(); +void ram2gs_save_start(char en8meg, char enled); +void ram2gs_save_end(char en8meg, char enled); + +#endif \ No newline at end of file diff --git a/ram2gs_hal_lcmxo2.c b/ram2gs_hal_lcmxo2.c new file mode 100644 index 0000000..cfb8647 --- /dev/null +++ b/ram2gs_hal_lcmxo2.c @@ -0,0 +1,88 @@ +static void ram2gs_lcmxo2_rw(char we, char addr, char data) { + char i; + for (i = 0; i < 8; i++) { ram2gs_cmd(0x38 + ((addr >> (7-i)) & 1)); } + for (i = 0; i < 8; i++) { ram2gs_cmd(0x38 + ((data >> (7-i)) & 1)); } + if (we) { ram2gs_cmd(0x39); } + else { ram2gs_cmd(0x38); } + ram2gs_cmd(0x3A); +} +static void ram2gs_lcmxo2_open() { ram2gs_lcmxo2_rw(1, 0x70, 0x80); } +static void ram2gs_lcmxo2_close() { ram2gs_lcmxo2_rw(1, 0x70, 0x00); } +static void ram2gs_lcmxo2_cmd_op3(char cmd, char op1, char op2, char op3) { + ram2gs_lcmxo2_open(); + ram2gs_lcmxo2_rw(1, 0x71, cmd); // Command + ram2gs_lcmxo2_rw(1, 0x71, op1); // Operand 1/3 + ram2gs_lcmxo2_rw(1, 0x71, op2); // Operand 2/3 + ram2gs_lcmxo2_rw(1, 0x71, op3); // Operand 3/3 +} + +static void ram2gs_lcmxo2_encfg() { + ram2gs_lcmxo2_cmd_op3(0x74, 0x08, 0x00, 0x00); + ram2gs_lcmxo2_close(); +} +static void ram2gs_lcmxo2_discfg() { + ram2gs_lcmxo2_cmd_op3(0x26, 0x08, 0x00, 0x00); + ram2gs_lcmxo2_close(); +} +static void ram2gs_lcmxo2_bypass() { + ram2gs_lcmxo2_open(); + ram2gs_lcmxo2_rw(1, 0x71, 0xFF); // Command + ram2gs_lcmxo2_close(); +} +static void ram2gs_lcmxo2_pollstat() { + ram2gs_lcmxo2_cmd_op3(0x3C, 0x00, 0x00, 0x00); + ram2gs_lcmxo2_rw(0, 0x73, 0x00); // Data 1/4 + ram2gs_lcmxo2_rw(0, 0x73, 0x00); // Data 2/4 + ram2gs_lcmxo2_rw(0, 0x73, 0x00); // Data 3/4 + ram2gs_lcmxo2_rw(0, 0x73, 0x00); // Data 4/4 + ram2gs_lcmxo2_close(); +} +static void ram2gs_lcmxo2_erase() { + // Enable configuration interface + ram2gs_lcmxo2_encfg(); + // Poll status register + ram2gs_lcmxo2_pollstat(); + + // Erase UFM + ram2gs_lcmxo2_cmd_op3(0xCB, 0x00, 0x00, 0x00); + ram2gs_lcmxo2_close(); +} +static void ram2gs_lcmxo2_save(char en8meg, char enled) { + char i; + // Poll status register + ram2gs_lcmxo2_pollstat(); + // Disable configuration interface + ram2gs_lcmxo2_discfg(); + // Bypass + ram2gs_lcmxo2_bypass(); + // Enable configuration interface + ram2gs_lcmxo2_encfg(); + // Poll status register + ram2gs_lcmxo2_pollstat(); + + // Set UFM address + ram2gs_lcmxo2_cmd_op3(0xB4, 0x00, 0x00, 0x00); + ram2gs_lcmxo2_rw(1, 0x71, 0x40); // Data 1/4 + ram2gs_lcmxo2_rw(1, 0x71, 0x00); // Data 2/4 + ram2gs_lcmxo2_rw(1, 0x71, 0x00); // Data 3/4 + ram2gs_lcmxo2_rw(1, 0x71, 190); // Data 4/4 + ram2gs_lcmxo2_close(); + + // Write UFM page + ram2gs_lcmxo2_cmd_op3(0xC9, 0x00, 0x00, 0x01); + // Data 0 + if (!en8meg && !enled) { ram2gs_lcmxo2_rw(1, 0x71, 0x01); } + else if (!en8meg && enled) { ram2gs_lcmxo2_rw(1, 0x71, 0x03); } + else if ( en8meg && !enled) { ram2gs_lcmxo2_rw(1, 0x71, 0x00); } + else if ( en8meg && enled) { ram2gs_lcmxo2_rw(1, 0x71, 0x02); } + // Data 1-15 + for (i = 1; i < 16; i++) { ram2gs_lcmxo2_rw(1, 0x71, 0x00); } + ram2gs_lcmxo2_close(); + + // Poll status register + ram2gs_lcmxo2_pollstat(); + // Disable configuration interface + ram2gs_lcmxo2_discfg(); + // Bypass + ram2gs_lcmxo2_bypass(); +} diff --git a/ram2gs_hal_max.c b/ram2gs_hal_max.c new file mode 100644 index 0000000..5812118 --- /dev/null +++ b/ram2gs_hal_max.c @@ -0,0 +1,16 @@ +static void ram2gs_max_erase() { ram2gs_cmd(0x28); } +static void ram2gs_max_shift(char bit) { + char data = 0x20; + if (bit) data |= 0x01; + ram2gs_cmd(data); + data |= 0x02; + ram2gs_cmd(data); +} +static void ram2gs_max_save(char en8meg, char enled) { + char i; + ram2gs_max_shift(0); // Clock in 0 to enable this setting entry + ram2gs_max_shift(en8meg); // Clock in 8 mb enable bit + ram2gs_max_shift(!enled); // Clock in LED enable bit + for (i = 0; i < 13; i++) { ram2gs_max_shift(1); } // Clock in 13 dummy 1s + ram2gs_cmd(0x24); // Program +} diff --git a/ram2gs_hal_spi.c b/ram2gs_hal_spi.c new file mode 100644 index 0000000..79fa624 --- /dev/null +++ b/ram2gs_hal_spi.c @@ -0,0 +1,38 @@ +static void ram2gs_spi_select() { ram2gs_cmd(0x34); } +static void ram2gs_spi_deselect() { ram2gs_cmd(0x30); } +static void ram2gs_spi_tx8(char data) { + char i; + for (i = 0; i < 8; i++) { + ram2gs_cmd(0x34 + ((data >> (7-i)) & 1)); + ram2gs_cmd(0x36 + ((data >> (7-i)) & 1)); + } +} +static void ram2gs_spi_wren() { + ram2gs_spi_deselect(); + ram2gs_spi_select(); + ram2gs_spi_tx8(0x06); // 0x06 is write enable + ram2gs_spi_deselect(); +} +static void ram2gs_spi_erase() { + ram2gs_spi_wren(); + ram2gs_spi_select(); + ram2gs_spi_tx8(0x20); // 0x20 is sector erase (4 kB) + ram2gs_spi_tx8(0x00); // address[23:16] + ram2gs_spi_tx8(0x10); // address[15:8] + ram2gs_spi_tx8(0x00); // address[7:0] + ram2gs_spi_deselect(); +} +static void ram2gs_spi_save(char en8meg, char enled) { + ram2gs_spi_wren(); + ram2gs_spi_select(); + ram2gs_spi_tx8(0x02); // 0x02 is page (byte) program + ram2gs_spi_tx8(0x00); // address[23:16] + ram2gs_spi_tx8(0x10); // address[15:8] + ram2gs_spi_tx8(0x00); // address[7:0] + // data[7:0] + if (!en8meg && !enled) { ram2gs_spi_tx8(0x7F); } + else if (!en8meg && enled) { ram2gs_spi_tx8(0x3F); } + else if ( en8meg && !enled) { ram2gs_spi_tx8(0xFF); } + else if ( en8meg && enled) { ram2gs_spi_tx8(0xBF); } + ram2gs_spi_deselect(); +} diff --git a/ramtest.c b/ramtest.c deleted file mode 100644 index 610ad79..0000000 --- a/ramtest.c +++ /dev/null @@ -1,103 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "util.h" -#include "gwconio.h" -#include "ramtestpat.c" - -#define TEST_SIZE (8*1024*1024) -#define BANK_SIZE (65536) -#define NUM_BANKS (TEST_SIZE/BANK_SIZE) - -static char getpat(uint32_t i) { - return ramtestpat[i % RAMTESTPAT_SIZE]; -} - -char test_run() { - uint32_t i; - uint8_t ah; - - // Put read/write stubs in low RAM - - - for (ah = 0, i = 0; ah < NUM_BANKS; ah++) { - uint16_t al = 0; - - // Copy 0x0000-01FF - *((char*)_test_wr1_dm1 + 1) = getpat(i); - for (; al < 0x200; al++, i++) { - _test_wr1_dm1: - __asm__("lda #$00"); - __asm__("sta $C009"); // SETALTZP - _test_wr1_am1: - __asm__("lda $0000"); - __asm__("sta $C008"); // SETSTDZP - } - - // Copy 0x0200-BFFF - for (; al < 0xC000; al++, i++) { - - } - - // Copy 0xC000-CFFF to LC2 D000-DFFF - for (; al < 0xD000; al++, i++) { - - } - - // Copy 0xD000-FFFF to LC1 D000-FFFF - for (; al != 0x0000; al++, i++) { - - } - } - - for (uint32_t a = 0; a < TEST_SIZE) { - char d = rd(a); - if (d != getpat(a)) { return -1; } - } - - return 0; -} - -static void rd_zplc() { - _rd_zplc: - __asm__("sta $C009"); // SETALTZP - _rd_zplc_am1: - __asm__("lda $0000"); - __asm__("sta $C008"); // SETSTDZP - __asm__("rts"); -} - -static void rd_main() { - _rd_main: - __asm__("sta $C003"); // WRCARDRAM - _rd_main_am1: - __asm__("lda $0000"); - __asm__("sta $C002"); // WRMAINRAM - __asm__("rts"); -} - -static void wr_zplc() { - _wr_zplc: - _wr_zplc_dm1: - __asm__("lda #$00"); - __asm__("sta $C009"); // SETALTZP - _wr_zplc_am1: - __asm__("lda $0000"); - __asm__("sta $C008"); // SETSTDZP - __asm__("rts"); -} - -static void wr_main() { - _wr_main: - _wr_zplc_dm1: - __asm__("lda #$00"); - __asm__("sta $C005"); // WRCARDRAM - _wr_main_am1: - __asm__("lda $0000"); - __asm__("sta $C004"); // WRMAINRAM - __asm__("rts"); -} diff --git a/ramtest.h b/ramtest.h deleted file mode 100644 index c9e8909..0000000 --- a/ramtest.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef TEST_H -#define TEST_H - -char test_run(); - -#endif /* TEST_H */ diff --git a/ramtest.s b/ramtest.s deleted file mode 100644 index 0fc9765..0000000 --- a/ramtest.s +++ /dev/null @@ -1,190 +0,0 @@ -.autoimport on -.importzp sp - -.export rtst_run -.import rtst_pat -.import rtst_scratch - -.code - -.proc ramtest_run: near - ; Preamble - php ; Push status - sei ; Disable interrupts - phx ; Push X - phy ; Push Y - - ; Save entire ZP - ldx #0 ; X = 0 - savezp: - lda $00,X - sta rtst_scratch,X - inx - bne savezp - - ; Set bank counter and address to 0 - lda #0 - sta $04 - sta $03 - sta $02 - - ; Set pattern address to 0xA000 - lda #$A0 - sta $01 - lda #$00 - sta $00 - - bankloop: - ; Store 0x0000-01FF - - ; Store 0x0200-BFFF - - ; Switch to LC2 - - ; Store in 0xD000-DFFF - - ; Switch to LC1 - - ; Store in 0xD000-FFFF - - ; Increment bank and repeat if < 128 - inc $04 - lda $04 - cmp #$80 - blt bankloop - - ; Restore entire ZP - ldx #0 ; X = 0 - savezp: - lda rtst_scratch,X - sta $00,X - inx - bne savezp - - ; Postamble - ply ; Pull Y - plx ; Pull X - plp ; Pull status -.endproc - -.proc ramtest_incpat: near - ; Increment pattern pointer - inc $00 ; Increment low byte - bne incpat1 ; If low byte nonzero, skip incrementing high byte - inc $01 ; If low byte zero, increment high byte - bne incpat2 ; Unconditional branch to return - beq incpat2 - - ; Check if pointer == 0xB001 - ; if low byte didn't roll around - incpat1: - lda $01 ; Load high byte of pointer - cmp #$B0 ; Check == 0xB0 - bne incpat2 ; If not, goto return - lda $00 ; Load low byte of pointer - cmp #$01 ; Check == 0x01 - bne incpat2 ; If not, goto return - ; Otherwise fall through - - ; Reset pattern pointer - lda #$A0 - sta $01 - lda #$00 - sta $00 - - incpat2: - rts -.endproc - -.proc ramtest_wr256zp: near - ; Set up to copy - ldy $02 ; Y = address lo - sty wr256zp_am1_1+1 ; Set 1st address lo = 0 - sty wr256zp_am1_2+1 ; Set 2nd address lo = 0 - ldy $03 ; Y = address hi - sty wr256zp_am1_1+2 ; Set 1st address hi - sty wr256zp_am1_2+2 ; Set 2nd address hi - ldy #0 ; Y = 0 - - wr256zp_loop: - ; Load two pattern bytes - lda ($00) ; A = next pattern byte - jsr ramtest_incpat ; Increment pattern pointer - ldx ($00) ; Y = next pattern byte - jsr ramtest_incpat ; Increment pattern pointer - ; Switch into ALTZP, store two pattern bytes, switch back - sta $C009 ; SETALTZP - wr256zp_am1_1: - sta $0000,Y ; Store in RAM - iny ; Y++ - wr256zp_am1_2: - stx $0000,Y ; Store in RAM - iny ; Y++ - sta $C008 ; SETSTDZP - ; Repeat - bne wr256zp_loop ; Repeat until X rolls over (256 times) - - ; Success exit - rts -.endproc - -.proc ramtest_wr256mn: near - ; Set up to copy - ldy $02 ; Y = address lo - sty wr256zp_am1_1+1 ; Set 1st address lo - sty wr256zp_am1_2+1 ; Set 2nd address lo - ldy $03 ; Y = address hi - sty wr256zp_am1_1+2 ; Set 1st address hi - sty wr256zp_am1_2+2 ; Set 2nd address hi - ldy #0 ; Y = 0 - - wr256mn_loop: - ; Load two pattern bytes - lda ($00) ; A = next pattern byte - jsr ramtest_incpat ; Increment pattern pointer - ldx ($00) ; Y = next pattern byte - jsr ramtest_incpat ; Increment pattern pointer - ; RAMWRTON, store two pattern bytes, RAMWRTOFF - sta $C009 ; RAMWRTON - wr256mn_am1_1: - sta $0000,Y ; Store in RAM - iny ; X++ - wr256mn_am1_2: - stx $0000,Y ; Store in RAM - iny ; X++ - sta $C008 ; RAMWRTOFF - ; Repeat - bne wr256mn_loop ; Repeat until X rolls over (256 times) - - ; Success exit - rts -.endproc - -.proc ramtest_vfy256zp: near - ; Set up to verify - ldx #0 ; X = 0 - stx vfy256zp_am1+1 ; Address lo = 0 - sty vfy256zp_am1+2 ; Address hi = Y - ldy #0 ; Y = 0 - - vfy256zp_loop: - ; Switch into ALTZP, load byte from RAM, switch back - sta $C009 ; SETALTZP - vfy256zp_am1: - lda $0000,X ; A = next RAM byte - sta $C008 ; SETSTDZP - ; Compare loaded byte from RAM with pattern - cmp ($00),Y ; Compare with pattern byte - bne vfy256zp_vfail - jsr ramtest_incpat ; Increment pattern pointer - inx - ; Repeat - bne vfy256zp_loop ; Repeat until X rolls over (256 times) - - ; Success exit - rts - ; Fail exit - vfy256zp_vfail: - lda #$FF - rts -.endproc diff --git a/ramtestpat.c b/ramtestpat.c deleted file mode 100644 index fd3edc9..0000000 --- a/ramtestpat.c +++ /dev/null @@ -1,4 +0,0 @@ -#define RAMTESTPAT_SIZE 4097 -char ramtestpat[RAMTESTPAT_SIZE] = { - 1, 2, 3, 4, 5, 6, 7, 8, 9 -}; \ No newline at end of file diff --git a/util.c b/util.c index 6474d50..6c6c69d 100644 --- a/util.c +++ b/util.c @@ -8,15 +8,22 @@ #define PB1 ((char*)0xC062) char read_applekey(void) { return ((*PB0) | (*PB1)) & 0x80; } -#define VBL ((signed char*)0xC019) +void wait(char frames) { + char i; + for (i = 0; i < frames; i++) { + unsigned int l; + for (l = 0; *VBL < 0 && l < 2500; l++); + for (l = 0; *VBL >= 0 && l < 2500; l++); + } +} + #define SPIN_HALFCYCLES 3 #define SPIN_FRAMESPERCHAR 4 void spin(uint8_t x, uint8_t y) { char i; - unsigned int l; // Sync to frame before starting - for (l = 0; *VBL >= 0 && l < 2500; l++); + wait(1); // Wait and animate spinner. // Spin_half @@ -24,8 +31,6 @@ void spin(uint8_t x, uint8_t y) { char j; for (j = 0; j < 4; j++) { char spinchar; - char k; - // Assign spinner char based on j switch (j) { case 0: spinchar = '\\'; break; @@ -40,14 +45,10 @@ void spin(uint8_t x, uint8_t y) { putchar(spinchar); // Wait specificed number of frames - for (k = 0; k < SPIN_FRAMESPERCHAR; k++) { - for (l = 0; *VBL < 0 && l < 2500; l++); - for (l = 0; *VBL >= 0 && l < 2500; l++); - } + wait(SPIN_FRAMESPERCHAR); } } // Wait a frame when finished - for (l = 0; *VBL < 0 && l < 2500; l++); - for (l = 0; *VBL >= 0 && l < 2500; l++); + wait(1); } diff --git a/util.h b/util.h index a591b63..1905716 100644 --- a/util.h +++ b/util.h @@ -6,7 +6,10 @@ #define true 1 #define false 0 +#define VBL ((signed char*)0xC019) + char read_applekey(void); +void wait(char frames); void spin(uint8_t x, uint8_t y); #endif /* UTIL_H */ \ No newline at end of file From e8399af9da77c4e95d3c88437bff3320ef4cdca5 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Fri, 29 Sep 2023 10:25:46 -0400 Subject: [PATCH 09/10] Add copy to makefile --- Makefile | 9 ++++++++- bnc.sh | 4 ---- 2 files changed, 8 insertions(+), 5 deletions(-) delete mode 100755 bnc.sh diff --git a/Makefile b/Makefile index 82912a0..43cd320 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,7 @@ cflags = -O --cpu 6502 -t apple2 +.PHONY: clean all copy + all: bin/GWRAM.po bin/GWRAM.dbg.po obj: @@ -60,6 +62,11 @@ bin/GWRAM.dbg.po: bin/main.dbg.sys cp prodos140.po bin/GWRAM.dbg.po cat bin/main.dbg.sys | java -jar ./ac-1.6.0.jar -p $@ gwram.system sys 0x2000 -.PHONY: clean clean: rm -fr bin obj + +copy: bin/GWRAM.po + cp bin/GWRAM.po /Volumes/FLOPPYEMU/GWRAM.po + diskutil unmount /Volumes/FLOPPYEMU/ + + diff --git a/bnc.sh b/bnc.sh deleted file mode 100755 index 8123a84..0000000 --- a/bnc.sh +++ /dev/null @@ -1,4 +0,0 @@ -make clean -make -cp bin/GWRAM.po /Volumes/FLOPPYEMU/GWRAM.po -diskutil unmount /Volumes/FLOPPYEMU/ From 745358d37b3b5292144cb912c7008fbd928c8e2a Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Fri, 29 Sep 2023 20:55:19 -0400 Subject: [PATCH 10/10] Better? --- Makefile | 2 -- bin/GWRAM.dbg.po | Bin 143360 -> 143360 bytes bin/GWRAM.po | Bin 143360 -> 143360 bytes ram2e.c | 1 + ram2e_hal.h | 58 ++--------------------------------------------- ram2e_save.h | 58 +++++++++++++++++++++++++++++++++++++++++++++++ ram2gs.c | 3 ++- 7 files changed, 63 insertions(+), 59 deletions(-) create mode 100644 ram2e_save.h diff --git a/Makefile b/Makefile index 43cd320..f73d8b9 100644 --- a/Makefile +++ b/Makefile @@ -68,5 +68,3 @@ clean: copy: bin/GWRAM.po cp bin/GWRAM.po /Volumes/FLOPPYEMU/GWRAM.po diskutil unmount /Volumes/FLOPPYEMU/ - - diff --git a/bin/GWRAM.dbg.po b/bin/GWRAM.dbg.po index 5d02111cab85294bcca13f2cc84bca73b640f558..7ce9458dd47abfd19c37394eff686961dd93f9ac 100644 GIT binary patch delta 7036 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 diff --git a/bin/GWRAM.po b/bin/GWRAM.po index 53d6729f647d835dbe7a97abb4492c183a36a7cc..122ce19133345324d25ac45fef7f6e3bb0168bbd 100644 GIT binary patch delta 7122 zcma)B4OCP|mVU2)fCfc08o{5j073avj0iZ;(rDD~S1&r_e-yP%#w;db{r}mSB>jvu zr$M@feP}T1Oy`ZQK4KF{ChK|)u zF`v9rp=79p*eeU4?;*D;6w?K}aNg#b3*paQaS(5o(?zZ&lOJ-^<#gvpmOA9m70Xj~Y1Aij$kG+Tg3UbB@=*30qba9{rM8atpa*fS{T|q0@Lk3>^)AD4~ze$bGROjb?t0LL}ES_0D4VngJRzamLpu3p@(*QX|y`@WFQgnVRUg~H|W z!4mSSoeY!&`5%}sjn2braF)25?bek=9?nt|$dW7(x+)vV7gvqvZ^|F6s!3$dBz5xK z)ssg?)s!+1;IhdsW7#i_+c9lo(Y{NzpOR{5z z91MX>{w7M?jvlmvLx#8*!4gmKRH34H7W8FFHtO1iYFPMUAd@TE;yc-D?)MPml&XWc z95^eHldWWnjo{yD5Wy&%@u>0R9~^=_k~x*Qr>gJ9OT`J63@}GZrxH3f%J-XiKEqS! z1J!YNzaE1r)vC=k zVUn@{EQUITn`e7qrllzhQRkjY#)>P4Lh-vQ@?I{CI_GqF^l>T|Ol+0FNu6^@s3K^A z61Z&|8+PcUR12Hrhsa5|2*^osWE9R6Z!mm?id5#jMT{_9<;CCIgNcw{KglHT=a5lz zf|UtyzLLu2`&uOk8-*ivxk1QL{Q=~&nW9FSTP5<#To40Q%0p7C`#Ie#cFC`-d(iXh zbmIa6(M>@s@IlsNlD|yE^V3!SJ`&6KPz4rL;2LITO8pRnpoi6-{opohDeU4JfhO7$ zJEj>o3tTIajHXYyZBLtAQn4B7;C$wH=7<8r5sY9%Z(L(>M%HHd0ve9 zSD6XyDxPhS*=bgQN{A_gG6E%M#27IW39o`EIVy^+`C|-6N|Xb_70yyTk|!ToUulCg zfEf2L6y%TA+tU^b;e`VEXdc9~%KH}!^7IXpS1%TNHQk@o6IdjK7Ylkqc#)uRZiR1m zqr`q_*wyDRz$^gDC-+i@F2DQ0!URuWKKZa9iWh?UKZF;CS%5trFC5Olo2Y&#!wXI! z@~xg4`3^4rLCq%qZ-F?gNW3}&jSaK8DKIw<<|YLBS|bYa=1wR?Nx%y2)ft9VgMX4C zOTQO0EJ5B_5OFKI3~Bxa0>rcbVWD$@aQ0zAKC$tk(muQ2))V5umCSSh73U}Q59m8i z^cSeNhI;TNdt|FSf6R-HJcmsp{RJo+FX>5gwL3R?d!gDBgepz?kNNFf zAqf`(4Eei45xUt$I3h5DLI+LSP!A_Ttub$kQav#Ys8dS;&uLcGBZi84qeDO=RmM<{ z&JIS0$-oS=mp~Xf$83R}-o)*IC;}U1eS{Uz{~YNEZcLCy5U_yKc!EhC#WbBoMtZR! zCw3O0wf`C=4r7`ju3=0QM?gpuM?l@3Mc)Hy?i7ii6{)!l2C%}#p*lv5Qwo>{)&pxC zrnytZ?vx?W0xEI&|91%D$l@8KVTSr{6o!E6VeQbVtAt5XGlOiO5oL_SG@zXozbK}O z-7whk=Y|(ymcV9)Aq~^d!@jZPLJ25xl14s~J3}LY8#9fY5^+9AgsVqXsa#Q~IpFQCD zu6PKz0a*GIEVh-Y3TQDQNV*R){SszuW$0i4OKflKetL|Vg}~4#E<;Ev71fOeb=zhc zu3?1FnMHVq9H<0j3OsSYfSW#=Nsi}r=o29yK7_AT9TdZ})Nk3qq<$N;0j{t?!I(w( zVj~%tL-P&quv%LG0lsLN0Gc-E1F@giOc4$) zMnp8K2Z+IBGQq*%)PEMMI+%bU4fa1m9l!x%CMVi)4{WND=@Yr0I}eE)W=E0J(vqei z;4pFXY&CJHGis<)HPrD$I|wB7CUvlvt-z$v%wqLJkTL)tLFe9l2C!#6MsVr1V?7C}}SplYK*XR%<5 z(aD1LGGjD27^vD0q863JEIA#sgry&FfNTU+u99G~I8%P4_BV+GCG9p|9FUW?Wb-TJ z!Y#R*&2z|#k}xMht_=0mK|d!MQ~)H|#5@PyafT_JHhP#9rY#CYA%Jw-oLb~Dvyb~< z)+X&s|0e0+C&hWGXUKB-+!j|AE8ns2Gd0Hhj3b=UldN(bEkiFdmY3i`rp3}EE`Y>m zk2aHFA9B@`fOOdq=<$GSbg2Q25Yw^9!dIY(x$Eg6kQcFZt%N=+)T1K2o)$6bqa$X0 zjCiqBtr2@l)n~AoiA@odcy_GO(>=ye1#Gdz@f6e%YiSJ5XvKj6IlNd=t));{yuOA; z(ry<=mSGPHkWWwTt#2XI%1*XuUtVw2Zn>Q>UmF>zPmCn%lU!1yzr|bxk7#Slu1^h3 zeJ8Uekx;qnsVq-Uh5r$%4tBWV)1ljlR7G+sa12t9TtA|juD{?8KT7>8C@CygS11%} zAsMI=PrE{G<)50oZC$3zhuz@~6b`MgOnk8dy9wBBtAN(~e8U0qQW?0Vt;5&d22$&N z^^M&}%0De`DU2j{nWvL_dElu+kDK0d)1#ZHTivA4^g1_f;ctj0N2vYOQTUL9Ww+K+ z?dx0XsP^A(uq3>jcJ4u2!h31wKJ0)+^*%Cv9{Evu$S1Cu7c)3I&l$9yZ{vxw6^!cZ+E-@j0;;;{?*eZ{0aHW)0v*rE+Un6Xeo;I z!V-G84IU=lksQs|eFR%lUq%9D;;C|#Q&LW>qkz)~C8r`e2%@Q~j- zKmZsNjga>p{=GD?kA@9P#&y=vn|o<^Jw5aJKH8NK*h`!D(em(G`uSek5ne};YKB_j z8uYKDP0+5T;gwV~lhSfhT@GCxyCC2HSLn%~Q+Ka3y?wLfm0C>K_t(mEwi5m=dDYex zbsetGmt7d4XI-6P>;x_1G7=Uk+~969yYl)HNUo(}t|#rQvp`I6HUY7=Fs&!g1Ak`* zIXzKrR9s@GYdDuDKrT;Yxopb&n9QmiPUWmh+3^&S%eJMBf7{v5Y2$>B3s;>jRsnv} z^G0=C=#w{WTju%DrJK^-@Br&ZYdFP191h6L_B>uMfHpzP@pZQo&H**(D?6|#926W4 z9zHY+RJ2rNg};*8mBA)4(T;bD6S0pMvPSYAtp%j-{{{8>0?$yWNqo02kJoJQH&9MR zhxmydh8~Od1=cDkbfDhGfCM%+L{@wis7Z}*T5`||W4uo)Q1_sg4tK!VFiH+TL%mEg zSmDz`C*Ry8OHJMhnQa-=GKbCx%UI0O6^o6OvBtPp>O}TV=O=UEPwo=be_*|?>hmAEg71otJ5Du)4h9ZT ze?67Wd#2|!IMhV(i89!hS`Gi45WI~5AQWCthSH{ebG@-o`=6erul;1tqQtyLSF`Jo zOXS#(|4momg3JH5EAU&F@BHAP|L={@d#>hxlrKFyV_J$3c$S7gaOvYhOPrylPQqQ{ zo~0eN-letPB~5OXFL!g?)@qqIWo-(=ziZTa3dLksGG3QXWDEG;FVlrD%_r>8y?vIu z)FW!+!&@&!cr8tJDV6>!uE13n+&PytOK9h*U0$hSzcK<)qP>z-3x)f8;8&d=q~2ro z$JP1r3(w_df8cVLlPTYICAQlnze8{49Y-{@c7cvF}ApIdHuS2!me NsP>$z_V5?G{txce>$C`?*6l1fH$4)dMGP{~Xo6JsS)}5Wr88@2QaLgoeDj5@#%`xo%-)gWh z=A89#s_y;nfB*l#|NZZOzb^e(Q~Xy`x*s!VI10J4nd8kI_pcnmhVf;CF=%)x$xLU? z^N_N6M6Q&^%Y-y?tRcedyF=cY@xThjR6EYBhTCEHih;PbR!n6rEeU+y8* zgdA|%)p&`T9QUiE>C=QX&62tBmcC9OxtdQ;6Z!pcxku*6HJ6-%k2TUf@^!feq$043 z0i>@Ilu2C3hnNi>qOr%XrifgR-)d;{iw5W=2cctx4uIrJb}9Y669ma)RWjGn=I`wB z_rL4!{(I6?6(X+-pDoW`)>lTZImwGo`d30;ujv}!S27V5#jT13RK+iJk0Qe&<8#Ob zr^rd5J8J`2r2j+c1=Nq$!VV98)fsaL>+2ujueo9lkD3-Yt6A|BbplACQk2A3$`qXT zYxex7shSFuF97*ukRN-O{AHBXE9l2b@^pHo6jZ`)XnM89gI}Tr{2^Cf{<=QZn0=*G zGr(d%{yPVQhA(vFgg{nJ=0W23PPr7c$t9Y~p?Jkpy50S_+(1xHt_XhS?}!G;+DeJD z8^ls_#!0S}iiYnQFHelaYzP)z%~tE4LLQtVCy~WdC^Ti(6W&}k&Tvim!>V=3ESTgm zVeabe(FrpZOpWl9)w%o#q!eS0iW_r96KuRio=bm~D_4L^@(p6WG(r(XdpO+BfLDa|Giz%M{=eT-&FbSky>$p9R?U9vD3- zC1+#TL=HLSFzCI7`A7cjB(;^Kyb{JmGl{z778o))v?Gp7RWr2pjKRqjpzE!C9grc- z2almn;o{jEm}?g4A+-6kDkh3Ehf?uxF7i%3^g7Bqc{Nk!#FREa1gWEpoTwDdPy!pL zv2Le2MmDoS!w{T;lhkxM1q!b`graU{w_Xbs+L2l8Dj6_b5#KN33NM z$BRj%w}x!W7vW&4_v5J5nDE5Z<|n_%hsjWycw(x(%BdzAogSa1PKwWlx=Pi#@nuk3 zm#drU>FL@v0v1A|1t!AT$D{r$Lc6Aeqjy8>)SswqONP1%V%LN*>$3U5GVuD31RjYN zJuywYNZ=NUj}LvsH5uLh5);A@Y8GX-ZlbN50ajf6Z&_B6hjTO`4*Xyh9m2G^eB|6c zZ1=!LBM*_EZHK!Mtf7gU5a}cwfaO#Zb}z2e8C|B!Wt~xNJ=*HG=EynP=4>w4<0o@Q z`mi2Ss@Tr!lwV?AF`IKVnC)kY&gLl8oUQ{#BXAm21?{>iAL%605)zQEu&s2zU9?hr zCGZAoA5aJ3y41S~L>Wb2auFtDn4Ah$itO ze?VC1%TM1}B=?C>$zeb?bO@7tLfgD zLoFNxZ?tja5PD}EZ7OLHYQ-Y+^h9xgq6=KcrFB&tJg~ksBG|jKPio$zx?F!H7DFbzP2j6r;0$NPxqPsG~S>)`uz4&^!hp zBN_pq?T+GmFru5q^uyx284&|V7zIWI(?N2W5h3p&H;dVoG{kwpBnR;Sw+s46?F{0d zF_IB!)>*>97+E!gY@Csh(=j5RS!a=Bw54Xmg24~{`tR<(38Ms7a~C7JS&a444!pX@ z?;f=CmLTNZunBe@brj>C0?lE(i&-{MapoQR#0(onI4j>_Juo+su%~B&_2I=q3cz`l zxX6~iSGnW0-s{R2(2N?wwKQrB&!bUOcs|9$JS5dy>pjGCnpmus1`M%zG+>O)rvVc? z^CKwKPH7?1A+`+0m?mog<5bDGT??hUVZy|2!*U(KE~bDEVAsfYiN7-^4V65mi7+!6 z2%OVhsrMt`(mBFd*Uxnl51_UKTCEwPW$9?$3f3Q=r3H!sA29#$4gv~>iLL+R z36QY=m`M)XJJpGBJl=&jR)o{DiUN zHC#gt;C)O6S&15w2m7@iP&UOxD`&$A0xk+RHy1FbHg6Wb*bqdRv9mn|Lp*H{UjS3? zNz?!yLDVkml8B||YYZSMg)9i)$I(h)Z$F%qU}m6G$IQeeDCQW|doZ;1_qK*pFoTev z<`mwssmGTVj&!`9d7xz%OM)xX0yuRVL0hlkEEm3IxCXGKeO(7IhPEA4)s*U{9MieU z4kJh;7~1?&F_qed`i57Muavf14fKkTz9HAJSeU&b|Iyo}WN~SX^TSywOSFJaaDJ@~ zgeI5VE(LBejBrZEuqX_hC4*v=IDi^Z=5{H*eDD1zWk=RGDf>Stv8Q*CMMCcecNVMW z`j0*95+8eh@c0DY2}hoN?0KL(!Pl~|$lm$b0~^i8L2x8lODorC6>@jhJYKt4yjJQd?kG@teucPP6_d9c$5uTIrUwz&Yp zJ}5psa9A-89P!1L(J-YXze1)Gg;GfV=%UBm(SsEq83PBqjc*CVwA_2#Z z9upT}{{k%X@<)yP9NGM1youwXPGXt`jY14{}Er(4g&B zL*QWZA@YVZaJcyhzS^6Q%3MZATYEqJ^|XhNyYcx8A^JqA;fV0w6FK}bH+kC8siaAk z-Ual~LHL;Ii{~lUp2PSgI~^qGpkjs0NomIy(Mz`fg@Izl5?Msm@$o`vET*vY1R6^y zkoa818d*wV8qJ$4k$8!c)CrxQ!;xh)UZClNC_OosD30)Q8mXt#4y>RDR#MP9Lz&1# zb#jN8+zJ|5Nrhi-%H~%w%`eP7u!c%&Bb#7jA`qvYj`&ZMbclO+Erk>HBTCQzF#d>Y zj&D$kB`yYj86^?}KaEmhWHlu(IZo~=NjtNes!0dd;?6*Mudl#KPb!(XeOiXKw*?_q zZ9!Olyiu73)A%z>sXDH%xz*BY*=^Y~dIcT55|qd#B)y_ROi3tdQbq&cSVgZxAmkm& zwD=Zf6gsyFokc6#lr(bM0Y-hy=nn97jbg8hf$~(QOI`yCQN#u!4e=d{Rm%vT{HX>M zfJ2E4d8;PeNFz-&rg@UtwSs=qNMkE$$EQuSJ1Npg4>Zw=*mC-5BkhdUQ$$TN*XbS% z*V7O@m($oHs+dSg1*xonrix9_AKr|Se2V(|>$2J(^#}Z|#(`Z8LS-W{ydkV>T*04k zcZqJy&|kW{By5Ogx}3xwq;OIDNO9G`VmL%gVqBl?i!%Tw)rA0TD6;k0dH6Xha%!@? zQ*zT6-NVOr0vy|k?ARLZ?~}r+;X^wK2tr`0Zy+z4cQLos9Gw!#qr%LlAB=mg?kcBb zdOCYA)wNnY@Gr|grnC3F@JQ2g{vEe!%<{n}Tp#+zNoG=31C^@XZcq#1nWW?ed)mnt z@LP)f#R(!32bJa`d__^rP|DI#6n-hSOM@Y5aNptu(+igBL+1ids;XjH?9$u`&+?k?eP6Jqp1fbp)CaA^1rNb;T!|_qGbJ zY@U{8hwoLOT1f_BWK2#-|qI=r>!RT&ygxdTKP?UXvR;&}D=KX;K&0%uHg*~WW zK2lbFYR}2mzEovybho9&5>zs-`jydQ+SxO8ZK0s;D|)dyWXqO;c(;WHLa^QYqrp=x zXyPxr>nW;Wbjm^Ik-0>rqG41 zK!h9-JX_{I>T#>qOP7>e@_n$*Uay;_OpkxSuNr&KhVey8V#M=AO1%gd78FE9)03&HOHxv3Rg$$8QS$M_0h*27)0U7*7b%( z!mX{@;}%sxo|)S>T=lj4BrXtXehvehFBEQD$d9Rkn?y{8Y>18ZbY*%-1`C*_MM(yN zVDl)Wqrt3AHV-sIn=(A%3=iyh9h^phGCY`y;jtds*5-#)3}<>|59}k^R1vdzx-vXI z;;rd^wDat5-FBn;<50;|Y}Kflk?mA|S2BY0+1(!b-&m`=_Ut=u@ol=M=2R%UKk^I> zKTC!5?bGv~sgaYZ&jHJl%i+I4Jb@Nq7m`s;g@UMjGthEL`Lb{M%Rk<}Albgtz01AV zO*!^2+~bbC>WD#Tw7Y4T?>kFI9!(?#LxK+*Ickb9Bq8tpR`YE@>1{NJkYZ_Z02wgFo3JdIK-) zJ;vUL_a2cs@p9nc-b3X1e=qX)`C{C8*xOODL7{JFO77ckUj>=`ZFh3J)gLbN_@u$> ry`#KueCSa>`!DVr_4Dg*d? #include @@ -15,58 +15,4 @@ void ram2e_erase(); void ram2e_save_start(char mask, char enled); void ram2e_save_end(char mask, char enled); -static char _rwsave[256]; -static char _rwsave0_1; -static char _rwsave0_2; -static char _rwsave0_3; -static void ramworks_save() { - __asm__("sta $C009"); // Store in ALTZP - - // Save address 0x0000 in every bank - __asm__("ldx #0"); - saveloop: - __asm__("stx $C073"); - __asm__("lda $00,X"); - __asm__("sta %v,X", _rwsave); - __asm__("inx"); - __asm__("bne %g", saveloop); - - // Save addresses 0x0001-3 in bank 0 - __asm__("ldx #0"); - __asm__("stx $C073"); - __asm__("lda $01"); - __asm__("sta %v", _rwsave0_1); - __asm__("lda $02"); - __asm__("sta %v", _rwsave0_2); - __asm__("lda $03"); - __asm__("sta %v", _rwsave0_3); - - __asm__("sta $C008"); // Don't store in ALTZP -} - -static void ramworks_restore() { - __asm__("sta $C009"); // Store in ALTZP - - // Restore address 0x0000 in every bank - __asm__("ldx #0"); - restoreloop: - __asm__("stx $C073"); - __asm__("lda %v,X", _rwsave); - __asm__("sta $00,X"); - __asm__("inx"); - __asm__("bne %g", restoreloop); - - // Restore addresses 0x0001-3 in bank 0 - __asm__("ldx #0"); - __asm__("stx $C073"); - __asm__("lda %v", _rwsave0_1); - __asm__("sta $01"); - __asm__("lda %v", _rwsave0_2); - __asm__("sta $02"); - __asm__("lda %v", _rwsave0_3); - __asm__("sta $03"); - - __asm__("sta $C008"); // Don't store in ALTZP -} - #endif \ No newline at end of file diff --git a/ram2e_save.h b/ram2e_save.h new file mode 100644 index 0000000..f8e6b63 --- /dev/null +++ b/ram2e_save.h @@ -0,0 +1,58 @@ +#ifndef RAM2E_SAVE_H +#define RAM2E_SAVE_H + +static char _rwsave[256]; +static char _rwsave0_1; +static char _rwsave0_2; +static char _rwsave0_3; +static void ramworks_save() { + __asm__("sta $C009"); // Store in ALTZP + + // Save address 0x0000 in every bank + __asm__("ldx #0"); + saveloop: + __asm__("stx $C073"); + __asm__("lda $00,X"); + __asm__("sta %v,X", _rwsave); + __asm__("inx"); + __asm__("bne %g", saveloop); + + // Save addresses 0x0001-3 in bank 0 + __asm__("ldx #0"); + __asm__("stx $C073"); + __asm__("lda $01"); + __asm__("sta %v", _rwsave0_1); + __asm__("lda $02"); + __asm__("sta %v", _rwsave0_2); + __asm__("lda $03"); + __asm__("sta %v", _rwsave0_3); + + __asm__("sta $C008"); // Don't store in ALTZP +} + +static void ramworks_restore() { + __asm__("sta $C009"); // Store in ALTZP + + // Restore address 0x0000 in every bank + __asm__("ldx #0"); + restoreloop: + __asm__("stx $C073"); + __asm__("lda %v,X", _rwsave); + __asm__("sta $00,X"); + __asm__("inx"); + __asm__("bne %g", restoreloop); + + // Restore addresses 0x0001-3 in bank 0 + __asm__("ldx #0"); + __asm__("stx $C073"); + __asm__("lda %v", _rwsave0_1); + __asm__("sta $01"); + __asm__("lda %v", _rwsave0_2); + __asm__("sta $02"); + __asm__("lda %v", _rwsave0_3); + __asm__("sta $03"); + + __asm__("sta $C008"); // Don't store in ALTZP +} + +#endif \ No newline at end of file diff --git a/ram2gs.c b/ram2gs.c index ddd5b67..a4563f0 100644 --- a/ram2gs.c +++ b/ram2gs.c @@ -49,7 +49,7 @@ static void loading_screen() int ram2gs_main(void) { char type; - uint16_t bankcount; + uint8_t bankcount; char en8meg = true; char hasled = true; char enled = false; @@ -89,6 +89,7 @@ int ram2gs_main(void) // Detect and print current capacity bankcount = ram2gs_getsize(); + en8meg = bankcount >= 128; menu_size(bankcount); // Detect and print LED menu