www.cavefischer.at/Sharp Pocket Computer


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
&F10B: 002 000   LIA 0         0 in das Bankregister &3C00 laden
&F10D: &82     STD             
&F10E: 036     IXL          
&F10F: 120 &F1 &4B CALL &F14B        
&F112: 016 &3C &00 LIDP &3C00         Zur Ansteuerung der ROM Bank 2
&F115: 002 001   LIA 1         1 in das Bankregister &3C00 laden
&F117: &82     STD          
&F118: 004     IX          
&F119: 037     DXL          
&F11A: 120 &F1 &4B CALL &F14B        
&F11D: 016 &3C &00 LIDP &3C00         Zur Ansteuerung der ROM Bank 3
&F120: 002 010   LIA 10         10 in das Bankregister &3C00 laden
&F122: &82     STD          
&F123: 004     IX          
&F124: 037     DXL          
&F125: 120 &F1 &4B CALL &F14B        
&F128: 016 &3C &00 LIDP &3C00         Zur Ansteuerung der ROM Bank 4
&F12B: 002 011   LIA 11         11 in das Bankregister &3C00 laden
&F12D: &82     STD          
&F12E: 004     IX          
&F12F: 037     DXL          
&F130: 120 &F1 &4B CALL &F14B        
&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
&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           Ausgabe des Datenbytes über Ext1-Ext4 des Portregisters &3A00
&F14E: 082     STD               
&F14F: 018 &5E   LIP &5E             
&F151: 097 004   ORIM 4             
&F153: 095     OUTF               
&F154: 206     NOPT               
&F155: 096 000   ANIM 0             
&F157: 095     OUTF               
&F158: 088     SWP               
&F159: 082     STD               
&F15A: 097 004   ORIM 4             
&F15C: 095     OUTF               
&F15D: 206     NOPT               
&F15E: 096 000   ANIM 0             
&F160: 095     OUTF               
&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


zum Seitenanfang

© 2026: Walter Fischer