EDIT: Removed AUXMEM ifdef. The code now requires aux memory (128K on //e)

This commit is contained in:
Bobbi Webber-Manners 2020-09-04 01:23:03 -04:00
parent f5dfc72c2b
commit 724a1aa988

View File

@ -10,8 +10,6 @@
// Note: Use my fork of cc65 to get a flashing cursor!! // Note: Use my fork of cc65 to get a flashing cursor!!
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#define AUXMEM // No longer builds without AUXMEM
#include <conio.h> #include <conio.h>
#include <ctype.h> #include <ctype.h>
#include <dirent.h> #include <dirent.h>
@ -36,18 +34,12 @@
#define ESC 0x1b #define ESC 0x1b
#define DELETE 0x7f #define DELETE 0x7f
#ifdef AUXMEM
#define BUFSZ 0xb7fe // Aux from 0x800 to 0xbfff, minus a pad byte #define BUFSZ 0xb7fe // Aux from 0x800 to 0xbfff, minus a pad byte
char iobuf[CUTBUFSZ]; // Buffer for disk I/O and cut/paste char iobuf[CUTBUFSZ]; // Buffer for disk I/O and cut/paste
uint8_t banktbl[1+8*16]; // Handles up to 8MB. Map of banks. uint8_t banktbl[1+8*16]; // Handles up to 8MB. Map of banks.
uint8_t auxbank = 0; // Currently selected aux bank (physical) uint8_t auxbank = 0; // Currently selected aux bank (physical)
uint8_t l_auxbank = 1; // Currently selected aux bank (logical) uint8_t l_auxbank = 1; // Currently selected aux bank (logical)
uint16_t cutbuflen = 0; // Length of data in cut buffer uint16_t cutbuflen = 0; // Length of data in cut buffer
#else
#define BUFSZ (20480 - 1024) // 19KB
char gapbuf[BUFSZ];
char padding = 0; // To null terminate for strstr()
#endif
// The following fields, plus the gap buffer, represent the state of // The following fields, plus the gap buffer, represent the state of
// the current buffer. These are stashed in each aux page from 0x200 up. // the current buffer. These are stashed in each aux page from 0x200 up.
@ -121,7 +113,6 @@ char namefilemsg[] =
*/ */
#pragma code-name (push, "LC") #pragma code-name (push, "LC")
char get_gapbuf(uint16_t i) { char get_gapbuf(uint16_t i) {
#ifdef AUXMEM
*(uint16_t*)(0xfe) = (uint16_t)0x0800 + i; // Stuff address in Zero Page *(uint16_t*)(0xfe) = (uint16_t)0x0800 + i; // Stuff address in Zero Page
__asm__("lda %v", auxbank); __asm__("lda %v", auxbank);
__asm__("sta $c073"); // Set aux bank __asm__("sta $c073"); // Set aux bank
@ -132,9 +123,6 @@ char get_gapbuf(uint16_t i) {
__asm__("lda #$00"); __asm__("lda #$00");
__asm__("sta $c073"); // Set aux bank back to 0 __asm__("sta $c073"); // Set aux bank back to 0
return *(uint8_t*)(0xff); return *(uint8_t*)(0xff);
#else
return gapbuf[i];
#endif
} }
#pragma code-name (pop) #pragma code-name (pop)
@ -146,7 +134,6 @@ char get_gapbuf(uint16_t i) {
*/ */
#pragma code-name (push, "LC") #pragma code-name (push, "LC")
void set_gapbuf(uint16_t i, char c) { void set_gapbuf(uint16_t i, char c) {
#ifdef AUXMEM
__asm__("lda %v", auxbank); __asm__("lda %v", auxbank);
__asm__("sta $c073"); // Set aux bank __asm__("sta $c073"); // Set aux bank
__asm__("sta $c005"); // Write aux mem __asm__("sta $c005"); // Write aux mem
@ -154,9 +141,6 @@ void set_gapbuf(uint16_t i, char c) {
__asm__("sta $c004"); // Write main mem __asm__("sta $c004"); // Write main mem
__asm__("lda #$00"); __asm__("lda #$00");
__asm__("sta $c073"); // Set aux bank back to 0 __asm__("sta $c073"); // Set aux bank back to 0
#else
gapbuf[i] = c;
#endif
} }
#pragma code-name (pop) #pragma code-name (pop)
@ -169,18 +153,15 @@ void set_gapbuf(uint16_t i, char c) {
*/ */
#pragma code-name (push, "LC") #pragma code-name (push, "LC")
void move_in_gapbuf(uint16_t dst, uint16_t src, size_t n) { void move_in_gapbuf(uint16_t dst, uint16_t src, size_t n) {
#ifdef AUXMEM
if (dst > src) { if (dst > src) {
// Start with highest addr and copy downwards // Start with highest addr and copy downwards
*(uint16_t*)(0xfa) = n; // Stuff sz in ZP *(uint16_t*)(0xfa) = n; // Stuff sz in ZP
*(uint16_t*)(0xfc) = (uint16_t)0x0800 + src - 1; // Stuff src in ZP *(uint16_t*)(0xfc) = (uint16_t)0x0800 + src - 1; // Stuff src in ZP
*(uint16_t*)(0xfe) = (uint16_t)0x0800 + dst - 1; // Stuff dst in ZP *(uint16_t*)(0xfe) = (uint16_t)0x0800 + dst - 1; // Stuff dst in ZP
#ifdef AUXMEM
__asm__("lda %v", auxbank); __asm__("lda %v", auxbank);
__asm__("sta $c073"); // Set aux bank __asm__("sta $c073"); // Set aux bank
__asm__("sta $c005"); // Write aux mem __asm__("sta $c005"); // Write aux mem
__asm__("sta $c003"); // Read aux mem __asm__("sta $c003"); // Read aux mem
#endif
__asm__("clc"); // Prepare the source pointer __asm__("clc"); // Prepare the source pointer
__asm__("lda $fd"); // MSB of source __asm__("lda $fd"); // MSB of source
__asm__("adc $fb"); // MSB of n __asm__("adc $fb"); // MSB of n
@ -216,23 +197,19 @@ dl3:
__asm__("inx"); __asm__("inx");
__asm__("jmp %g", dl2); __asm__("jmp %g", dl2);
ds2: ds2:
#ifdef AUXMEM
__asm__("sta $c002"); // Read main mem __asm__("sta $c002"); // Read main mem
__asm__("sta $c004"); // Write main mem __asm__("sta $c004"); // Write main mem
__asm__("lda #$00"); __asm__("lda #$00");
__asm__("sta $c073"); // Set aux bank back to 0 __asm__("sta $c073"); // Set aux bank back to 0
#endif
} else { } else {
// Start with lowest addr and copy upwards // Start with lowest addr and copy upwards
*(uint16_t*)(0xfa) = n; // Stuff sz in ZP *(uint16_t*)(0xfa) = n; // Stuff sz in ZP
*(uint16_t*)(0xfc) = (uint16_t)0x0800 + src; // Stuff src in ZP *(uint16_t*)(0xfc) = (uint16_t)0x0800 + src; // Stuff src in ZP
*(uint16_t*)(0xfe) = (uint16_t)0x0800 + dst; // Stuff dst in ZP *(uint16_t*)(0xfe) = (uint16_t)0x0800 + dst; // Stuff dst in ZP
#ifdef AUXMEM
__asm__("lda %v", auxbank); __asm__("lda %v", auxbank);
__asm__("sta $c073"); // Set aux bank __asm__("sta $c073"); // Set aux bank
__asm__("sta $c005"); // Write aux mem __asm__("sta $c005"); // Write aux mem
__asm__("sta $c003"); // Read aux mem __asm__("sta $c003"); // Read aux mem
#endif
__asm__("ldx #$00"); __asm__("ldx #$00");
al1: al1:
__asm__("cpx $fb"); // MSB of n __asm__("cpx $fb"); // MSB of n
@ -259,21 +236,16 @@ al3:
__asm__("iny"); __asm__("iny");
__asm__("jmp %g", al3); __asm__("jmp %g", al3);
as2: as2:
#ifdef AUXMEM
__asm__("sta $c002"); // Read main mem __asm__("sta $c002"); // Read main mem
__asm__("sta $c004"); // Write main mem __asm__("sta $c004"); // Write main mem
__asm__("lda #$00"); __asm__("lda #$00");
__asm__("sta $c073"); // Set aux bank back to 0 __asm__("sta $c073"); // Set aux bank back to 0
#endif
} }
#else
memmove(gapbuf + dst, gapbuf + src, n);
#endif
} }
#pragma code-name (pop) #pragma code-name (pop)
#pragma data-name (push, "LC") #pragma data-name (push, "LC")
char needle[80] = ""; // Must be in LC memory if using AUXMEM char needle[80] = ""; // Must be in LC memory
#pragma data-name (pop) #pragma data-name (pop)
/* /*
@ -301,15 +273,11 @@ uint8_t search_in_gapbuf(uint16_t i, char *srch, uint16_t *loc) {
*(uint16_t*)(0xfc) = (uint16_t)needle; *(uint16_t*)(0xfc) = (uint16_t)needle;
*(uint16_t*)(0xf8) = (uint16_t)needle; // Another copy of needle ptr *(uint16_t*)(0xf8) = (uint16_t)needle; // Another copy of needle ptr
#ifdef AUXMEM
*(uint16_t*)(0xfa) = (uint16_t)0x0800 + i; // Haystack pointer *(uint16_t*)(0xfa) = (uint16_t)0x0800 + i; // Haystack pointer
__asm__("lda %v", auxbank); __asm__("lda %v", auxbank);
__asm__("sta $c073"); // Set aux bank __asm__("sta $c073"); // Set aux bank
__asm__("sta $c005"); // Write aux mem __asm__("sta $c005"); // Write aux mem
__asm__("sta $c003"); // Read aux mem __asm__("sta $c003"); // Read aux mem
#else
*(uint16_t*)(0xfa) = (uint16_t)gapbuf + i; // Haystack pointer
#endif
__asm__("ldy #$00"); __asm__("ldy #$00");
__asm__("lda ($fc),y"); // Get first byte of needle __asm__("lda ($fc),y"); // Get first byte of needle
@ -365,25 +333,19 @@ l5:
// We found the needle // We found the needle
found: found:
#ifdef AUXMEM
__asm__("sta $c002"); // Read main mem __asm__("sta $c002"); // Read main mem
__asm__("sta $c004"); // Write main mem __asm__("sta $c004"); // Write main mem
__asm__("lda #$00"); __asm__("lda #$00");
__asm__("sta $c073"); // Set aux bank back to 0 __asm__("sta $c073"); // Set aux bank back to 0
*loc = *(uint16_t*)0xfa - 0x0800; *loc = *(uint16_t*)0xfa - 0x0800;
#else
*loc = *(uint16_t*)0xfa - (uint16_t)gapbuf;
#endif
return 1; return 1;
// We reached end of haystack without finding needle // We reached end of haystack without finding needle
notfound: notfound:
#ifdef AUXMEM
__asm__("sta $c002"); // Read main mem __asm__("sta $c002"); // Read main mem
__asm__("sta $c004"); // Write main mem __asm__("sta $c004"); // Write main mem
__asm__("lda #$00"); __asm__("lda #$00");
__asm__("sta $c073"); // Set aux bank back to 0 __asm__("sta $c073"); // Set aux bank back to 0
#endif
return 0; return 0;
//#else //#else
@ -696,7 +658,6 @@ uint8_t next_tabstop(uint8_t col) {
return (col / 8) * 8 + 8; return (col / 8) * 8 + 8;
} }
#ifdef AUXMEM
#define FROMAUX 0 #define FROMAUX 0
#define TOAUX 1 #define TOAUX 1
/* /*
@ -717,7 +678,6 @@ void copyaux(char *src, char *dst, uint16_t len, uint8_t dir) {
__asm__("jsr $c311"); // AUXMOVE __asm__("jsr $c311"); // AUXMOVE
} }
} }
#endif
/* /*
* Translate logic aux bank number to physical. * Translate logic aux bank number to physical.
@ -734,7 +694,6 @@ uint8_t bank_log_to_phys(uint8_t l) {
* Current physical bank is in auxbank * Current physical bank is in auxbank
* logbank - desired logical bank * logbank - desired logical bank
*/ */
#ifdef AUXMEM
#pragma code-name (push, "LC") #pragma code-name (push, "LC")
void change_aux_bank(uint8_t logbank) { void change_aux_bank(uint8_t logbank) {
if (logbank > banktbl[0]) { if (logbank > banktbl[0]) {
@ -755,7 +714,6 @@ void change_aux_bank(uint8_t logbank) {
__asm__("sta $c073"); // Set aux bank back to 0 __asm__("sta $c073"); // Set aux bank back to 0
} }
#pragma code-name (pop) #pragma code-name (pop)
#endif
/* /*
* Used by load_file() when opening a new bank for a large file * Used by load_file() when opening a new bank for a large file
@ -827,19 +785,9 @@ uint8_t load_file(char *fname, uint8_t replace, uint8_t copymode) {
gapend = BUFSZ - 1; gapend = BUFSZ - 1;
col = 0; col = 0;
} }
#ifdef AUXMEM
cutbuflen = 0; cutbuflen = 0;
p = iobuf; p = iobuf;
#else
p = gapbuf + gapend - IOSZ; // Read to mem just before gapend
#endif
do { do {
#ifndef AUXMEM
if (FREESPACE() < IOSZ * 2) {
show_error("File truncated");
goto done;
}
#endif
spinner(DATASIZE(), 0, copymode); spinner(DATASIZE(), 0, copymode);
s = fread(p, 1, IOSZ, fp); s = fread(p, 1, IOSZ, fp);
cont = (s == IOSZ ? 1 : 0); cont = (s == IOSZ ? 1 : 0);
@ -849,7 +797,6 @@ uint8_t load_file(char *fname, uint8_t replace, uint8_t copymode) {
case '\n': // UNIX files case '\n': // UNIX files
set_gapbuf(gapbegin++, '\r'); set_gapbuf(gapbegin++, '\r');
col = 0; col = 0;
#ifdef AUXMEM
if (replace && (FREESPACE() < 15000) && (banktbl[0] > 1)) { if (replace && (FREESPACE() < 15000) && (banktbl[0] > 1)) {
draw_screen(); draw_screen();
if (open_new_aux_bank(++partctr) == 1) { if (open_new_aux_bank(++partctr) == 1) {
@ -862,7 +809,6 @@ uint8_t load_file(char *fname, uint8_t replace, uint8_t copymode) {
goto done; goto done;
} }
} }
#endif
break; break;
case '\t': case '\t':
c = next_tabstop(col) - col; c = next_tabstop(col) - col;
@ -883,10 +829,8 @@ uint8_t load_file(char *fname, uint8_t replace, uint8_t copymode) {
done: done:
fclose(fp); fclose(fp);
if (replace) { if (replace) {
#ifdef AUXMEM
if (partctr > 0) if (partctr > 0)
status[2] = ++partctr; status[2] = ++partctr;
#endif
jump_pos(0); jump_pos(0);
pos = 0; pos = 0;
set_modified(0); set_modified(0);
@ -906,19 +850,12 @@ done:
* Returns 0 on success * Returns 0 on success
* 1 if file can't be opened * 1 if file can't be opened
*/ */
#ifndef AUXMEM
#pragma code-name (push, "LC")
#endif
uint8_t save_file(uint8_t copymode, uint8_t append) { uint8_t save_file(uint8_t copymode, uint8_t append) {
uint16_t pos = gapbegin; uint16_t pos = gapbegin;
uint16_t sz; uint16_t sz;
uint8_t retval = 1; uint8_t retval = 1;
uint8_t i; uint8_t i;
#ifdef AUXMEM
uint16_t p, j; uint16_t p, j;
#else
char *p;
#endif
FILE *fp; FILE *fp;
_filetype = PRODOS_T_TXT; _filetype = PRODOS_T_TXT;
_auxtype = 0; _auxtype = 0;
@ -927,39 +864,24 @@ uint8_t save_file(uint8_t copymode, uint8_t append) {
goto done; goto done;
jump_pos(copymode == 1 ? startsel : 0); jump_pos(copymode == 1 ? startsel : 0);
goto_prompt_row(); goto_prompt_row();
#ifdef AUXMEM
cutbuflen = 0; cutbuflen = 0;
p = gapend + 1; p = gapend + 1;
#else
p = gapbuf + gapend + 1;
#endif
if (copymode) if (copymode)
sz = endsel - startsel; sz = endsel - startsel;
else else
sz = DATASIZE(); sz = DATASIZE();
for (i = 0; i < sz / IOSZ; ++i) { for (i = 0; i < sz / IOSZ; ++i) {
spinner(i * IOSZ, 1, copymode); spinner(i * IOSZ, 1, copymode);
#ifdef AUXMEM
for (j = 0; j < IOSZ; ++j) for (j = 0; j < IOSZ; ++j)
iobuf[j] = get_gapbuf(p++); iobuf[j] = get_gapbuf(p++);
if (fwrite(iobuf, IOSZ, 1, fp) != 1) if (fwrite(iobuf, IOSZ, 1, fp) != 1)
goto done; goto done;
#else
if (fwrite(p, IOSZ, 1, fp) != 1)
goto done;
p += IOSZ;
#endif
} }
spinner(i * IOSZ, 1, copymode); spinner(i * IOSZ, 1, copymode);
#ifdef AUXMEM
for (j = 0; j < sz - (IOSZ * i); ++j) for (j = 0; j < sz - (IOSZ * i); ++j)
iobuf[j] = get_gapbuf(p++); iobuf[j] = get_gapbuf(p++);
if (fwrite(iobuf, sz - (IOSZ * i), 1, fp) != 1) if (fwrite(iobuf, sz - (IOSZ * i), 1, fp) != 1)
goto done; goto done;
#else
if (fwrite(p, sz - (IOSZ * i), 1, fp) != 1)
goto done;
#endif
retval = 0; retval = 0;
status[0] = 0; // No longer marked modified status[0] = 0; // No longer marked modified
done: done:
@ -967,14 +889,10 @@ done:
jump_pos(pos); jump_pos(pos);
return retval; return retval;
} }
#ifndef AUXMEM
#pragma code-name (pop)
#endif
/* /*
* Obtain the first bank number for the current file * Obtain the first bank number for the current file
*/ */
#ifdef AUXMEM
uint8_t find_first_bank(void) { uint8_t find_first_bank(void) {
if (status[2] == 0) // Not a multi-bank file if (status[2] == 0) // Not a multi-bank file
return l_auxbank; return l_auxbank;
@ -982,12 +900,10 @@ uint8_t find_first_bank(void) {
return l_auxbank; return l_auxbank;
return l_auxbank - status[2] + 1; // Assumes banks allocated in order return l_auxbank - status[2] + 1; // Assumes banks allocated in order
} }
#endif
/* /*
* Save a large file that spans multiple banks * Save a large file that spans multiple banks
*/ */
#ifdef AUXMEM
uint8_t save_multibank_file(void) { uint8_t save_multibank_file(void) {
uint8_t bank = find_first_bank(); uint8_t bank = find_first_bank();
uint8_t origbank = l_auxbank; uint8_t origbank = l_auxbank;
@ -1031,7 +947,6 @@ done:
} }
return retval; return retval;
} }
#endif
/* /*
* Read next char from gapbuf[] and update state. * Read next char from gapbuf[] and update state.
@ -1603,12 +1518,8 @@ void help(uint8_t num) {
printf("Can't open help file\n\n"); printf("Can't open help file\n\n");
goto done; goto done;
} }
#ifdef AUXMEM
cutbuflen = 0; cutbuflen = 0;
p = iobuf; p = iobuf;
#else
p = gapbuf + gapend - IOSZ; // Read to just before gapend
#endif
do { do {
if (FREESPACE() < IOSZ) { if (FREESPACE() < IOSZ) {
beep(); beep();
@ -1677,11 +1588,7 @@ void save(void) {
} }
fclose(fp); fclose(fp);
} }
#ifdef AUXMEM
rc = save_multibank_file(); rc = save_multibank_file();
#else
rc = save_file(0, 0);
#endif
switch (rc) { switch (rc) {
case 0: // Success case 0: // Success
status[1] = 0; // No need to prompt for overwrite next time status[1] = 0; // No need to prompt for overwrite next time
@ -1870,7 +1777,6 @@ void init_aux_banks(void) {
/* /*
* Generate buffer list * Generate buffer list
*/ */
#ifdef AUXMEM
#pragma code-name (push, "LC") #pragma code-name (push, "LC")
void buffer_list(void) { void buffer_list(void) {
uint8_t o_aux = l_auxbank, row = 0; uint8_t o_aux = l_auxbank, row = 0;
@ -1904,7 +1810,6 @@ void buffer_list(void) {
cgetc(); cgetc();
} }
#pragma code-name (pop) #pragma code-name (pop)
#endif
/* /*
* Rename a file, taking care of multi-bank files * Rename a file, taking care of multi-bank files
@ -1945,7 +1850,6 @@ void name_file(void) {
/* /*
* Save all modified buffers * Save all modified buffers
*/ */
#ifdef AUXMEM
void save_all(void) { void save_all(void) {
uint8_t o_aux = l_auxbank; uint8_t o_aux = l_auxbank;
uint8_t i; uint8_t i;
@ -1965,7 +1869,6 @@ void save_all(void) {
} }
change_aux_bank(o_aux); change_aux_bank(o_aux);
} }
#endif
/* /*
* Sort startsel / endsel in ascending order to allow backwards selection * Sort startsel / endsel in ascending order to allow backwards selection
@ -2371,7 +2274,6 @@ int edit(char *fname) {
} }
order_selection(); order_selection();
position = gapbegin; position = gapbegin;
#ifdef AUXMEM
if (endsel - startsel <= CUTBUFSZ) { if (endsel - startsel <= CUTBUFSZ) {
cutbuflen = endsel - startsel; cutbuflen = endsel - startsel;
jump_pos(startsel); jump_pos(startsel);
@ -2382,15 +2284,12 @@ int edit(char *fname) {
__asm__("sta $c073"); // Set aux bank back to 0 __asm__("sta $c073"); // Set aux bank back to 0
} else { } else {
cutbuflen = 0; cutbuflen = 0;
#endif
if (save_file(1, 0) == 1) { if (save_file(1, 0) == 1) {
show_error("Can't save CLIPBOARD"); show_error("Can't save CLIPBOARD");
draw_screen(); draw_screen();
break; break;
} }
#ifdef AUXMEM
} }
#endif
if (tmp == 0) { // Cut if (tmp == 0) { // Cut
mark_undo(); mark_undo();
jump_pos(startsel); jump_pos(startsel);
@ -2628,7 +2527,6 @@ donehelp:
} }
break; break;
default: default:
#ifdef AUXMEM
if (*(uint8_t*)0xc062 & 0x80) { // Closed Apple depressed if (*(uint8_t*)0xc062 & 0x80) { // Closed Apple depressed
// CA-number (1-9) - quick jump to first 9 buffers // CA-number (1-9) - quick jump to first 9 buffers
if ((c >= '1') && (c <= '9')) { if ((c >= '1') && (c <= '9')) {
@ -2707,9 +2605,6 @@ donehelp:
} }
} }
else if ((c >= 0x20) && (c < 0x80) && (mode == SEL_NONE)) { else if ((c >= 0x20) && (c < 0x80) && (mode == SEL_NONE)) {
#else
if ((c >= 0x20) && (c < 0x80) && (mode == SEL_NONE)) {
#endif
mark_undo(); mark_undo();
insert_char(c); insert_char(c);
update_after_insert_char(); update_after_insert_char();
@ -2730,7 +2625,6 @@ void usage(void) {
void main(int argc, char *argv[]) { void main(int argc, char *argv[]) {
uint8_t i; uint8_t i;
#ifdef AUXMEM
uint8_t *pp = (uint8_t*)0xbf98; uint8_t *pp = (uint8_t*)0xbf98;
if (!(*pp & 0x02)) { if (!(*pp & 0x02)) {
printf("Need 80 cols"); printf("Need 80 cols");
@ -2744,7 +2638,6 @@ void main(int argc, char *argv[]) {
avail_aux_banks(); avail_aux_banks();
init_aux_banks(); init_aux_banks();
getcwd(startdir, 80); getcwd(startdir, 80);
#endif
email_mode = 0; email_mode = 0;
switch (argc) { switch (argc) {
case 3: case 3: