Commit 5d8f66ba authored by Sergio Costas's avatar Sergio Costas

Moved microdrive into its own class

parent 205603c4
......@@ -46,7 +46,7 @@ computer.o: computer.cpp z80free/Z80free.h llsound.hh keyboard.hh computer.hh sc
emulator.o: emulator.cpp keyboard.hh llsound.hh cmdline.hh computer.hh screen.hh signals.hh llscreen.hh z80free/Z80free.h tape.hh emulator.hh osd.hh microdrive.hh menus.hh cargador.hh
$(CPP) $(CPPFLAGS) -o emulator.o emulator.cpp
keyboard.o: keyboard.cpp keyboard.hh
keyboard.o: keyboard.cpp menus.hh llscreen.hh llsound.hh computer.hh screen.hh signals.hh z80free/Z80free.h tape.hh emulator.hh osd.hh keyboard.hh
$(CPP) $(CPPFLAGS) -o keyboard.o keyboard.cpp
llscreen.o: llscreen.cpp osd.hh font.h llscreen.hh
......@@ -55,7 +55,7 @@ llscreen.o: llscreen.cpp osd.hh font.h llscreen.hh
llsound.o: llsound.cpp emulator.hh screen.hh osd.hh z80free/Z80free.h computer.hh signals.hh llscreen.hh tape.hh llsound.hh
$(CPP) $(CPPFLAGS) -o llsound.o llsound.cpp
menus.o: menus.cpp keyboard.hh llsound.hh llscreen.hh menus.hh tape.hh signals.hh emulator.hh screen.hh osd.hh z80free/Z80free.h computer.hh cargador.hh
menus.o: menus.cpp microdrive.hh z80free/Z80free.h keyboard.hh llsound.hh llscreen.hh menus.hh tape.hh signals.hh emulator.hh screen.hh osd.hh computer.hh cargador.hh
$(CPP) $(CPPFLAGS) -o menus.o menus.cpp
microdrive.o: microdrive.cpp osd.hh emulator.hh screen.hh z80free/Z80free.h computer.hh signals.hh llscreen.hh tape.hh microdrive.hh
......
......@@ -89,6 +89,7 @@ computer::computer() {
this->sound_cuantity = 0;
this->sound_current_value = 0;
this->interr = 0;
OOTape->register_signal("pause_tape",this);
OOTape->register_signal("pause_tape_48k",this);
}
......@@ -130,7 +131,7 @@ void computer::emulate (int tstados) {
play_ay (tstados);
play_sound (tstados);
OOTape->play(tstados);
microdrive_emulate(tstados);
microdrive->emulate(tstados);
if (!OOTape->get_pause()) {
if (OOTape->read_signal() != 0) {
......@@ -211,7 +212,7 @@ void ResetComputer () {
}
keyboard->reset();
screen->reset(ordenador->mode128k);
microdrive_reset();
microdrive->reset();
}
void Z80free_Wr (register word Addr, register byte Value) {
......@@ -242,7 +243,7 @@ void Z80free_Wr (register word Addr, register byte Value) {
byte Z80free_Rd (register word Addr) {
if((ordenador->mdr_active)&&(ordenador->mdr_paged)&&(Addr<8192)) // Interface I
if((microdrive->mdr_active)&&(microdrive->mdr_paged)&&(Addr<8192)) // Interface I
return((byte)ordenador->shadowrom[Addr]);
switch (ordenador->other_ret) {
......@@ -300,8 +301,8 @@ void Z80free_Out (register word Port, register byte Value) {
screen->set_ulaplus_value(Value);
}
if(((Port &0x0018)!=0x0018)&&(ordenador->mdr_active))
microdrive_out(Port,Value);
if(((Port &0x0018)!=0x0018)&&(microdrive->mdr_active))
microdrive->out(Port,Value);
// ULA port (A0 low)
......@@ -417,8 +418,8 @@ byte Z80free_In (register word Port) {
// Microdrive access
if(((Port &0x0018)!=0x0018)&&(ordenador->mdr_active))
return(microdrive_in(Port));
if(((Port &0x0018)!=0x0018)&&(microdrive->mdr_active))
return(microdrive->in(Port));
pines=ordenador->bus_empty();
......
......@@ -88,21 +88,6 @@ public:
bool tape_write; // FALSE can't write; TRUE can write
bool tape_fast_load; // FALSE normal load; TRUE fast load
// Microdrive global variables
FILE *mdr_file; // Current microdrive file
char mdr_current_mdr[2049]; // current path and name for microdrive file
unsigned char mdr_active; // 0: not installed; 1: installed
unsigned char mdr_paged; // 0: not pagined; 1: pagined
unsigned int mdr_tapehead; // current position in the tape
unsigned int mdr_bytes; // number of bytes read or written in this transfer
unsigned int mdr_maxbytes; // maximum number of bytes to read or write in this transfer
unsigned int mdr_gap; // TSTATEs remaining for GAP end
unsigned int mdr_nogap; // TSTATEs remaining for next GAP
unsigned char mdr_cartridge[137923]; // current cartridge
unsigned char mdr_drive; // current drive
byte mdr_old_STATUS; // to detect an edge in COM CLK
unsigned char mdr_modified; // if a sector is stored, this change to know that it must be stored in the file
// pagination global variables
unsigned char mport1,mport2; // ports for memory management (128K and +3)
......
......@@ -207,7 +207,7 @@ void save_config(struct computer *object) {
fprintf(fconfig,"issue=%c%c",48+object->issue,10);
fprintf(fconfig,"joystick=%c%c",48+keyboard->joystick,10);
fprintf(fconfig,"ay_sound=%c%c",48+object->ay_emul,10);
fprintf(fconfig,"interface1=%c%c",48+object->mdr_active,10);
fprintf(fconfig,"interface1=%c%c",48+microdrive->mdr_active,10);
fprintf(fconfig,"doublescan=%c%c",object->dblscan ? '1' : '0',10);
fprintf(fconfig,"volume=%c%c",65+(llsound->volume/4),10);
fprintf(fconfig,"bw=%c%c",object->bw ? '1' : '0',10);
......@@ -302,7 +302,7 @@ void load_config(struct computer *object) {
object->ay_emul=ay_emul;
}
if (mdr_active<2) {
object->mdr_active=mdr_active;
microdrive->mdr_active=mdr_active;
}
if (dblscan<2) {
object->dblscan = dblscan==0 ? false : true;
......@@ -353,6 +353,7 @@ int main(int argc,char *argv[]) {
OOTape = new Tape();
keyboard = new Keyboard();
ordenador = new computer();
microdrive = new Microdrive();
load_config(ordenador);
......@@ -419,7 +420,7 @@ int main(int argc,char *argv[]) {
salir=1;
printf("Init microdrive\n");
microdrive_init();
printf("Reset computer\n");
ResetComputer();
......@@ -458,7 +459,7 @@ int main(int argc,char *argv[]) {
/* if PC is 0x0556, a call to LD_BYTES has been made, so if
FAST_LOAD is 1, we must load the block in memory and return */
if((!ordenador->mdr_paged) && (PC==0x0556) && (ordenador->tape_fast_load)) {
if((!microdrive->mdr_paged) && (PC==0x0556) && (ordenador->tape_fast_load)) {
if(ordenador->current_tap != "") {
//procesador.Rm.br.F &= ~F_Z;
do_fast_load();
......@@ -471,7 +472,7 @@ int main(int argc,char *argv[]) {
/* if PC is 0x04C2, a call to SA_BYTES has been made, so if
we want to save to the TAP file, we do it */
if((!ordenador->mdr_paged) && (PC==0x04C2) && (ordenador->tape_write==1)) {
if((!microdrive->mdr_paged) && (PC==0x04C2) && (ordenador->tape_write==1)) {
uint8_t *data;
uint8_t op_xor;
......@@ -511,20 +512,20 @@ int main(int argc,char *argv[]) {
/* if ordenador->mdr_paged is 2, we have executed the RET at 0x0700, so
we have to return to the classic ROM */
if(ordenador->mdr_paged==2)
ordenador->mdr_paged=0;
if(microdrive->mdr_paged==2)
microdrive->mdr_paged=0;
/* if PC is 0x0008 or 0x1708, and we have a microdrive, we have to page
the Interface 1 ROM */
if(((PC==0x0008)||(PC==0x1708))&&(ordenador->mdr_active))
ordenador->mdr_paged = 1;
if(((PC==0x0008)||(PC==0x1708))&&(microdrive->mdr_active))
microdrive->mdr_paged = 1;
/* if PC is 0x0700 and we have a microdrive, we have to unpage
the Interface 1 ROM after the last instruction */
if((PC==0x0700)&&(ordenador->mdr_active))
ordenador->mdr_paged = 2;
if((PC==0x0700)&&(microdrive->mdr_active))
microdrive->mdr_paged = 2;
if(ordenador->interr==1) {
keyboard->read_keyboard (NULL); // read the physical keyboard
......
......@@ -36,6 +36,7 @@
#include "llscreen.hh"
#include "llsound.hh"
#include "keyboard.hh"
#include "microdrive.hh"
// shows the settings menu
......@@ -196,7 +197,7 @@ void settings_menu() {
llscreen->print_string(texto,-1,4,11,0);
if(ordenador->mdr_active)
if(microdrive->mdr_active)
sprintf(texto,"Interface I Emulation: enabled");
else
sprintf(texto,"Interface I Emulation: disabled");
......@@ -289,7 +290,7 @@ void settings_menu() {
ordenador->issue=3;
ordenador->mode128k=3;
ordenador->ay_emul=1;
ordenador->mdr_active=0;
microdrive->mdr_active=0;
ResetComputer();
break;
case SDLK_6:
......@@ -312,7 +313,7 @@ void settings_menu() {
break;
case SDLK_i:
if(ordenador->mode128k!=3) {
ordenador->mdr_active=1-ordenador->mdr_active;
microdrive->mdr_active=1-microdrive->mdr_active;
ResetComputer();
}
break;
......@@ -710,11 +711,11 @@ void microdrive_menu() {
llscreen->print_string("ESC: \001\017return to emulator",14,10,12,0);
llscreen->print_string("Current MDR file is:",-1,13,12,0);
llscreen->print_string(ordenador->mdr_current_mdr,-1,14,12,0);
llscreen->print_string(microdrive->mdr_current_mdr,-1,14,12,0);
print_copy();
if(!ordenador->mdr_cartridge[137922])
if(!microdrive->get_protected())
llscreen->print_string("Write enabled",-1,-4,14,0);
else
llscreen->print_string("Write disabled",-1,-4,14,0);
......@@ -731,16 +732,10 @@ void microdrive_menu() {
create_mdrfile();
break;
case SDLK_3:
if(ordenador->mdr_cartridge[137922])
ordenador->mdr_cartridge[137922]=0;
else
ordenador->mdr_cartridge[137922]=1;
ordenador->mdr_file=fopen(ordenador->mdr_current_mdr,"wb"); // create for write
if(ordenador->mdr_file!=NULL) {
fwrite(ordenador->mdr_cartridge,137923,1,ordenador->mdr_file); // save cartridge
fclose(ordenador->mdr_file);
ordenador->mdr_file=NULL;
ordenador->mdr_modified=0;
if(microdrive->get_protected()) {
microdrive->set_protected(false);
} else {
microdrive->set_protected(true);
}
break;
default:
......@@ -769,22 +764,10 @@ void select_mdrfile() {
return;
}
ordenador->mdr_file=fopen(filename,"rb"); // read
if(ordenador->mdr_file==NULL)
retorno=-1;
else {
retorno=0;
fread(ordenador->mdr_cartridge,137923,1,ordenador->mdr_file); // read the cartridge in memory
ordenador->mdr_modified=0; // not modified
fclose(ordenador->mdr_file);
ordenador->mdr_tapehead=0;
}
llscreen->clear_screen();
strcpy(ordenador->mdr_current_mdr,filename);
retorno = microdrive->select_mdrfile(filename);
free(filename);
llscreen->clear_screen();
switch(retorno) {
case 0: // all right
......@@ -792,7 +775,7 @@ void select_mdrfile() {
case -1:
llscreen->print_string("Error: Can't load that file",-1,-3,10,0);
llscreen->print_string("Press any key",-1,-2,10,0);
ordenador->mdr_current_mdr[0]=0;
microdrive->mdr_current_mdr[0]=0;
wait_key();
break;
}
......@@ -821,39 +804,19 @@ void create_mdrfile() {
if(retorno==2) // abort
return;
ordenador->mdr_file=fopen(nombre2,"r"); // test if it exists
if(ordenador->mdr_file==NULL)
retorno=0;
else
retorno=-1;
retorno = microdrive->new_mdrfile(nombre2);
if(!retorno) {
ordenador->mdr_file=fopen(nombre2,"wb"); // create for write
if(ordenador->mdr_file==NULL)
retorno=-2;
else {
for(bucle=0;bucle<137921;bucle++)
ordenador->mdr_cartridge[bucle]=0xFF; // erase cartridge
ordenador->mdr_cartridge[137922]=0;
fwrite(ordenador->mdr_cartridge,137923,1,ordenador->mdr_file); // save cartridge
fclose(ordenador->mdr_file);
ordenador->mdr_file=NULL;
ordenador->mdr_modified=0;
retorno=0;
}
}
strcpy(ordenador->mdr_current_mdr,nombre2);
switch(retorno) {
case 0:
break;
case -1:
llscreen->print_string("File already exists",-1,9,10,0);
ordenador->mdr_current_mdr[0]=0;
microdrive->mdr_current_mdr[0]=0;
wait_key();
break;
case -2:
llscreen->print_string("Can't create file",-1,9,10,0);
ordenador->mdr_current_mdr[0]=0;
microdrive->mdr_current_mdr[0]=0;
wait_key();
break;
}
......
......@@ -22,85 +22,91 @@
#include "emulator.hh"
#include "osd.hh"
byte basura;
#include <stdio.h>
void microdrive_init() {
class Microdrive *microdrive;
Microdrive::Microdrive() {
int bucle;
basura = 0;
this->trash = 0;
ordenador->mdr_active = 0;
ordenador->mdr_paged = 0;
this->mdr_active = 0;
this->mdr_paged = 0;
for(bucle=0;bucle<137922;bucle++)
ordenador->mdr_cartridge[bucle]=0xFF; // cartridge erased
ordenador->mdr_cartridge[137922]=0; // but not write-protected
ordenador->mdr_tapehead=0;
ordenador->mdr_drive=0; // no motor on
ordenador->mdr_old_STATUS=0x00; // default -> no down edge
ordenador->mdr_modified=0; // not modified
ordenador->mdr_current_mdr[0]=0; // no cartridge
this->mdr_cartridge[bucle]=0xFF; // cartridge erased
this->mdr_cartridge[137922]=0; // but not write-protected
this->mdr_tapehead=0;
this->mdr_drive=0; // no motor on
this->mdr_old_STATUS=0x00; // default -> no down edge
this->mdr_modified=0; // not modified
this->mdr_current_mdr[0]=0; // no cartridge
this->mdr_gap = 15;
this->mdr_nogap = 15;
this->mdr_bytes = 0;
this->mdr_maxbytes = 0;
}
void microdrive_reset() {
void Microdrive::reset() {
ordenador->mdr_gap = 15;
ordenador->mdr_nogap = 15;
ordenador->mdr_tapehead = 0; // head is at start position
this->mdr_gap = 15;
this->mdr_nogap = 15;
this->mdr_tapehead = 0; // head is at start position
}
void microdrive_emulate(int tstados) {
void Microdrive::emulate(int tstados) {
// still nothing to do here
}
byte microdrive_in(word Port) {
byte Microdrive::in(word Port) {
byte retorno;
/* allow access to the port only if motor 1 is ON and there's a file open */
if(((Port|0xFFE7)==0xFFE7)&&(ordenador->mdr_drive==0x01)&&(ordenador->mdr_current_mdr[0])) {
if(ordenador->mdr_bytes<ordenador->mdr_maxbytes) {
retorno=ordenador->mdr_cartridge[ordenador->mdr_tapehead];
basura=retorno;
increment_head();
if(((Port|0xFFE7)==0xFFE7)&&(this->mdr_drive==0x01)&&(this->mdr_current_mdr[0])) {
if(this->mdr_bytes<this->mdr_maxbytes) {
retorno=this->mdr_cartridge[this->mdr_tapehead];
this->trash = retorno;
this->increment_head();
} else {
retorno = basura;
retorno = this->trash;
}
ordenador->mdr_bytes++;
this->mdr_bytes++;
return (retorno);
}
if((Port|0xFFE7)==0xFFEF) {
if((ordenador->mdr_drive==0x01)&&(ordenador->mdr_current_mdr[0])) { // motor 1 ON and file selected
if(ordenador->mdr_gap) {
if((this->mdr_drive==0x01)&&(this->mdr_current_mdr[0])) { // motor 1 ON and file selected
if(this->mdr_gap) {
retorno=0xFE; // GAP and SYNC high
ordenador->mdr_gap--;
this->mdr_gap--;
} else {
retorno=0xF8; // GAP and SYNC low
if(ordenador->mdr_nogap)
ordenador->mdr_nogap--;
if(this->mdr_nogap)
this->mdr_nogap--;
else {
ordenador->mdr_gap=15;
ordenador->mdr_nogap=15;
this->mdr_gap=15;
this->mdr_nogap=15;
}
}
if(!ordenador->mdr_cartridge[137922]) // if write protected
if(!this->mdr_cartridge[137922]) // if write protected
retorno|=0x01; // active bit
} else // motor 1 OFF
retorno=0xFF;
microdrive_restart();
this->restart();
return (retorno);
}
if ((Port|0xFFE7)==0xFFF7) {
microdrive_restart();
this->restart();
return (0xFF);
}
......@@ -108,67 +114,141 @@ byte microdrive_in(word Port) {
}
void microdrive_out(word Port,byte Value) {
void Microdrive::out(word Port,byte Value) {
/* allow access to the port only if motor 1 is ON and there's a file open */
if(((Port|0xFFE7)==0xFFE7)&&(ordenador->mdr_drive==0x01)&&(ordenador->mdr_current_mdr[0])) {
if((ordenador->mdr_bytes>11)&&(ordenador->mdr_bytes<(ordenador->mdr_maxbytes+12))) {
ordenador->mdr_cartridge[ordenador->mdr_tapehead]=(unsigned int) Value;
increment_head();
ordenador->mdr_modified=1;
if(((Port|0xFFE7)==0xFFE7)&&(this->mdr_drive==0x01)&&(this->mdr_current_mdr[0])) {
if((this->mdr_bytes>11)&&(this->mdr_bytes<(this->mdr_maxbytes+12))) {
this->mdr_cartridge[this->mdr_tapehead]=(unsigned int) Value;
this->increment_head();
this->mdr_modified=1;
}
ordenador->mdr_bytes++;
this->mdr_bytes++;
return;
}
if((Port|0xFFE7)==0xFFEF) {
if(((Value&0x02)==0)&&((ordenador->mdr_old_STATUS&0x02)==2)) { // edge down-> new bit for motor ON
ordenador->mdr_drive=((ordenador->mdr_drive<<1)&0xFE); // rotate one drive
if(((Value&0x02)==0)&&((this->mdr_old_STATUS&0x02)==2)) { // edge down-> new bit for motor ON
this->mdr_drive=((this->mdr_drive<<1)&0xFE); // rotate one drive
if(!(Value&0x01)) // if COM DATA is 0, we add a 1 bit to mdr_drive
ordenador->mdr_drive|=0x01;
this->mdr_drive|=0x01;
if(ordenador->mdr_modified) { // if the cartridge has been modified, we store it in hard disk
ordenador->mdr_file=fopen(ordenador->mdr_current_mdr,"wb"); // create for write
if(ordenador->mdr_file==NULL) {
osd->set_message("Can't store the cartridge",3000);
} else {
fwrite(ordenador->mdr_cartridge,137923,1,ordenador->mdr_file); // save cartridge
fclose(ordenador->mdr_file);
ordenador->mdr_file=NULL;
ordenador->mdr_modified=0;
}
if(this->mdr_modified) { // if the cartridge has been modified, we store it in hard disk
this->save_cartridge();
}
}
ordenador->mdr_old_STATUS=Value;
microdrive_restart();
this->mdr_old_STATUS=Value;
this->restart();
return;
}
if ((Port|0xFFE7)==0xFFF7) {
microdrive_restart();
this->restart();
return;
}
}
void increment_head() { // gets the tape head to the next byte
bool Microdrive::save_cartridge() {
FILE *mdr_file;
mdr_file=fopen(this->mdr_current_mdr,"wb"); // create for write
if(mdr_file==NULL) {
osd->set_message("Can't store the cartridge",3000);
return true;
}
fwrite(this->mdr_cartridge,137923,1,mdr_file); // save cartridge
fclose(mdr_file);
mdr_file=NULL;
this->mdr_modified=0;
return false;
}
void Microdrive::increment_head() { // gets the tape head to the next byte
ordenador->mdr_tapehead++;
if(ordenador->mdr_tapehead>137921)
ordenador->mdr_tapehead=0;
this->mdr_tapehead++;
if(this->mdr_tapehead>137921)
this->mdr_tapehead=0;
}
void microdrive_restart() { // there's an access to a port. Reset counters and relocate the head
void Microdrive::restart() { // there's an access to a port. Reset counters and relocate the head
//printf("Inicializado\n");
while(((ordenador->mdr_tapehead%543)!=0)&&((ordenador->mdr_tapehead%543)!=15))
increment_head(); // put head in the start of a block
while(((this->mdr_tapehead%543)!=0)&&((this->mdr_tapehead%543)!=15)) {
this->increment_head(); // put head in the start of a block
}
ordenador->mdr_bytes = 0; // reset current number of bytes written
if((ordenador->mdr_tapehead%543)==0)
ordenador->mdr_maxbytes = 15; // up to 15 bytes for header blocks
this->mdr_bytes = 0; // reset current number of bytes written
if((this->mdr_tapehead%543)==0)
this->mdr_maxbytes = 15; // up to 15 bytes for header blocks
else
ordenador->mdr_maxbytes = 528; // up to 528 bytes for data blocks
this->mdr_maxbytes = 528; // up to 528 bytes for data blocks
}
int Microdrive::select_mdrfile(char *filename) {
int retorno;
FILE *mdr_file;
mdr_file=fopen(filename,"rb"); // read
if(mdr_file==NULL)
retorno=-1;
else {
retorno=0;
fread(this->mdr_cartridge,137923,1,mdr_file); // read the cartridge in memory
this->mdr_modified=0; // not modified
fclose(mdr_file);
this->mdr_tapehead=0;
}
strcpy(this->mdr_current_mdr,filename);
return retorno;
}
int Microdrive::new_mdrfile(char *filename) {
int retorno;
int bucle;
FILE *mdr_file;
mdr_file=fopen(filename,"r"); // test if it exists
if(mdr_file != NULL) {
fclose(mdr_file);
return -1;
}
for(bucle=0;bucle<137921;bucle++) {
this->mdr_cartridge[bucle]=0xFF; // erase cartridge
}
this->mdr_cartridge[137922]=0;
if (this->save_cartridge()) {
retorno = -2;
} else {
retorno = 0;
}
strcpy(this->mdr_current_mdr,filename);
return retorno;
}
bool Microdrive::get_protected() {
if (this->mdr_cartridge[137922] == 0) {
return false;
} else {
return true;
}
}
void Microdrive::set_protected(bool prot) {
if (prot) {
this->mdr_cartridge[137922] = 1;
} else {
this->mdr_cartridge[137922] = 0;
}
this->save_cartridge();
}
......@@ -20,14 +20,42 @@
#ifndef H_MICRODRIVE
#define H_MICRODRIVE
#include <inttypes.h>
#include <stdio.h>
#include "z80free/Z80free.h"
void microdrive_init();
void microdrive_reset();
byte microdrive_in(word);
void microdrive_out(word,byte);
void microdrive_emulate(int);
void increment_head();
void microdrive_restart();
class Microdrive {
void increment_head();
void restart();
bool save_cartridge();
uint32_t mdr_tapehead; // current position in the tape
uint32_t mdr_bytes; // number of bytes read or written in this transfer
uint32_t mdr_maxbytes; // maximum number of bytes to read or write in this transfer
uint32_t mdr_gap; // TSTATEs remaining for GAP end
uint32_t mdr_nogap; // TSTATEs remaining for next GAP
uint8_t mdr_cartridge[137923]; // current cartridge
uint8_t mdr_drive; // current drive
byte mdr_old_STATUS; // to detect an edge in COM CLK
uint8_t mdr_modified; // if a sector is stored, this change to know that it must be stored in the file
byte trash;
public:
Microdrive();
void reset();
byte in(word);
void out(word,byte);
void emulate(int);
int select_mdrfile(char *);
int new_mdrfile(char *);
bool get_protected();
void set_protected(bool);
bool mdr_active; // 0: not installed; 1: installed
bool mdr_paged; // 0: not pagined; 1: pagined
char mdr_current_mdr[2049]; // current path and name for microdrive file
};
extern class Microdrive *microdrive;
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment