From 4bba555e7d902988ff30f4a5cee03f7eda251408 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Sat, 5 Sep 2020 22:45:23 -0400 Subject: [PATCH] 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 +}