OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 19.03.2024, 04:45

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 43 ]  Přejít na stránku 1, 2, 3  Další
Autor Zpráva
PříspěvekNapsal: 23.08.2013, 09:42 
Offline
Site Admin
Uživatelský avatar

Registrován: 05.04.2013, 15:29
Příspěvky: 2385
Bydliště: Starý Vestec
Has thanked: 423 times
Been thanked: 444 times
Sleduju vedlejší vlákno a jsem z toho tumpachovej :oops: Kdysi jsem něco jakž takž v assembleru uměl, ale dneska si pamatuju sotva ldir. Už nevím co dělá co, co kterej registr, zásobník, čítač... Mým kdysi vrcholným počinem byly ovladače pro BT-100. Napsal jsem několik různých. Pak nějaký další utilitky a kravinky. Dneska už neumím nic... A to je průšvih. Chtěl bych si idělat utilitu, která je schopná zapsat DSK(obyčejný, žádný e-dsk) na ZXS+3 z DivIDE na disk a naopak. A pak ještě něco jednoduššího. Kopírku z kazeťáku na +3 disk a zpět. Jo a vůbec by nevadilo, kdyby to jelo přes rutiny romky, šlo by to pak použít s divide s fatware 128 od Velesofta. Prosím ale v tomhle vlákně minimálně odkazovat. A když už bude odkaz, poprosil byl o ten komfort, A vemte to klíďo aby byl v českém případně slovenském jazyce. Má to být fakt pro začátečníky. A vemte to klíďo úplně od začátku (bez ohledu na mé vytyčené cíle) instrukci po instrukci, co dělá atd... Myslím si, že když to bude hodně polopatický, přidá se více začátečníků...

_________________
Amiga Sinclair Didaktik Sam_Coupé Enterprise SAM440ep μA1 MacBook_Air Mac_Mini_MOS CPC Atari MSX Acorn C64 RetroPC

http://party.oldcomp.cz/


Nahoru
 Profil  
 
PříspěvekNapsal: 23.08.2013, 09:46 
Offline
Site Admin
Uživatelský avatar

Registrován: 05.04.2013, 15:29
Příspěvky: 2385
Bydliště: Starý Vestec
Has thanked: 423 times
Been thanked: 444 times
Pro začátek mi úplně bude stačit, jak napsat v assembleru rutinu, která použije ROMku a nahraje jakýkoliv blok dat. (hlavičku, data) Prostě pustim kazeťák a nahraje to první věc, která tam bude.

_________________
Amiga Sinclair Didaktik Sam_Coupé Enterprise SAM440ep μA1 MacBook_Air Mac_Mini_MOS CPC Atari MSX Acorn C64 RetroPC

http://party.oldcomp.cz/


Nahoru
 Profil  
 
PříspěvekNapsal: 23.08.2013, 18:56 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3636
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Starej_Mraf píše:
Chtěl bych si idělat utilitu, která je schopná zapsat DSK(obyčejný, žádný e-dsk) na ZXS+3 z DivIDE na disk a naopak. A pak ještě něco jednoduššího. Kopírku z kazeťáku na +3 disk a zpět. Jo a vůbec by nevadilo, kdyby to jelo přes rutiny romky, šlo by to pak použít s divide s fatware 128 od Velesofta.
No, myslim ze toto nie su tak celkom uplne zaciatocnicke projekty ;)
Starej_Mraf píše:
Pro začátek mi úplně bude stačit, jak napsat v assembleru rutinu, která použije ROMku a nahraje jakýkoliv blok dat. (hlavičku, data) Prostě pustim kazeťák a nahraje to první věc, která tam bude.
A slubis, ze ked sem nieco napisem, tak nezalozis dalsie vlakno nazvane napr. Assembler pro fakt úplný začátečníky ? :)


Nahoru
 Profil  
 
PříspěvekNapsal: 24.08.2013, 17:11 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3636
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Starej_Mraf píše:
Pro začátek mi úplně bude stačit, jak napsat v assembleru rutinu, která použije ROMku a nahraje jakýkoliv blok dat. (hlavičku, data) Prostě pustim kazeťák a nahraje to první věc, která tam bude.
Load rutinka romky #556 zial nie je programovana na to aby nahrala akykolvek blok dat. Vzdy treba zadat aky flagbajt ocakavas (#00=hlavicka, #FF=telo), a pokial blok na paske nema tento flagbajt, load rutinka rovno vrati chybu a ani sa nesnazi pokracovat v nahravani bloku.

Len pre pripomenutie, load rutinka na adrese #556 ocakava taketo parametre:
IX = adresa kam sa maju nahravat data bajty (alebo odkial sa ma verifikovat)
DE = dlzka nahravaneho bloku alebo pocet data bajtov bez flagbajtu a parity
CY = 0..rob iba verify, 1..rob skutocny load
A = flagbajt bloku

Ale existuje trik ako rutinku prinutit ignorovat flagbajt: Standartne volanie na adresu #556, avsak s hodnotou DE=#FFXX. Flagbajt sa potom normalne ulozi do pameti ako keby to bol prvy datovy bajt. Toto riesenie ma tu nevyhodu, ze ak mas v pameti vyhradeny nejaky buffer pre nahravku, a nahravka bude dlhsia, tak prepise oblast za bufferom. Lepsie je preto do DE vlozit iba dlzku buffera. Pri dlzke bloku vecsej ako DE bajtov load rutinka predcasne skonci nahravanie, cim ochrani oblast za bufferom. V takom pripade ale nemozeme volat rutinku od adresy #556, ale treba nastavit ZERO flag (napr. instrukciou CP A,A), urobit EX AF,AF a rutinku zavolat od adresy #559.

Po nahrati bloku kratsieho ako DE bajtov nam sice rutinka vrati priznak ze nastala chyba (CY=0) avsak my vieme, ze chyba moze byt sposobena tym, ze rutinka nedostala z kazety tolko bajtov, kolko sme jej podla hodnoty DE na zaciatku naslubovali. Musime preto nejak inak zistit, ci je to preto lebo bajtov v bloku bolo menej ako DE, alebo ci nastal skutocny tape loading error. Na toto vyuzijeme skutocnost ze load rutinka nam v registri H pocita paritu nahravky. Ak je na konci po navrate z rutinky H=#00, znamena to, ze parita prave nahraneho bloku je v poriadku, a teda (je pravdepodobne, ze) blok sa nahral spravne. Ak je H<>#00 tak je zle a urcite mame tape loading error.

Pokial je teda blok nahraty spravne, v pameti (od adresy ktoru sme vlozili do IX) mame ulozeny najprv flagbajt bloku, potom vsetky datove bajty bloku a na koniec tu mame aj paritny bajt. Hodnota DE sa presne o tento celkovy pocet nahratych bajtov zmensi, takze podla zmeny DE mozeme vypocitat, aku dlzku ma nahraty blok.

Tento popisany sposob volania load rutinky vyuzivaju stare kazetove kopiraky pre 48k, ktore este nemali kompresiu. Napr. Mr.Copy+, Free copy, Copy copy.

Poznamka na zaver: Tento sposob nahravania blokov funguje len pri loadovani z realnej kazety. Tape emulacie v roznych diskovych systemoch obvyke neumoznuju takto "nadivoko" nahravat bloky.


Nahoru
 Profil  
 
PříspěvekNapsal: 13.10.2013, 21:43 
Offline
Kecálek
Uživatelský avatar

Registrován: 18.05.2013, 11:46
Příspěvky: 180
Bydliště: Ústí nad Orlicí
Has thanked: 10 times
Been thanked: 62 times
Rád bych pochopil, jak funguje stránkování na ZX 128K, nemáte někdo tip na web, kde by tohle bylo popsáno a hlavně s praktickými ukázkami kódu v assembleru s podrobným komentářem pro úplné začátečníky? :-D

Pro začátek by mohla stačit i tato praktická ukázka:
1) Nastavit si banku 7 (druhou VRAM)
2) Zapsat do ní jeden byte třeba s hodnotou $FF
3) Prohodit obě vramky, aby se výsledek vykreslil na obrazovku

z toho už bych snad pochopil, co sám dělám blbě :).

_________________
https://zx-spectrum.cz
https://maps.speccy.cz
https://www.zx-spectrum.cz/collection/
https://cs.speccy.cz
https://spectrumcomputing.co.uk/


Nahoru
 Profil  
 
PříspěvekNapsal: 13.10.2013, 22:06 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3636
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
pavero píše:
Pro začátek by mohla stačit i tato praktická ukázka:
1) Nastavit si banku 7 (druhou VRAM)
2) Zapsat do ní jeden byte třeba s hodnotou $FF
3) Prohodit obě vramky, aby se výsledek vykreslil na obrazovku
Druha videoramka sa nachadza v 128k banka cislo 7 od adresy #C000. Cize na #C000 zacinaju pixely a na #D800 zacinaju atributy.
Malicky priklad:
Kód:
ld  bc,#7ffd  128k strankovaci port
ld  a,#17     Banka cislo 7 v ktorej je druha videoramka
out (c),a
ld  a,#FF     Bajt #FF
ld  (#D800),a ulozime do laveho horneho atributu druhej videoram
ld  a,#1F     Banka 7 + zobrazovanie druhej videoramky
out (c),a
Samozrejme zasobnik musis mat mimo hornych 16kB, aby si o neho neprisiel ked sa prepne pametova banka.


Nahoru
 Profil  
 
PříspěvekNapsal: 14.10.2013, 14:00 
Offline
Kecálek
Uživatelský avatar

Registrován: 18.05.2013, 11:46
Příspěvky: 180
Bydliště: Ústí nad Orlicí
Has thanked: 10 times
Been thanked: 62 times
Díky. Jaký je v takovém případě vhodný prostor pro umístění zásobníku, pouze $8000 až $BFFF? Rozumím tomu správně, že paměť $4000 - $7FFF se mi po nastavení OUT $7FFD,$31 přepíše obsahem banky 7?

_________________
https://zx-spectrum.cz
https://maps.speccy.cz
https://www.zx-spectrum.cz/collection/
https://cs.speccy.cz
https://spectrumcomputing.co.uk/


Nahoru
 Profil  
 
PříspěvekNapsal: 14.10.2013, 14:30 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3636
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
pavero píše:
Díky. Jaký je v takovém případě vhodný prostor pro umístění zásobníku, pouze $8000 až $BFFF?
Hocikde medzi #4000 az #C000 ;)
pavero píše:
Rozumím tomu správně, že paměť $4000 - $7FFF se mi po nastavení OUT $7FFD,$31 přepíše obsahem banky 7?
Rozumiest tomu zle. Pamet v rozsahu od #4000-#BFFF sa prepinanim baniek na #7FFD nijak nemeni.
Spectrum 128k prepina ram banky iba v hornych 16kB, t.j. #C000 - #FFFF. Da sa povedat, ze hornych 16kB mas osemkrat, a ktoru z tych osmych baniek chces mat prave pristupnu procesoru, urcuju tri najnizsie bity na porte #7FFD.


Nahoru
 Profil  
 
PříspěvekNapsal: 14.10.2013, 18:39 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3636
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
pavero píše:
Rozumím tomu správně, že paměť $4000 - $7FFF se mi po nastavení OUT $7FFD,$31 přepíše obsahem banky 7?
No mozno to chce trosku podrobnejsie vysvetlenie. Vykonanim OUT sa v pameti nikde nic neprepisuje, iba sa urcuje, ktora cast pameti bude pristupna pre CPU a ktora cast pre ULA. Spodne tri bity 0,1,2 na porte #7FFD urcuju, ktora z osmych 16kB ram baniek sa objavi v hornych 16 kB adresneho priestoru procesora. Bit 3 na porte #7FFD zase urcuje, ci bude ULA zobrazovat klasicku standartnu spektracku videoramku od adresy #4000 (bit3=0), alebo bude zobrazovat tu druhu videoramku (bit3=1). Druha videoramka sa VZDY nachadza na zaciatku ram banky cislo 7. To znamena, ze ak chces pracovat s touto druhou videoramkou, musis procesoru spristupnit banku cislo 7 (bity012=111). Ak sa zobrazuje druha videoramka (bit3=1) a procesor ma prave pristup k inej banke ako 7 (bity012 su ine ako 111), tak zobrazovana videoramka je de-fakto uplne mimo adresoveho priestoru procesora a celych 48kB ramky od #4000 az do #FFFF je plne k dispozicii procesoru ktory si tam moze robit co chce, na obraze sa to nijak neprejavi.


Nahoru
 Profil  
 
PříspěvekNapsal: 14.10.2013, 21:19 
Offline
Kecálek
Uživatelský avatar

Registrován: 18.05.2013, 11:46
Příspěvky: 180
Bydliště: Ústí nad Orlicí
Has thanked: 10 times
Been thanked: 62 times
Díky za objasnění, už mi to začíná do sebe zapadat :).

A co přerušení, mělo by se zakazovat když se přehazují banky?

_________________
https://zx-spectrum.cz
https://maps.speccy.cz
https://www.zx-spectrum.cz/collection/
https://cs.speccy.cz
https://spectrumcomputing.co.uk/


Nahoru
 Profil  
 
PříspěvekNapsal: 14.10.2013, 21:36 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3636
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
pavero píše:
A co přerušení, mělo by se zakazovat když se přehazují banky?
Presne ako zasobnik - rutinka a aj pripadny vektor (ak je v ramke) musi byt v "nedotknutej" pameti #4000-#BFFF. Vektor, ak je v ramke, doporucujem niekde na #8000-#BFFF aby to neprsalo. A potom si prerusenie a strankovanie nebudu navzajom zavadzat.


Nahoru
 Profil  
 
PříspěvekNapsal: 27.10.2013, 16:27 
Offline
Kecálek
Uživatelský avatar

Registrován: 18.05.2013, 11:46
Příspěvky: 180
Bydliště: Ústí nad Orlicí
Has thanked: 10 times
Been thanked: 62 times
Lze nějak napřímo číst naposledy zapsanou hodnotu na portu $7ffd? Nebo si ji musím ukládat někam bokem?

Zkoušel jsem následující obecné řešení, ale to nefunguje (vrací mi stále 255).

Kód:
ld bc,$7ffd
in a,(c)

_________________
https://zx-spectrum.cz
https://maps.speccy.cz
https://www.zx-spectrum.cz/collection/
https://cs.speccy.cz
https://spectrumcomputing.co.uk/


Nahoru
 Profil  
 
PříspěvekNapsal: 27.10.2013, 17:00 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3636
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
pavero píše:
Lze nějak napřímo číst naposledy zapsanou hodnotu na portu $7ffd? Nebo si ji musím ukládat někam bokem?
Zkoušel jsem následující obecné řešení, ale to nefunguje (vrací mi stále 255).
Kód:
ld bc,$7ffd
in a,(c)

Neda sa, musis si ju ukladat niekam bokom.

PS1: z tohto portu nikdy necitaj. Dekoder tohto portu v Spektre 128 nedekoduje signaly RD a WR a akykolvek pristup na port povazuje za zapis. To znamena - pri citani sa na port zapise stav aky sa prave (nahodou) nachadza na datovej zbernici. Obvykle je to hodnota 255 (pretoze pull-up odpory), ale v oblasti zobrazovania paperu to moze byt aj hodnota niektoreho atributu z videoramky (ktory prave citala ULA). Na Spektrach +2A a +3 to bude iba 255 pretoze ma inak robene citanie z videoramky.

PS2: Ked citanie z tohto vrati 255 tak tato hodnota (ako som uz vyssie napisal) sa zaroven zapise na port. Lenze 255 znamena, ze nastrankuju banku 7, zapne druhu videoramku a zaroven tento port zamkne, takze tato konfiguracia bude natvrdo nastavena az do najblizsieho resetu / vypnutia.


Nahoru
 Profil  
 
PříspěvekNapsal: 10.11.2013, 15:16 
Offline
Kecálek
Uživatelský avatar

Registrován: 18.05.2013, 11:46
Příspěvky: 180
Bydliště: Ústí nad Orlicí
Has thanked: 10 times
Been thanked: 62 times
Jak lze spolehlivě otestovat, zda spouštěný kód běží na Spectru 48K nebo 128K? Ať už se jedná o 128K/+2/+3 nehraje roli.

_________________
https://zx-spectrum.cz
https://maps.speccy.cz
https://www.zx-spectrum.cz/collection/
https://cs.speccy.cz
https://spectrumcomputing.co.uk/


Nahoru
 Profil  
 
PříspěvekNapsal: 10.11.2013, 17:26 
Offline
Pan Štábní

Registrován: 12.05.2013, 22:24
Příspěvky: 1504
Bydliště: u Prahy
Has thanked: 44 times
Been thanked: 380 times
Závisí na tom, jak definuješ rozdíl.
Pokud jde o to, otestovat přítomnost stránkování, pak
1) předpokládejme aktuální stránku 0 (kdyžtak ji nastavme)
2) zapišme do ní bajt A, otestujme, zda se korektně zapsal
3) nastavme stránku jinou (třeba 1)
5) zapišme do ní na stejnou adresu bajt B různý od A, zkontrolujme, zda se korektně zapsal
6) nastavme zpět stránku 0, zkontrolujme, zda místo bajtu B máme opět bajt A


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 43 ]  Přejít na stránku 1, 2, 3  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
cron
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz