Indeks English versionEnglish version

Projekt konstrukcyjny - prosty interfejs szeregowy dla Casio FX-8000G

Przedstawione urządzenie umożliwia transfer danych pomiędzy kalkulatorem FX-8000G i komputerem PC za pomocą portu szeregowego. Nie jest kompatybilne z oryginalną przystawką FA-80.

Ustawienia portu szeregowego

Hardware

Schemat interfejsu dla portu RS232. Może tylko przesyłać dane do kalkulatora.

schemat interfejsu RS232

Schemat interfejsu dla poziomów logicznych 5V. W celu podłączenia do portu RS232 lub USB wymagany jest dodatkowy konwerter zbudowany np. na układzie MAX232 (RS232) lub FT232R (USB).

schemat interfejsu dla poziomów logicznych 5V

Software

Programy przesyłające dane napisane zostały w języku asembler. Metoda wpisywania i uruchamiania programów maszynowych na kalkulatorze FX-8000G opisana jest na osobnej stronie.

Ładowanie danych do FX-8000G

Program odczytuje dane z portu szeregowego do pamięci edytora plików. Transmisja zostaje zakończona wciśnięciem klawisza DEL lub gdy wystąpił błąd.

Kod binarny

  2→S
  Hex
  60B78A40:Prog 0
  C00041C7:Prog 0
  7C600F99:Prog 0
  4802C300:Prog 0
  C0847114:Prog 0
  49F9822C:Prog 0
  82087C5A:Prog 0
  FA41081A:Prog 0
  0BF10174:Prog 0
  5B085EF1:Prog 0
  0FF9820C:Prog 0
  82082B82:Prog 0
  01FE00FA:Prog 0
  FA03F101:Prog 0
  745B088C:Prog 0
  000BF101:Prog 0
  745B25F9:Prog 0
  822C8208:Prog 0
  7C5AFA70:Prog 0
  B1880000:Prog 0

Tekst źródłowy

Fragmenty kodu, które zawierają w komentarzu liczbę taktów, muszą być wykonane w ściśle określonym czasie. Nie powinny być one modyfikowane w sposób, który by wpływał na czas wykonania.

        ORG     &H5AE8

BEGIN:  CAL     &HB78A          ;"LOAD executing"
        LDW     IX,&HC000
        LDW     IY,&HC77C
        CAL     &H0F99          ;zapełnienie pamięci RAM od adresu IX do IY wartością &HFF
        ADW     IX,2            ;IX = &HC77D
        PST     IE,&H00         ;zablokowanie przerwań
        PST     KO,&H84         ;wybrane wyjście portu klawiatury KO9
; czekanie na bit startu
LOOP1:  JMP     K,&H1449        ;10 taktów, "Break" gdy wciśnięty klawisz DEL
; powinno zająć ok. 1.5*379 taktów od tego miejsca do BIT1
        GST     R2,IF           ;8 taktów
        TAN     R2,&H08         ;10 taktów
        JMP     Z,LOOP1         ;10 taktów
; został wykryty bit startu
        LDW     IY,&H081A       ;10 taktów, R121 = licznik bitów, R57 = opóźnienie
; pętla odbierająca bity, powinna zająć 379 taktów stąd do STORE
LOOP2:
DEL2:   SB      R57,1           ;10 taktów
        JMP     NZ,DEL2         ;10 taktów
        LD      R57,15          ;10 taktów, opóźnienie
; powinno zająć 379 taktów od tego miejsca do STOP1
BIT1:   GST     R2,IF           ;8 taktów
        AN      R2,&H08         ;10 taktów
        TSB     R2,1            ;10 taktów, odbierany bit bit -> Carry
        ROD     R0              ;8 taktów, R0 = odbierany bajt
        NOP                     ;6 taktów
        NOP                     ;6 taktów
; następny bit
        SB      R121,1          ;10 taktów
        JMP     NZ,LOOP2        ;10 taktów
; zapis odebranego bajtu do pamieci
STORE:  ST      -(IX),R0        ;16 taktów
DEL3:   SB      R57,1           ;10 taktów
        JMP     NZ,DEL3         ;10 taktów
; sprawdzenie obecności bitu stopu
STOP1:  GST     R2,IF
        TAN     R2,&H08
        JMP     Z,LOOP1         ;następny bajt, gdy nie wystąpił błąd ramki
        JMP     &HB188          ;"I/O error"

Zapis danych z FX-8000G

Program wysyła przez port szeregowy zawartość pamięci RAM. Transmisja może zostać przerwana klawiszem DEL.

Kod binarny

  2→S
  Hex
  60B77B40:Prog 0
  C000C300:Prog 0
  C0847114:Prog 0
  495E8203:Prog 0
  A801FC81:Prog 0
  405F8B90:Prog 0
  0B830174:Prog 0
  5B00FE02:Prog 0
  FE01775B:Prog 0
  12C10070:Prog 0
  5AFDC101:Prog 0
  745AFD23:Prog 0
  F0E0775A:Prog 0
  F2701449:Prog 0

Tekst źródłowy

        ORG     &H5AE8

BEGIN:  CAL     &HB77B          ;"SAVE executing"
        LDW     IX,&HC000
        PST     IE,&H00         ;zablokowanie przerwań
        PST     KO,&H84         ;wybrane wyjście portu klawiatury KO9
; pętla wysyłająca bajty
LOOP1:  JMP     K,&H1449        ;"Break" gdy wciśnięty klawisz DEL
        LD      R2,&H03         ;2 bity stopu
        LD      R1,(IX)+
        BIUM    R1..R2          ;bit startu
; pętla wysyłająca bity, powinna zająć 379 taktów (=910000kHz/2400baud)
LOOP2:  LDM     R3..R4,16       ;14 taktów, zapis do R4 tylko dla nabicia taktów
DEL:    SB      R3,1            ;10 taktów
        JMP     NZ,DEL          ;10 taktów
; w tym momencie bit Carry jest skasowany
        ROD     R2              ;8 taktów
        ROD     R1              ;8 taktów, wysyłany bit -> Carry
        JMP     C,ONE           ;10 taktów
        PST     IF,&H00         ;8 taktów
        JMP     LOOP2           ;10 taktów, następny bit
ONE:    PST     IF,&H01
        JMP     NZ,LOOP2        ;następny bit
; następny bajt
        TSB     R120,&HE0       ;koniec pamięci RAM?
        JMP     C,LOOP1         ;następny bajt jeżeli nie
        JMP     &H1449          ;"Break"