OldComp.cz

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


Právě je 28.03.2024, 10:41

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 55 ]  Přejít na stránku Předchozí  1, 2, 3, 4  Další
Autor Zpráva
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 28.12.2013, 21:49 
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
Opravuji, každé čtyři znaky se vejdou do tří bajtů.

_________________
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ředmět příspěvku: Re: Assembler
PříspěvekNapsal: 29.12.2013, 16:32 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
pavero píše:
Milsa píše:
Ja mám otázku, niekde som videl, že EXX vymení aj AF a AF' a inde, že tieto registre ostanú nedotknuté. Ako je to teda?

Aspoň co já mám vyzkoušené (minimálně v emulátorech), tak instrukce EXX nemění AF/AF', od toho je EX AF,AF'
Samozrejme, EXX meni iba BC,DE,HL. Pre vymenu AF treba pouzit EX AF,AF. Takze napriklad ak chcem aby hlavny program pouzival jednu sadu registrov AF BC DE HL, a rutinka v prerusni druhu sadu, tak na zaciatku aj na konci prerusovacej rutinky musim pouzit obidve tieto instrukcie:
Kód:
int:
  EXX
  EX AF,AF
  .....
  EX AF,AF
  EXX
  EI
  RET
Vzajomne poradie oboch instrukcii EXX a EX AF,AF nie je kriticke (kedze ich mnoziny posobenia su plne disjunktné), preto ja osobne vzdy pouzivam take ich poradie, ktore v zdrojaku vyzera esteticky lepsie :)

PS1: Uz som sa u ludi zoparkrat stretol s pohladom ze zalozne registre su nejake "ine" a pred navratom z programu ich treba zase "odstrankovat" aby cinnost pokracovala s hlavnymi registrami. Zaujimavy pohlad, ale nespravny. Obidve sady su absolutne rovnocenne, nie je medzi nimi ziadna "hlavna" alebo "zalozna". Je preto uuuplne jedno, ci ich nejaky program necha v skutocnosti vymenene alebo nie. Dolezite je jedine to aby pripadne potrebne hodnoty (vracane z programu) boli v spravnej registrovej banke.

PS2: Pokial je na ZX spektre nejaky strojak volany z basicu funkciou USR, v registri HL' (HL ktore prave nie je "nastrankovane") je hodnota #2758 a tato hodnota tam musi byt aj pri navrate nazad do basicu. Je preto uplne jedno, ci strojak vobec nepouzije EXX (a tym HL' nezmeni) alebo pouzije EXX lubovolny pocet (parny ci neparny) krat (a pomeni vsetky registre) ale pred navratom urobi LD HL,#2758:EXX:RET - v oboch pripadoch to bude spravne.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 29.12.2013, 18:00 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
pavero píše:
Tak obecně to lze využít na čtení dat v takovémto formátu uložené. Asi klasický příklad jsou texty, kde používám pouze abecedu, tedy mi stačí jen 32 kombinací. Například Dizzy používá něco obdobného, byť tam je to ještě trochu komplikovanější.

Sám to chci použít ve své hře na uložení textů, u kterých nechci, aby byly snadno odhalitelné v hexaeditoru. Vím, že na to by mi dobře posloužila třeba i instrukce cpl, popřípadě nějaké rotace. Zároveň bych tím ale ušetřil i paměť. Asi jako vhodný kompromis použiji 6-bitů na znak, kdy každé tři znaky se vejdou do dvou bajtů, takže čtecí rutinka bude jednoduchá a krátká.
Aj keby si pouzil 5 bitov na znak, rutinku to nijak neskomplikuje ;)

Btw. prave takyto "5-bitovy" sposob ulozenia textu som pouzil vo svojom intre StoryTalker (video). Text nacitavam z pameti takouto rutinkou:
Kód:
getznk  ld      b,#05
        xor     a
getrot  rl      c
        jr      nz,getbit
        ld      c,(hl)
        inc     hl
        scf
        rl      c
getbit  adc     a,a
        djnz    getrot
Rutinka postupne pri kazdom zavolani nacita jednu 5-bitovu hodnotu z pameti a vrati ju v A. Funguje tak, ze si najprv do registra C nacita cely bajt z pameti, a z tohto bajtu potom narotuje 5 bitov do akumulatora. Ked sa (napr. pri dalsom zavolani) minu vsetky bity v registri C, nacita sa do C novy bajt z pameti a mozu sa vyberat dalsie bity. Rutinka sa da pouzit na vseobecny pocet bitov na jeden nacitavany znak, staci zmenit konstantu #05. Pred prvym zavolanim rutinky treba C inicializovat na hodnotu #00 alebo #80 a do HL nastavit adresu prveho bajtu kde v pameti zacina takto skomprimovany text. A potom pocas nacitavania textu po znakoch zachovat pre rutinku registre C a HL.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 29.12.2013, 23:33 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
pavero píše:
Za jaké situace je příznak ZERO nastaven na 1 u instrukce RL?
Pri vsetkych rotaciach po shifte #DD sa zero nastavuje podla obvyklych pravidiel - nastavi sa ak je vysledkom operacie (v tomto pripade rotacie) nulovy bajt. Napr. ak mas v C hodnotu #80, nie je nastavene carry a urobis RL C, carry sa zarotuje do nulteho bitu C a tym padom bude v nultom bite C nula. A najvyssi jednotkovy bit vypadne prec, v celom registri C budu vsetky bity nulove a nastavi sa zero.

pavero píše:
k čemu je tam dobrá ta instrukce scf, když za ní hned následuje rl c, která příznak carry přenastaví dle aktuální situace?
Avsak ak je carry pred rotaciou nastavene, potom po rotacii bude nulty bit C nastaveny na jednotku. A zero nastavene tym padom byt nemoze.

Tato moja rutinka prave podla priznaku zero testuje, ci uz vyrotovala z registra C vsetky uzitocne bity a ci ho treba znovu naplnit dalsim bajtom. Na zaciatku pri prvom zavolani rutinky (ked je C nastavene na #80) po XOR A nebude carry, a rotaciou vznikne nula, takze C sa naplni bajtom z ramky. Nasledne, hned po vyrotovani prveho najvyssieho bitu prveho znaku, sa vdaka tomu SCF dostane do nulteho bitu jednicka, a ta zabezpeci, ze nasledujucich sedem rotacii nemoze nastavit priznak zero (a register C nebude najplnany z ramky). A az tento nas jednickovy bit vypadne na druhej strane registra C von, co znamena, ze v registri C uz nie su ziadne bity nasich znakov, nastavi sa zero a rutinka podla toho vie, ze musi C znovu naplnit dalsimi datami z ramky.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 30.12.2013, 00:17 
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
Aj, teď mi to konečně docvaklo, vykonání adc a,a vždy v tomto případě vynuluje CARRY, takže do C se pak zprava sypou samé nuly, takže rutinka ví, kdy má skočit na další byte, prostě geniální. :)

A intro StoryTalker je taky boží!

_________________
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ředmět příspěvku: Re: Assembler
PříspěvekNapsal: 08.01.2014, 18:17 
Offline
Pan Generální
Uživatelský avatar

Registrován: 11.06.2013, 15:27
Příspěvky: 3025
Has thanked: 2191 times
Been thanked: 894 times
dex píše:
Milsa píše:
Kedysi sme mali na Didaktik Game spektrácky program na výuku assembleru. Nahrávalo sa to z kazety postupne po lekciách. Bolo to v češtine. Myslím, že obsahovo aj pedagogicky to bol výborný program. Nemá to niekto? Samozrejme aj s návodom ako to nahrať do emulátora.

Šlo o počeštěnou verzi tohoto:
http://www.worldofspectrum.org/infoseekid.cgi?id=0008031

Tu dole uprostred?
http://sam.speccy.cz/assembler.html

_________________
// na co myslím, když sedím u oldkompů: celý příběh


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 22.01.2014, 13:00 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Milsa píše:
Mal by som otázku na znalcov procesora Z80. Ako procesor vyhodnotí túto inštrukciu?
FD ED 40 - Ide o to, že prefix FD sa s prefixom ED nedá použiť. Sú teda dve možnosti:
a) FD ED sa vyhodnotí ako NOP s 8 T-States (neviem presný preklad) a potom sa vykoná inštrukcia 40, čiže LD B,B
b) FD sa ignoruje (tak ako napr. pri inštrukcii FD 01 12 34, čiže LD BC,3412) čiže NOP so 4 T-States a vykoná sa inštrukcia ED 40, čiže IN B,(C)
b) je spravne. Pri instrukciach po #ED sa pripadne predchadzajuce prefixy #DD,#FD zvysoka odignoruju. Z hladiska poctu taktov je to rovnocenne ako keby sa pred danou instrukciou namiesto #DD alebo #FD vykonal klasicky 4T NOP.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 01.02.2014, 23:40 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Milsa píše:
Vie mi niekto dať nejaký link, kde je presne popísané chovanie klopných obvodov IFF1 a IFF2 a ako presne funguje prerušenie v stave IM0, IM1, IM2? Niečo som našiel, ale stále tomu dostatočne nerozumiem.
DI ... vynuluje obidva IFF1 aj IFF2.
EI ... nastavi obidva IFF1 aj IFF2.
Signal NMI ... vynuluje iba IFF1
RETN ... stav IFF2 presunie do IFF1.
LD A,R a LD A,I ... stav IFF2 presunie do P/V flagu.
Signal INT ... Ak IFF1=1 tak vynuluje IFF1 aj IFF2 a skoci na rutinku prerusenia, inak nic.

Ludsky napisane:
Pri normalnej cinnosti (hlavny program, obsluha maskovatelneho prerusenia) su IFF1 a IFF2 nastavovane vzdy rovnako.
Pri nemaskovatelnom preruseni sa vynuluje iba IFF1 aby sa nevykonalo pripadne INT avsak pri navrate RETN sa stav IFF1 zase obnovi zo zalohy IFF2 - tym padom sa po navrate z NMI zachova pred tym nastaveny stav DI/EI.
LD A,x (x=I alebo R) cita stav IFF2, takze v NMI rutinke je mozne si precitat, ci pred prichodom NMI bolo prerusenie zakazane alebo povolene.

Mody prerusenia:
IM0 ... po INT ocakava na zbernici instrukciu co ma robit. Obvykle to byva RST xx co znamena zavolanie podprogramu na adresu xx. Na beznych Spektrach, kde su na datovej zbernici odpory o +5V, sa precita instrukcia 255 co je RST #38.
IM1 ... nic zo zbernice necaka a rovno natvrdo vykona RST #38, t.j. zavola rutinku prerusenia na adrese #38.
IM2 ... precita z datovej zbernice bajt - to bude nizsi bajt adresy, vezme hodnotu registra I - to bude vyssi bajt adresy. Potom nacita z tejto adresy v pameti dva bajty ktore hovoria kam ma skocit na rutinku prerusenia. Cize v podstate sa akoze vykona takyto kod:
Kód:
ld l,bajt_z_datovej_zbernice
ld h,i
ld e,(hl)
inc hl
ld d,(hl)
ex de,hl
push navratova_adresa_do_preruseneho_programu
jp (hl)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 02.02.2014, 15:14 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
Po prečítaní tohto už viem, že čo mi nebolo jasné. Išlo o to, že som nechápal význam načo je IFF1 a IFF2, keď sa programovo nastavujú obidva a prerušenia si ich len prehadzujú. Teraz už chápem, že ide o to, že do IFF2 sa ukladá stav IFF1 počas prerušenia, aby sa vrátila pôvodná hodnota nastavenia povolenia prerušenia. Ďakujem za kvalitné odborné vysvetlenie.

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 07.02.2014, 21:33 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Milsa píše:
Ešte ma napadlo: Ak je procesor v stave zakázaného prerušenia a príde signál na prerušenie
a) pamätá si túto žiadosť a vykoná prerušenie len čo to bude možné
Nepameta.
Milsa píše:
b) pokiaľ trvá signál na prerušenie, dovtedy je možné, že sa vykoná, ak sa prerušenie povolí
Pri signale INT sa netestuje hrana, ale uroven. Takze je jedno kedy bola nabezna hrana, ak sa zrovna skonci instrukcia, prerusenie je povolene a INT je v log 0 tak sa prerusenie zavola.
Milsa píše:
c) dôležitý je nábeh signálu na prerušenie, ak je vtedy zakázané, tak hoci aj signál na prerušenie trvá, po povolení sa prerušenie nevykoná
Ak je prerusenie povolene (IFF1=1), uroven signalu INT sa "skenuje" po dokonceni kazdej instrukcie (u blokovych instrukcii s opakovanim po kazdej iteracii). Ak je INT=0, potom sa prerusenie zavola, inak nie.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 20.09.2020, 21:50 
Offline
Radil

Registrován: 18.10.2013, 15:30
Příspěvky: 263
Bydliště: Oakland, Slovakia
Has thanked: 25 times
Been thanked: 60 times
Moze mi niekto vysvetlit nasledujuce?

Najskor kratka cast programu:
Kód:
ld   a,127
in   a,(254)
cp   252
ret  z
Otazka: Naco sa do registra A uklada hodnota 127, ked hned na to sa do registra A uklada hodnota z portu 254?

Dakujem

_________________
Didaktik Gama | ZX Spectrum 128 | ZX Diskface Quick A | BetaDisk 128C Interface | D40 & D80 | divIDE | Interface M/P | Multiface 128 (GOTDJ) | Gama Breaker | D80mini

"Kvalita a stabilita Windows XP se Microsoftu nevyplatila, stal se takovou temnou připomínkou toho, co se stane, když odvedete svou práci moc dobře."


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 20.09.2020, 22:10 
Offline
Pan Štábní

Registrován: 12.05.2013, 22:24
Příspěvky: 1508
Bydliště: u Prahy
Has thanked: 44 times
Been thanked: 380 times
iwosh píše:
Naco sa do registra A uklada hodnota 127, ked hned na to sa do registra A uklada hodnota z portu 254?

Protože ta hodnota se samozřejmě nenačítá z portu 254.
Z80 má 16bitové adresování.
A horní bajt adresy se vezme kde?
...
V akumulátoru.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 20.09.2020, 22:20 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
iwosh píše:
Kód:
ld   a,127
in   a,(254)
cp   252
ret  z
Otazka: Naco sa do registra A uklada hodnota 127, ked hned na to sa do registra A uklada hodnota z portu 254?
Na toto je standartna velmi oblubena odpoved: RTFM ! :)
V dokumentancii sa vyslovene pise: "IN A,(n) and OUT (n),A put A * 256 + n on the address bus."

Z80, na rozdiel od svojho predchodcu 8080, od ktorho zdedil instrukciu IN A,(8-bit-port), umoznuje pre periferie pouzit az 16-bitovu adresu. No ale kedze v spominanej instrukcii IN A,(8-bit-port) je iba 8-bitova adresa portu, tak dalsich 8 bitov adresy sa vezme z predchadzajuceho obsahu A.
Takze vyssie uvedeny kod funguje takto:
Kód:
ld a,vyssi_bajt_adresy_portu
in a,(nizsi_bajt_adresy_portu)
...


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 20.09.2020, 22:27 
Offline
Óm Nejvyšší

Registrován: 16.06.2014, 12:23
Příspěvky: 3676
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 280 times
Input and Output Group

IN A, (n)

The operand n is placed on the bottom half (A0 through A7) of the address
bus to select the I/O device at one of 256 possible ports. The contents of the
Accumulator also appear on the top half (A8 through A15) of the address
bus at this time. Then one byte from the selected port is placed on the data
bus and written to the Accumulator (register A) in the CPU.

IN r (C)

The contents of register C are placed on the bottom half (A0 through A7) of
the address bus to select the I/O device at one of 256 possible ports. The
contents of Register B are placed on the top half (A8 through A15) of the
address bus at this time. Then one byte from the selected port is placed on
the data bus and written to register r in the CPU. Register r identifies any of
the CPU registers shown in the following table, which also indicates the
corresponding 3-bit r field for each. The flags are affected, checking the
input data.

.....

_________________
Diagnóza: Touretteův syndrom, Koprolálie, Dyslexie, Obsedantně kompulzivní porucha.
Kalkulačky: Privileg PR56, TI51-III, TI57, TI58, TI59, TI83, TI-83 Premium CE, TI89
Počítadla: BOBO64, ZX48 plus, DG-88, Didaktik-M, C16, C64C, Amiga 500+, MZ800, MUPID C2A2


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 20.09.2020, 23:04 
Offline
Radil

Registrován: 18.10.2013, 15:30
Příspěvky: 263
Bydliště: Oakland, Slovakia
Has thanked: 25 times
Been thanked: 60 times
Busy píše:
Na toto je standartna velmi oblubena odpoved: RTFM ! :)
To je asi odpoved na vsetky zaciatocnicke otazky, ale ked tu mame tento topic, tak si vravim "Opytam sa. Hadam ma nebudu pranierovat..."

No jasne, uz si spominam, ved som to cital v knizke ASMaZX. :idea:

_________________
Didaktik Gama | ZX Spectrum 128 | ZX Diskface Quick A | BetaDisk 128C Interface | D40 & D80 | divIDE | Interface M/P | Multiface 128 (GOTDJ) | Gama Breaker | D80mini

"Kvalita a stabilita Windows XP se Microsoftu nevyplatila, stal se takovou temnou připomínkou toho, co se stane, když odvedete svou práci moc dobře."


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ů: 55 ]  Přejít na stránku Předchozí  1, 2, 3, 4  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 5 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:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz