forum speccy.pl

ZX Spectrum => PROGRAMOWANIE => Wątek zaczęty przez: mad1 w 2013.11.22, 12:45:44

Tytuł: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2013.11.22, 12:45:44
Cześć
Jestem byłym posiadaczem ZX Spectrum+, z którym spędziłem dzieciństwo i niestety parę lat temu go sprzedałem czego teraz żałuję. Pisałem w Basicu jakieś proste programiki, a teraz chciałbym powrócić do miłych wspomnień i się tym znowu pobawić, zwłaszcza gdy widzę, że w Polsce jest całkiem duża społeczność, która coś na niego tworzy. Nie wiem czy ludzie powrócili do tematu czy zawsze tak było. Chciałbym coś napisać prostego a może i się nawet tym podzielić.

Na początku mam dla was 2 pytania:
1. Jakie jest najlepsze środowisko do programowania w BASIC-u, tak bym mógł pisać w trybie tekstowym a wynik swojego programu od razu podejrzeć jak działałby na spectrumie.
2. Jaki program polecacie do tworzenia obrazków "loading screen"?
3. Czy warto zapoznać się początkującemu z asseblerem(bo słyszałem, że też w nim można pisać), jeśli tak czy są jakieś publikacje(po polsku) dedykowane spectrumowi na ten temat. Czy tez może lepiej sobie odpuścić?
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: sect0r w 2013.11.22, 14:04:17
Witamy Serdecznie!

2. Polecam ZX Paintbrush

1 i 3. Od razu przeskakuj na assembler, z publikacjami w naszym języku krucho. Nie wiem jak to kiedyś bywało, ale wydaj mi się że się nie dzielili ;D. Wypadałoby zacząć od poznania się wpierw z rozkazami procesora Z80 (lektura obowiązkowa na początek) - które są fantastycznie opracowane po naszemu na stronie
http://edu.i-lo.tarnow.pl/inf/retro/004_z80_inst/index.php
Odnośnie samego asemblera dla spektrum to książki są po angielsku na WOS'ie, ale na forum mamy sporo znanych postaci ze świata ZX Spectrum, także napewno na pomoc , czy wyjaśnienie pewnych zjawisk można liczyć.
Na stronie głównej znajdziesz kilka artykułów odnośnie programowania:
http://www.speccy.pl/articles.php?cat_id=3
Jeśli angielski Ci nie straszny, to jest kilka tutoriali w sieci jak na przykład ten przy użyciu ZX Spin (polecam ten emu do nauki, wbudowany assembler, debugger)
http://chuntey.wordpress.com/2012/12/18/how-to-write-zx-spectrum-games-chapter-1/

Grunt to nie odpuszczać!
Jak będziesz chciał się pochwalić twórczością, to nie zapomnij opublikować tego na forum :D
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: Tygrys w 2013.11.22, 14:24:11
Witaj na forum!

Co do drugiego pytania, do program nazywa się BASin i działa pod Windowsem. Do ściągnięcia ze strony https://sites.google.com/site/ulaplus/home/zx-spin-and-basin  Wygodny do pisania programów, a wbudowany emulator ZX Spectrum sprawia, że masz dokładnie to, czego potrzebujesz.

Pytanie numer 3, jest coraz większa potrzeba napisania kursu programowania w Z80, oraz wykorzystania go w ZX Spectrum.
To wskazówka do tego aby zacząć działać.

Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: RafalM w 2013.11.22, 15:00:39
Cytuj
2. Jaki program polecacie do tworzenia obrazków "loading screen"?

Photoshop? ;)

Tak naprawdę to są trzy opcje:

- rysować w programie działającym na Spectrum  (Art Studio, Melbourne Draw, Leonardo, Burial), w emulatorze lub jeśli jesteś hardkorem to na prawdziwym Spectrum :)

- rysować w programie na PC napisanym specjalnie do wspierania trybu graficznego Spectrum (wspomniany Zx Paintbrush)

- rysować w dowolnym programie graficznym (jak wspomniany Photoshop) pamiętając o ograniczeniach Spectrum. Można to sobie ułatwić ustawiając paletę Spectrum i siatkę 8x8 pikseli (pomocne by nie używać więcej niż 2 kolorów w atrybucie)
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: RafalM w 2013.11.22, 15:03:55
A co do asemblera to warto spróbować, chociaż jeśli nie zajmowałeś się programowaniem przez ponad 20 lat to może być trochę ciężko. Widzę to niestety po sobie - w pewnym wieku coraz trudniej się chłonie nową więdzę.
Ale spróbuj :)
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: Gryzor w 2013.11.22, 16:55:20
Na poczatek warto zajrzec do polskiego Przewodnika po ZX Spectrum.
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2013.11.22, 21:50:12
Dzięki chłopaki za liczny odzew, śpieszy mi się jednak do "szybkich" efektów mojej pracy więc na razie przystanę przy Basicu bo widzę, że długo musiałbym się wgłębiać w assemblera, niemniej jednak linki wyżej podane na pewno wielu się przydadzą.
Zgodnie z waszymi sugestiami pobrałem ZX Paintbrush oraz BASin(świetny programik). Trochę się nimi pobawiłem i mam do was następne pytania.
Napisałem sobie najprostszy program jaki był możliwy(w BASin), ale chciałbym by został on wczytany po wcześniejszym załadowaniu się obrazka (loading screen) jak ma to miejsce w większości gier. BASin posiada także swój własny edytor screenów, jednak nie potrafię takiego screena dołączyć(testuje programik na innym emulatorze w czasie rzeczywistym). Ponadto w ZX Painbrushu zapisałem niby mój screen w formacie .scr a nawet .tap, ale nie wiem co dalej zrobić by załączyć takiego screena do programu.
Czy ktoś się bawił tymi programami i dogrywaniem screenów do swoich spectrumowych programów i mógłby mi przybliżyć jak to zrobić?
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: RafalM w 2013.11.23, 14:45:05
Jeśli program składa się z kilku części wczytywanych jako osobne bloki danych, to zwykle pierwszy blok to loader czyli krótki programik którego jedynym zadaniem jest wczytać wszystko do pamięci i uruchomić właściwy kod jak już wszystko się wczyta.

U ciebie taki loader mógłby mięc postać:

1 load "" screen$
2 load ""


Pierwsza linia wczytuje obrazek.
Druga doczytuje właściwy program w Basicu i go uruchamia

Zarówno loader jak i właściwy program warto zapisać przez:

save "nazwa" line 1

gdzie line 1 znaczy że program ma wykonać autostart od linii o podanym numerze. Inaczej program się wczyta ale nie uruchomi.

Czyli na taśmie będzies miał po kolei 3 bloki danych:

-loader
-obrazek
-właściwy program

Teraz jak połączyć dwa .tapy - z programem i obrazkiem... Niestety, sam nie wiem czemu, większość emulatorów nie pozwala na taką operację i z niby prostej rzeczy robi się rzecz wcale nie taka prosta. Są różne narzędzia pozwalające to robić i pewnie każdy ma jakieś swoje ulubione:

Ja używam programu Tapir, możesz zobaczyć czy ci się spodoba:
ftp://ftp.worldofspectrum.org/pub/sinclair/tools/pc/tapir1.0.zip



Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2013.11.23, 18:50:02
@RafalM

Dzięki. Niezmiernie mi pomogłeś. Dzisiejsze popołudnie przyniosło dzięki Tobie postęp, umiem już poprzedzić program screenem. Ale zatrzymałem się na pewnej rzeczy. Mam też kilka pytań. Ogólnie sprawdziłem tapir, ale widziałem, że Basin też ma "tape creator'a" z którego skorzystałem.

Otóż na pierwszy rzut stworzyłem .tap typu:

1 LOAD ""SCREEN$
2 PRINT "Wlasciwy program"


Czyli loader, który wczytuje w jednym bloku SCREENA oraz jednocześnie po nim program.

Teraz odniosę się do Twojej koncepcji. Czyli wczytywania się "właściwego" programu w nowym bloku, po wcześniejszym wczytaniu się SCREENA. Czyli poprzez:

1 LOAD ""SCREEN$
2 LOAD ""


Następnie chciałem stworzyć nowy blok(bytes) z "właściwym programem" jako

3 PRINT "Właściwy program"

jednak zarówno Basinie i Tapirze wyskoczyło mi okienko żebym podał "Start adress" oraz "lenght", o co chodzi w tej adresacji? jakie prawidłowe wartości muszę tam podać aby było dobrze?

Jakie zalety ma tworzenie nowego bloku w stosunku do metody, którą zastosowałem trochę wyżej? Czy kolejność  instrukcji w nowym bloku można numerować z powrotem od 1 czy kolejność musi być zachowana?
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: Tygrys w 2013.11.24, 09:12:40
Kolejnym blokiem powinienm być jednak program w BASIC, a nie blok danych.
Obecna sytuacja ma się tak:
1 - ładujesz program w BASICu
2 - ładujesz obrazek (blok binarny)
edit: LOAD ""SCREEN$ odpowiada poleceniu LOAD""CODE 16384

3 - ładujesz ponownie program w BASICu (LOAD "")

Nowo załadowany program w BASIC nadpisze w pamięci ten, z którego uruchomiłeś LOAD ""

A co do pytania to start address i length w bloku binarnym, to start address to adres pamięci RAM w ZX Spectrum, do którego blok ma być domyślnie załadowany. lenght zaś to jego długość.  Adres startowy ma znaczenie jeżeli ładujesz blok za pomocą LOAD""CODE. Aby zmienić adres ładowania bloku binarnego, po prostu podajesz jego nowy adres docelowy: LOAD ""CODE nowy_adres.
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2013.11.24, 12:52:35
@Tygrys, dzięki za wyjaśnienia
Bawiłem się w "memory block" bo na początku zrobiłem tak jak mówisz by wczytało nowy blok jako program ale miałem jakiś błąd "Nonsense in Basic", jednak po Twoim poście spróbowałem raz jeszcze i teraz poprawnie się wszystko załadowało, więc musiałem coś chyba wcześniej źle zrobić. Niemniej dzięki za wyjaśnienie "memory block".

Ok teraz mam następne pytanie, jak widać na załączonym obrazku wczytanie nowego bloku z programem powoduje, że zostaje mi nadpisany kawałek screen'a, czy w Basicu można jakoś zrobić by tytuł bloku nie nadpisywał mi obrazka? można zrobić jakieś proste zabezpieczenie?

(http://oi39.tinypic.com/okbfk9.jpg)
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: Tygrys w 2013.11.24, 13:32:50
Jest na to sposób.

pierwszy, szybszy:
POKE 23739,111

Zadziała na Spectrum bez dodatkowych rozszerzeń takich jak ZX Interface. Emulatory dość często mają go włączonego, więc wersja dłuższa powinna pomóc:

POKE PEEK 23631+256*PEEK 23632+5,111
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: Phonex w 2013.11.24, 15:08:48
Jeżeli ostatni ładowany blok to własny program w Basicu, to może być potrzebne dopisanie na samym początku "odwołania" tego, czyli przywrócenia poprzedniej wartości: POKE 23739, 244.
W przeciwnym wypadku mogą być problemy np. z kolorami na ekranie.
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2013.11.24, 17:36:54
Dzięki Tygrys, działa:) Phonex thx, będę miał to na uwadze. Skoro już umiem stworzyć interfejs ładowania, czas napisać jakiś programik.
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: Tygrys w 2013.11.25, 07:40:16
Powodzenia! Pochwal się rezultatami ;)
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2013.11.25, 13:50:03
Mam następny problem, zrobiłem sobie posty programik do rysowania, który przesuwa mi się o jeden piksel w zależności jaki klawisz nacisnę. Jednocześnie w komponowałem to wyświetlanie aktualnej pozycji "kursora", chodzi o zmienne odpowiadające pozycji w poziomie i pionie (x,y). Rysowanie zaczynam od punktu 0,0 czyli lewego dolnego punktu ekranu. Wszystko działa ładnie i pokazuje prawidłową pozycję "kursora" dopóki nie przekroczę 100 a następnie zejdę wstecz poniżej 100. Wtedy mam wynik  x=990 zamiast x=99. Coś nie tak jest z formatem tej liczby.  Można coś zrobić by nie pokazywał tego zera, lub przynajmniej wyświetlał liczbę w formacie x=099?
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: Tygrys w 2013.11.25, 14:01:18
Mam wrażenie że nie jest zmazywana poprzednia wartość liczbowa. Spróbuj dodać spacje po wyświetleniu liczby, np tak:
PRINT x;" co najmniej jedna spacja "
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: RafalM w 2013.11.25, 14:23:55
Cytuj
Mam wrażenie że nie jest zmazywana poprzednia wartość liczbowa. Spróbuj dodać spacje po wyświetleniu liczby, np tak:
PRINT x;" co najmniej jedna spacja "

A najlepiej 2 spacje bo zaraz będzie taki sam problem przy zmniejszeniu z 10 do 9 :)

Gdybyś natomiast chciał mieć zera z przodu to ja bym to robił tak:

-zamieniam liczbę na tekst
-dopisuje dwa zera z przodu
-biorę trzy znaki z tekstu licząc od końca
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2013.11.25, 20:54:20
Panowie, dzięki, taki banał, że też na to nie wpadłem.
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2014.01.04, 13:06:05
Cześć ponownie,
mam pytanko jak mogę zmierzyć(wydrukować) czas jaki minął od wywołania jakiejś instrukcji(podprogramu) do wciśnięcia danego klawisza. Jak mogę prosto to zrobić w BASICU? czy jest jakaś instrukcja, która mierzy czas lub  jak zdefiniować taką zmienną pod, którą kryje się czas działania danego programu? Nie chodzi mi ile czasu program ma działać lecz ile trwał.
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: trojacek w 2014.01.04, 13:23:22
Pod adresami 23672, 23673 i 23674 masz 24-bitowy licznik ramek (zwiększany o 1 co 1/50 sekundy).
Tu masz przykład, jak tego używać:
http://edu.i-lo.tarnow.pl/inf/retro/006_zx_spect_inst/0018.php

Ale uwaga - ten licznik działa tylko wtedy, gdy są włączone przerwania. Jeżeli wywołujesz kod maszynowy, który wyłącza przerwania (DI) - to licznik się zatrzymuje do czasu ich ponownego włączenia (EI). Skoro jednak używasz BASIC-a, to nie powinno być tego problemu.
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: matofesi w 2014.01.04, 15:33:59
FRAMES zatrzymuje się też w niektórych procedurach w ROMie - BEEP, save/load i chyba obsługa drukarki. Jeśli w BASICu używa się tych procedur odczyty również będą niedokładne. No i samo odczytanie trzybajtowego licznika i przeliczenie na sekundy to dla interpretera na tyle duża operacja, że sama z siebie może dodać kilka ramek ;)
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: trojacek w 2014.01.04, 15:35:45
Racja!
Ale co do narzutu instrukcji BASIC-owych na wynik obliczeń - myślę, że tak mały błąd można śmiało pominąć. Przecież to ułamek sekundy.
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2014.01.04, 16:39:34
Dzięki trojacek za link, to co chciałem osiągnąłem :)
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2014.01.05, 21:01:01
Panowie mam problem z programem. Założenie jest takie, że program każe nam wcisnąć losowy klawisz z zakresu a-b. W zależności czy dobrze wciśniemy drukuje nam "OK" lub "błąd" kiedy źle. Problem w tym, że czasami drukuje "błąd" mimo, że został naciśnięty klawisz który wylosował nam komputer. Co tu może być źle? możecie przetestować i coś poradzić?
30 LET d=97+RND*25
60 PRINT AT 1,0;"Wcisnij '";CHR$ d;"'"
120 IF INKEY$=CHR$ d THEN PRINT "OK": PAUSE 100: CLS : GO TO 30
150 IF INKEY$<>"" THEN PRINT "Blad": PAUSE 100: CLS : GO TO 30
160 GO TO 60
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: trojacek w 2014.01.05, 21:18:45
Aha, a co jeśli RND*25 nie jest liczbą całkowitą (a często tak będzie)? Wtedy d też nie będzie liczbą całkowitą. CHR$ sobie z tym poradzi, ale Twój warunek już nie.
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2014.01.05, 21:33:20
Trojacek, dzięki, znowu można na was polegać, wygląda na to że masz rację:) wtedy tak 1/7 raza był błąd. Ale dziwię się bo mimo wszystko litera zostawała przypisywana(choć nie musiała być liczbą całkowitą) do wygenerowanej liczby (d).
-----
coś jest chyba nadal nie tak :/
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: trojacek w 2014.01.05, 21:39:26
Bo funkcja CHR$ sobie sama zaokrągla!
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: Phonex w 2014.01.05, 21:46:08
To chyba nie to.
Program dwa razy odczytuje klawisz.
Jeśli naciśnięcie klawisza będzie PO TYM, gdy program już wykona linię 120 (warunek niespełniony bo jeszcze nie naciśnięty) to w linii 150 sprawdzi tylko że klawisz nie jest pusty i stwierdzi "Blad".
Można to rozwiązać na dwa sposoby:

1. Dopisać w linii 70 LET i$=INKEY$ i sprawdzać potem i$.
2. W linii 150 sprawdzać warunek przeciwny czyli INKEY$<>CHR$ d.
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: trojacek w 2014.01.05, 21:51:10
Ooo, fakt, ja jak zwykle zbyt pobieżnie przejrzałem kod i nie zgłębiłem problemu.
I mi teraz wstyd.
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2014.01.06, 19:11:19
Mam pytanko, czy w basicu jest jakieś zabezpieczenie by nie można przerwać przez "break" lub winny sposób działania programu? Bo pamiętam, że proste programiki można było spokojnie zatrzymać i przejrzeć kod.
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: ZbyniuR w 2014.01.07, 14:12:52
Widzę że stare Spectrumowe wygi zajęte, a ja szukając czegoś innego przypadkiem trafiłem na odpowiedź. Informuję że programowe wyłączenie Break jest opisane w Bajtku nr 3/4 z 1986r na str. 23. :)
A tego i inne Bajtki można ściągnąć gratis stąd:
http://atarionline.pl/v01/index.php?subaction=showfull&id=1234027498&archive=&start_from=0&ucat=8&ct=biblioteka#zin=Bajtek
A jak nie masz czym otwierać plików djvu to może wolisz pdf stąd:
http://www.t2e.pl/pl/435/434/435/Bajtek-Redux
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2014.01.07, 20:52:01
Dzięki ZbyniuR :)
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: tdu w 2014.01.07, 22:20:47
po co daleko szukać, wszystko jest tutaj

   ftp://speccy:[email protected]
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2014.01.07, 22:41:44
Odnośnie "BREAK" może mi ktoś napisać jak dokładnie i w jakiej kolejności napisać te instrukcję bo próbowałem ale do końca nie rozumiem rozumowania autora.

Cytuj
Nieraz chcieliśmy zabezpieczyć nasz program przed przypadkowym zatrzymaniem czy też ciekawością wścibskich? Niestety BASIC umieszczony w ROM-ie ZX Spectrum nie posiada komendy ON BREAK. Poniższy program pozwala na przejęcie kontroli nad klawiszem BREAK. Podprogram należy umieścić na początku programu. Uruchomienie odbywa się przez RANDOMIZE USR 60000. Następnie trzeba podać do której linii ma się odbyć skok. Dwubajtowy odpowiednik numeru linii zostaje wprowadzony pod adresy 60053 i 60054. Dwubajtową konwersję liczby X uzyskujemy według wzoru: X=256 * N+M. Najprostszym sposobem jest wprowadzenie do komputera RANDOMIZE X:PRINT PEEK 23670, PEEK 23671. Liczba po lewej stronie to M następna to N. Tak więc pod adres 60053 wprowadzamy M a pod 60054 Iiczbę N. W efekcie kolejna linia programu powinna wyglądać następująco:
RANDOMIZE USR 60000:POKE 60053,M:POKE 60054,N
Przed uruchomieniem programu proponuję umieścić go na taśmie, gdyż najmniejszy nawet błąd może spowodować jego zniszczenie. Podprogram musi się znajdować poza główną pętlą programu.
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: steev w 2014.01.07, 23:07:26
1) wywołujesz w programie kod który jest na końcu artykułu. Umieszcza on pod adresem 60000 procedurę on_break.
2) ustawiasz numer linii do której program ma skoczyć (POKE 60053,low :POKE 60054,high)
3) uruchamiasz procedurę poprzez randomize usr 60000

alternatywnie:

1) spisujesz i uruchamiasz kod który jest na końcu artykułu
2) zapisujesz procedurę na taśmie/dysku (save"nazwa"code 60000,72)

w programie:
3) na początku programu ładujesz z tasmy/dysku zapisaną procedurę (load"nazwa"code)
4) ustawiasz numer linii do której program ma skoczyć (POKE 60053,low :POKE 60054,high)
5) uruchamiasz procedurę poprzez randomize usr 60000
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: ZbyniuR w 2014.01.08, 01:32:28
Na mój rozum to w tym artykule wzór jest źle podany. Bo z tekstu wynika że powinien liczbę nr linii (do jakiej ma skoczyć na Break) zapisać w dwóch bajtach, ale nie wyjaśniono jak to zrobić, tylko zamiast tego podano wzór na coś odwrotnego czyli jak liczbę zapisaną w dwóch bajtach zamienić na dziesiętną. (X=256 * N+M)

Ale skoro kolega jest początkujący to najpierw wyjaśnię co to jest starszy bajt i młodszy bajt i po co to wogóle jest. Otóż jak wiemy w jednym bajcie można zapisać liczbę od 0 do 255 i nie większą, a co jeśli chcemy zapisać w pamięci liczbę większą np 750 ?

Ano trzeba to zamienić na 2 bajty, starszy i młodszy (z ang. high i low). By wyliczyć starszy to trzeba naszą liczbę podzielić przez 256 i wartością do zapisania w starszym bajcie będzie część całkowita czyli to przed przecinkiem z tego dzielenia. W podanym przykładzie 750/256=2,9296... nas interesuje to przed przecinkiem czyli 2 będzie wartością do zapisania w starszym bajcie. A co w młodszym wyliczamy tak: bierzesz liczbę początkową (tą którą chcemy zapisać w dwóch bajtach) odejmujesz od tego wynik mnożenia starszego bajtu z 256 i zostaje ci wartość do zapisania w młodszym bajcie. Czyli w naszym przykładzie 750-2*256=238  :)

A teraz ważna rzecz: w kodzie maszynowym procesora Z80 - STARSZY BAJT MA ADRES O 1 WIĘKSZY NIŻ MŁODSZY BAJT. Czyli w programiku o jakim mowa młodszy bajt wpisujemy POKE 60053,młodszy a starszy w adres następny POKE 60054,starszy :)

Maksymalną liczbą jaka się zmieści w dwóch bajtach jest 65535. :)
Wzór jaki podano w artykule zamienia wartości z dwóch bajtów w liczbę dziesiętną czyli
liczba=PEEK(młodszy)+PEEK(starszy)*256   - jak w przykładzie 238+2*256=750
Dla pewności że wszystko jasne inny przykład zamieńmy 9210 na 2 bajty. ;)
starszy=INT(9210/256):młodszy=9210-starszy*256
albo nawet tak by nie wymyślać wielu nazw zmiennych:    adr=60053:nrlini=9210:POKE adr+1,nrlini/256:POKE adr,nrlini-PEEK(adr+1)*256:
I taki wzór powinien być podany. :) Oczywiście nr linii podajesz taki jak potrzebujesz. ;)
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: Phonex w 2014.01.08, 10:51:15
Na mój rozum to w tym artykule wzór jest źle podany.
...

Widać żeś nie Spectrumowiec :D
To prosty trik, który jest opisany chyba we wszystkich książkach o Spectrum dla początkujących.
Instrukcja RANDOMIZE X, zmieniając bazę liczb losowych, zapisuje do pamięci (pod adres 23670) liczbę z zakresu 0-65535. Można ją potraktować jak DPOKE 23670, X. Wystarczy odczytać tą liczbę z pamięci bajt-po-bajcie, czyli PRINT PEEK 23670, PEEK 23671!
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: ZbyniuR w 2014.01.08, 13:22:52
Coś takiego, w sumie fajny mechanizm. Szkoda że od razu nie można pod podany adres. Ale i tak wolę w Lokomotywie pisać. :D
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2014.01.08, 14:13:50
Dzięki za wasz wysiłek, ale ja jako początkujący i zaczynający bliższą znajomość z basic'iem nie jestem czasami w stanie was zrozumieć, wy w domyśle wiecie o co chodzi autorowi, ja niestety niekoniecznie.
Takie rzeczy jak "Następnie trzeba podać do której linii ma się odbyć skok." niewiele mi mówią, wtedy tylko zadaje sobie pytanie jakiej linii?? co ma się w niej znajdować??  może ktoś mógłby po prostu napisać tych parę wierszy przykładowego (działającego) kodu??
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: Phonex w 2014.01.08, 14:34:21
To nie my jesteśmy niezrozumiali, a autor króciutkiego tekstu w Bajtku! :P
Chodzi o to, że w momencie naciśnięcia BREAK, należy coś zrobić. To co ma być zrobione jest częścią programu w BASICu (jak podprogram) zaczynając się od linii numer X.
W momencie naciśnięcia BREAK to co robi program zostanie przerwane i wykonane zostanie GO TO X.

Ten właśnie numer linii X trzeba podać. Może to być 1 - program zacznie się od początku, lub inny, np. 9000 a w linii 9000 PRINT "Nie przerywać!"
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: steev w 2014.01.08, 15:07:48
Tak przy okazji, natknąłem się właśnie na dużo ciekawego czytania dla programistów :)
http://www.users.globalnet.co.uk/~jg27paw4//pourri/0-surc-contents.htm (http://www.users.globalnet.co.uk/~jg27paw4//pourri/0-surc-contents.htm)
Link do archiwum jest na samej górze.

Dla mających więcej czasu : http://www.users.globalnet.co.uk/~jg27paw4//index.html (http://www.users.globalnet.co.uk/~jg27paw4//index.html)
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: ZbyniuR w 2014.01.08, 17:29:42
Hej mad1 tak z ciekawości zapytam, z jakimi komputerami miałeś wcześniej do czynienia?   
I czy zdarzało już ci się pisać programy w jakimś innym języku? 
Ile wiosen chodzisz po ziemi?
Co cie skłoniło do zajęcia się Spectrumem?
Bo ostatnio obserwuję narastające zjawisko zainteresowania kompami sprzed 20-30 lat ludzi młodszych od tych maszyn i chciałbym zrozumieć co nimi motywuje bo mnie by do głowy nie przyszło by interesować się komputerami starszymi ode mnie, zresztą co tak stare kompy miały, kilka KB RAMu + semigrafika = bieda z nędzą. :D  Z kolei współczesne są tak złożone i skomplikowane, zarówno sprzętowo jak i programowo, że życia nie starczy by ogarnąć co się w nich dzieje. Co daje niemiłe uczucie że człowiek jest na to za głupi. A te z lat 80-90 były już na tyle fajne a jednocześnie na tyle proste że da się zrozumieć co tam w nich piszczy. :)
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: twip w 2014.01.08, 18:43:17
To jest bardzo dobre pytaniu, ZbyniuR, czemu "młodzi" chcą poznać stare komputery. Zakładam, że są to pasjonaci, którzy po prostu chcą zrozumieć w pełni działanie komputera. Tak jak napisałeś - zrozumienie w najgłębszych detalach współczesnych pecetów jest nietrywialne, o ile możliwe dla zwykłego śmiertelnika. Stare komputery osobiste są natomiast do ogarnięcia przez jedną osobę, z odpowiednią motywacją. Zresztą, trzeba się cieszyć, że jest nimi zainteresowanie. Zrozumienie jak działa nawet 8-bitowiec od środka, na poziomie kodu maszynowego, komunikacji na szynach danych itd. jest bardzo przydatne. Dla przykładu, jest widoczna różnica pomiędzy programistami, którzy nigdy nie tknęli assemblera, a tymi którzy mają na swoim koncie z nim dłuższą styczność. Trochę lepiej można zrozumieć i zaplanować kod, także w języku wyższego poziomu, wiedząc jak to wszystko działa na niskim poziomie. Nie mówię, że jest to wiedza niezbędna, ale na pewno przydatna. Marzy mnie się wskrzeszenie starych komputerów w nowej, mocno zintegrowanej (single chip), w 100% zgodnej z oryginałem wersji. Taki komputer mógłby kosztować tyle co sama klawiatura a mógłby być super narzędziem do nauki i funu. No to się rozmarzyłem. :-P
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2014.01.08, 20:12:03
Zbyniur, ZX Spectrum to był mój 1-szy komputer, dostałem go w spadku po kuzynie, który wyjechał na studia. Po prostu chciałem wrócić trochę do miłych wspomnień. Zawsze podobały mi się grafiki przy wgrywaniu gierek, nieźle się tym jarałem. Teraz zobaczyłem, że jest nawet duża społeczność i tak mnie coś naszło, żeby samemu coś spróbować napisać, tak po prostu dla własnej satysfakcji. Kiedyś miałem jeszcze c64 bo wszyscy na około mieli, ale to już nie był ten czar. Zdarzało mi się pisać w Bascomie(dla mikrokontrolerów) i c++ ale to raczej były bardzo proste rzeczy. 30 lat chodzę po ziemi i raczej zaniżam chyba tutaj średnią ;)

A to ja dokładnie 20 lat temu

(http://oi41.tinypic.com/35362ix.jpg)

Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: sect0r w 2014.01.08, 20:19:09
Ostra jazda zaczyna się dopiero w assemblerze, chłopaki robią cuda  ;)
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2014.01.08, 21:51:32
Ok, dzięki za pomoc w tym wątku, udało mi się dzięki temu stworzyć małą mini gierkę, bardzo krótką i prymitywną aczkolwiek jest satysfakcja :) tylko dla hardcorowych i zatwardziałych spectrumowców ;)



Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: ZbyniuR w 2014.01.09, 04:18:12
Wiesz twip nie ty jeden marzysz o takim czymś, są nas miliony. I myślę że to kwestia czasu. W jednym chipie już mamy NES-a, które przez lata sprzedały się w 62mln a dziś na Allegro są po 20zł z tysiącami gier dwoma padami i pistoletem, a zwie się to PolyStation lub FunStation3 zależy jaki kolorek wolisz. ;)

Czytałem też że zrobiono już InOneChip MSX-a, ale nie widziałem nawet fotek, cóż to nie Europa jest rynkiem zbytu tej platformy, a raczej Japonia i Ameryka Południowa.
W FPGA i/lub jako emulatorek na Raspberry są już praktycznie wszystkie maszynki sprzed lat,choć ceny zwłaszcza tych pierwszych jak na razie odstraszają. W miarę nasycania się rynku w podobny sposób będą robione kolejne platformy. Bo technologia tanieje. Jak będziemy się zdrowo odżywiać to doczekamy czasów że będziemy mieli drukarki 3d w domach z opcją drukowania we wysokiej rozdzielczości także układów elektronicznych. Jak będziesz chciał mieć z 10 Spectrusiów w obudowach w kolorach tęczy to sobie wydrukujesz. A jak ci się zgubi lub pobrudzi to sobie dodrukujesz. ;) A takie jednochipowe sprzętowe emulatorki będą wtykane w handheldy jak karta microSD. Sprzedawane dziesiątkami w kolekcjach do zbierania, tak jak dziś się zbiera karty z pokemonami. :D I będzie karta z Atarką, Trumienką, AppleII, TRS... itd itd dziesiątki maszynek. ;)

A emulator za jakieś powiedzmy 15 lat? - Hmmm niech pomyślę...  Stacjonarny komp to będą wtedy dwa dotykowe blaty wielkie jak stół, jeden jako stół a drugi na ścianie. Pierwszy będzie wyświetlał bałagan typowy na biurku nieletniego a wszystko reaguje na dotyk i gesty, długopis resoraki Commodorek czy Amstradzik czy czego tam dusza zapragnie a obok leży Bajtek z którego przepisujesz linie Data. hahaha - Oczywiście jego strony przewracają się po szurnięciu blatu w miejscu gdzie go wyświetla. A na ścianie wyświetla nie tylko ekran komputera ale kawał pokoju z telewizorem na którym ten ekran jest, półki z książkami, kasety, widać że w magnetofonie się kręci taśma, plakaty na ścianie Kajagoogoo, Madonna, Papa Dance, Kasia Figura. ;) To dopiero będzie klimat. :D

Myślicie że przesadzam? - Niedawno policzyłem i wychodzi mi że mój obecny skromny przecież laptop jest ok 5 tys razy szybszy od mojego pierwszego kompa i ma 16 tys razy więcej pamięci. Jego standardowy nośnik jest ponad milion razy pojemniejszy i kilkadziesiąt tysięcy razy szybszy. Standardowo pamięć ekranu ma 8 tys razy większą a przeciętna gra zajmuje dziesiątki tysięcy razy więcej miejsca. Ot tak, na marginesie. A to tylko 20 lat różnicy. To pomnóżcie sobie o tyle wasze obecne konfigi i co wam wyjdzie? I co to będzie potrafić?

No co? Ja też się rozmarzyłem. ;) Niedawno gdzieś przeczytałem że jeśli nie boisz się swoich marzeń to znaczy że są za małe. ;) Niektórzy mawiają że dla odważnych świat należy inni że "Sky is the limit" - bzdura, skoro niektórzy byli już na księżycu, to ja tam spędzę emeryturę. :D
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: Tygrys w 2014.01.09, 08:39:53
mad1: Gratuluje pierwszej gry. Refleks przy niej trzeba mieć ;)
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: Abrimaal w 2014.01.10, 20:47:14
Proponuję tak. Jeśli PAUSE 0 w linii 160 źle działa, to można wstawić pętlę opóźniającą.
30 LET d=INT (97+RND*25)
60 PRINT AT 1,0;"Wcisnij '";CHR$ d
70 LET i$=INKEY$: IF i$="" THEN GO TO 70
120 IF i$=CHR$ d THEN LET n$="OK": GO TO 160
150 LET n$="Blad"
160 PRINT n$: PAUSE 0: PAUSE 100: CLS: GO TO 30
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2021.10.22, 15:28:58
Witam ponownie,
Zamierzam napisać nową gierką żużlową. Pomysł chcę przenieść z gry "kreski" na PC, w którą wielu z was miało okazję grać w zamierzchłych czasach.
Mam pytanie o koncepcję algorytmu jazdy i skrętu w lewo. Założenia na początek są takie:
1. Po starcie samoistnie rysuje mi się linia jazdy(ruch jednostajny)
2. Sterowanie jednym klawiszem. Mogę skręcać tylko lewo gdy przytrzymam(nacisnę) klawisz. Gdy go puszczę "motor" jedzie prosto(w kierunku w który skręciłem). Generalnie ma to polegać na jeżdżeniu w kółko.

Teraz pytania:
Jak najlepiej nadać ruch? rysować PLOTEM?
Jak mogłaby wtedy wyglądać ogólna koncepcja algorytmu do otrzymania współrzędnych w celu rysowania linii jazdy?

Moje próby napisania takiego algorytmu w Basicu spełzy na niczym dlatego zwracam z pomocą do was. 
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2022.03.21, 08:12:43
Mam pytanie odnośnie komendy PAUSE w Basicu. Domyślnie naciśniecie dowolnego klawisza przerywa taką pauze. Co zrobić by naciśnięcie klawisza nie przerywało pauzy tylko nadal ona trwała przez zdefiniowany pierwotnie czas?
Jeśli nie da się tego zrobić za pomocą PAUSE to może jest jakiś inny sposób w Basicu?
 
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: trojacek w 2022.03.21, 09:45:04
Prosto to się tak nie da. Nie przypominam sobie żadnego POKE na zablokowanie wszystkich klawiszy.
A o jakim czasie mowa? I o jaką precyzję? Bo można po prostu zrobić nic nierobiącą pętlę o zadanej liczbie cykli. Ale jeśli ważna jest precyzja, to lepiej użyć zmiennej systemowej liczącej ramki.
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: matofesi w 2022.03.21, 12:27:54
PAUSE wykonuje cykliczne HALT synchronizując się z ramką i po nim sprawdza klawiaturę i jeśli nic nie jest wciśnięte zamyka wewnętrzną pętlę.

Rozwiązaniem problemu przerwania PAUSE przy chęci zachowania dokładności czasowej jest użycie PAUSE 1 w pętli FOR-NEXT:

10 FOR i=1 TO 100 : PAUSE 1 : NEXT i

PAUSE 1 nie sprawdza klawiatury i trwa "dokładnie" 1/50 sekundy, pętla wyrabia się w jednej ramce i całość daje - moim zdaniem - wymagany efekt nawet jeśli cały czas będziemy trzymali wciśnięty jakiś klawisz.
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2023.02.28, 20:38:54
Mam pytanie co do dźwięków/muzyki w Basicu Spectruma. Czy jest możliwość generowania dźwięków komendą BEEP ale by jednocześnie wykonywały się inne instrukcje? Innymi słowy jak zrobić w basicu by grała muzyczka i równolegle można było robić inne rzeczy?
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: Tygrys w 2023.02.28, 21:02:14
Nie, nie można. Podczas wykonywania BEEP .. wykonuje się tylko BEEP.

Jeżeli chcesz mieć muzykę to musisz bardzo mocno pomieszać komendy BEEP z innymi instrukcjami, tak aby czas wykonywania tych innych był na tyle krótki, aby dźwięki z głośniczka stanowiły rodzaj muzyki.

W przypadku efektów dźwiękowych jako wynik naciśnięcie klawisza czy innej akcji jest znany stary sposób, np taki:
10 FOR i=0 TO 10
20 BEEP .01,i*1
50 NEXT i

Dobór czasu trwania oraz wysokości dźwięku musisz sobie dobrać sam, lub też stworzyć tablicę i z niej czytać dane... lub też wprowadzić szereg BEEPów po kolei.

Mam nadzieję że chociaż trochę pomogłem ;) Jeżeli nie - będziemy myśleć dalej.\
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: damik w 2023.02.28, 21:17:51
Lepiej do muzyczki w trakcie gry stosować generatory AY'ka bo nie wstrzymują wykonywania programu podczas generowania dźwięku, jednak tutaj trzeba by bawić się już instrukcjami OUT programując bezpośrednio jego rejestry sekwencyjnie np w głównej pętli programu z jakiejś tablicy DATA lub wcześniej załadować te dane rejestrów do DIM.
BEEP w Basic'u będzie Ci dość mocno spowalniał program a żeby tego uniknąć trzeba będzie stosować bardzo krótkie milisekundowe dźwięki, a jeśli dźwięk/ton miałby trwać dłużej to trzeba by go szatkować co daje efekt popierdywania pisząc to w samym Basicu.  ;D
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: mad1 w 2023.02.28, 21:48:43
Dziękuję za odpowiedzi, szczerze mówiąc spodziewałem się takich ale jednocześnie miałem nadzieję, że jest jakiś patent. Tygrys dzięki za podpowiedź,  potestuję i zobaczę czy gra jest warta świeczki. Damik AY to póki co dla mnie zbyt odległy temat na dziś, nie chce wchodzić w te rejony. Jeśli program znacznie ucierpi na szybkości to rzeczywiście nie ma sensu się w to bawić. 
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: damik w 2023.02.28, 22:39:05
Patent jakiś chyba jest, ale wymaga już raczej znajomości assemblera i ogarnięcia mechanizmu kontroli przerwań procka Z80 ;)
Jednak to już temat do innego wątku... ale co ja tam się będę wymądrzał kiedy są tu na forum już od tego specjaliści w kodowaniu (ja tam tylko ogarniam mały śrubokręt i lutownicę)  8)

Kiedyś już gdzieś widziałem jakąś gotową procedurkę w kodzie maszynowym ładowaną z Basic'a w kodzie maszynowym grającą muzyczki w tle na przerwaniach podczas wykonywania Basic'owych programów, tylko teraz już nie jestem pewien czy to było na ZX Spectrum czy na Amstrad CPC.
Może ktoś podpowie gotowca... ;)
Tytuł: Odp: Pytania od bardzo początkującego
Wiadomość wysłana przez: matofesi w 2023.03.01, 08:40:29
Prosta sprawa - w samym BASICu się nie da i nie ma co kombinować - BEEP wyłącza przerwania, żeby dźwięk brzmiał "przyzwoicie". Jak się zmodyfikuje ROM i usunie to wyłączanie to BEEP dalej zajmuje tyle samo czasu i zatrzymuje wykonanie programu, ale za to przerwania działają a to powoduje, że BEEP "pierdzi" ;)
Można oczywiście zrobić jakiś player w ASMie beepający na przerwaniach, ale żeby brzmiał sensownie będzie zjadał kosmiczne ilości procesora a efekt nadal będzie taki sobie. Proste efekty można uzyskać metodą sugerowaną przez Tygrysa, ale cokolwiek bardziej skomplikowanego albo zje procesor albo będzie brzmiało mocno tak sobie. Albo oba na raz.
AY można "popychać" OUTami ale to też raczej do prostych efektów - cokolwiek więcej będzie wymagało na tyle dużo OUTów, że znowu zje procesor a efekt będzie średni. Sensowne rozwiązanie to muzyczka AY grająca na przerwaniach (da się zrobić stosunkowo prosto) oraz program w BASICu unikający instrukcji wyłączających przerwania.