Panda38 píše:
Mnoho procesorů používá invertovaný carry při borrow, včetně ARM a původních Microchip. Protože je to pro procesor přirozený stav - odčítání realizuje jako sčítání s invertovanou hodnotou.
Panda38 píše:
Proč je invertovaný carry pro procesor přirozený:
Příklad, součet dvou 16-bitů bez vstupního carry, tj. carry = 0:
FFFE + 0003 + 0 = 0001, C je 1
Po bajtech:
FE + 03 + 0 = 01, C = 1
FF + 00 + 1 = 00, C = 1
Příklad, rozdíl dvou 16-bitů bez vstupního borrow, tj. borrow = 0:
0001 - 0003 - 0 = FFFE, B = 1 resp. invertovaný C = 0
Procesor namísto odečtení dělá přičtení invertované hodnoty, včetně inverze carry:
0001 + FFFC + 1 = FFFE, C = 0
Po bajtech:
01 + FC + 1 = FC, C = 0
00 + FF + 0 = FF, C = 0
Z80 i 6502 dělají interně odečtení stejně, převedením na součet pomocí inverze, rozdíl je pouze v tom, že 6502 invertuje carry PŘED operací a Z80 invertuje carry PO operaci (převede carry na borrow).
Ja to vlastne uvadim taky
_dworkin píše:
Aby to nebylo tak nesmyslne tak ve skutecnosti provadi SBC to same co ADC jen invertuje odcitanou hodnotu.
NEG = (0xFF xor num)+1 ; ok, dodatecna podminka je ze je to dvojkovy doplnek, tzn -1 = 0xFF
NEG = 0xFF xor (num-1)
A - num = A + NEG(num) = A + (0xFF xor num) + 1
kde tu 1 na konci zamenite za hodnotu carry.
Takze kdyz bude 1 tak se to odecte.
A kdyz bude 0 tak vysledek bude evidentne o 1 nizsi, takze to bude odecteni a jeste -1.
Ale je dobre vedet ze to Z80 ma vnitrne taky tak.
Panda38 píše:
Když jsem emuloval 6502, tak mě docela příjemně překvapil svou instrukční sadou - je to sice málo instrukcí, ale jsou zajímavé těmi stránkovými módy (jako zero page), výsledně pro malá zařízení může být kód dost rychlý.
Ja bych to ani malo instrukci nenazval, jen jinym resenim s mensim mnozstvim vice univerzalnich instrukci.
Ale koukam ze mas pravdu!
Predpokladal jsem ze bude jako u Z80 vyuzity vsech 256 hodnot pro kodovani instrukci... Tam kde bude mit Z80 specializovane tak budou nahrazeny vice vice univerzalnimi 6502. A ono ne. Ma tam mezery... a nebo jinak receno nelegalni instrukce.
https://www.masswerk.at/6502/6502_instruction_set.htmlKód:
HI LO-NIBBLE
‐0 ‐1 ‐2 ‐3 ‐4 ‐5 ‐6 ‐7 ‐8 ‐9 ‐A ‐B ‐C ‐D ‐E ‐F
0‐ BRK impl ORA X,ind --- --- --- ORA zpg ASL zpg --- PHP impl ORA # ASL A --- --- ORA abs ASL abs ---
1‐ BPL rel ORA ind,Y --- --- --- ORA zpg,X ASL zpg,X --- CLC impl ORA abs,Y --- --- --- ORA abs,X ASL abs,X ---
2‐ JSR abs AND X,ind --- --- BIT zpg AND zpg ROL zpg --- PLP impl AND # ROL A --- BIT abs AND abs ROL abs ---
3‐ BMI rel AND ind,Y --- --- --- AND zpg,X ROL zpg,X --- SEC impl AND abs,Y --- --- --- AND abs,X ROL abs,X ---
4‐ RTI impl EOR X,ind --- --- --- EOR zpg LSR zpg --- PHA impl EOR # LSR A --- JMP abs EOR abs LSR abs ---
5‐ BVC rel EOR ind,Y --- --- --- EOR zpg,X LSR zpg,X --- CLI impl EOR abs,Y --- --- --- EOR abs,X LSR abs,X ---
6‐ RTS impl ADC X,ind --- --- --- ADC zpg ROR zpg --- PLA impl ADC # ROR A --- JMP ind ADC abs ROR abs ---
7‐ BVS rel ADC ind,Y --- --- --- ADC zpg,X ROR zpg,X --- SEI impl ADC abs,Y --- --- --- ADC abs,X ROR abs,X ---
8‐ --- STA X,ind --- --- STY zpg STA zpg STX zpg --- DEY impl --- TXA impl --- STY abs STA abs STX abs ---
9‐ BCC rel STA ind,Y --- --- STY zpg,X STA zpg,X STX zpg,Y --- TYA impl STA abs,Y TXS impl --- --- STA abs,X --- ---
A‐ LDY # LDA X,ind LDX # --- LDY zpg LDA zpg LDX zpg --- TAY impl LDA # TAX impl --- LDY abs LDA abs LDX abs ---
B‐ BCS rel LDA ind,Y --- --- LDY zpg,X LDA zpg,X LDX zpg,Y --- CLV impl LDA abs,Y TSX impl --- LDY abs,X LDA abs,X LDX abs,Y ---
C‐ CPY # CMP X,ind --- --- CPY zpg CMP zpg DEC zpg --- INY impl CMP # DEX impl --- CPY abs CMP abs DEC abs ---
D‐ BNE rel CMP ind,Y --- --- --- CMP zpg,X DEC zpg,X --- CLD impl CMP abs,Y --- --- --- CMP abs,X DEC abs,X ---
E‐ CPX # SBC X,ind --- --- CPX zpg SBC zpg INC zpg --- INX impl SBC # NOP impl --- CPX abs SBC abs INC abs ---
F‐ BEQ rel SBC ind,Y --- --- --- SBC zpg,X INC zpg,X --- SED impl SBC abs,Y --- --- --- SBC abs,X INC abs,X ---
Busy píše:
_dworkin píše:
... Protoze 6502 ma invertovanou hodnotu carry oprotu Z80. ...
Podla mna to moc komplikujes.
Uplne staci vediet ze 6502 pri odcitani (a teda aj porovnani) proste pouziva carry invertovane. 1 znamena ze nebol prenos a 0 znamena ze bol. Tot vsio
Viem ze pre intelakov a zilogakov je to trosku odveci, ale co narobime.
Co ale mne osobne pride od veci este viac, je ze pri scitani sa pouziva carry neinvertovane. Taka mala nekonzistencia, no To me prijde spis zvlastni videt ze ma pri odcitani/porovnani 6502 oproti Z80 invertovany carry jako prirozeny fakt, ale to ze ma u adc carry S TEJNY jako Z80 jeste zvlastnejsi. Asi narazis na to ze se s timhle otocenim musi vyporadat i 6502 programator? Ten to asi bere jako prirozeny fakt.
Kdyz ignoruji jak to ma vnitrne zadratovany procesor a budu to brat z pohledu programatora, tak stale nedokazi odhadnout ktery zpusob je obecne vyhodnejsi... (a nebo to vyjde celkove nastejno) ale v konkretnim algoritmu deleni je lepsi to mit "invertovane". Tam kde se ti u metody "dlouheho deleni" vleze odcitane cislo (delitel) do posunovaneho delence je dobre mit rovnou carry jako 1, protoze ho nacitas(posunem) do vysledku. A nemusis invertovat carry (kratsi ale pomalejsi) a nebo na konci provest xor 0xFF s vysledkem (delsi ale rychlejsi). A nebo pouzit uplne jinou metodu.
Jen me stale nejak hlava nedokaze ukazat jak se to poradne chova.
U Z80 jsem automaticky schopen provest:
A+X aby carry bylo 0 nebo 1 tim ze upravim X do nejakeho tvaru (256-X) a pouziji bud ADC/ADD nebo SBC/SUB
A-X aby carry bylo 0 nebo 1 tim ze upravim X do nejakeho tvaru (256-X) a pouziji bud ADC/ADD nebo SBC/SUB
u 6502 me hlava rika... DEJ ME POKOJ! Nechces se radsi kouknout na anime nez delat tyhle kraviny a odmita myslet.
Kdyby mel 6502 instrukci ADD a SUB (coz by evidetne mohl kdyz ma tolik mista v kodovani instrukci, jen by se jim prodrazil hw) tak by si usetril i to jednou nastavit carry (SBC-->SUB) a jednou ho vynulovat (ADC-->ADD). Mozna by bylo zajimave vedet jak casto to musis delat a jak casto znas predchozi stav. Zda se ze 6502 nemeni CARRY pri nacitani hodnoty do A (na rozdil od ZERO a SIGN FLAG!!!).
V nejhorsim pripade to muze byt dvojnasobna delka a trvani...
Tezko rici kde 6502 programatory tlaci nejvice bota, pro me by to bylo(byla?) asi velikost zasobniku. Mit tam jeste neco co ma Z80 tak by mel najednou 2 zasobniky a byl by to idealni procesor pro FORTH. Sorry offtopic.
faraon píše:
Nad tímhle jsem u TWELVE dost dlouho zpytoval, a nakonec jsem to udělal tak, že před začátkem sčítání/odčítání se Carry musí vždy vynulovat, a pokud došlo k přenosu/výpůjčce, nastaví se na 1. No a ta jednička se při pokračování výpočtu k dalšímu slovu automaticky přičte/odečte. Vlastně jsou tam jenom ADC a SBC.
Takže pokud je po spočtení všech řádů Carry 1, tak se to buď nevešlo nebo překlopilo znaménko. Což jde testovat jednou podmínkou bez ohledu na to, jestli se předtím přičítalo nebo odčítalo.
Co je TWELVE?
Jinak popisujes Z80 variantu pokud to spravne chapu, jen s tim ze nemas ADD a SUB.
Ale kdyz pises o "jednou podminkou" tak to asi neumi jr(jp) C a jr(jp) NC, ale jen jednu variantu? Pravdepodobne jr(jp) NC, aby se skocilo dal pokud nemusime resit problem. Stejne by s jeste bezpodminkovym skokem sla resit i opacna varianta jen o neco sloziteji... aaaa...uz zase offtopic.
Busy píše:
Inak ono v 6502 je viacero veci co sa pouzivaju naopak. Napriklad bit pre zakaz/povolenie prerusenia - 0 znamena povolene a 1 zakazane. Teda tiez presne naopak ako pri Inteli / Zilogu.
Dobra informace.
V tomhle odkazu
https://litwr2.github.io/8080-8085-z80- ... -6502.html kde se snazi emulovat Z80 na 6502 je toho vic.
6502 a Z80 mají několik architektonických rozdílů, díky kterým je emulace několika funkcí Z80 téměř nemožná:
Ukazatel zásobníku u 6502 má svůj horní bajt vždy nastaven na 1, ale SP u Z80 má 16 bitů;
Zaváděcí instrukce 6502 (LDA, TXA, LDY, PLA, ...) mění SF a ZF, zaváděcí instrukce Z80 nemění příznaky;
6502 má dekadický režim a Z80 má instrukci decimální korekce (DAA);
6502 nemá příznaky parity, polovičního přenosu a odečítání;
6502 používá invertovaný příznak přenosu pro odečítání a porovnávání;
Instrukce 6502 JSR a RET pracují se zásobníkem trochu jinak než instrukce Z80 CALL a RET;
6502 nemá nic podobného instrukcím Z80 HALT, RETN a IM nebo registrům R a I;
Instrukce Z80 RETI je ve světě procesorů jedinečná;
6502 nemá speciální adresní prostor pro vstup a výstup.