Indeks English version English version

Elektronika MK-85 - pamięć masowa

Moim zdaniem, najpoważniejszą wadą MK-85 w stosunku do pierwowzoru Casio FX-700P jest brak obsługi jakiejś zewnętrznej pamięci masowej. Przedstawiony projekt wykorzystuje możliwość programowania w języku maszynowym do realizacji zapisu programów BASIC w nieulotnej pamięci szeregowej.

Bardziej zaawansowane rozwiązanie tego problemu przedstawia Fuse na swojej stronie internetowej.

Hardware

Do realizacji projektu wybrana została popularna szeregowa pamięć EEPROM typu 93C86 z magistralą Microwire, podłączona do portu klawiatury. Pamięć EEPROM powinna być wyciągana lub wkładana do podstawki tylko przy wyłączonym kalkulatorze.

Schemat połączeń

schemat połączeń

Software

W pamięci EEPROM zapisywana jest tablica adresów programów BASIC z adresu 822C-823F oraz segment kodu programów począwszy od adresu 826A.

Sposób użycia

  1. Najpierw trzeba zarezerwować 00B0 bajtów pamięci RAM przez wpisanie wartości 8750 do zmiennej systemowej ramtop pod adresem 8252. Jest to równoważne wpisaniu łańcucha input string w odpowiedzi na INPUT.
  2. Następnie trzeba użyć programu ładującego do wpisania kodu programu do zarezerwowanego obszaru pamięci RAM.
  3. Program uruchamia się wpisując łańcuch input string gdy chcemy zapisać programy BASIC, lub input string gdy programy BASIC mają być wczytane. W czasie transmisji nie wolno wciskać żadnych klawiszy. Transmisja trwa kilka sekund, zależnie od wielkości pliku. Po zakończeniu powinien pojawić się na wyświetlaczu napis READY P0.

Wygodnie jest pozostawić program startujący jako P0 i używać tylko P1-P9 dla innych programów w języku BASIC.

Listing programu

; port 100, bit 7 - Data Output
; port 102, bit 1 - Data Input
; port 102, bit 2 - Clock
; port 102, bit 3 - Chip Select

        .radix  16

start:  mov     #E,@#102        ;CE=0, CK=0, DO=0
        mov     #822C,r4        ;adres początkowy RAM
        mov     #C000,r3        ;komenda READ i adres EEPROM
        clr     r5              ;bez opóźnień
        cmpb    @#825A,#4C      ;'L', load
        beq     loop
        mov     #A000,r3        ;komenda WRITE i adres EEPROM
        mov     #20,r5          ;opóźnienie ok. 10ms
        cmpb    @#825A,#53      ;'S', save
        bne     end

; Write Enable
        mov     #9800,r1        ;komenda EWEN
        mov     #E,r2           ;13 (dziesiętnie) impulsów clock
        jsr     pc,xfer
        mov     #E,@#102        ;CE=0, CK=0, DO=0
; transmisja danych
loop:   mov     r3,r1
        add     #8,r3           ;zwiększenie adresu EEPROM
        mov     #E,r2           ;13 (dziesiętnie) impulsów clock
        jsr     pc,xfer
        mov     (r4),r1         ;dana do zapisu, ignorowana przy odczycie
        mov     #11,r2          ;16 (dziesiętnie) impulsów clock
        jsr     pc,xfer
        mov     #E,@#102        ;CE=0, CK=0, DO=0
        mov     r5,r0           ;opóźnienie
        beq     load
        jsr     pc,@#10FC       ;czas zapisu do EEPROM ok. 10ms
        br      next
load:   mov     r1,(r4)         ;odczytana dana
next:   cmpb    (r4)+,(r4)+     ;zwiększenie adresu RAM
        cmp     r4,#8240
        bcs     loop
        bne     next1
        mov     #826A,r4        ;pominięcie obszaru zmiennych systemowych
next1:  cmp     r4,@#823E
        bcs     loop
; Write Disable
end:    mov     #8000,r1        ;komenda EWDS
        mov     #E,r2           ;13 (dziesiętnie) impulsów clock
        jsr     pc,xfer
        mov     #E,@#102        ;CE=0, CK=0, DO=0
; restart systemu
        clr     r0              ;wektor reset
        jmp     (r0)

xfer1:  bic     #4,r0           ;CK=1
        mov     r0,@#102
        mov     @#100,r0
        rolb    r0              ;Carry=/DO
; wysłanie r1 przez DI oraz odczyt z DO do r1
; oczekuje ilości_bitów+1 w r2
xfer:   rol     r1              ;Carry=/DI, bit 0 rejestru r1 = /DO
        mov     #3,r0           ;CE=1, CK=0, DI=0
        sbc     r0              ;CE=1, CK=0, DI=/Carry
        asl     r0
        mov     r0,@#102
        sob     r2,xfer1
        com     r1
        rts     pc

Dane dla programu ładującego

9000 !DF,15,0E,00,02,01,C4,15
9010 !2C,82,C3,15,00,C0,05,0A
9020 !D7,A7,5A,82,4C,00,11,03
9030 !C3,15,00,A0,C5,15,20,00
9040 !D7,A7,5A,82,53,00,28,02
9050 !C1,15,00,98,C2,15,0E,00
9060 !F7,09,68,00,DF,15,0E,00
9070 !02,01,C1,10,C3,65,08,00
9080 !C2,15,0E,00,F7,09,54,00
9090 !01,13,C2,15,11,00,F7,09
9100 !4A,00,DF,15,0E,00,02,01
9110 !40,11,03,03,DF,09,FC,10
9120 !01,01,4C,10,14,A5,17,21
9130 !40,82,E7,87,02,02,C4,15
9140 !6A,82,1F,21,3E,82,E1,87
9150 !C1,15,00,80,C2,15,0E,00
9160 !F7,09,18,00,DF,15,0E,00
9170 !02,01,00,0A,48,00,C0,45
9180 !04,00,1F,10,02,01,C0,17
9190 !00,01,40,8C,41,0C,C0,15
9200 !03,00,80,0B,C0,0C,1F,10
9210 !02,01,8F,7E,41,0A,87,00
9999 END

Programy do konwersji formatów

plik mk85util.zip - rozmiar pliku: 21kB, teksty źródłowe i kody wykonywalne, DOS lub Windows (w okienku DOS)

BAS2MK85

Ten program dokonuje konwersji listy programów BASIC w formacie ASCII na wewnętrzny format danych MK-85.

Sposób użycia: bas2mk85.com program1.bas [program2.bas program3.bas ...]

MK852BAS

Ten program dokonuje przeciwnej operacji, tzn. wyświetla zawartość pamięci EEPROM.

Sposób użycia: mk852bas.com infile.bin