www.cavefischer.at/Sharp Pocket Computer


Mit Arduino UNO das (externe) ROM von Sharp Pocket Computern auslesen






Mit Arduino UNO das externe ROM des Sharp PC-1403 auslesen



Eine Anfrage aus Winterthur in der Schweiz hat mich inspiriert das folgende Programm zu entwickeln.
Es kann damit das (externe) ROM des Sharp Pocket Computers PC-1403 (PC-1403H, EL-5500III) ausgelesen und an einen Arduino UNO übertragen werden.
Das 64 kB große ROM ist in vier Bänke zu je 16384 Byte gegliedert und kann mit dem Basic Befehl PEEK nicht abgefragt werden.
Das Auslesen ist nur mit einem Programm in Maschinensprache, wie z.B. in nachfolgendem Beispiel, möglich. Siehe auch Schulze J. (1987).
Der Ausgang Fo3 (Pin 4) des Sharp Pocket Computers wird zusammen mit dem Eingang IN1 (Pin 9) für einen einfachen Handshake verwendet.
Die Daten werden über die Leitungen Ext1 bis Ext4 (Pins 11, 10, 5, 8) parallel zu je 4 bit übertragen.
Als Beschaltung sind lediglich pull-down Widerstände (z.B. 10kOhm) an den vier Datenleitungen und der Handshake Leitung Fo3 erforderlich.
Beim ersten Aufruf muß das Basic Programm im Sharp Pocket Computer mit RUN gestartet werden, um das Maschinenprogramm in den Speicher zu übertragen.
Dies dauert ca. 14 Sekunden.
Das eigentliche Programm zur Übertragung des externen ROMs an den Arduino wird in der Folge mit DEF A gestartet.
Die Übertragung der 64 kB und die Ausgabe am Serial Monitor der Arduino IDE dauert ca. 38 Sekunden und endet mit einem Piepton.


Steckbrett mit Arduino UNO:



Programm für Arduino:

// Externes 64kB ROM (Bank1, Bank2, Bank3, Bank4) vom Sharp PC-1403 auslesen
// Je Byte 2x4 bit parallel über EXT1-EXT4 übertragen, Handshake mit Fo3 und IN1

unsigned long RomAdr = 16384; // Beginn ext. ROM
int indexBk = 0;
byte ByteArray[4]; // Speicherbereich für 4 Bytes (Bank 1 - Bank 4)
const int IN_Ext1 = 2; // Pin D2, Ext1 Sharp PC-1403, pin 11 der 11-pol. Buchsenleiste
const int IN_Ext2 = 3; // Pin D3, Ext2 Sharp PC-1403, pin 10 der 11-pol. Buchsenleiste
const int IN_Ext3 = 4; // Pin D4, Ext3 Sharp PC-1403, pin  5 der 11-pol. Buchsenleiste
const int IN_Ext4 = 5; // Pin D5, Ext4 Sharp PC-1403, pin  8 der 11-pol. Buchsenleiste
const int IN_Fo3  = 6; // Pin D6, Fo3  Sharp PC-1403, pin  4 der 11-pol. Buchsenleiste
const int OUT_IN1 = 7; // Pin D7, IN1  Sharp PC-1403, pin  9 der 11-pol. Buchsenleiste
const int InfoLED = 13;
byte DataBit1;
byte DataBit2;
byte DataBit3;
byte DataBit4;
byte DataBit5;
byte DataBit6;
byte DataBit7;
byte DataBit8;
byte Nib1;
byte Nib2;
byte DataByte = 0;
int Vorher;
int Jetzt;

void setup() {
  Serial.begin(115200);
  pinMode(IN_Fo3, INPUT);
  pinMode(IN_Ext1, INPUT);
  pinMode(IN_Ext2, INPUT);
  pinMode(IN_Ext3, INPUT);
  pinMode(IN_Ext4, INPUT);
  pinMode(OUT_IN1, OUTPUT);
  pinMode(InfoLED, OUTPUT);
  Serial.println("Ext. ROM PC-1403 64kB");
  Serial.println("Adr. ;Bk1;Bk2;Bk3;Bk4");
  Vorher = millis();
}

void loop() {
  if (digitalRead(IN_Fo3)) { // Data available
    digitalWrite(InfoLED, HIGH);   
    digitalWrite(OUT_IN1, LOW);
    DataBit1 = digitalRead(IN_Ext1);
    DataBit2 = digitalRead(IN_Ext2);
    DataBit3 = digitalRead(IN_Ext3);
    DataBit4 = digitalRead(IN_Ext4);
    while (digitalRead(IN_Fo3));   
    while (!digitalRead(IN_Fo3));    
    DataBit5 = digitalRead(IN_Ext1);
    DataBit6 = digitalRead(IN_Ext2);
    DataBit7 = digitalRead(IN_Ext3);
    DataBit8 = digitalRead(IN_Ext4);
    while (digitalRead(IN_Fo3));
    Nib1 = DataBit1 | (DataBit2 << 1) | (DataBit3 << 2) | (DataBit4 << 3);
    Nib2 = (DataBit5 << 4) | (DataBit6 << 5) | (DataBit7 << 6) | (DataBit8 << 7);
    DataByte = Nib1 | Nib2;
    AddByte();
    DataByte = 0;
    digitalWrite(InfoLED, LOW);
    digitalWrite(OUT_IN1, HIGH);
    Vorher = millis();
  }
  Jetzt = millis();
  if ((Jetzt - Vorher) > 5) {
    RomAdr = 16384;
    digitalWrite(OUT_IN1, LOW);
  }
} // Ende loop

void AddByte() {
  ByteArray[indexBk] = DataByte;
  indexBk++;
  if (indexBk == 4) {
    indexBk = 0;
    SerialPrintBytes();
    RomAdr++;
  }
}

void SerialPrintBytes() {
  Serial.print(RomAdr);
  Serial.print(';');
  for (int y=0; y<4; y++) {
    byte d = ByteArray[y];
    if (d < 10) Serial.print(char(32));
    if (d < 100) Serial.print(char(32));
    Serial.print(d);
    if (y < 3) Serial.print(';');
  }
  Serial.println();
}

BASIC Programm für Sharp PC-1403 (PC-1403H, EL-5500III):


10:RESTORE
20:FOR X=0 TO 97
30:READ D
40:POKE &F100+X,D
50:NEXT X
60:END
100:"A"
110:CALL &F100
120:BEEP 1
140:END
200:DATA &85,2,&3F,219,&84,2,&FF,219
210:DATA 16,&3C,&00,2,0,82,36,120,&F1,&4B
220:DATA 16,&3C,&00,2,1,82,4,37,120,&F1,&4B
230:DATA 16,&3C,&00,2,10,82,4,37,120,&F1,&4B
240:DATA 16,&3C,&00,2,11,82,4,37,120,&F1,&4B
250:DATA &85,99,&7F,58,7,&84,99,&FF,58,2,55
260:DATA 16,&3C,&00,214,128,57,3,107,8,126,&F1,&08,55
270:DATA 16,&3A,&00,82,18,&5E,97,4,95,206,96,0,95
280:DATA 88,82,97,4,95,206,96,0,95,55

Assemblerdarstellung des Maschinenprogramms für PC-1403
&F100: &85     LP05               
&F101: 002 &3F   LIA &3F           &3FFF (16383) = Startadresse (-1) des externen ROMs in das X-Reg laden
&F103: 219     EXAM               
&F104: &84     LP04               
&F105: 002 &FF   LIA &FF             
&F107: 219     EXAM               
&F108: 016 &3C &00 LIDP &3C00 <   Zur Ansteuerung der ROM Bank 1 (LZ92K32 BNK2=0, LZ92K32 BNK1=0):
&F10B: 002 000   LIA 0           000 in das Bankregister &3C00 laden
&F10D: 082     STD             
&F10E: 036     IXL          
&F10F: 120 &F1 &4B CALL &F14B         Aufruf des Unterprogramms zur Datenausgabe
&F112: 016 &3C &00 LIDP &3C00         Zur Ansteuerung der ROM Bank 2 (LZ92K32 BNK2=0, LZ92K32 BNK1=1):
&F115: 002 001   LIA 1           001 in das Bankregister &3C00 laden
&F117: 082     STD          
&F118: 004     IX          
&F119: 037     DXL          
&F11A: 120 &F1 &4B CALL &F14B         Aufruf des Unterprogramms zur Datenausgabe
&F11D: 016 &3C &00 LIDP &3C00         Zur Ansteuerung der ROM Bank 3 (LZ92K32 BNK2=1, LZ92K32 BNK1=0):
&F120: 002 010   LIA 10           010 in das Bankregister &3C00 laden
&F122: 082     STD          
&F123: 004     IX          
&F124: 037     DXL          
&F125: 120 &F1 &4B CALL &F14B         Aufruf des Unterprogramms zur Datenausgabe
&F128: 016 &3C &00 LIDP &3C00         Zur Ansteuerung der ROM Bank 4 (LZ92K32 BNK2=1, LZ92K32 BNK1=1):
&F12B: 002 011   LIA 11           011 in das Bankregister &3C00 laden
&F12D: 082     STD          
&F12E: 004     IX          
&F12F: 037     DXL          
&F130: 120 &F1 &4B CALL &F14B         Aufruf des Unterprogramms zur Datenausgabe
&F133: &85     LP05             
&F134: 099 &7F   CPIM &7F         Das Programm am Ende des ROMs bei &7FFF verlassen
&F136: 058 007   JRCP 7     
&F138: &84     LP04           
&F139: 099 &FF   CPIM &FF         
&F13B: 058 002   JRCP 2     
&F13D: 055     RTN         
&F13E: 016 &3C &00 LIDP &3C00 <   Port IN1 abfragen (Handshake)
&F141: 214 128   TSID 128 <       
&F143: 057 003   JRZM 3       
&F145: 107 008   TEST 8         Abfrage der BRK Taste
&F147: 126 &F1 &08 JPZ &F108     
&F14A: 055     RTN               
&F14B: 016 &3A &00 LIDP &3A00           Unterprogramm zur Ausgabe des Datenbytes über Ext1-Ext4 des Portregisters &3A00:
&F14E: 082     STD             Daten (Lower Nibble) an Ext1-Ext4 senden
&F14F: 018 &5E   LIP &5E             
&F151: 097 004   ORIM 4             
&F153: 095     OUTF             High an Fo3 (Pin 4) senden (Handshake)
&F154: 206     NOPT               
&F155: 096 000   ANIM 0             
&F157: 095     OUTF             Low an Fo3 (Pin 4) senden (Handshake)
&F158: 088     SWP               
&F159: 082     STD             Daten (Upper Nibble) an Ext1-Ext4 senden
&F15A: 097 004   ORIM 4             
&F15C: 095     OUTF             High an Fo3 (Pin 4) senden (Handshake)
&F15D: 206     NOPT               
&F15E: 096 000   ANIM 0             
&F160: 095     OUTF             Low an Fo3 (Pin 4) senden (Handshake)
&F161: 055     RTN               


Ausgabe am Serial Monitor:


...
bis 32767


Pinbelegung:

Arduino UNO Pin Name Sharp PC
11-pol. Schnittstelle
GND GND Pin 3
D7 Port IN 1 Pin 9
D6 (mit pull-down Widerstand auf GND) Port Fo 3 Pin 4
D5 (mit pull-down Widerstand auf GND) Port Ext 4 Pin 8
D4 (mit pull-down Widerstand auf GND) Port Ext 3 Pin 5
D3 (mit pull-down Widerstand auf GND) Port Ext 2 Pin 10
D2 (mit pull-down Widerstand auf GND) Port Ext 1 Pin 11





Mit Arduino UNO das externe ROM des Sharp PC-1401 auslesen



Mit dem folgenden Programm kann das (externe) ROM des Sharp Pocket Computers PC-1401 (PC-1402, EL-5500, EL-5500II) ausgelesen und an einen Arduino UNO übertragen werden.
Es ist zwar möglich, das ROM mit dem Basic Befehl PEEK auszulesen, dies ist aber sehr langwierig.
Viel schneller geht es mit einem Programm in Maschinensprache, wie z.B. in nachfolgendem Beispiel.
Der Ausgang Xo (Pin 7) des Sharp Pocket Computers wird zusammen mit dem Eingang Xi (Pin 6) für einen einfachen Handshake verwendet.
Die Daten werden über die Leitungen Fo1, Fo2, IB7, IB8 (Pins 4, 5, 9, 8) parallel zu je 4 bit übertragen.
Als Beschaltung sind lediglich pull-down Widerstände (z.B. 10kOhm) an den vier Datenleitungen und der Handshake Leitung Xo erforderlich.
Beim ersten Aufruf muß das Basic Programm im Sharp Pocket Computer mit RUN gestartet werden, um das Maschinenprogramm in den Speicher zu übertragen.
Dies dauert ca. 10 Sekunden.
Das eigentliche Programm zur Übertragung des externen ROMs an den Arduino wird in der Folge mit DEF A gestartet.
Die Übertragung der 32 kB und die Ausgabe am Serial Monitor der Arduino IDE dauert ca. 33 Sekunden und endet mit einem Piepton.


Steckbrett mit Arduino UNO:



Programm für Arduino:

// Externes ROM vom Sharp PC-1401 auslesen
// 2x4 bit parallel ueber Fo1,Fo2,IB7,IB8 uebertragen, Handshake mit Xo und Xi

unsigned long RomAdr = 32768; // Beginn ext. ROM
const int IN_Fo1 = 2; // Pin D2, Fo1 Sharp PC-1401, pin 4 der 11-pol. Buchsenleiste
const int IN_Fo2 = 3; // Pin D3, Fo2 Sharp PC-1401, pin 5 der 11-pol. Buchsenleiste
const int IN_IB7 = 4; // Pin D4, IB7 Sharp PC-1401, pin 9 der 11-pol. Buchsenleiste
const int IN_IB8 = 5; // Pin D5, IB8 Sharp PC-1401, pin 8 der 11-pol. Buchsenleiste
const int IN_Xo  = 6; // Pin D6, Xo  Sharp PC-1401, pin 7 der 11-pol. Buchsenleiste
const int OUT_Xi = 7; // Pin D7, Xi  Sharp PC-1401, pin 6 der 11-pol. Buchsenleiste
const int InfoLED = 13;
byte DataBit1;
byte DataBit2;
byte DataBit3;
byte DataBit4;
byte DataBit5;
byte DataBit6;
byte DataBit7;
byte DataBit8;
byte Nib1;
byte Nib2;
byte DataByte = -1;
unsigned long Vorher;
unsigned long Jetzt;
boolean StartTransmission = false;

void setup() {
  Serial.begin(115200);
  pinMode(IN_Xo, INPUT);
  pinMode(IN_Fo1, INPUT);
  pinMode(IN_Fo2, INPUT);
  pinMode(IN_IB7, INPUT);
  pinMode(IN_IB8, INPUT);
  pinMode(OUT_Xi, OUTPUT);
  pinMode(InfoLED, OUTPUT);
  Serial.println("Ext.ROM;PC-1401 32kB");
  Serial.println("Adresse;Inhalt");
  Vorher = millis();
}

void loop() {
  if (!StartTransmission) { // Trigger fuer Datenuebertragung
    if (digitalRead(IN_Fo1)) StartTransmission = true;  
  }
  if (digitalRead(IN_Xo) && StartTransmission) { // Data available
    digitalWrite(InfoLED, HIGH);   
    digitalWrite(OUT_Xi, LOW);
    DataBit1 = digitalRead(IN_Fo1);
    DataBit2 = digitalRead(IN_Fo2);
    DataBit3 = digitalRead(IN_IB7);
    DataBit4 = digitalRead(IN_IB8);
    while (digitalRead(IN_Xo));   
    while (!digitalRead(IN_Xo));    
    DataBit5 = digitalRead(IN_Fo1);
    DataBit6 = digitalRead(IN_Fo2);
    DataBit7 = digitalRead(IN_IB7);
    DataBit8 = digitalRead(IN_IB8);
    while (digitalRead(IN_Xo));
    Nib1 = DataBit1 | (DataBit2 << 1) | (DataBit3 << 2) | (DataBit4 << 3);
    Nib2 = (DataBit5 << 4) | (DataBit6 << 5) | (DataBit7 << 6) | (DataBit8 << 7);
    DataByte = Nib1 | Nib2;
    Serial.print(RomAdr);
    Serial.print(';');
    Serial.println(DataByte);
    DataByte = -1;
    RomAdr++;
    digitalWrite(InfoLED, LOW);
    digitalWrite(OUT_Xi, HIGH);
    Vorher = millis();
  }
  Jetzt = millis();
  if ((Jetzt - Vorher) > 5) {
    StartTransmission = false;
    RomAdr = 32768;
    digitalWrite(OUT_Xi, LOW);
  }
} // Ende loop

BASIC Programm für Sharp PC-1401 (PC-1402, EL-5500, EL-5500II):


10:RESTORE
20:FOR X=0 TO 68
30:READ D
40:POKE &4100+X,D
50:NEXT X
60:END
100:"A"
110:CALL &4100
120:BEEP 1
130:END
200:DATA &85,2,&7F,219,&84,2,&FF,219
210:DATA 36,18,&5E,219,95
220:DATA 219,52,81,88,219,221
230:DATA 18,&5F,2,16,219,223,77,2,0,219,223
240:DATA 91,81,88,219,95
250:DATA 219,88,81,219,221
260:DATA 18,&5F,2,16,219,223,206,2,64,219,223
270:DATA &85,99,&FF,58,7,&84,99,&FF,58,2,55
280:DATA 107,128,57,3,121,&41,&08

Assemblerdarstellung des Maschinenprogramms für PC-1401
&4100: &85     LP05                 
&4101: 002 &7F   LIA &7F             &7FFF (32767) = Startadresse (-1) des externen ROMs in das X-Reg laden
&4103: 219     EXAM                 
&4104: &84     LP04                 
&4105: 002 &FF   LIA &FF               
&4107: 219     EXAM                 
&4108: 036     IXL   <     
&4109: 018 &5E   LIP &5E             
&410B: 219     EXAM               
&410C: 095     OUTF             Bit 1 an Fo1 senden, Bit 2 an Fo2 senden
&410D: 219     EXAM              
&410E: 052     PUSH              
&410F: 081     DECP               
&4110: 088     SWP            
&4111: 219     EXAM            
&4112: 221     OUTB             Bit 3 an IB7 senden, Bit 4 an IB8 senden
&4113: 018 &5F   LIP &5F          
&4115: 002 016   LIA 16          
&4117: 219     EXAM            
&4118: 223     OUTC             Handshake Xo=High, Xi inaktiv
&4119: 077     NOPW            
&411A: 002 000   LIA 0          
&411C: 219     EXAM            
&411D: 223     OUTC             Handshake Xo=Low, Xi inaktiv
&411E: 091     POP               
&411F: 081     DECP            
&4120: 088     SWP            
&4121: 219     EXAM            
&4122: 095     OUTF             Bit 5 an Fo1 senden, Bit 6 an Fo2 senden
&4123: 219     EXAM               
&4124: 088     SWP            
&4125: 081     DECP               
&4126: 219     EXAM               
&4127: 221 &FF   OUTB             Bit 7 an IB7 senden, Bit 8 an IB8 senden
&4128: 018 &5F   LIP &5F          
&412A: 002 016   LIA 16          
&412C: 219     EXAM            
&412D: 223     OUTC             Handshake Xo=High, Xi inaktiv
&412E: 206     NOPW            
&412F: 002 064   LIA 64          
&4131: 219     EXAM            
&4132: 223     OUTC             Handshake Xo=Low, Xi aktiv
&4133: &85     LP05            
&4134: 099 &FF   CPIM &FF          
&4136: 058 007   JRCP 7     
&4138: &84     LP04             
&4139: 099 &FF   CPIM &FF        
&413B: 058 002   JRCP 2     
&413D: 055     RTN         Das Programm am Ende des ROMs bei &FFFF verlassen
&413E: 107 128   TEST 128 <   Port Xi abfragen (Handshake)
&4140: 057 003   JRZM 3      
&4142: 121 &41 &08 JP &4108     


Ausgabe am Serial Monitor:


...
bis 65535


Pinbelegung:

Arduino UNO Pin Name Sharp PC
11-pol. Schnittstelle
GND GND Pin 3
D7 Port Xi Pin 6
D6 (mit pull-down Widerstand auf GND) Port Xo Pin 7
D5 (mit pull-down Widerstand auf GND) Port IB8 Pin 8
D4 (mit pull-down Widerstand auf GND) Port IB7 Pin 9
D3 (mit pull-down Widerstand auf GND) Port Fo2 Pin 5
D2 (mit pull-down Widerstand auf GND) Port Fo1 Pin 4


zum Seitenanfang

© 2026: Walter Fischer