Indeks English versionEnglish version

Jak odczytać zawartość karty pamięci za pomocą mikrokomputera Casio PB-2000C

Powiązany odnośnik: "Uruchamianie programów maszynowych na mikrokomputerze Casio PB-2000C"

Wymagany jest PB-2000C z 64kB RAM i interfejsem FA-7 lub MD-100.

A tak przy okazji, poszukuję obrazu pamięci karty ROM OM-54A (język asembler CASL + symulator COMET).

Konfiguracja kalkulatora

Treść wyświetlacza:

<memory>      c    file    work 
   58879   7500   50000    1379
    free          50000    1379
c,file? 7500,50000

Załadowanie programu maszynowego do pamięci

main() {
char* p;
p=(char*)0xC021;
*p++=0x56;*p++=0x60;*p++=0x55;*p++=0xD1;
*p++=0x08;*p++=0xE0;*p++=0x04;*p++=0x77;
*p++=0x74;*p++=0xC0;*p++=0xB4;*p++=0x84;
*p++=0x0D;*p++=0x04;*p++=0xD1;*p++=0x08;
*p++=0x96;*p++=0x40;*p++=0x77;*p++=0x74;
*p++=0xC0;*p++=0xD1;*p++=0x08;*p++=0x1D;
*p++=0x57;*p++=0x71;*p++=0x74;*p++=0xC0;
*p++=0xD1;*p++=0x08;*p++=0x23;*p++=0x40;
*p++=0x77;*p++=0x74;*p++=0xC0;*p++=0xD1;
*p++=0x00;*p++=0x00;*p++=0x80;*p++=0xD1;
*p++=0x08;*p++=0x3E;*p++=0x41;*p++=0x77;
*p++=0x74;*p++=0xC0;*p++=0xD1;*p++=0x08;
*p++=0xE0;*p++=0x04;*p++=0x77;*p++=0x74;
*p++=0xC0;*p++=0xB0;*p++=0x84;*p++=0x56;
*p++=0x60;*p++=0x45;*p++=0xD6;*p++=0x00;
*p++=0x10;*p++=0x0C;*p++=0xD1;*p++=0x00;
*p++=0x30;*p++=0x00;*p++=0xA0;*p++=0x00;
*p++=0x56;*p++=0x60;*p++=0x65;*p++=0xD6;
*p++=0x00;*p++=0x00;*p++=0x00;*p++=0xD6; /*#*/
*p++=0x20;*p++=0xFF;*p++=0x7F;*p++=0x96; /*#*/
*p++=0x59;*p++=0xD8;*p++=0xFE;*p++=0x1E;
*p++=0x66;*p++=0x26;*p++=0x06;*p++=0xD1;
*p++=0x06;*p++=0x75;*p++=0x02;*p++=0xA6;
*p++=0x07;*p++=0x56;*p++=0x60;*p++=0x54;
*p++=0xDE;*p++=0x08;
}

Start kodu maszynowego

>E0CE2
0CE2 AE-76 6F-02 FF-            
 
 

Użycie karty

W rezultacie tych czynności w kalkulatorze powinien pojawić się plik o nazwie "MEMO" zawierający dolne 32kB obrazu pamięci ROM karty + bajt EOF (0x1A). Można go wysłać przez port RS232 za pomocą menu [save].

W celu odczytania górnych 32kB zawartości pamięci ROM karty, potrzebna jest niewielka zmiana programu w języku C i powtórzenie powyższych kroków. Wiersze oznaczone komentarzem /*#*/ należy zastąpić następującymi:

*p++=0x00;*p++=0x00;*p++=0x80;*p++=0xD6; /*#*/
*p++=0x20;*p++=0xFF;*p++=0xFF;*p++=0x96; /*#*/

Zwracam uwagę, że karta jest wkładana do włączonego kalkulatora, przy aktywnej magistrali. Nie jest to niebezpieczne, ale może czasem spowodować zawieszenie kalkulatora (chociaż mnie się to nigdy nie zdarzyło). W takiej sytuacji trzeba zacząć jeszcze raz od początku.

Dodatek: tekst źródłowy programu w asemblerze

        ORG     &HC021
        START   &HC021

        PST     UA,&H55
; czekanie na otwarcie gniazda karty
        LDW     $8,&H04E0
L1:     CAL     SYSCAL
        JR      NZ,L1
; szukanie pliku o nazwie "MEMO"
        NA      $4,$SX
        LDW     $8,&H4096
        CAL     SYSCAL
; skasowanie istniejącego pliku "MEMO"
        LDW     $8,&H571D
        CAL     NC,SYSCAL
; utworzenie nowego sekwencyjnego pliku o nazwie "MEMO"
        LDW     $8,&H4023
        CAL     SYSCAL
; zmiana rozmiaru pliku na &H8000 bajtów
        LDW     $0,&H8000       ;ilość bajtów
        LDW     $8,&H413E       ;powiększenie pliku
        CAL     SYSCAL
; czekanie na zamknięcie gniazda karty
        LDW     $8,&H04E0
L2:     CAL     SYSCAL
        JR      Z,L2
; wybór karty w banku pamięci 2
        PST     UA,&H45
        PRE     IX,&H0C10
        LDW     $0,&H0030
        STW     $0,(IX+$31)
; kopiowanie &H8000 bajtów z karty do pliku
        PST     UA,&H65         ;źródło = bank 2, cel = bank 1
        PRE     IX,0            ;początkowy adres źródłowy
        PRE     IY,&H7FFF       ;końcowy adres źródłowy
        PRE     IZ,$25          ;adres docelowy
        BUP
        OFF

; wywołanie podprogramu o adresie $8,$9 w banku pamięci 0
SYSCAL: GST     UA,$6
        PHS     $6
        LDW     $6,&H0276-1
        PHSW    $7
        PST     UA,&H54
        JP      $8