Freut mich, dass Du unerschrocken genug bist, damit herum zu basteln!
Mit unter 2000 Bytes bist Du da auch auf einem guten Weg! Das könnte wirklich etwas werden, und das wäre wirklich super!
Um Deine weiteren Fragen zu beantworten, sei mir erlaubt, erst etwas zur Architektur des verwendeten AVR-Controllers auszuholen:
AVRs haben Harvard-Architektur der übelsten Sorte. Es gibt also nicht einen gemeinsamen Speicher (wie bei der von-Neumann-Architektur) für Daten (RAM) und Programm (Flash), sondern der ist strikt getrennt. Bei AVR sogar so sehr getrennt, dass RAM und Flash nicht einfach an verschiedenen Adressbereichen liegen, sondern die MCU mit verschiedenen Maschinenbefehlen darauf zugreifen muss. Um passenden Code erzeugen zu können, muss zur compile-time bekannt sein, ob ein Zeiger auf das RAM oder das Flash zeigt. Die Funktionen der Standardbibliothek erwarten ihre Parameter alle im RAM. Mit strcpy() könnte man z.B. keinen String aus dem Flash in das RAM kopieren. Dafür gibt es in der avr-libc Funktionen mit angehängtem _P bzw. _p, das wäre also hier z.B. strcpy_P(). Bei anderen Prozessoren, wie z.B. PIC18 von Microchip heissen diese Funktionen, die auf das Flash zugreifen können, aber wieder anders, weshalb wir das in XD-2031 abstrahiert haben. Aufgedröselt wird das über common/archcompat.h, da wird z.B. unser IN_ROM_STR(s) in das AVR-spezifische PSTR(s) gewandelt, wenn ein AVR verwendet wird.
Die große String-Tabelle, die von command_to_name() verwendet wird, liegt schon im Flash, da kann man kein RAM mehr sparen. Siehe auch firmware/cmdnames.c. Der von command_to_name() gelieferte String liegt aber wie Du richtig erkannt hast, im RAM. Dazu gibt es in cmdnames einen Puffer von STRLEN (=10+1) Bytes RAM und command_to_name() holt den passenden Namen aus dem Flash und kopiert ihn in diesen Puffer im RAM, damit spätere Funktionen (wie z.B. strcpy) den String dort vorfinden, wo sie ihn erwarten: im RAM. Was man nun machen könnte, ist STRLEN zu reduzieren und dadurch auf die Unterstützung von langen Befehlsschreibweisen zu verzichten: bei einer echten Floppy löscht man Dateien üblicherweise mit dem S-Befehl. Man kann den Befehl aber auch ausschreiben und SCRATCH FOO sagen, so unterstützt das auch die XD-2031 firmware. Wenn Du STRLEN nun auf zwei reduzierst (z.B. für CD), könnte man damit immerhin 8 Bytes RAM sparen.
Ein return IN_ROM_STR("foo") würde nicht funktionieren, da ein Zeiger auf RAM erwartet wird, IN_ROM_STR() aber auf etwas im Flash verweist. Das compiliert nur deshalb ohne Fehler, weil der Compiler nicht erkennen kann, was erforderlich ist und was geliefert wird. Einfach gesprochen sieht der nur Adressen, kann aber nicht wissen, ob diese Adresse z.B. 0x0834 nun im Flash oder im RAM liegt.
Hast Du im xs1541-Makefile MCU angepasst? Müsste 328p für Dich sein.
In der config.h musst Du noch F_CPU auf die verwendete Takt-Frequenz anpassen.
In hwdefines.h musst Du dann noch die Port-Belegung entsprechend anpassen, falls nicht schon geschehen.