Indeks English versionEnglish version

Projekt konstrukcyjny - prosty interfejs RS232 dla Casio PB-1000

Opisane urządzenie umożliwia wymianę plików pomiędzy kalkulatorem PB-1000 i komputerem PC za pomocą portu szeregowego. Nie jest zgodne z oryginalnym interfejsem FA-7/MD-100, za to jest znacznie mniejsze i nie wymaga osobnego zasilania. Wersja zgodna z FA-7/MD-100 jest przedstawiona tutaj.

Ustawienia portu szeregowego

Hardware

schemat interfejsu RS232

płytka drukowana interfejsu RS232, widok od strony elementów płytka drukowana interfejsu RS232, widok od strony połączeń

Software

Programy sterujące zostały napisane z użyciem tylko oficjalnej listy rozkazów, tak żeby były akceptowane przez wbudowany asembler. Można je również skompilować za pomocą asemblera HD61 z opcją LEVEL 0.

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 (np. przez zastąpienie instrukcji JP przez optymalniejszą JR).

plikpb1000s6.zip - oba poniższe programy pozbawione komentarzy i nadmiernych spacji

Program RSWRITE

Program wysyła przez port szeregowy zawartość pliku o stałej nazwie "MEMO". Transmisja może zostać przerwana klawiszem BRK.

        ORG     &H7000
        START   &H7000

        PST     PD,&HC4
        PST     PE,&HC0
        CAL     &HB6EE      ;kopiuj nazwę pliku "MEMO" do WORK1
        CAL     &HE80F      ;znajdź plik dowolnego typu o nazwie w WORK1
        JP      C,&HABE0    ;NF Error, plik nie został znaleziony
        PRE     IZ,$6       ;wskaźnik do wpisu katalogu
        DB      233,36,96   ;= LDM $4,(IZ+$30),4
; $4,$5 = wskaźnik początku danych, $6,$7 = wskaźnik końca danych
LOOP1:  SBCW    $6,$4
        RTN     Z           ;powrót gdy osiągnięty koniec pliku
        LD      $0,$30      ;kolumna klawiatury KO1
        CAL     &H0625      ;wysłanie $0 na KO, odczyt wiersza KI do $1,$2
        BIU     $1          ;KI12 -> Carry
        RTN     C           ;powrót, gdy wcisnięty klawisz BRK
        LD      $1,($4)     ;$1 <- bajt do wysłania
        ADW     $4,$30      ;zwiększenie wskaźnika danych
        CAL     RSWRT       ;wysłanie bajtu
        JR      LOOP1

; procedura wysyła bajt $1 przez port PD3
RSWRT:  LD      $2,&HFB     ;2 bity stopu
        BIUW    $1          ;bit startu
        INVW    $1
        GST     IE,$0
        PST     IE,$31      ;zablokowanie przerwań
; pętla wysyłająca bity, powinna zająć 379 taktów (=910000kHz/2400baud)
RSWR1:  LD      $3,&H0C     ;12 taktów
        BIDW    $2          ;14 taktów, wysyłany bit -> Carry
        ROU     $3          ;9 taktów
        BIU     $3          ;9 taktów
        BIU     $3          ;9 taktów
        BIU     $3          ;9 taktów
        PST     PE,$3       ;9 taktów
; opóźnienie
        LD      $3,11       ;12 taktów
RSWR2:  SB      $3,1        ;12 taktów
        JP      NZ,RSWR2    ;12 taktów
        NOP                 ;6 taktów
; następny bit, $1,$2=&H0001 gdy wysłane wszystkie 11 bitów ramki
        SBCW    $30,$1      ;17 taktów
        JR      NZ,RSWR1    ;9 taktów
        PST     IE,$0       ;przywrócenie stanu przerwań
        RTN

Program RSREAD

Program odczytuje dane z portu szeregowego do pliku tekstowego o stałej nazwie "MEMO". Transmisja zostaje zakończona po odebraniu znaku EOF o kodzie &H1A, lub gdy została przerwana klawiszem BRK, lub gdy wystąpił błąd.

Pliki binarne można przesyłać jako tekst (jako listę argumentów instrukcji DATA w programie BASIC lub w szesnastkowym formacie PBF), a następnie przekonwertować na docelowy format. Odpowiednie programy konwertujące TRANS oraz PBFTOBIN są dołączone do asemblera HD61.

        ORG     &H7000
        START   &H7000

        PST     PE,&HC0
        CAL     &HB6EE      ;kopiuj nazwę pliku "MEMO" do WORK1
        CAL     &HE80F      ;znajdź plik dowolnego typu o nazwie w WORK1
        CAL     NC,&HE842   ;KILL, skasuj istniejący plik
        CAL     &HB1C2      ;NDFMK, utwórz nowy plik tekstowy
        PRE     IZ,&H6945
        DB      233,2,96    ;= LDM $2,(IZ+$31),4 ;$2<-MEMEN, $4<-DATDI
        GST     IE,$1
        PST     IE,$31      ;zablokowanie przerwań
        PST     IA,$30      ;wybierz kolumnę klawiatury KO1
; czekanie na bit startu
LOOP1:  GRE     KY,$8
        BIU     $8          ;KI12 -> Carry
        JR      C,EXIT      ;powrót, gdy wcisnięty klawisz BRK
; powinno zająć ok. 1.5*379 taktów od tego miejsca do BIT1
        GPO     $8          ;9 taktów
        ANC     $8,&H10     ;12 taktów
        JR      NZ,LOOP1    ;9 taktów
; został wykryty bit startu
        LDW     $8,&H0818   ;23 takty, $9 = licznik bitów, $8 = opóźnienie
        JR      DEL2        ;9 taktów
; pętla odbierająca bity, powinna zająć 379 taktów stąd do STORE
LOOP2:  LD      $8,14       ;12 taktów, opóźnienie
DEL2:   SB      $8,1        ;12 taktów
        JR      NZ,DEL2     ;9 taktów
        NOP                 ;6 taktów
; powinno zająć 379 taktów od tego miejsca do STOP1
BIT1:   GPO     $8          ;9 taktów
        AN      $8,&H10     ;12 taktów
        SBC     $30,$8      ;12 taktów, odebrany bit -> Carry
        ROD     $6          ;9 taktów, $6 = odebrany bajt
; następny bit
        SB      $9,1        ;12 taktów
        JP      NZ,LOOP2    ;12 taktów
; zapis odebranego bajtu do pamieci
STORE:  SBC     $6,&H1A     ;12 taktów
        JR      Z,EXIT      ;9 taktów, koniec gdy odebrano EOF
        SBCW    $2,$4       ;17 taktów
        JR      NC,OMERR    ;9 taktów, brak pamięci
        PRE     IX,$2       ;14 taktów
        LD      $7,&H1A     ;12 taktów, znak EOF
        STW     $6,(IX-$30) ;20 taktów, zapis odebranego znaku + EOF
        ADW     $2,$30      ;17 taktów, zwiększenie wskaźnika danych
        STW     $2,(IZ+$31) ;20 taktów, MEMEN
        PRE     IX,$4       ;14 taktów, DATDI
        LD      $0,3        ;12 taktów
        STW     $2,(IX+$0)  ;20 taktów, adres końcowy pliku
        LD      $8,6        ;12 taktów, opóźnienie
DEL3:   SB      $8,1        ;12 taktów
        JR      NZ,DEL3     ;9 taktów
; sprawdzenie obecności bitu stopu
STOP1:  GPO     $8
        AN      $8,&H10
        JR      NZ,LOOP1
FRERR:  PST     IE,$1       ;przywrócenie stanu przerwań
        JP      &HAC30      ;FR error (błąd ramki)
OMERR:  PST     IE,$1       ;przywrócenie stanu przerwań
        JP      &HABBD      ;OM error (brak pamięci)
EXIT:   PST     IE,$1       ;przywrócenie stanu przerwań
        RTN

Link do podobnego projektu wykorzystującego układ scalony interfejsu RS232 lub USB zamiast pojedynczych elementów. Załączone oprogramowanie potrafi przesyłać dane z prędkością 9600 bps. Uwaga: autor wybrał inne bity portu PB-1000.