Joy TransmissionKiedy 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:
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 rtsZamieszczamy 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:
Podczas uruchamiania transmisji zawsze zaczyna Commodore, co jest sygnalizowane przez program. W menu podane są także dwa parametry:
Na ATARI kod wynikowy zgrywa się programem Zgrywus+. Dla Commodore trzeba wykonać następujące czynności:
Na koniec kilka uwag praktycznych:
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" |