From 4bba555e7d902988ff30f4a5cee03f7eda251408 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Sat, 5 Sep 2020 22:45:23 -0400 Subject: [PATCH 1/6] Fixed utility on unenhanced Apple IIe? --- Makefile | 25 ++++++----- bin/GWRAM.dbg.po | Bin 143360 -> 143360 bytes bin/GWRAM.po | Bin 143360 -> 143360 bytes gwconio.h | 7 +++ gwconio.s | 115 +++++++++++++++++++++++++++++++++++++++++++++++ main.c | 12 ++--- ram2e.c | 81 +++++++++++++-------------------- ram2gs.c | 72 +++++++++++------------------ util.c | 2 +- 9 files changed, 199 insertions(+), 115 deletions(-) create mode 100644 gwconio.h create mode 100644 gwconio.s diff --git a/Makefile b/Makefile index b888577..e3bf6d1 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ +cflags = -O --cpu 6502 -t apple2 + all: GWRAM.po GWRAM.dbg.po obj: @@ -7,37 +9,40 @@ bin: @mkdir bin obj/main.o: obj main.c - cc65 main.c -O --cpu 6502 -t apple2enh -o obj/main.s + cc65 main.c $(cflags) -o obj/main.s ca65 obj/main.s -o obj/main.o obj/ram2e.o: obj ram2e.c - cc65 ram2e.c -O --cpu 6502 -t apple2enh -o obj/ram2e.s + cc65 ram2e.c $(cflags) -o obj/ram2e.s ca65 obj/ram2e.s -o obj/ram2e.o obj/ram2e.dbg.o: obj ram2e.c - cc65 ram2e.c -O --cpu 6502 -t apple2enh -o obj/ram2e.dbg.s -DSKIP_RAM2E_DETECT + cc65 ram2e.c $(cflags) -o obj/ram2e.dbg.s -DSKIP_RAM2E_DETECT ca65 obj/ram2e.dbg.s -o obj/ram2e.dbg.o obj/ram2gs_asm.o: obj ram2gs_asm.s ca65 ram2gs_asm.s -o obj/ram2gs_asm.o obj/ram2gs.o: obj ram2gs.c - cc65 ram2gs.c -O --cpu 6502 -t apple2enh -o obj/ram2gs.s + cc65 ram2gs.c $(cflags) -o obj/ram2gs.s ca65 obj/ram2gs.s -o obj/ram2gs.o obj/ram2gs.dbg.o: obj ram2gs.c - cc65 ram2gs.c -O --cpu 6502 -t apple2enh -o obj/ram2gs.dbg.s -DSKIP_RAM2GS_DETECT + cc65 ram2gs.c $(cflags) -o obj/ram2gs.dbg.s -DSKIP_RAM2GS_DETECT ca65 obj/ram2gs.dbg.s -o obj/ram2gs.dbg.o obj/util.o: obj util.c - cc65 util.c -O --cpu 6502 -t apple2enh -o obj/util.s + cc65 util.c $(cflags) -o obj/util.s ca65 obj/util.s -o obj/util.o -bin/main.sys: bin obj/main.o obj/ram2e.o obj/ram2gs.o obj/ram2gs_asm.o obj/util.o - ld65 -o bin/main.sys obj/main.o obj/ram2gs.o obj/ram2e.o obj/ram2gs_asm.o obj/util.o -C apple2enh-system.cfg --lib apple2enh.lib -D __EXEHDR__=0 +obj/gwconio.o: obj gwconio.s + ca65 gwconio.s -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 - ld65 -o bin/main.dbg.sys obj/main.o obj/ram2gs.dbg.o obj/ram2e.dbg.o obj/ram2gs_asm.o obj/util.o -C apple2enh-system.cfg --lib apple2enh.lib -D __EXEHDR__=0 +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/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 cp prodos140.po bin/GWRAM.po diff --git a/bin/GWRAM.dbg.po b/bin/GWRAM.dbg.po index 8b3441f1e0081952d9856aa0d5f113a43b1d80b9..2c3f3fff973fb5c5b88e2f345978b91045b05aa4 100644 GIT binary patch delta 4626 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 delta 4471 zcmZu#4RBP|6@G93l59v=kc^2aT*w01WdDN@-d+sUKmr>=BnlR^PWO?p znaz@25+2~9O}oCbDQ{uZ1j}HokyWOa#nyS)mTAXMO_^zgQt=tb;^=64?%Mguq7Lapu@bGZXBbAp$Q9=T1NGa`14yJooK(hMER)P+ zF_C2wETD~^w?jOzp9xEh?&lSwG=uC**?%Daw_i!r$u2%!*f(YDTOv*M^TiD`dljJ` z#11%+ff$tZWT8n2{}S&fG3f|HOBinhW55;Dh@gpHu%V}IWUE8li2?{2h|rdAwfvd0 ztrO?nwxgbHONOE9OeQ*B^{^QuQwT%M7*QpP2m@tF+)Wr?s|@y(19jSwW`;z?v|W6# zi%+0cZpfNQS^UT*xQ8ftB<)g)({5#Y`eCTVTBVeIcSa_u>>nK=qJ~Z(wqd5YUgMW& zb>Bz!=!ygNIKW)GE_9u0*3|H(Q=pfLQY~6l);aP>P?X9*uOQTiAoq}xT=ZGlol4E( zT=vg1(Y3OKVgPpR7NUk#Q{2L!vRgwj;98+L=0jetsHjXAgoT@ z>%ga-!YhweY6cv_mB*ISmBKw6rui%JMOgv)h#My>v0_NNu}Ef6x~O_mzW2rXx36UmVSK2X&R9`f?!7FATJZvL!EKcSKhgOlOJpKpe3N0QeWc#) zm$TYNz1wFpepLzeZtu>LQ1A9?Rf0fLw;jzdMSm)VyMl7f3E71pGz)T>aXqKuP(`Qg3ra|m&oDhVLCuaJ0&K^UB%YX_X#=7Q6Ipf5{ zaiV&h@Q)FhB=Ym%-@FY$>@gBLQFNL|TS<1bZKRi>igcY@A=Oj>X=Rlw5}rxr&Js)3jnrYm`Z8tumQiXpuIu)fVXmvN*_MgNdT14-kpuJ?bDg5B%M5 z3C)}C^>4JG0mt|tHCfOpM`otdmSjoF*!QIx1i8ac*uwW?Cc(j)P;$`%7jR$;s>g

|rK;r0TjRaHLQ3&QUJ80?U)osD%}5gfyVhLJJ$V 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 XJyrGds@CS6zi-}2`(Ksp%%lGU`?b(A diff --git a/gwconio.h b/gwconio.h new file mode 100644 index 0000000..21cf901 --- /dev/null +++ b/gwconio.h @@ -0,0 +1,7 @@ +void gwcputsxy (unsigned char x, unsigned char y, const char* s); + +void gwcputs (const char* s); + +void __fastcall__ gwcputcxy (unsigned char x, unsigned char y, char c); + +void __fastcall__ gwcputc (char c); diff --git a/gwconio.s b/gwconio.s new file mode 100644 index 0000000..d00abd2 --- /dev/null +++ b/gwconio.s @@ -0,0 +1,115 @@ +; +; Ullrich von Bassewitz, 06.08.1998 +; Modified Sep. 5, 2020 by Zane Kaminski, Engineer @ Garrett's Workshop +; +; + .ifdef __APPLE2ENH__ + .constructor initconio + .endif + .export _gwcputcxy, _gwcputc + .export _gwcputsxy, _gwcputs + .import gotoxy, VTABZ + .importzp ptr1, tmp1 + + .include "apple2.inc" + + .segment "ONCE" + + .ifdef __APPLE2ENH__ +initconio: + sta SETALTCHAR ; Switch in alternate charset + bit LORES ; Limit SET80COL-HISCR to text + rts + .endif + + .code + + +; void gwcputsxy (unsigned char x, unsigned char y, const char* s); +_gwcputsxy: + sta ptr1 ; Save s for later + stx ptr1+1 + jsr gotoxy ; Set cursor, pop x and y + jmp L0 ; Same as cputs... +; void gwcputs (const char* s); +_gwcputs: sta ptr1 ; Save s + stx ptr1+1 +L0: ldy #0 +L1: lda (ptr1),y + beq L9 ; Jump if done + iny + sty tmp1 ; Save offset + jsr _gwcputc ; Output char, advance cursor + ldy tmp1 ; Get offset + bne L1 ; Next char + inc ptr1+1 ; Bump high byte + bne L1 +; Done +L9: rts + + +; void __fastcall__ gwcputcxy (unsigned char x, unsigned char y, char c); +_gwcputcxy: + pha ; Save C + jsr gotoxy ; Call this one, will pop params + pla ; Restore C and run into _gwcputc +; void __fastcall__ gwcputc (char c); +_gwcputc: + cmp #$0D ; Test for \r = carrage return + beq left + cmp #$0A ; Test for \n = line feed + beq newline + eor #$80 ; Invert high bit + +cputdirect: + jsr putchar + inc CH ; Bump to next column + lda CH + cmp WNDWDTH + bcc :+ + jsr newline +left: lda #$00 ; Goto left edge of screen + sta CH +: rts + +newline: + inc CV ; Bump to next line + lda CV + cmp WNDBTM + bcc :+ + lda WNDTOP ; Goto top of screen + sta CV +: jmp VTABZ + +putchar: + .ifdef __APPLE2ENH__ + ldy INVFLG + cpy #$FF ; Normal character display mode? + beq putchardirect + cmp #$E0 ; Lowercase? + bcc mask + and #$7F ; Inverse lowercase + bra putchardirect + .endif +mask: and INVFLG ; Apply normal, inverse, flash + +putchardirect: + pha + ldy CH + .ifdef __APPLE2ENH__ + bit RD80VID ; In 80 column mode? + bpl put ; No, just go ahead + tya + lsr ; Div by 2 + tay + bcs put ; Odd cols go in main memory + bit HISCR ; Assume SET80COL + .endif +put: lda (BASL),Y ; Get current character + tax ; Return old character for _cgetc + pla + sta (BASL),Y + .ifdef __APPLE2ENH__ + bit LOWSCR ; Doesn't hurt in 40 column mode + .endif + rts \ No newline at end of file diff --git a/main.c b/main.c index 2f2bd9b..862b771 100644 --- a/main.c +++ b/main.c @@ -17,18 +17,14 @@ int main(void) // Set RAMWorks bank to 0 __asm__("lda #0"); __asm__("sta $C073"); - return EXIT_SUCCESS; case APPLE_IIGS: ram2gs_main(); - return EXIT_SUCCESS; default: // If not on IIe or IIgs, show an error message and quit - gotoxy(0, 8); - cputs(" THIS PROGRAM REQUIRES APPLE IIE OR IIGS"); - gotoxy(0, 10); - cputs(" PRESS ANY KEY TO QUIT."); + cputsxy(0, 8, " THIS PROGRAM REQUIRES APPLE IIE OR IIGS"); + cputsxy(0, 10, " PRESS ANY KEY TO QUIT."); cgetc(); // Wait for key clrscr(); // Clear screen before quitting - return EXIT_SUCCESS; - } + } + return EXIT_SUCCESS; } diff --git a/ram2e.c b/ram2e.c index c76196e..cb5bcb5 100644 --- a/ram2e.c +++ b/ram2e.c @@ -6,6 +6,7 @@ #include #include "util.h" +#include "gwconio.h" static char _rwsave[256]; static char _rwsave0_1; @@ -262,36 +263,28 @@ static void set_nvm(char mask) { static void menu(uint16_t bankcount) { - gotoxy(5, 1); - cputs("-- RAM2E Capacity Settings --"); + gwcputsxy(5, 1, "-- RAM2E Capacity Settings --"); + if (bankcount < 2) { gotoxy(5, 3); } else { gotoxy(4, 3); } - printf("Current RAM2E capacity: %d kB", bankcount * 64); + gwcputs("Current RAM2E capacity: "); + printf("%d", bankcount * 64); + gwcputs(" kB"); - gotoxy(1, 5); - cputs("Select desired memory capacity:"); + gwcputsxy(1, 5, "Select desired memory capacity:"); - gotoxy(4, 7); - cputs("1. 64 kilobytes"); - gotoxy(4, 9); - cputs("2. 512 kilobytes"); - gotoxy(4, 11); - cputs("3. 1 megabyte"); - gotoxy(4, 13); - cputs("4. 4 megabytes"); - gotoxy(4, 15); - cputs("5. 8 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"); - gotoxy(1, 18); - cputs("Capacity will be saved until power-off."); + gwcputsxy(1, 18, "Capacity will be saved until power-off."); - gotoxy(1, 20); - cputs("To remember capacity setting in"); - gotoxy(1, 21); - cputs("nonvolatile memory, press Apple+number."); + gwcputsxy(1, 20, "To remember capacity setting in"); + gwcputsxy(1, 21, "nonvolatile memory, press Apple+number."); - gotoxy(1, 23); - cputs("Press [Q] to quit without saving."); + gwcputsxy(1, 23, "Press [Q] to quit without saving."); } int ram2e_main(void) @@ -306,10 +299,8 @@ int ram2e_main(void) if(!auxram_detect() || !ram2e_detect()) { ramworks_restore(); // If no RAM2E, show an error message and quit - gotoxy(0, 8); - cputs(" No RAM2E II detected."); - gotoxy(0, 10); - cputs(" Press any key to quit."); + 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; @@ -341,10 +332,8 @@ int ram2e_main(void) if (reset_count >= 100) { // Show message about saving. clrscr(); // Clear screen - gotoxy(1, 8); - cputs("Resetting RAM2E settings."); - gotoxy(1, 9); - cputs("Do not turn off your Apple."); + 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) @@ -354,8 +343,7 @@ int ram2e_main(void) // Show success message and quit clrscr(); // Clear screen - gotoxy(1, 8); - cputs("RAM2E settings reset successfully."); + gwcputsxy(1, 8, "RAM2E settings reset successfully."); goto end; } } default: continue; @@ -374,36 +362,27 @@ int ram2e_main(void) if (nvm) { // Save in NVM if requested. // Show message about saving. - gotoxy(1, 8); - cputs("Saving RAM2E capacity setting."); - gotoxy(1, 9); - cputs("Do not turn off your Apple."); + gwcputsxy(1, 8, "Saving RAM2E capacity setting."); + gwcputsxy(1, 9, "Do not turn off your Apple."); // Save capacity in nonvolatile memory. set_nvm(mask); // Wait for >= 500ms on even the fastest systems. spin(32, 8); // Print success message clrscr(); // Clear screen - gotoxy(1, 8); - cputs("RAM2E capacity saved successfully."); + gwcputsxy(1, 8, "RAM2E capacity saved successfully."); } else { // Print success message if not saving in NVM. - gotoxy(1, 8); - cputs("RAM2E capacity set successfully."); + gwcputsxy(1, 8, "RAM2E capacity set successfully."); } end: if (nvm) { // Show end message for nonvolatile save - gotoxy(1, 10); - cputs("You may now turn off your Apple."); - gotoxy(1, 12); - cputs("You may also reset your Apple for"); - gotoxy(1, 13); - cputs("the setting change to take effect."); + gwcputsxy(1, 10, "You may now turn off your Apple."); + gwcputsxy(1, 12, "You may also reset your Apple for"); + gwcputsxy(1, 13, "the setting change to take effect."); } else { // Show end message for volatile save - gotoxy(1, 10); - cputs("Please reset your Apple for"); - gotoxy(1, 11); - cputs("the setting change to take effect."); + gwcputsxy(1, 10, "Please reset your Apple for"); + gwcputsxy(1, 11, "the setting change to take effect."); } // Don't quit. Instead leave prompt asking user to reset. while(1) { cgetc(); } diff --git a/ram2gs.c b/ram2gs.c index d430f6f..c3644e0 100644 --- a/ram2gs.c +++ b/ram2gs.c @@ -6,6 +6,7 @@ #include #include "util.h" +#include "gwconio.h" #include "ram2gs_asm.h" static void ram2gs_erase() { ram2gs_cmd(0x28); } @@ -40,29 +41,24 @@ static void ram2gs_setnvm(char en8meg) { static void menu(void) { uint8_t bankcount = ram2gs_getsize(); - gotoxy(5, 1); - cputs("-- RAM2GS Capacity Settings --"); + gwcputsxy(5, 1, "-- RAM2GS Capacity Settings --"); + gotoxy(4, 3); - printf("Current RAM2GS capacity: %d kB", bankcount * 64); + gwcputs("Current RAM2GS capacity: "); + printf("%d", bankcount * 64); + gwcputs(" kB"); - gotoxy(1, 6); - cputs("Select desired memory capacity:"); + gwcputsxy(1, 6, "Select desired memory capacity:"); - gotoxy(4, 8); - cputs("1. 4 megabytes"); - gotoxy(4, 10); - cputs("2. 8 megabytes"); + gwcputsxy(4, 8, "1. 4 megabytes"); + gwcputsxy(4, 10, "2. 8 megabytes"); - gotoxy(1, 18); - cputs("Capacity will be saved until power-off."); + gwcputsxy(1, 18, "Capacity will be saved until power-off."); - gotoxy(1, 20); - cputs("To remember capacity setting in"); - gotoxy(1, 21); - cputs("nonvolatile memory, press Apple+number."); + gwcputsxy(1, 20, "To remember capacity setting in"); + gwcputsxy(1, 21, "nonvolatile memory, press Apple+number."); - gotoxy(1, 23); - cputs("Press [Q] to quit without saving."); + gwcputsxy(1, 23, "Press [Q] to quit without saving."); } int ram2gs_main(void) @@ -75,10 +71,8 @@ int ram2gs_main(void) #ifndef SKIP_RAM2GS_DETECT if(!ram2gs_detect()) { // If no RAM2GS, show an error message and quit - gotoxy(0, 8); - cputs(" No RAM2GS II detected."); - gotoxy(0, 10); - cputs(" Press any key to 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; @@ -105,10 +99,8 @@ int ram2gs_main(void) if (reset_count >= 100) { // Show message about saving. clrscr(); // Clear screen - gotoxy(1, 8); - cputs("Resetting RAM2GS settings."); - gotoxy(1, 9); - cputs("Do not turn off your Apple."); + 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 @@ -118,8 +110,7 @@ int ram2gs_main(void) // Show success message and quit clrscr(); // Clear screen - gotoxy(1, 8); - cputs("RAM2GS settings reset successfully."); + gwcputsxy(1, 8, "RAM2GS settings reset successfully."); goto end; } } default: continue; @@ -135,36 +126,27 @@ int ram2gs_main(void) if (nvm) { // Save in NVM if requested. // Show message about saving. - gotoxy(1, 8); - cputs("Saving RAM2GS capacity setting."); - gotoxy(1, 9); - cputs("Do not turn off your Apple."); + 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); // Print success message clrscr(); // Clear screen - gotoxy(1, 8); - cputs("RAM2GS capacity saved successfully."); + gwcputsxy(1, 8, "RAM2GS capacity saved successfully."); } else { // Print success message if not saving in NVM. - gotoxy(1, 8); - cputs("RAM2GS capacity set successfully."); + gwcputsxy(1, 8, "RAM2GS capacity set successfully."); } end: if (nvm) { // Show end message for nonvolatile save - gotoxy(1, 10); - cputs("You may now turn off your Apple."); - gotoxy(1, 12); - cputs("You may also reset your Apple for"); - gotoxy(1, 13); - cputs("the setting change to take effect."); + gwcputsxy(1, 10, "You may now turn off your Apple."); + gwcputsxy(1, 12, "You may also reset your Apple for"); + gwcputsxy(1, 13, "the setting change to take effect."); } else { // Show end message for volatile save - gotoxy(1, 10); - cputs("Please reset your Apple for"); - gotoxy(1, 11); - cputs("the setting change to take effect."); + gwcputsxy(1, 10, "Please reset your Apple for"); + gwcputsxy(1, 11, "the setting change to take effect."); } // Don't quit. Instead leave prompt asking user to reset. while(1) { cgetc(); } diff --git a/util.c b/util.c index a597700..4584d13 100644 --- a/util.c +++ b/util.c @@ -49,4 +49,4 @@ void spin(uint8_t x, uint8_t y) { // Wait a frame when finished while (*VBL < 0); while (*VBL >= 0); -} \ No newline at end of file +} From 8a76da3d316b1c17a3b2a44728b069296d1e0279 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Sat, 5 Sep 2020 23:48:33 -0400 Subject: [PATCH 2/6] Removed whitespace in gwconio.h --- gwconio.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gwconio.h b/gwconio.h index 21cf901..36739f0 100644 --- a/gwconio.h +++ b/gwconio.h @@ -1,7 +1,9 @@ +#ifndef GWCONIO_H +#define GWCONIO_H + void gwcputsxy (unsigned char x, unsigned char y, const char* s); - void gwcputs (const char* s); - void __fastcall__ gwcputcxy (unsigned char x, unsigned char y, char c); - void __fastcall__ gwcputc (char c); + +#endif /* GWCONIO_H */ From 312cba43753444d9e29b0b584aa5609eb9753385 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Sat, 5 Sep 2020 23:48:51 -0400 Subject: [PATCH 3/6] Lowered reset count to 25 --- bin/GWRAM.dbg.po | Bin 143360 -> 143360 bytes bin/GWRAM.po | Bin 143360 -> 143360 bytes ram2e.c | 6 +++--- ram2gs.c | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/bin/GWRAM.dbg.po b/bin/GWRAM.dbg.po index 2c3f3fff973fb5c5b88e2f345978b91045b05aa4..1b8a9565def4a4b59e98417e0807e90bcba3284b 100644 GIT binary patch delta 4325 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 delta 4363 zcmZu#4R8}x9^Y&}+NLd}%15~td^7=?v`y0#r0u>tbjCS@?$MLskWti}QjF)I9r2U_ z$Ap&j($J0REMU2Vb6J|oMz)vAXO%+b^oDRBF2bpJaCDrrR|IjbI{0ySz5jb@F`!K6 z?f?Dv|9HzEJUF2L3!kyAWUE zK{E-UVkU!u3|{$GwBMHDSkUDb zvhF51_#Fs6=}|D5K&2=BYeqrW+(gzKhNFW8RZJm@cjN`v6jO;Jo@FteDArI5zQBVn zyU~AP^2@IMEk0|5JZ`A2GM`KLyR_>uF;FrUj3HzJ&=;6x}85WI}>8w?TJeA zGByZHQ4ivuDpL#u2E9ULROdlv58CHVuZmt|n%Tu6+bggx<0U;F8C89v5?3+v#>|AB9MhG86g8H1Udad@F96V zfM>zHKw&6)ZAMKq(3gc?fP#Q^cb2A*fR}@x3+-8J)?}SFf7}9+1hM8D>_Xn4%*56X z9$}wVaa);;l`7$|!=UcMVOEuK*htI(oD{aO z8%JR5#=X1o-fpq?-daP6_~E^G7+x0Vt(X;j8K2N}Fpu?M^<}JE)E+D|e%a7P)+;j<)|D6gLBrL*l`M#YEH6`s1<`B>h2UeU^rn%;Q;# z$pmC&M)6&v7s?B-^)+pDM`mAYK^y&}tSY08K1i1kw))zQZnL9z?a(-=$nii@t3j*n zS&Zt)?8cCtX_XgH#WhCdYdvV119FRI&7mtLbA~b`79F^OGsIo@%?!5A9p{N!;0dth zee;x@31RYtuxLUEjtiN9n>`fvJMw6|o(Ilmoty@EfGSYPp#;%V2hay;%kT5Y0(l|d zKkpiUm^wp}88~671K=go4J@+ihc}@sqGXRB++qXWLJ88WP^SBkCV|3d(}*z(zJOr; zJ}bYpBvt^_l=3VV*_E|~vItm=v&i)F+;zp@=5GGbBQ3h`mEPr|Z)M>2<>e|9@}Vc_ zLm3m85X{qK+Dx>(9B$Rjl+h+-EZ~JnHfV5B!8`zO(Q@&#l?zwVYqNL8pzYhtwP=hR z`5q^^O6e_WN<9IMPg!zu+MwIgtX`Bh>NoMroXSdmxl?(L4Ao?)f;)zW4>*d%{c1I7 zM%Zte*zv&3z*;9N@l4#a^PH%_leuz>o$8E1Yw8>719Wvb($^SJFblmw`*7YK6oEU7wS{eR(`;`G17q2;j@49jjYhPVCgtgE8;E8$)_r61XQBULEGeiK7 zHbv0W9`qMiBEoljvL+vSe3H3;3$s0mBetu7@Rqi%=w?rNTic7|(bcwHVT$&2cAbE~ zzAhn$BV(@E{Lp;%Yq!|*5DHp2dyA?)IpRVa*{ zzq1dYw0#3Fsx)(~59>416(GEdp&k$j`!IYy*tNXaehka_vlTK*do)WDCVkst2XNYz z!GrLXRiaHU;UJD3!gD(gzkj8t%wl`CSeW3<}U-RjBT`#M~S z9RnmYk`?7tkVQ{uQ%PDg1=rOXfmn4$;PB}uwRx~CxOYF+r~BIC=D4}V+*)`T7xn{) z;z7q<0V#JJq**J3oBlOC0&!5*Y4g%+wF2VYDdH^I<=0w1y59wxPNAEw15a0IPM-?k zR*I#p06=151Cu~{otBrWh#)%S1pshpyh4t8h0{282CErQruH7jmrrB0AMg3(3{F{M zr*X#_T&EtypPa@?^$;dnqrxN?j|qox6vl&C?ZcW8{mX?ub%Cf85%7h-lSsac{U?0I zT}`2ID9#RV42YJ8E7s(3y;hFYW%L+PP7>%4%ry03L{n;W_q&7YuxKe(@_ zf=Arfs310K6h1dDP6%HZ{fIf%q>7^t|2TLnr?bU=C8y3$++<`E@{{kTE~i1SfYGAO ziS%_LvqygdLP$HIF! z9ErV;fuIb15vM`RQ*6L6Nw`R18Z>F25#j>wgYENBgICHS14te;y9TzI1fM8Y$qaMJ z%Acxe!xS03h-e9dLTu5bTG&8+iGz5egEhrXW#KuNF{P6Py z$i+V#(pa%-RcZeDD##BE7XG}rY}KORWw&HZw8FKXXn`Tx843Vj`@?ZU7SXoN;f^)| z9j_rXAU8ki@bt8H#|N!ieWJzOZjNY0Lm{nD%J1J*-x-bAzT!)3qPCezmBe&Lhog}B z&51})JNg;rZ+^rB01D%i;OB=WGPiwhOVQj`*IV(p>7)2?B%)p3)88rDo9u?;;+;(u zQv)?^?cI@{SX*RMOv>e-stL!?aq%}z^^^BE=y@kkYFFXM6XPE^AimvHT3_PnxP(=f z>ot-pOoVzi7O%NPn3Yxu@!9H~d)c}`j18G?Egf}FxZ zGSTb`bv@U+f%Bthys4&S|3VI&yFco25a~93YU~57oRV2MO=;>bhgOA8Ew;XJ?sj_0f?djpC!tzc9J*G~D_|^PxAI4U3M6Hg?wk0gg_A=l}o! diff --git a/bin/GWRAM.po b/bin/GWRAM.po index 8d62877e013f2f30c5d4f6950f20079c57e0aaee..1f7d532002adb2be7b49e9ee30782137a843ca7b 100644 GIT binary patch delta 4400 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 diff --git a/ram2e.c b/ram2e.c index cb5bcb5..c0bf4de 100644 --- a/ram2e.c +++ b/ram2e.c @@ -329,8 +329,8 @@ int ram2e_main(void) case '5': mask = 0x7F; break; case 'R': { reset_count++; - if (reset_count >= 100) { - // Show message about saving. + if (reset_count >= 25) { + // Show message about resetting. clrscr(); // Clear screen gwcputsxy(1, 8, "Resetting RAM2E settings."); gwcputsxy(1, 9, "Do not turn off your Apple."); @@ -346,7 +346,7 @@ int ram2e_main(void) gwcputsxy(1, 8, "RAM2E settings reset successfully."); goto end; } - } default: continue; + } default: reset_count = 0; continue; } // Check if pressed with apple key. If so, save to nonvolatile memory. diff --git a/ram2gs.c b/ram2gs.c index c3644e0..b6eee2f 100644 --- a/ram2gs.c +++ b/ram2gs.c @@ -96,8 +96,8 @@ int ram2gs_main(void) case '2': en8meg = 1; ram2gs_set8mb(); break; case 'R': { reset_count++; - if (reset_count >= 100) { - // Show message about saving. + if (reset_count >= 25) { + // Show message about resetting. clrscr(); // Clear screen gwcputsxy(1, 8, "Resetting RAM2GS settings."); gwcputsxy(1, 9, "Do not turn off your Apple."); @@ -113,7 +113,7 @@ int ram2gs_main(void) gwcputsxy(1, 8, "RAM2GS settings reset successfully."); goto end; } - } default: continue; + } default: reset_count = 0; continue; } // Check if pressed with apple key. If so, save to nonvolatile memory. From 75c06e1ccd66673adee7128aba34839a158761a4 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Sun, 6 Sep 2020 00:00:30 -0400 Subject: [PATCH 4/6] Fixed reset and menu bugs introduced in previous commits --- bin/GWRAM.dbg.po | Bin 143360 -> 143360 bytes bin/GWRAM.po | Bin 143360 -> 143360 bytes main.c | 6 ++-- ram2e.c | 1 + ram2gs.c | 1 + ramtest.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 ramtest.c diff --git a/bin/GWRAM.dbg.po b/bin/GWRAM.dbg.po index 1b8a9565def4a4b59e98417e0807e90bcba3284b..c8d2c7b5c8af4ebeb66560bd70b058a646770f58 100644 GIT binary patch delta 4360 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 delta 4391 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 +#include +#include +#include +#include +#include + +#include "util.h" +#include "gwconio.h" +#include "ramtestpat.c" + +#define TEST_SIZE 8*1024*1024 + +char test_run() { + // Put copy stub in low RAM + for (uint32_t a = 0; a < TEST_SIZE) { + wr(a, getpat(a)); + } + + for (uint32_t a = 0; a < TEST_SIZE) { + char d = rd(a); + if (d != getpat(a)) { return -1; } + } + + return 0; +} + +static inline char getpat(uint32_t a) { + return ramtestpat[a % RAMTESTPAT_SIZE]; +} + +static char rd(uint32_t a) { + uint16_t al = a & 0xFFFF; + if (al < 0x0200) { return rd_zplc(a); } + else if (al < 0xC000) { return rd_mid(a); } + else if (al < 0xD000) { return rd_lc2(a); } + else { return rd_zplc(a); } +} + +static char rd_zplc(uint32_t a) { + +} + +static char rd_mid(uint32_t a) { + +} + +static char rd_lc2(uint32_t a) { + +} + +static char wr(uint32_t a, char d) { + uint16_t al = a & 0xFFFF; + if (al < 0x0200) { wr_zplc(a, d); } + else if (al < 0xC000) { wr_mid(a, d); } + else if (al < 0xD000) { wr_lc2(a, d); } + else { wr_zplc(a, d); } +} + +static char rd_zplc(uint32_t a) { + +} + +static char rd_mid(uint32_t a) { + +} + +static char rd_lc2(uint32_t a) { + +} + From 8a90077d1e6408d89cc24460e42cfe1913f891c5 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Sun, 6 Sep 2020 00:00:50 -0400 Subject: [PATCH 5/6] Added more test stuff --- ramtest.h | 6 ++++++ ramtestpat.c | 4 ++++ 2 files changed, 10 insertions(+) create mode 100644 ramtest.h create mode 100644 ramtestpat.c diff --git a/ramtest.h b/ramtest.h new file mode 100644 index 0000000..c9e8909 --- /dev/null +++ b/ramtest.h @@ -0,0 +1,6 @@ +#ifndef TEST_H +#define TEST_H + +char test_run(); + +#endif /* TEST_H */ diff --git a/ramtestpat.c b/ramtestpat.c new file mode 100644 index 0000000..fd3edc9 --- /dev/null +++ b/ramtestpat.c @@ -0,0 +1,4 @@ +#define RAMTESTPAT_SIZE 4097 +char ramtestpat[RAMTESTPAT_SIZE] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9 +}; \ No newline at end of file From ff31b44109541b508f223fff6bad08e61f0f4b27 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Sun, 6 Sep 2020 14:13:24 -0400 Subject: [PATCH 6/6] Improved lowercase support for future versions --- bin/GWRAM.dbg.po | Bin 143360 -> 143360 bytes bin/GWRAM.po | Bin 143360 -> 143360 bytes gwconio.s | 9 ++++++++- main.c | 10 ++++++++-- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/bin/GWRAM.dbg.po b/bin/GWRAM.dbg.po index c8d2c7b5c8af4ebeb66560bd70b058a646770f58..45f04a603ad8ea9a35459abb74e2e3b78ef19af3 100644 GIT binary patch delta 4366 zcmZu#4R93I9pAl=d=j{z8Itnh%NNOAlFQ`+60%RgnT`f#3(8QXsBl!G2UCQK4%E`_ zVYqlXvS)5K!BET0xy{AwnT;16!~h`&sfDF8oo#0v3bqnINRbNNfEFr9`hV{dJkU($ z?f?DX|Kq*?$M3zwHFUy79n)C+HPnrBVF?uIs8iqJup{c#BGU~2kC|Un@BkaatecT1-Fuca^1=*c^>-E zPB?BQiwwV^47Ab-)?_B=QObG7u9T3$MuuD%Kn{K6gnh%j2!;sT?=!NLLNYJrN6~jH z3eywzX;b6(PAn2(rr(#pQDFHm5sD)oxzM6=;@Cm&)#(mnOM!LMpBxoy*V!pX38EC%N6(q{&0OEs13QOrjghmgzP?ie}Y6ZbBn60Lz zK3fmyB)3J+7D_ouCfU|wl!4wt=nzQ;a57MZ{Z6G!L7vZlRRlTaM+y+FV6!HDQ4QK8EU;&5ola#(Y=>qehRVmND3o| zFsfj)D~gk*sLJyxXU?9GfMh|?`IW_DWKw8gb~zLOo|0K7w_OG{~}(S~6Qx7}JQ6^+^VGLmPg&yx?|!(}uSv{Za|q z@E236j5hoSRE40{Ehk!Cj4l^L-ynO*x|m*rep{RbQreXEq&J3mrWKn@8Ml#@uX7=1 z3Bif`OQ~kWnuLys2_3o{Jf4=`STjdxEQ8)84O<6T0n+@&G9`VIm^Mi)o+N|`A{p{5 z7d8AHh&0`a2Op=Lord^0WuVRyML?TM07e8j$@g)jUS7bTEhD?yJNGt>Si-)D6|iAb z2|*LfU1+lLhh0$(nRxm^M?QgiN`aGq(PU8bwJFe$kz$^r$sbbkOiSY_ur$9sMWs7M zg`x>aOrS|!dB%?X8yR~(bxHWi=N{Z%t}?y`^eX+pwafTmu8r%n(e`qV3#(|m^zSDZKqTP;?JG#wZX|C=bDNnzVJDX=y)Z5D=b-f|PEONU!={;x zT+M7u=U=odPx9OC%1$y=lc5T38yYx3DH8FU)ubK4-_HO~$mMH^=cxsWtoS$7-R;}A z-HwneIb-<-JIZyDYnkO2+Eb*V;r)T;7WBVr{xdtFKp|jEJ-NFLeQWP()31!S=$AbW zu9$$8)-9F!E40j7%hpGd{EeyjtU(L<1g`ymPSiIC~mVvrGmBhG~TEZ z-^R*#%mbg8k%^);=tdQpgOk0Zdv(+3YaaD57T?3jRH3{lV?Ym-;pVfsXnWlkCVzX} z^rsGwn!tK4ia7XrPC}*;(&>cJ|8jE^L_5587Q063TU#j{$Cr=eeZ$zJ49hrw^Ksn9 zUf|2z(a!FD@ImVxmyclm`sG2aU-f`T^)&ALJMpQW!F^{50iJgU(63zRD@QcIE3TBu zMOQ<_I?&GSi{pUpn%Cdn+=234{=LnwkxysyK84Bc33r}^-~LW<3P;8qY16uSrdv)a zvJMH^9D2+V)3askU>tX}!?Vw$mFk)Od&!8_IM4na(Nk)PS2QbMMp<@_@99>PW?A~K= ziM9@toJF!wbp_FSPR}EWP1a#&H~>)$2Ouok7QGDAdJkb^MniL(waxmnwJGN)&KUw5 ziVIzIcq17THn!?H@H9x^3lJb>hhC;_)2E<_;1Exf-4ZV^>e;Bt0ZuV>x&yYlTDLc- zU_FZ(Q&xjTB4Ps(ueL+aoT!yEZqSGQOiYK};u#z|i`C>#^7@YAFVA3g2=`n%i{ojb zGr09Eu2YZTOK0Zem^z3F+pI9LrQ_lt4#Ic@s|T@eMpG)#j0zwPLV^SFBNEDgNMq~k zg{fTMG>(+1jqA%LM8v|cL~0*4tcnK>IY*a6C#_JKgzf8IV5T($f$6QZCF}w`P$GE(@l4vsCi^)w=)B#=eE?6XZCvCp<)ztcr{;#Pn8mB+rBU%Kvj;Il zjqgZb{``UaInFTUdzAD#57`wXTTml;Np;#;qXNb>y)@9@iAvpY&p$*S7BT~fd`w#R zbe`a?Cg9gV@W~G?A9%|| zi`|iQG63a5b8AKbli`h$6|urRlEqt{=veK@xSkIXeXmLks~=-OHJoWF4F~inF++sW zJ+V$a1kOqUaV#6ZSm{WRn!;Bfw_QB>o{?=v@ zov0xo0C40%VQFwfzP)>4I2f>9=L>6sw%JNmgb4>ngOH^?(Li?#T1hdNzvKexTN~!E zd!^Zp#q0^`!N!Wb%{9#}U4iaUb6|HUlEH7U@rTd}X;pADv58Xz*fmhQ zIfV=Ryl82KDsX*1&VzpKjyJ{zFlRRzPXt{hgj!LgidwV0>JxNq$^hYpt|oi?eJC7dnU4dd|p;E^mmg zXn>|-&f%EXzryQZ4u6!hbsmQC)Jm+WXnn*2E!-tz(!z4V0pI>tIPzZu)8G~J{x^WU z*2@efczuStWk_RnoAROT6zjOqLij&`JfvHq+qz%y`3W+?9Y|r6+>@ zukZf7(j(<>om*VbdFs%8x8muYnLe=#JdIx%+=-8@!p7Jc=7w?Q!jVDbnT$F{PIha{V+;Q#TshDQJZ delta 4437 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 w*u{FJsS77o`2YX_ delta 4447 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