From bf1835d76976efd11fa9d3afea267c23472108e9 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Mon, 1 Jun 2020 03:00:31 -0400 Subject: [PATCH] Release candidate 1 --- Makefile | 19 +- bin/ram2e140.dbg.po | Bin 0 -> 143360 bytes obj/ram2e.dbg.s | 805 ++++++++++++++++++++++++++++++++++++++++++++ ram2e.c | 158 ++++++++- 4 files changed, 966 insertions(+), 16 deletions(-) create mode 100644 bin/ram2e140.dbg.po create mode 100644 obj/ram2e.dbg.s diff --git a/Makefile b/Makefile index 655089a..89543c7 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -all: ram2e140.po +all: ram2e140.po ram2e140.dbg.po .PHONY: clean @@ -14,12 +14,23 @@ obj/ram2e.o: obj ram2e.c cc65 ram2e.c -O --cpu 6502 -t apple2enh -o obj/ram2e.s ca65 obj/ram2e.s -o obj/ram2e.o -ram2e140.po: bin/ram2e.sys - cp prodos140.po bin/ram2e140.po - cat bin/ram2e.sys | java -jar ./AppleCommander-ac-1.6.0.jar -p bin/ram2e140.po ram2e.system sys 0x2000 +obj/ram2e.dbg.o: obj ram2e.c + cc65 ram2e.c -O --cpu 6502 -t apple2enh -o obj/ram2e.dbg.s -DSKIP_RAM2E_DETECT + ca65 obj/ram2e.dbg.s -o obj/ram2e.dbg.o bin/ram2e.sys: bin obj/ram2e.o ld65 -o bin/ram2e.sys obj/ram2e.o -C apple2enh-system.cfg --lib apple2enh.lib -D __EXEHDR__=0 +bin/ram2e.dbg.sys: bin obj/ram2e.dbg.o + ld65 -o bin/ram2e.dbg.sys obj/ram2e.dbg.o -C apple2enh-system.cfg --lib apple2enh.lib -D __EXEHDR__=0 + +ram2e140.po: bin/ram2e.sys + cp prodos140.po bin/ram2e140.po + cat bin/ram2e.sys | java -jar ./AppleCommander-ac-1.6.0.jar -p bin/ram2e140.po ram2e.system sys 0x2000 + +ram2e140.dbg.po: bin/ram2e.dbg.sys + cp prodos140.po bin/ram2e140.dbg.po + cat bin/ram2e.dbg.sys | java -jar ./AppleCommander-ac-1.6.0.jar -p bin/ram2e140.dbg.po ram2e.system sys 0x2000 + clean: rm -fr bin obj diff --git a/bin/ram2e140.dbg.po b/bin/ram2e140.dbg.po new file mode 100644 index 0000000000000000000000000000000000000000..846d30bbaebd4bde1d6e36ca3470cffa44457b0d GIT binary patch literal 143360 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 + jsr _cputs + lda #$04 + jsr pusha + lda #$03 + jsr _gotoxy + lda #<(L0122) + ldx #>(L0122) + jsr pushax + jsr _ramworks_getsize + jsr shlax4 + jsr shlax2 + jsr pushax + ldy #$04 + jsr _printf + lda #$01 + jsr pusha + lda #$05 + jsr _gotoxy + lda #<(L0129) + ldx #>(L0129) + jsr _cputs + lda #$04 + jsr pusha + lda #$07 + jsr _gotoxy + lda #<(L012F) + ldx #>(L012F) + jsr _cputs + lda #$04 + jsr pusha + lda #$09 + jsr _gotoxy + lda #<(L0135) + ldx #>(L0135) + jsr _cputs + lda #$04 + jsr pusha + lda #$0B + jsr _gotoxy + lda #<(L013B) + ldx #>(L013B) + jsr _cputs + lda #$04 + jsr pusha + lda #$0D + jsr _gotoxy + lda #<(L0141) + ldx #>(L0141) + jsr _cputs + lda #$04 + jsr pusha + lda #$0F + jsr _gotoxy + lda #<(L0147) + ldx #>(L0147) + jsr _cputs + lda #$01 + jsr pusha + lda #$12 + jsr _gotoxy + lda #<(L014D) + ldx #>(L014D) + jsr _cputs + lda #$01 + jsr pusha + lda #$14 + jsr _gotoxy + lda #<(L0153) + ldx #>(L0153) + jsr _cputs + lda #$01 + jsr pusha + lda #$15 + jsr _gotoxy + lda #<(L0159) + ldx #>(L0159) + jsr _cputs + lda #$01 + jsr pusha + lda #$17 + jsr _gotoxy + lda #<(L015F) + ldx #>(L015F) + jmp _cputs + +.endproc + +; --------------------------------------------------------------- +; void __near__ spin (unsigned char, unsigned char) +; --------------------------------------------------------------- + +.segment "CODE" + +.proc _spin: near + +.segment "CODE" + + jsr pusha + jsr decsp1 +L0162: ldx $C019 + bpl L0162 + lda #$00 + tay +L0256: sta (sp),y + cmp _SPIN_HALFCYCLES + jcs L0252 + jsr decsp1 + lda #$00 + tay +L0254: sta (sp),y + cmp #$04 + bcs L0171 + jsr decsp2 + ldy #$02 + lda (sp),y + beq L024A + cmp #$01 + beq L024B + cmp #$02 + beq L024C + cmp #$03 + beq L024E + jmp L024E +L024A: lda #$5C + jmp L0253 +L024B: lda #$7C + jmp L0253 +L024C: lda #$2F + jmp L0253 +L024E: lda #$2D +L0253: dey + sta (sp),y + ldy #$05 + lda (sp),y + jsr pusha + ldy #$05 + lda (sp),y + jsr _gotoxy + ldy #$01 + lda (sp),y + ldx #$00 + jsr _putchar + lda #$00 + tay +L0255: sta (sp),y + cmp _SPIN_FRAMESPERCHAR + bcs L0194 +L0251: lda $C019 + asl a + bcs L0251 +L01A1: ldx $C019 + bpl L01A1 + ldy #$00 + lda (sp),y + clc + adc #$01 + jmp L0255 +L0194: jsr incsp2 + ldy #$00 + lda (sp),y + clc + adc #$01 + jmp L0254 +L0171: jsr incsp1 + lda (sp),y + clc + adc #$01 + jmp L0256 +L0252: lda $C019 + asl a + bcs L0252 +L01AD: ldx $C019 + bpl L01AD + jmp incsp3 + +.endproc + +; --------------------------------------------------------------- +; int __near__ main (void) +; --------------------------------------------------------------- + +.segment "CODE" + +.proc _main: near + +.segment "CODE" + + jsr decsp4 + jsr _clrscr + jsr _get_ostype + and #$F0 + cmp #$30 + beq L01B5 + lda #$00 + jsr pusha + lda #$08 + jsr _gotoxy + lda #<(L01BD) + ldx #>(L01BD) + jsr _cputs + lda #$00 + jsr pusha + lda #$0A + jsr _gotoxy + lda #<(L01C3) + ldx #>(L01C3) + jmp L0264 +L01B5: jsr _auxram_detect + tax + beq L0259 + jsr _ram2e_detect + tax + bne L01C8 +L0259: jsr pusha + lda #$08 + jsr _gotoxy + lda #<(L01CF) + ldx #>(L01CF) + jsr _cputs + lda #$00 + jsr pusha + lda #$0A + jsr _gotoxy + lda #<(L01D5) + ldx #>(L01D5) + jmp L0264 +L01C8: jsr _menu + lda #$00 + ldy #$03 + sta (sp),y + dey + sta (sp),y + tax +L0262: jsr stax0sp +L01E1: jsr _cgetc + ldx #$00 + jsr _toupper + cpx #$00 + bne L01E1 + cmp #$31 + beq L025A + cmp #$32 + beq L025B + cmp #$33 + beq L025C + cmp #$34 + beq L025D + cmp #$35 + beq L025E + cmp #$51 + jeq L0261 + cmp #$52 + beq L0202 + jmp L01E1 +L025A: txa + ldy #$03 + sta (sp),y + jmp L01E8 +L025B: lda #$07 + ldy #$03 + sta (sp),y + jmp L01E8 +L025C: lda #$0F + ldy #$03 + sta (sp),y + jmp L01E8 +L025D: lda #$3F + ldy #$03 + sta (sp),y + jmp L01E8 +L025E: lda #$7F + ldy #$03 + sta (sp),y + jmp L01E8 +L0202: jsr ldax0sp + cmp #$80 + txa + sbc #$00 + bvs L0205 + eor #$80 +L0205: bpl L0203 + jsr _ufm_erase + ldx #$00 + txa + jmp L0262 +L0203: jsr ldax0sp + jsr incax1 + jmp L0262 +L01E8: jsr _read_applekey + tax + beq L01E2 + lda #$01 + ldy #$02 + sta (sp),y +L01E2: ldy #$03 + lda (sp),y + jsr _set_mask_temp + jsr _clrscr + ldy #$02 + lda (sp),y + beq L0213 + lda #$01 + jsr pusha + lda #$08 + jsr _gotoxy + lda #<(L0219) + ldx #>(L0219) + jsr _cputs + lda #$01 + jsr pusha + lda #$09 + jsr _gotoxy + lda #<(L021F) + ldx #>(L021F) + jsr _cputs + ldy #$03 + lda (sp),y + jsr _set_nvm + lda #$20 + jsr pusha + lda #$08 + jsr _spin + jsr _clrscr + lda #$01 + jsr pusha + lda #$08 + jsr _gotoxy + lda #<(L022B) + ldx #>(L022B) + jmp L0258 +L0213: lda #$01 + jsr pusha + lda #$08 + jsr _gotoxy + lda #<(L0232) + ldx #>(L0232) +L0258: jsr _cputs + lda #$01 + jsr pusha + lda #$0A + jsr _gotoxy + lda #<(L0238) + ldx #>(L0238) + jsr _cputs + lda #$01 + jsr pusha + lda #$0B + jsr _gotoxy + lda #<(L023E) + ldx #>(L023E) +L0264: jsr _cputs + jsr _cgetc +L0261: jsr _clrscr + ldx #$00 + txa + jmp incsp4 + +.endproc + diff --git a/ram2e.c b/ram2e.c index f4a238b..799a1df 100644 --- a/ram2e.c +++ b/ram2e.c @@ -58,6 +58,127 @@ static void ram2e_cmd(char cmd, char arg) { __asm__("sta $C073"); } +/* auxram_detect() returns true if a RAMWorks memory is detected */ +static 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 */ +uint8_t _detect; +static char ram2e_detect() { + #ifdef SKIP_RAM2E_DETECT + return true; + #endif + __asm__("sta $C009"); // Store in ALTZP + + // Store 0x00 at beginning of bank 0x00 + __asm__("lda #$00"); + __asm__("sta $C073"); + __asm__("sta $00"); + + // Send SetRWBankFF 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__("lda #$FF"); + __asm__("sta $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"); + + // 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 */ +uint8_t _rwsize; +static uint8_t ramworks_getsize() { + // 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", NotMem); // If not, skip increment + __asm__("inx"); // If so, increment bank count + NotMem: + __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) + + return _rwsize; +} + /* set_mask_temp(...) sends the "Set RAMWorks Capacity Mask" to the RAM2E */ static void set_mask_temp(char mask) { ram2e_cmd(0xE0, mask); } @@ -92,30 +213,32 @@ static void menu(void) { gotoxy(5, 1); cputs("-- RAM2E Capacity Settings --"); + gotoxy(4, 3); + printf("Current RAM2E capacity: %d kB", ramworks_getsize() * 64); - gotoxy(1, 4); + gotoxy(1, 5); cputs("Select desired memory capacity:"); - gotoxy(4, 6); + gotoxy(4, 7); cputs("1. 64 kilobytes"); - gotoxy(4, 8); + gotoxy(4, 9); cputs("2. 512 kilobytes"); - gotoxy(4, 10); + gotoxy(4, 11); cputs("3. 1 megabyte"); - gotoxy(4, 12); + gotoxy(4, 13); cputs("4. 4 megabytes"); - gotoxy(4, 14); + gotoxy(4, 15); cputs("5. 8 megabytes"); - gotoxy(1, 17); + gotoxy(1, 18); cputs("Capacity will be saved until power-off."); - gotoxy(1, 19); - cputs("To remember capacity setting in"); gotoxy(1, 20); + cputs("To remember capacity setting in"); + gotoxy(1, 21); cputs("nonvolatile memory, press Apple+number."); - gotoxy(1, 22); + gotoxy(1, 23); cputs("Press [Q] to quit without saving."); } @@ -180,8 +303,19 @@ int main(void) return EXIT_SUCCESS; } - // Show menu - menu(); + // Check for RAM2E + if(!auxram_detect() || !ram2e_detect()) { + // 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."); + cgetc(); // Wait for key + clrscr(); // Clear screen before quitting + return EXIT_SUCCESS; + } + + menu(); // Print menu // Get user choice from menu mask = 0;