Aktualności: C64 Power - online od stycznia 2000 !

Autor Wątek: Pisz w assemblerze lepiej nisz Budyń (znajomość assemblera niewymagana)!  (Przeczytany 2270 razy)

0 użytkowników i 10 Gości przegląda ten wątek.

Offline qus

  • Level 3
  • ***
  • Wiadomości: 201
Mam dla Was coś ekstra!

Po co pisać w BASICu, V2 w dodatku, skoro możecie od razu pisać w assemblerze?

No, prawie...

Jeśli macie kawałek Linucha albo przynajmniej Cygwin/MinGW, to zapraszam do zbudowania sobie fantastycznego języka programowania dla ośmiobitowych zabytków.

Język nazywa się Atalan (ATAri LANguage  ;D) i przy umiejętnym pisaniu wypluwa kod assemblerowy zoptymalizowany tak dobrze, jakbyście pisali bezpośrednio w języku maszynowym.

Pełną specyfikację znajdziecie tu:

http://atalan.kutululu.org/

A dające się zbudować źródła - tu:

https://github.com/ssuukk/Atalan

Czemu o tym piszę? No cóż - to już prośba do zaawansowanych - przydałoby się trochę pomocy w ogarnięcu generatorów kodu dla naszego C64, ponieważ domyślnie Atalan generuje kod dla assemblera MADS pod Atari. Dla swoich projektów już częściowo przekonwertowałem instrukcje na ca65, odpowiadają za to pliki w katalogu:

cpu\m6502

m6502.asm - całkowicie przekonwertowany, jest OK, assembluje się. Ten plik zawiera kawałki "standardowej biblioteki Atalana", takie jak mnożenie, dzielenie, pisanie po ekranie.

m6502.atl - plik Atalana mówiący jak konwertować pośredni mikrokod atalana na assembler 6502 - tu jest trochę sałatki, ponieważ póki co tylko część instrukcji, tych, których potrzebowałem do moich projektów jest w formacie a65, reszta w MADS, co oczywiście może powodować że skompilowany plik assemblera też będzie zawierał mix mnemoników dla a65 i MADS (głównie chodzi o pseudokody dla rzeczy takich jak .byt, .word, tworzenie tablic itp.). Dodatkowo - w niektórych przypadkach brak tam konwersji mikrokodu na assembler i pewnych konstruktów, które Atalan teoretycznie ma, nie da się wykorzystać, DOPÓKI NIE DODA SIĘ ICH W TYM PLIKU w postaci kodu assemblerowego. Więc jest to dość łatwe, jak tylko rozkmini się minimalnie składnię tegoż pliku

I najfajniejsza chyba rzecz, którą ktoś miły mógłby chcieć pomóc rozwijać, to te pliki:

platform/c64/c64.atl i c64.asm

Pierwszy z nich zawiera np takie definicje:

borderColor @53280:color
backgroundColor @53281:color

Color: enum
 black
 white
 red
 cyan
 purple
 green
 blue
 yellow
 orange
 brown
 lightred
 garkgrey
 grey
 lightgreen
 lightblue
 lightgrey

Dzięki czemu potem w kodzie Waszego programu, kiedy chcecie czarną ramkę piszecie po prostu:

borderColor = Color.black
A Atalan, o ile w akumulatorze jest właśnie przypadkiem 0, podmieni tę linijkę na:

STA 53280
Fajnie?

Dalej w tymże pliku mamy definicję:

KLoad@$ffd5:  proc type:byte@cpu.a startAddr@(CPU.x,CPU.y):adr  -> state@cpu.c error@cpu.a lastByte@(cpu.x,cpu.y):adr  @cpu.a @cpu.x @cpu.y
Ale co znaczą te wszystkie symbole?

KLoad to procedura zawarta w pamięci pod adresem$ffd5 - to chyba jasne. Przyjmuje ona dwa argumenty, pierwszy nazywa się "type" i przenoszony jest przez rejestr A procesora, a drugi nazywa się startAddr i umieszczony zostanie w rejestach X i Y procesora. Procedura zwraca trzy wartości (serio!) zawarte w rejestrze C, A oraz adres w X+Y. I wywołujecie ją w swoim kodzie np. tak:

stan,blad,koniec = KLoad 1,$0800

Tadam? Fajnie?

Ostatnie krzaczki w linii informują generator kodu Atalana, że wywołanie tej proceduy wymaże zawartość rejestrów X, Y i A (zaawansowanym nie muszę tłumaczyć, po co to...)

Ten plik zawiera jeszcze parę innych pożytecznych skrótów, ale możnaby go rozszerzyć o wiele, wiele więcej, np. zmiany trybu graficznego, operowanie duszkami itp.

Jak ktoś jest chętny do pomocy, to zapraszam...



Offline Raf

  • Master of disaster
  • Administrator
  • Level 7
  • **********
  • Wiadomości: 7333
  • Wolność, własność, sprawiedliwość
Kiedyś już o tym pisałem na forum, doczekal się ten projekt bibliotek dla c64, czy wciąż tylko Atari?
"Cokolwiek powiesz albo napiszesz, znajdzie się ktoś, kto słyszy lub czyta coś zupełnie innego i jeszcze bezczelnie wmawia Ci to"

Offline sajmosia

  • Level 3
  • ***
  • Wiadomości: 194
Twierdzisz, ze:

KLoad@$ffd5:  proc type:byte@cpu.a startAddr@(CPU.x,CPU.y):adr  -> state@cpu.c error@cpu.a lastByte@(cpu.x,cpu.y):adr  @cpu.a @cpu.x @cpu.y

Jest bardziej czytelne niz :

  LDX #$08
  LDY #$00
  LDA #$01
  JMP $FFD5

IMHO, Dla mnie to wyglada troche jak kolejne rozwiazanie do problemu, ktorego nie ma.

Pozdro.

Offline qus

  • Level 3
  • ***
  • Wiadomości: 201
Kiedyś już o tym pisałem na forum, doczekal się ten projekt bibliotek dla c64, czy wciąż tylko Atari?

Projekt jest martwy. Jedyne biblioteki dla c64, które są to uzupełniony przeze mnie plik c64.atl

Dalsze jego rozszerzenie nie jest niczym trudnym.

Twierdzisz, ze:

KLoad@$ffd5:  proc type:byte@cpu.a startAddr@(CPU.x,CPU.y):adr  -> state@cpu.c error@cpu.a lastByte@(cpu.x,cpu.y):adr  @cpu.a @cpu.x @cpu.y

Jest bardziej czytelne niz :

  LDX #$08
  LDY #$00
  LDA #$01
  JMP $FFD5


Twierdzę że

stan,blad,koniec = KLoad 1,$0800 (1 - słownie: jedna linijka)

jest czytelniejsze niż:

  LDX #$08
  LDY #$00
  LDA #$01
  JMP $FFD5
  STA blad
  STX <koniec
  STY >koniec
  BCC obsluz_status
(8 - słownie OSIEM linijek)

I raczej nie jestem w tym odosobniony, jak sądzę...
« Ostatnia zmiana: 06 Lutego 2018, 13:22 wysłana przez qus »

Offline V-12/Tropyx

  • Level 7
  • *******
  • Wiadomości: 2765
  • 0ldsk00l 4ever!
    • http://www.riversedge.pl/
W życiu nie zamienię:

  LDX #$08
  LDY #$00
  LDA #$01
  JMP $FFD5

na:

KLoad@$ffd5:  proc type:byte@cpu.a startAddr@(CPU.x,CPU.y):adr  -> state@cpu.c error@cpu.a lastByte@(cpu.x,cpu.y):adr  @cpu.a @cpu.x @cpu.y

http://www.riversedge.pl/ - zapraszam na nową stronę: recenzje, relacje, strefa C64.

Serwis Commodore 64/1541 - naprawa/diagnoza.
Zawsze aktualne!

Offline qus

  • Level 3
  • ***
  • Wiadomości: 201
No i słusznie, bo ta linijka:

KLoad@$ffd5:  proc type:byte@cpu.a startAddr@(CPU.x,CPU.y):adr  -> state@cpu.c error@cpu.a lastByte@(cpu.x,cpu.y):adr  @cpu.a @cpu.x @cpu.y

Nic nie robi... To fragment pliku nagłówkowego atalana... Czytanie ze zrozumieniem nie boli...

Offline sajmosia

  • Level 3
  • ***
  • Wiadomości: 194
Twierdzę że

stan,blad,koniec = KLoad 1,$0800
jest czytelniejsze niż:

  LDX #$08
  LDY #$00
  LDA #$01
  JMP $FFD5

I raczej nie jestem w tym odosobniony, jak sądzę...

Tylko tak sie sklada, ze :

stan,blad,koniec = KLoad 1,$0800Nie znaczy nic bez:
KLoad@$ffd5:  proc type:byte@cpu.a startAddr@(CPU.x,CPU.y):adr  -> state@cpu.c error@cpu.a lastByte@(cpu.x,cpu.y):adr  @cpu.a @cpu.x @cpu.y

Co jeszcze bardziej komplikuje sprawe. Tutaj widac ewidentny brak doswiadczenia w programowaniu.

Znam magikow, ktorzy twierdzili, ze sie naucza "EF, Code First, LinQ" i wszystkiego wokolo, zeby sie nie musieli uczyc SQL.  EF jest w miare swieze, pelne bledow i z brakiem wielu rzeczy, ktore dostepne sa tylko w SQL. Na koniec dnia nie mieli wyjscia musieli sie nauczyc SQL, ktory jest na rynku od ~40 lat, stabilny jak skala i nie bez powodu wciaz uzywany.

Teraz tu jest piekne rozwiazanie, ktore zmusza cie do nauki innego podejscia do assemblera, niz nauczenie sie assemblera, wiec zanim zaczniesz od razu powiem Ci co sie stanie :

Kiedy juz sie nauczysz Atalana od deski do deski i juz bedziesz wiedzial wszystko, co mozna wiedziec na tema atalana, to stanie sie to wtedy, gdy staniesz przed problemem, ktory mozna zalatwic tylko w assemblerze i wrocisz do punktu wyjscia.

Zaden kompiler nie da Ci dokladnej ilosci cykli potrrzebnych na wykonanie Twojego kodu takze cokolwiek potrzebuje byc bardzo dokladne w czasie, napisane w czymkolwiek innym niz assemblerze odpada.

Tak czy inaczej, jesli uwazasz, ze jest wart uwagi to prosze bardzo :)

Powodzenia :)

Offline Raf

  • Master of disaster
  • Administrator
  • Level 7
  • **********
  • Wiadomości: 7333
  • Wolność, własność, sprawiedliwość
Zacząłem pisać posta ale gdzieś go wcieli a dotyczył tego, że debugować i tak trzeba w czystym asemblerze.
"Cokolwiek powiesz albo napiszesz, znajdzie się ktoś, kto słyszy lub czyta coś zupełnie innego i jeszcze bezczelnie wmawia Ci to"

Offline sajmosia

  • Level 3
  • ***
  • Wiadomości: 194
Zacząłem pisać posta ale gdzieś go wcieli a dotyczył tego, że debugować i tak trzeba w czystym asemblerze.

Dokladnie :)

Przypomina mi to tekst nauczycielki od matematyki w podstawowce :

Cytuj
Nie kombinuj, tylko wez sie bracie do roboty

Pozdrawiam :)

Offline qus

  • Level 3
  • ***
  • Wiadomości: 201
Tylko tak sie sklada, ze :

stan,blad,koniec = KLoad 1,$0800Nie znaczy nic bez:
KLoad@$ffd5:  proc type:byte@cpu.a startAddr@(CPU.x,CPU.y):adr  -> state@cpu.c error@cpu.a lastByte@(cpu.x,cpu.y):adr  @cpu.a @cpu.x @cpu.y

Co jeszcze bardziej komplikuje sprawe.

To tak komplikuje sprawę, jak istnienie pliku stdio.h komplikuje programowanie w C...

Cytuj
Tutaj widac ewidentny brak doswiadczenia w programowaniu.

Nie przejmuj się, masz jeszcze dużo czasu żeby się nauczyć. Kiedyś było trudno, ale teraz jest dużo materiałów online. Programowanie może być naprawdę wielką frajda!

Cytuj
Teraz tu jest piekne rozwiazanie, ktore zmusza cie do nauki innego podejscia do assemblera, niz nauczenie sie assemblera, wiec zanim zaczniesz od razu powiem Ci co sie stanie :

Kiedy juz sie nauczysz Atalana od deski do deski i juz bedziesz wiedzial wszystko, co mozna wiedziec na tema atalana, to stanie sie to wtedy, gdy staniesz przed problemem, ktory mozna zalatwic tylko w assemblerze i wrocisz do punktu wyjscia.

...ponieważ kompilatory kompilują kod do magicznego zestawu instrukcji, który jest zupełnie inny od niemagicznego asemblera, w którym da się zrobić dosłownie wszystko.

Cytuj
Zaden kompiler nie da Ci dokladnej ilosci cykli potrrzebnych na wykonanie Twojego kodu takze cokolwiek potrzebuje byc bardzo dokladne w czasie, napisane w czymkolwiek innym niz assemblerze odpada.

Ooooj, mnie się nie sipieszy! Zawsze skłonny jestem poświęcić szybkość dla ekspresywności.

Offline sajmosia

  • Level 3
  • ***
  • Wiadomości: 194
Ooooj, mnie się nie sipieszy! Zawsze skłonny jestem poświęcić szybkość dla ekspresywności.

Nie chodzi o szybkosc czy ekspresywnosc, tylko synchronizacje w czasie :)

Poprosze o przyklad programu napisanego w Atalanie, ktory wyswietli cokolwiek w gornej albo dolnej ramce obrazu :)

Pozdrawiam.

Offline qus

  • Level 3
  • ***
  • Wiadomości: 201
Słuchaj - jest tu cała masa osób, która chciałaby coś sobie napisać na C64 - a to "słówka", a to jakąś bazę danych, prostą grę czy "mój pierwszy program na c64". Trwa wątek o prostej podmiance polskich znaków...

I teraz pytanie - czy mają dłubać w Basicu V2 który umie dosłownie nic, flow kodu kontoluje poleceniem "goto" a zmieszczenie tego co po "then" w 80 znakach to czasem sztuka, czy może mogliby nauczyć się prostego i sympatycznego języka, który się kompiluje do źródła w assemblerze? PEEK, POKE, DATA, czy porządny język?

Poprosze o przyklad programu napisanego w Atalanie, ktory wyswietli cokolwiek w gornej albo dolnej ramce obrazu :)

Proszę o przykład gry z listy http://www.lemon64.com/games/votes_list.php, która wyświetla coś w górnej lub dolnej ramce, inaczej szkoda czasu na kodowanie czegoś tak bezużytecznego.

Jeśli znajdziesz przykład, to trudno - będę musiał spróbować...

Offline sajmosia

  • Level 3
  • ***
  • Wiadomości: 194
https://www.youtube.com/watch?v=VfhJM2Gaeew

Nie wiem, czy jest na Twojej liscie, ale mysle, ze gre Bomb Jack chyba wiekszosc zna :)

Pozdro.

Offline qus

  • Level 3
  • ***
  • Wiadomości: 201
No, cóż. Słowo się rzekło :D A jak się uda, to co?

Offline sajmosia

  • Level 3
  • ***
  • Wiadomości: 194
To wtedy porownamy Twoj super latwy, prosty i czytelny kod do tego w assemblerze tutaj:

http://codebase64.org/doku.php?id=base:removing_the_top_bottom_border

I werdykt zostawimy czytelnikom :)