Tajemnice ATARI

Joy Transmission


    Kiedy używa się dwu różnych komputerów jednocześnie, np. ATARI i Commodore, często zachodzi potrzeba przesyłania danych pomiędzy nimi. Istnieje kilka sposobów rozwiązania tego problemu. Można próbować odczytać dyskietkę w formacie Commodore na stacji ATARI (lub odwrotnie), można próbować odczytać na magnetofonie Commodore program nagrany w formacie turbo ATARI. Ale po co? Projektanci obydwu komputerów wyposażyli je w kilka złącz, które mogą wysyłać i odbierać dane. Należą do nich:

    A) w Commodore:

  • User Port (RS-232 i inne)
  • Serial Bus (stacja(e) dysków, drukarka)
  • Extenslon Port (cartridge, RAM(ROM)disk)
  • Cassette (magnetofon)
  • Control Ports (joystick, paddle, pióro świetlne, inne)
    B) w ATARI:

  • Peripheral (stacja dysków, magnetofon i inne)
  • Parallel Bus (dysk twardy, inne)
  • Cartridge
  • Controllers joystick, paddle, pióro świetlne, inne)
    W obu komputerach jednakowym złączem jest controller. Te złącza postanowiliśmy wykorzystać. Porty joysticków są ze sobą w pełni zgodne. Obydwa komputery oferują możliwość pełnego programowania tych złącz, tzn. każdy z ośmiu bitów portu można ustawić jako wejściowy (0) lub wyjściowy (1). Nie nastręcza też żadnych kłopotów wykonanie odpowiedniego kabla połączeniowego. Wystarczy do tego zestaw następujących części:

  • 4 wtyczki typu Eltra 9pin
  • dwa kable sześcio-żyłowe.
    Poniżej przedstawiamy schemat połączeń:



    Dla zainteresowanych przedstawiamy procedury obsługi powyższego połączenia, napisane w języku maszynowym dla obu komputerów. Program źródłowy na Commodore został napisany przy użyciu programu Turbo Assembler 5.1, natomiast na ATARI programem Quick Assembler 1.0.

Procedury dla Atari:

*-- SYSTEM --

trig0  equ $d010
porta  equ $d300
pactl  equ $d302

*-- PROGRAM --

* odbieranie

       sei
       ldx #$00000001
       jsr SetPort

       lda #0           ; w tym miejscu pętla
       sta porta        ; GetSgn skończy swe działanie

* procedura odbioru bajtu

       lda porta        ; ta pętla przestanie
Synch  cmp porta        ; działać, gdy wartość na
       beq Synch        ; porcie ulegnie zmianie 
                        ; (inc ciaprb)
       lda #1           ; daj znak gotowości
       sta porta

       ldx #50          ; odczekaj, żeby C64
       dex              ; odebrał ten znak
       bne *-1

       lda porta        ; wartość z portu
       and #%11111110   ; dodaj do wartości
       ora trig0        ; odczytanej z FIRE

       stx porta        ; nie pozwól, aby C64 przesłał
                        ; kolejny bajt bez twojej zgody

       jmp ResPort

* nadawanie

       sei
       ldx #%11111111   ; cały port na
       jsr SetPort      ; wyjście

* procedura nadawania bajtu

       inc porta

Synchr ldx trig0        ; czekaj na znak gotowości
       bne Synchr       ; od Commodore

       sta porta        ; zapisz do portu wysyłaną wartość

       ldx #0           ; odczekaj moment,        
       inx              ; w którym C64 odbiera
       bne *-1          ; daną

ResPort equ *           ; ustaw port

       lda pactl
       and #%11111011
       sta pactl
       stx porta
       ora #%00000100
       sta pactl

       cli
       rts

Procedury dla Commodore:

;*---- Zero Page

byte   = $02            ;komórka pomocnicza

;*---- Registers

ciapra = $dc00          ;Rejestr Portu A
ciaprb = $dc01          ;Rejestr Portu B
ciddra = $dc02          ;Rejestr kierunku danych Portu A
ciddrb = $dc03          ;Rejestr kierunku danych Portu B

;*---- Program

;   WYSYŁANIE

       sei
       lda #%00011110   ;0 - wejście
       sta ciddra
       lda #%00011111   ;1 - wyjście
       sta ciddrb

GetSgn lda ciapra       ;Dopóty bit0 zapalony
       lsr a            ;dopóki Atari niegotowe
       bcs GetSgn       ;do odbioru transmisji

;Powyższa pętla wykonana jest tylko raz
;na samym początku programu.

;!!! Commodore zawsze zaczyna pierwszy !!!

;Tu umieszczona jest procedura wysyłania bajtu.

       tax              ;zachowaj akumulator 

       inc ciaprb       ;daj znak, że zostanie
                        ;przesłany kolejny bajt

synch  lda ciapra       ;sprawdź, czy Atari
       lsr a            ;odebrało tę informację
       bcc synch        ;C=0 -> jeszcze nie

       txa              ;umieść starszy nybble
       lsr a            ;w porcie B
       lsr a 
       lsr a
       lsr a
       sta ciaprb

       txa              ;przenieś bit0 bajtu 
       and #$0f         ;do bitu4 (FIRE)
       lsr a        
       bcc bit0         ;Tak spreparowany 
                        ;młodszy nybble
       ora #%00001000   ;umieść w porcie A
                        ;(dla wygody Atari)
bit0   asl a
       sta ciapra
   
       ldx #0           ;daj czas Atari na
       inx              ;odebranie bajtu
       bpl *-1

       lda #%00000000   ;zainacjalizuj
       sta ciddrb       ;porty na standar-
       lda #%11111111   ;dowe wartości;
       sta ciddra       ;Port A wejściowy 
       cli              ;Port B wyjściowy.
       rts

;  ODBIERANIE

       sei
       lda #%00010000
       sta ciddra 
       sta ciapra
       lda #%00000000
       sta ciddrb

;Tu umieszczona jest procedura odbierania bajtu.

       lda ciapra       ;Jeśli na Porcie A zaszła 
getbyt cmp ciapra       ;zmiana, to Atari chce
       beq getbyt       ;przesłać kolejny bajt

       lda #%00000000   ;daj znak, żeś gotowy;
       sta ciapra       ;trig0 w Atari zeruje się

       ldx #50          ;poczekaj, aż Atari
       dex              ;odbierze ten znak
       bne *-1

       lda #%00010000   ;pewnie odebrało,
       sta ciapra       ;to skasuj go teraz

       lda ciaprb       ;w Porcie B
       asl a            ;starszy nybble
       asl a
       asl a
       asl a
       sta byte

       lda ciapra       ;w Porcie A
       and #$0f         ;młodszy nybble
       ora byte

       lda #%llllllll   ;Przywróć standardową
       sta ciddra       ;wartość Portu A
       cli

       rts
    Zamieszczamy także program Joy Transmission, wykorzystujący wyżej przedstawione procedury.

    Po uruchomieniu programu na ATARI zgłosi się menu: W - wczytaj, N - nadaj, Z - zapisz, O - odbierz, D - numer dysku, I - informacje, K - katalog D1:, ESC - do widzenia i napis: B=94b3 L=0000

    Dla programu uruchamianego na Commodore wystąpią drobne różnice w wyglądzie menu. Zamiast opcji D pojawi się U - urządzenie, czyli:

  • 1 - magnetofon w systemie NORMAL
  • 7 - magnetofon w systemie TURBO (jeśli użytkownik posiada cartridge z turbo)
  • 8, 9 - stacja dyskietek o podanym numerze
    Jeśli wystąpią jakiekolwiek problemy podczas transmisji danych, to można ją przerwać klawiszem RESET (dla Commodore - RESTORE), co spowoduje ponowne uruchomienie programu.

    Podczas uruchamiania transmisji zawsze zaczyna Commodore, co jest sygnalizowane przez program.

    W menu podane są także dwa parametry:

  • B - wielkość bufora
  • L - długość pliku znajdującego się w buforze
    Dla ATARI parametr B jest zmienny i zależy od używanego DOS-a, dla DOS-a 2.5 z nakładką CP.SYS wynosi ona 9424. Dla Commodore wielkość B jest stała i wynosi C233. Wynika z tego, że długość bufora dla Commodore jest większa niż dla ATARI. Należy zatem uważać przy transmisji w kierunku Commodore -> ATARI na to, by długość programu (drugi parametr) była mniejsza, bądź równa wielkości bufora ATARI. W przeciwnym przypadku mogą wystąpić kolizje pamięci, co jest równoznaczne z zawieszeniem się ATARI.

    Na ATARI kod wynikowy zgrywa się programem Zgrywus+. Dla Commodore trzeba wykonać następujące czynności:

  • 1. wykonać reset komputera, np. za pomocą komendy SYS 64738;
  • 2. wykonać ciąg instrukcji: POKE 43,1:POKE 44,32:POKE 8192,0:NEW
  • 3. wpisać zamieszczony program;
  • 4. uruchomić program komendą RUN;
  • 5. wykonać ciąg instrukcji: POKE 43,1:POKE 44,8:POKE 45,205:POKE 46,12 SAVE "JOYTRANS.OBJ",8,1
    Zgrany w ten sposób program wczytujemy komendą LOAD "JOYTRANS.OBJ",8 i uruchamiamy komendą RUN.

    Na koniec kilka uwag praktycznych:

  • Przed połączeniem należy obydwa komputery wyłączyć.
  • Najpierw należy włączyć ATARI, a później Commodore.
  • Port 1 Commodore łączymy z portem 2 Atari, port 2 Commodore łączymy z portem 1 Atari.
  • Połączenie i program są odporne na wszelkie zakłócenia, np. CB radio, odkurzacz przemysłowy, migoczącą świetlówkę, poskręcane przewody, bliskość monitora, spadki napięcia w sieci do 190V.
  • Prędkość transmisji osiąga ok. 16 Kbodów.

1000 REM *--------------------------*
1002 REM : ATARI<>C64 Transfer A    :
1004 REM :  autor:                  :
1006 REM : (c) 1993 Tajemnice ATARI :
1008 REM *--------------------------*
1010 DATA ffff00b7f0bba90c8d4203a200
1020 DATA 2056e4a9038d4203a9548d4403
1030 DATA a9ba8d4503a90c8d4a03a20020
1040 DATA 56e4a201b50c9d35b7bd48ba95
1050 DATA 0cca10f330032034b7a20020c5
1060 DATA b978ca9a58a900388de502ede7
1070 DATA 028582a9b78de602ede802aaca
1080 DATA 8683a9048552a922855320a0b8
1090 DATA 201fbaa03e2021ba200fbaa208
1100 DATA dd2dbaf005ca10f830f18688a8
1110 DATA 2083f9a2008e48038e4903b951
1120 DATA fba82021ba201fbaa5880aaabd
1130 DATA 37ba48bd36ba4860a201bd35b7
1140 DATA 950cca10f86c0a0020e2b8a904
1150 DATA 2057b8306da210a5829d4803a5
1160 DATA 839d4903a9072073b8a210bd48
1170 DATA 038d4ababd49038d4bba4c22b8
1180 DATA 20e2b8a9082057b83041a210ad
1190 DATA 4aba9d4803ad4bba9d4903a90b
1200 DATA 2073b84c22b8a210a94d9d4403
1210 DATA a9ba9d4503a9062065b83018a2
1220 DATA 10a9009d48039d4903a907206a
1230 DATA b83007a82021ba4c0ab8a908a2
1240 DATA 1fa0bb20f7b9a58b203db8a210
1250 DATA a90c9d42032056e44c62b74829
1260 DATA f04a4a4a4a204ab868290f1869
1270 DATA 30c93a90026906a84c21ba48a2
1280 DATA 10a9f19d4403a9bb9d4503689d
1290 DATA 4a03a9039d42032056e4848b60
1300 DATA 48ade7029d4403ade8029d4503
1310 DATA 684c6ab8ae4ebae8e0399002a2
1320 DATA 318e4eba4c5fb7a9b0a241a0bb
1330 DATA 20f7b94c62b7a9bba257a0ba20
1340 DATA f7b9a0b038ad4ebae9209158a5
1350 DATA 82a683a0d220c4b8ad4abaae4b
1360 DATA baa0d920c8b88a48290f20d3b8
1370 DATA 684a4a4a4a186910c91a900269
1380 DATA 06098091588860a90da212a0bb
1390 DATA 20f7b9a2f1a0bb8e44038c4503
1400 DATA a9008d4803a9108d4903a9058d
1410 DATA 4203a2004c56e4ade7028586ad
1420 DATA e8028587205fb978a2ff20c5b9
1430 DATA a001b94aba204bb98810f7ae4b
1440 DATA bae88689a000b186204bb9c8d0
1450 DATA f8e687c689d0f2a9ff8d00d3a2
1460 DATA 0020c5b9584c62b7ee00d3ae10
1470 DATA d0d0fb8d00d38d1ad0a200e810
1480 DATA fd60a91aa227a0bb20f7b94c0f
1490 DATA baade7028586ade8028587205f
1500 DATA b978a20120c5b9a9008d00d3a0
1510 DATA 0220d6b99949ba88d0f7a482cc
1520 DATA 4abaa6838aed4bbab0068e4bba
1530 DATA 8c4abaae4bbae88689a00020d6
1540 DATA b99186c8d0f8e687c689d0f2a9
1550 DATA 008d00d3a20020c5b9584c62b7
1560 DATA ad02d329fb8d02d38e00d30904
1570 DATA 8d02d360ad00d3cd00d3f0fba9
1580 DATA 018d00d3a232cad0fdad00d329
1590 DATA fe0d10d08e00d38d1ad0608481
1600 DATA 8680858aa0008489b180a82021
1610 DATA baa489c8c48a90f160a0ff8cfc
1620 DATA 02adfc02c9fff0f98cfc0260a0
1630 DATA 9ba200bd470348bd4603489860
1640 DATA 1c2e170508230d3a0c9db7aab7
1650 DATA d6b7f6b76ab908b993b883b85e
1660 DATA b734b700000044313a2a2e2a9b
1670 DATA 453a9b7dc1f4e1f2e9adc3efed
1680 DATA edefe4eff2e5a0caeff9a0d4f2
1690 DATA e1eef3ede9f4e9efee19572e77
1700 DATA 637a7974616a20706c696b204f
1710 DATA 2e6f64626965727a2064616e65
1720 DATA 99195a2e7a617069737a20706c
1730 DATA 696b20204e2e6e6164616a2064
1740 DATA 616e6520209919442e6e756d65
1750 DATA 72206479736b752020492e696e
1760 DATA 666f726d61636a65202099194b
1770 DATA 2e6b6174616c6f672044203a20
1780 DATA 204553432e646f7769647a656e
1790 DATA 696199a0e2bda0a0a0a0a0e4bd
1800 DATA a0a0a0a0a0a8c3a9b1b9b9b3a0
1810 DATA c3a6c3a0f3efe6f46e617a7761
1820 DATA 20706c696b753a9b9b73746174
1830 DATA 75733a43363420706965727773
1840 DATA 7a799b52455455524e2d737461
1850 DATA 72749b4175746f727a793a9b4b
1860 DATA 727a79737a746f662043687564
1870 DATA 7a696e736b6920284174617269
1880 DATA 299b4a616e75737a2044616272
1890 DATA 6f77736b692028436f6d6d6f64
1900 DATA 6f7265299b9b50726f64756365
1910 DATA 6e742069206479737472796275
1920 DATA 746f723a9b43264320736f6674
1930 DATA 9b55736c756769204b6f6d7075
1940 DATA 7465726f77659b756c2e506f7a
1950 DATA 6e616e736b612032619b33352d
1960 DATA 30383220527a65737a6f779b74
1970 DATA 656c2e2028302d313729343234
1980 DATA 2d303020772e3330399be002e1
1990 DATA 0200b7

0 REM JOYTRANSMITION BY JD
1 SUM=0 :OBJ=2049
2 DEF FN W(D)=(48-D)*(D<58)+(55-D)*(D>64)
3 FOR L=100 TO 181 :PRINT L;CHR$(145) :READ D$
4 FOR D=l TO LEN(D$) STEP 2 :B$=MID$(D$,D,2)
5 B=16*FN W(ASC(MID$(B$,1,1)))
6 B=B+FN W(ASC(MID$(B$,2,1)))
7 POKE OBJ,B :OBJ=OBJ+1 :SUM=SUM+B :NEXT D,L
8 IF SUM=131922 THEN END
9 PRINT "POPRAW DANE !" :STOP
100 DATA 0B08C9079E32303631000000A201BD
101 DATA 18039DCE0BBDCC0B9D1803CA10F120
102 DATA 2A0A2C01DC30036C1603789AA91B8D
103 DATA 11D058A9802090FFA0008C20D08C21
104 DATA D0A233A9C2A02620C809ADCA0CA000
105 DATA 20D509AECB0CADCC0CA02D20C809A9
106 DATA E6A00A201EAB20E4FFC90DF0DFA208
107 DATA DDB30BF005CA10F830ED20D2FF2083
108 DATA 08A9ABA00B201EABF0DE8A0AAABDBC
109 DATA 0B48BDBB0B4860209F09A000A901AE
110 DATA CA0C20BAFFA2CDA00CA90020D5FF90
111 DATA 0DA5BAC908900320E608A200A0CF38
112 DATA 8AE9CD8DCB0C98E90C8DCC0C60209F
113 DATA 09A00198AECA0C20BAFF18A9CD85AC
114 DATA 6DCB0CAAA90C85AD6DCC0CA8A9AC20
115 DATA D8FF90DB249030D7A5BA20B4FFA96F
116 DATA 2096FFA90D20D2FF20A5FFC90DD0F6
117 DATA 20ABFFA5BA20B1FFA96F2093FFA955
118 DATA 20A8FFA94920A8FF4CAEFFA901A2CB
119 DATA A00B20BDFFAECA0CE0089097A901A0
120 DATA 6020BAFF20C0FF2490301BA5BA20B4
121 DATA FFA5B92096FFA20420A5FFCAD0FAA9
122 DATA 0D20D2FF24905005A5B84CC3FF20A5
123 DATA FFAA20A5FF20CDBDE6D320A5FF20D2
124 DATA FFD0F8A202A5CBC93FF0DFB0CEC5CB
125 DATA F0FCD0C8A9D0A00B201EAB20E4FFC9
126 DATA 0DF014C931F008C93790F1C93AB0ED
127 DATA 20D2FF290F8DCA0C60A9A7A00C201E
128 DATA ABA00C84D3A2FFE820CFFF9DB40CE0
129 DATA 15B004C90DD0F1A9009DB40C8AA2B4
130 DATA A00C4CBDFF20CC098A484A4A4A4A20
131 DATA D50968290FC90A9002692669309968
132 DATA 0BC860A9E2A00B201EAB78A91E8D02
133 DATA DCA90F8D03DCA9CD85FBA90C85FCA9
134 DATA 368501AD00DC4AB0FAA002B9CA0C20
135 DATA 390A88D0F7AECC0CE886FDB1FB2039
136 DATA 0AC8D0F8E6FCC6FDD0F28C20D0A200
137 DATA 8E03DCCA8E02DCA93785015860AAEE
138 DATA 01DC8D20D0AD00DC4A90FA8A4A4A4A
139 DATA 4A8D01DC8A290F4A900209080A8D00
140 DATA DCA200E810FD60A9E2A00B201EAB78
141 DATA A9108D02DC8D00DCA9008D03DCA9CD
142 DATA 85FBA90C85FCA00220A60A99CA0C88
143 DATA D0F7AECC0CE886FD20A60A91FBC8D0
144 DATA F8E6FCC6FDD0F28C20D0A9FF8D02DC
145 DATA 5860AD00DCCD00DCF0FBA9008D00DC
146 DATA A232CAD0FDA9108D00DCAD01DC0A0A
147 DATA 0A0A8502AD00DC290F05028D20D060
148 DATA A9F6A00B4C1EABA201BDCE0B9D1803
149 DATA CA10F76C02A09A080E9312C34F4D4D
150 DATA 4F444F52452DC15441524920CA4F59
151 DATA 20D452414E534D4954494F4E8DB5D7
152 DATA 2E57435A5954414A20504C494B20DA
153 DATA 2E5A415049535A20504C494B20B68D
154 DATA B5CF2E4F44424945525A2044414E45
155 DATA 20CE2E4E4144414A2044414E452020
156 DATA B68DB5CB2E4B4154414C4F47202020
157 DATA 202020D52E55525A41445A454E4945
158 DATA 2338B68DB5C92E494E464F524D4143
159 DATA 4A412020205F2E444F5749445A454E
160 DATA 49412020B68D12423DA4A4A4A42044
161 DATA 3DA4A4A4A4202028C3293139393320
162 DATA C326C320534F46548D8D3E1220929D
163 DATA 00575A4B554E4F495F8E08C1081909
164 DATA 7B09E3095F0AD00AD70A241E080000
165 DATA 8DCE554D45522028312C372D392912
166 DATA 209D008DC35A454B414D204E4120C1
167 DATA 544152492E2E2E008DC155544F525A
168 DATA 593A8DCB525A59535A544F4620C348
169 DATA 55445A494E534B492028C154415249
170 DATA 298DCA414E55535A20C44142524F57
171 DATA 534B492028C34F4D4D4F444F524529
172 DATA 8D8DD0524F445543454E5420492044
173 DATA 59535452594255544F523A8DC326C3
174 DATA 20534F46548DD5534C55474920CB4F
175 DATA 4D50555445524F57458D554C2ED04F
176 DATA 5A4E414E534B412032418D33352D30
177 DATA 383220D25A45535A4F578D54454C2E
178 DATA 2028302D3137293432342D30302057
179 DATA 2E333039008DCE415A574120504C49
180 DATA 4B553A000000000000000000000000
181 DATA 00000000000000000000080000


Janusz Dąbrowski
Krzysztof Chudziński
"C&C soft"



Powrót na start | Powrót do spisu treści | Powrót na stronę główną

Pixel 2002