OldComp.cz

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


Právě je 29.03.2024, 10:13

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: 22.08.2013, 09:34 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Busy píše:
Maly trik ako si moze program sam zistit, na akych adresach sa nachadza:

Kód:
db #21   <= toto je kod instrukcie LD HL,xxxx
pop hl   <= nizsi bajt operandu instrukcie  LD HL,xxxx
jp (hl)  <= vyssi bajt operandu instrukcie  LD HL,xxxx
ld (#4000),hl
call #4000
...a presne na tomto mieste v beziacom kode je v HL adresa presne tohto miesta,
nieco ako keby tu v zdrojaku bolo napisane  LD HL,$

Inymi slovami, tento kusok programu je de-fakto ako keby instrukcia LD HL,PC (PC=program counter) ;)

Prosim te, nemohl by si to jeste trosku rozvest. Dival jsem se na to a nepochopil to...
Chvilku mi trvalo, nez jsem vubec vysel z bludu ze se jedna o SP a pritom je to PC. Pak jsem zkoumal zda neco z toho neni komentar, viz ty prvni 3 radky, ale neni. Pak jsem se dival jaky to ma strojovy kod ty prvni 3 radky a zda to neni nejaky trik kdy skocis doprostred instrukce a ono to udela neco jineho, ale to taky neni ono.
Kód:
defb $21   ; ld hl,nn
defb $e1   ; pop hl
defb $e9   ; jp (hl)

Proc to teda neni rovnou zapsane jako
Kód:
ld hl, $e9e1   ; ???

To call by melo delat neco jako
Kód:
push "Adresa za tretim a teda poslednim bajtem instrukce call nn" : jp NN

Jsem uplne mimo. Proc zrovna $4000?
Kdybych potreboval to PC tak bych asi musel udelat na to fci
Kód:
FCE_VRAT_PC:
pop hl               ; nacti PC ze zasobniku
jp (hl)                ; misto RET
....
a v kodu
call FCE_VRTA_PC              ; do hl ulozi PC nasledujici instrukce

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 22.08.2013, 10:05 
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
_dworkin píše:
Busy píše:
Maly trik ako si moze program sam zistit, na akych adresach sa nachadza:

Kód:
db #21   <= toto je kod instrukcie LD HL,xxxx
pop hl   <= nizsi bajt operandu instrukcie  LD HL,xxxx
jp (hl)  <= vyssi bajt operandu instrukcie  LD HL,xxxx
ld (#4000),hl
call #4000
...a presne na tomto mieste v beziacom kode je v HL adresa presne tohto miesta,
nieco ako keby tu v zdrojaku bolo napisane  LD HL,$

Inymi slovami, tento kusok programu je de-fakto ako keby instrukcia LD HL,PC (PC=program counter) ;)

Prosim te, nemohl by si to jeste trosku rozvest. Dival jsem se na to a nepochopil to...
Chvilku mi trvalo, nez jsem vubec vysel z bludu ze se jedna o SP a pritom je to PC.
Pre zistenie hodnoty SP nastastie mame jednoduchsie sposoby: LD (adresa),SP alebo ADD HL,SP.
_dworkin píše:
Pak jsem zkoumal zda neco z toho neni komentar, viz ty prvni 3 radky, ale neni. Pak jsem se dival jaky to ma strojovy kod ty prvni 3 radky a zda to neni nejaky trik kdy skocis doprostred instrukce a ono to udela neco jineho, ale to taky neni ono.
Kód:
defb $21   ; ld hl,nn
defb $e1   ; pop hl
defb $e9   ; jp (hl)

Proc to teda neni rovnou zapsane jako
Kód:
ld hl, $e9e1   ; ???
To je uplne jedno, aj takto sa to da zapisat. Ide len o to, ze do registra HL vlozim operacne kody instrukcii POP HL a JP (HL). Nic viac, a ani o ziadne skakanie doprostred instrukcie sa nejedna.
_dworkin píše:
To call by melo delat neco jako
Kód:
push "Adresa za tretim a teda poslednim bajtem instrukce call nn" : jp NN
Presne tak, to robi CALL.
_dworkin píše:
Jsem uplne mimo. Proc zrovna $4000?
Pretoze #4000 je na to idealna adresa. Na mensiu adresu program vo vseobecnosti umiestnit nemozes (tam je romka) a na vyssich adresach si tym LD (adresa),HL mozes program nevhodne prepisat.
_dworkin píše:
Kdybych potreboval to PC tak bych asi musel udelat na to fci
Kód:
FCE_VRAT_PC:
pop hl               ; nacti PC ze zasobniku
jp (hl)                ; misto RET
....
a v kodu
call FCE_VRTA_PC              ; do hl ulozi PC nasledujici instrukce
A presne toto robi ten moj programcek ! :) Vytvori si presne takuto funkciu FCE_VRAT_PC, umiestni ju na adresu #4000, zavola ju, a funkcia mu vrati adresu ukazujucu do programu presne za miesto volania tejto funkcie. Takze toto si pochopil uplne spravne ;)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 22.08.2013, 10:21 
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
_dworkin píše:
Aha, uz me to asi docvaklo kdyz jsem to porovnal s "mym" resenim.
Kód:
db $21                                ;  v prvnim pruchodu budou nasledujici 3 bajty chapane jako LD HL,$e9e1
ADRESA_PRO_CALL:
pop hl                                 ;  <= nizsi bajt operandu instrukcie  LD HL,xxxx
jp (hl)                                  ;  <= vyssi bajt operandu instrukcie  LD HL,xxxx
; tohle sem umazal protoze by to udelalo ld (ADRESA_PRO_CALL),$e9e1 a to uz tam je
call ADRESA_PRO_CALL
...a presne na tomto mieste v beziacom kode je v HL adresa presne tohto miesta,
nieco ako keby tu v zdrojaku bolo napisane  LD HL,$

Cele to vypada jako nejaky kod pro zatemneni pri debuggovani co to dela. .)
No, asi to budem musiet blizsie vysvetlit. Ucelom toho mojho triku je aby si program napisany v asembleri sam vedel zistit, na akej adrese v pameti bezi. To znamena, ze ty ho mozes nahrat do pameti na lubovolnu adresu kam chces, spustis ho od jeho zaciatocnej adresy (tam kde si ho nahral) a program si nasledne sam zisti kde v pameti bezi. Pokial ale v programe pouzijes CALL <adresa_v_ramci_toho_programu> a program nahras do pameti na ine miesto, nez na ake si ho prekladal, tak ten CALL nebude fungovat, pretoze vyzaduje absolutnu adresu a ta po nahrati programu inam uz nebude sediet.

Preto sa v tom mojom priklade umiestnuje funkcia na zistenie PC niekam mimo programu a na pevne zvolenu adresu, aby ju tam mohol CALL zavolat bez ohladu na to, kde si nahral cely program.


Naposledy upravil Busy dne 22.08.2013, 10:24, celkově upraveno 1

Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 22.08.2013, 10:34 
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
_dworkin píše:
Jinak by opravdu stacilo to zapsat jako
Kód:
ld hl,ADRESA
ADRESA:
a zbytek nechat na prekladaci.
Popripade takto:
Kód:
ld hl,$+3
V pripade ze program bude spustany vzdy na tej jednej adrese na ktoru bol prelozeny, tak ano, toto by uplne stacilo.


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

Registrován: 13.05.2013, 10:52
Příspěvky: 1669
Bydliště: Mliecna draha
Has thanked: 19 times
Been thanked: 124 times
Busy píše:
zz_indigo píše:
Busy píše:
Z80 ma programovo dostupnych dokopy 13 sestnastbitovych registrov a dva bity. Resp. jeden a pol bitu, lebo jeden z nich sa neda programovo citat :)
To cislo sa mi nejak nezda. (AF je nepouzitelne, iX a iY su len indexy, PC a SP detto)a nieje mozne pouzivat registe nakros sadamy ;-) Takze realne pouzitelnych mame 2x3 a to trinast urcite nieje ;-)
Netvrdim ze vsetky su pristupne priamo ako jeden celistvy 16-bitovy udaj, ale aspon po 8 bitovych castiach ano.

AF,BC,DE,HL,
AF',BC',DE',HL',
IX,IY,IR,
SP,PC
a este dva bity IFF1 a IFF2 ;)

PS: Preco by IX a IY mali byt len indexy ? Mozno s nimi robit vela veci co aj s HL, 16-bitovych aj 8-bitovych. Napriklad ADD IX,BC; INC IX, LD SP,IX. Osembitove napr. ADD A,XL; LD XL,XH. Jedine co nejde je akurat EX DE,HL a vsetky instrukcie po #ED. A este nejde v jednej instrukcii pouzivat naraz obidva IX aj IY. A ohladom AF, to sa tiez zvykne pouzivat ako jeden celistvy 16-bitovy udaj, hlavne v roznych demoefektoch :)


Moja chyba. V poznamkach som si nevsinol ze na pracu z Index registramy su vlastne kody. nie rozsirenia povodnych.

_________________
Amiga 600 + a602, Amiga 600 PCB only, Commodore 64+ZZ-RAM V1.0 512k+C1541(18k RAM)+sd2iec +9.600 Rs232, Commodore 116 + 64k upgrade, ZX 81 ISSUE1 + ZX81XRAM

http://zz-indigo.mavipet.sk/


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 22.08.2013, 17:44 
Offline
Pan Štábní

Registrován: 12.05.2013, 22:24
Příspěvky: 1509
Bydliště: u Prahy
Has thanked: 44 times
Been thanked: 380 times
Busy píše:
Maly trik ako si moze program sam zistit, na akych adresach sa nachadza:
Kód:
db #21   <= toto je kod instrukcie LD HL,xxxx
pop hl   <= nizsi bajt operandu instrukcie  LD HL,xxxx
jp (hl)  <= vyssi bajt operandu instrukcie  LD HL,xxxx
ld (#4000),hl
call #4000
...a presne na tomto mieste v beziacom kode je v HL adresa presne tohto miesta,
nieco ako keby tu v zdrojaku bolo napisane  LD HL,$


Universum na to používal ne adresu uprostřed RAM, ale adresu v ROM, o které je známo, že se na ní nachází instrukce RET (takže se ZX ROM funguje prakticky vždy, i s většinou těch upravených).
CALL 82: DEC SP: DEC SP: POP HL


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 22.08.2013, 18:30 
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
dex píše:
Universum na to používal ne adresu uprostřed RAM, ale adresu v ROM, o které je známo, že se na ní nachází instrukce RET (takže se ZX ROM funguje prakticky vždy, i s většinou těch upravených).
CALL 82: DEC SP: DEC SP: POP HL
Viem, tento sposob je jednoduchsi, ale rozhodne ho neodporucam pouzivat, pretoze je nespolahlivy. V pripade ze pride prerusenie zrovna uprostred paru instrukcii DEC SP, adresa na zasobniku sa poskodi (nizsi bajt sa prepise vyssim) a na konci bude v HL blbost. Je to sice pravdepodobnost velmi mala, ale je nenulova (a uz sa mi to aj realne stalo). Ciastocne by to riesil zakaz prerusenia, ale co som pozeral, aplikacie ktore tento sposob vyuzivaju, len malokedy prerusenie zakazuju. Ale aj keby aplikacia prerusenie zakazala, este stale to moze pokazit NMI - napr. uzivatel si urobi snapshot zrovna v tomto case...


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 23.08.2013, 08:26 
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
A na dnes jeden maly trik so skokom doprostred instrukcie ;)

Dajme tomu ze mame vyriesit takyto problem:
Kód:
IF a=ttt THEN a=uuu
ELSE IF a=vvv THEN a=www
Ako prve nas napadne jednoduchy priamociary sposob:
Kód:
      cp TTT      ; Ak A nie je TTT
      jr nz,NEXT   ; tak pokracuj
      ld a,UUU   ; Ak ano tak A=UUU
      jr END      ; Skok na koniec
NEXT:   cp VVV      ; Ak A nie je VVV
      jr nz,END   ; tak skok na koniec
      ld a,WWW   ; A=WWW
END:
Lenze toto ma az 14 bajtov. Neslo by to trosku zoptimalizovat ?
Samozrejme slo, inak by som sa nepytal ;) Najprv si to trosku preusporiadame:
Kód:
      cp TTT
      jr z,SETTT
      cp VVV
      jr nz,END
      ld a,WWW
      jr END      ; Skok o 2 bajty dalej
SETTT:   ld a,UUU   ; LD A,UUU ma 2 bajty
END
Vsimnite si ten skok ktory skace o dva bajty dopredu - obskakuje instrukciu LD A,UUU. Pre tento skok sme pouzili dvojbajtovu instrukciu nepodmieneny relativny jump. Lenze, ono existuje aj jednobajtovy nepodmieneny jump o dva bajty ! :bulb: Neverite ? Tak sa pozrite:
Kód:
      cp TTT
      jr z,SETTT
      cp VVV
      jr nz,END
      ld a,WWW
      db #21      ; Kod instrukcie LD HL,dvojbajtovy_operand
SETTT:   ld a,UUU   ; Instrukcia alebo operand pre LD HL,...
END:
Tento jednobajtovy jump je dokonca o dva takty rychlejsi, nez ten dvojbajtovy relativny ! :thumbup: A vdaka nemu je nasa rutinka o bajt kratsia :clap: Akurat jedinou jeho nevyhodou je, ze nam nezachova obsah registra HL :shrug: Nuz ale pokial HL na tomto mieste zrovna nepotrebujeme, tak to predsa nevadi :neener:


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 23.08.2013, 23:04 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Toho by se dalo vymyslet jeste vic, jen to bude hodne specificke a nepouzitelne pro vsechno. Staci si seradit instrukce a najit si ty prvni a nebo posledni a kombinovat.

Co mne napadlo napr: if zero SMAZ_BC else neco_jineho
Kód:
...
   jr nz,NEMAZ_BC
   ld bc,0
   jr END
NEMAZ_BC:    ; else
   neco_jineho
END:

Tohle by melo pouzit zacatek instrukce ld bc,0 (coz je jedna) jako skok doprostred tech dat a kdyz vyssi bajt bude treba ta nula tak to udela jen 1x nop. Nebo neco jineho, pak to ale nebude nastavovat "b" na nulu, ale na jinou hodnotu.
Kód:
   jr z,SMAZ_BC
   neco_jineho
defb   $18      ; jr n
SMAZ_BC:
   ld bc,0      ; $01 $00 (zde muze byt cokoliv, bude to preskoceno) $00 (nop)

Kód:
Instrukce        Čas (T-cykly)    Délka    Kód (dekadicky)  Kód (hexa)
NOP              4                1        0                00
LD BC,NN        10                3        1, xx, xx        01, xx, xx
LD (BC),A        7                1        2                02
INC BC           6                1        3                03
INC B            4                1        4                04
DEC B            4                1        5                05
LD B,N           7                2        6, xx            06, xx
RLCA             4                1        7                07
EX AF,AF'        4                1        8                08
ADD HL,BC        11               1        9                09
LD A,(BC)        7                1        10               0A
DEC BC           6                1        11               0B
INC C            4                1        12               0C
DEC C            4                1        13               0D
LD C,N           7                2        14, xx           0E, xx
RRCA             4                1        15               0F
DJNZ N           13/8             2        16, xx           10, xx
LD DE,NN         10               3        17, xx, xx       11, xx, xx
LD (DE),A        7                1        18               12
INC DE           6                1        19               13
INC D            4                1        20               14
       

PS: Skoda jen ze treba u mne ten kod nezabira v podstate skoro nic. Vetsina jsou data.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 27.08.2013, 18:41 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Busy píše:
A na dnes jeden maly trik so skokom doprostred instrukcie ;)

Dajme tomu ze mame vyriesit takyto problem:
Kód:
IF a=ttt THEN a=uuu
ELSE IF a=vvv THEN a=www
Ako prve nas napadne jednoduchy priamociary sposob:
Kód:
      cp TTT      ; Ak A nie je TTT
      jr nz,NEXT   ; tak pokracuj
      ld a,UUU   ; Ak ano tak A=UUU
      jr END      ; Skok na koniec
NEXT:   cp VVV      ; Ak A nie je VVV
      jr nz,END   ; tak skok na koniec
      ld a,WWW   ; A=WWW
END:
Lenze toto ma az 14 bajtov. Neslo by to trosku zoptimalizovat ?
Samozrejme slo, inak by som sa nepytal ;) Najprv si to trosku preusporiadame:
Kód:
      cp TTT
      jr z,SETTT
      cp VVV
      jr nz,END
      ld a,WWW
      jr END      ; Skok o 2 bajty dalej
SETTT:   ld a,UUU   ; LD A,UUU ma 2 bajty
END
Vsimnite si ten skok ktory skace o dva bajty dopredu - obskakuje instrukciu LD A,UUU. Pre tento skok sme pouzili dvojbajtovu instrukciu nepodmieneny relativny jump. Lenze, ono existuje aj jednobajtovy nepodmieneny jump o dva bajty ! :bulb: Neverite ? Tak sa pozrite:
Kód:
      cp TTT
      jr z,SETTT
      cp VVV
      jr nz,END
      ld a,WWW
      db #21      ; Kod instrukcie LD HL,dvojbajtovy_operand
SETTT:   ld a,UUU   ; Instrukcia alebo operand pre LD HL,...
END:
Tento jednobajtovy jump je dokonca o dva takty rychlejsi, nez ten dvojbajtovy relativny ! :thumbup: A vdaka nemu je nasa rutinka o bajt kratsia :clap: Akurat jedinou jeho nevyhodou je, ze nam nezachova obsah registra HL :shrug: Nuz ale pokial HL na tomto mieste zrovna nepotrebujeme, tak to predsa nevadi :neener:

To reseni vlastne neni zavisle na tribajtove instrukci LD HL,nn ( $21, lo, hi ). Stejne dobre poslouzi i LD BC,nn ( $01, lo, hi ) nebo LD DE, nn ( $11, lo, hi ). Takze lze obetovat libovolnou z tech tri. Dalsi tribajtove jsou ruzne skoky nebo call a ty se nedaji pouzit. Ale jde udelat i toto
Kód:
      cp TTT
      jr z,SETTT
      cp VVV
      jr nz,END
      ld h,WWW
      defb $dd      ; "Prefix" instrukcie LD ixh,n, popripade $FD pro iyh,
SETTT:   ld h,UUU   ;
END:

Misto akumulatoru (ve skutecnosti tam teda jde dat cokoliv co zabita 2 bajty) se nastavuje pouze "h"a obetuje se IXH nebo IYH. Obdobne $2E nn = ld l,n a $DD $2E nn je ld ixl,n nebo $FD 2E nn je ld iyl, n.
A cele to jde pak prevest na 16 bit kdy misto osmibitoveho "h/l" nebo cast "ix/iy", muzeme nastavovat ld hl,nn a to maskovat za ld ix/iy,nn
Kód:
Instrukce   Čas (T-cykly)   Délka   Kód (dekadicky)     Kód (hexa)
LD HL,NN        10              3       33, xx, xx          21, xx, xx
LD IX,NN        14              4       221, 33, xx, xx     DD, 21, xx, xx
LD IY,NN        14              4       253, 33, xx, xx     FD, 21, xx, xx
-----
LD HL,(NN)      16              3       42, xx, xx          2A, xx, xx
LD IX,(NN)      20              4       221, 42, xx, xx     DD, 2A, xx, xx
LD IY,(NN)      20              4       253, 42, xx, xx     FD, 2A, xx, xx
-----
LD H,N          7               2       38, xx              26, xx
LD HX,N         11              3       221, 38, xx         DD, 26, xx
LD HY,N         11              3       253, 38, xx         FD, 26, xx
-----
LD L,N          7               2       46, xx              2E, xx
LD LX,N         11              3       221, 46, xx         DD, 2E, xx
LD LY,N         11              3       253, 46, xx         FD, 2E, xx

A jeste jsou tribajtove instrukce u kterych si neprepiseme zadny registr, ale pamet. Nejlepsi je asi nejrychlejsi "ld (nn),a" oproti "ld (nn),hl". Problem je jen v tom ze ta adresa musi ukazovat nekam kde to nevadi. A vyssi bajt je zrovna ten druhy kam cpeme nejakou hodnotu.
Jde to i otocit na "ld a,(nn)" pak si prepisujeme akumulator a nastavovat muzeme "b,c,d,e,h,l"
Na vic jsem zatim neprisel. .)

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Naposledy upravil _dworkin dne 27.08.2013, 19:32, celkově upraveno 1

Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 27.08.2013, 19:23 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Kód:
IF a=ttt THEN a=uuu
ELSE IF a=vvv THEN a=www

Nejlepsi reseni je stejne si vhodne zvolit data.
Idealni pripad
Kód:
IF a=ttt THEN a=ttt
ELSE IF a=vvv THEN a=vvv

Se da prepsat do Z80 bez jedine chyby .)
Horsi pripady
Kód:
IF a=ttt THEN a=ttt+ccc
ELSE IF a=vvv THEN a=vvv+ccc

Kód:
IF a=ttt THEN a=ttt | xxx
ELSE IF a=vvv THEN a=vvv | xxx

A pokud se ttt vhodne zvoli jako nula tak toho jde udelat hodne misto skoku jen vzorcem.
Kód:
Prakticky prevod
if a = 0 then dec b
else if a =1 then inc b
else b je nedefinovano

add a,a
dec a
add a,b
ld b,a

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 28.12.2013, 19:09 
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 se dá v assembleru číst obsah paměťi nikoliv po bajtech, ale po skupině bitů? Řekněme čtení po pěti bitech.

1. krok - horních pět bitů z prvního bajtu.
2. krok - dolní tři bity z prvního bajtu a horní dva bity z druheho bajtu.
3. krok - dalších pět bitů z druhého bajtu.
Atd.

Nějaká speciální instrukce, ktera by na toto šla nasadit, asi neexistuje, co?

_________________
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: 28.12.2013, 19:13 
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
Když o tom tak premýšlím, asi mnohem snazší bude varianta po sesti bitech. (8 kroků vs. 3)

_________________
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: 28.12.2013, 19:51 
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
Instrukcie vzdy citaju z pameti cely bajt, dokonca aj ked potrebujes jediny bit. Pokial mas v pameti data usporiadane tak ze nejaky udaj nezabera celych 8 bitov, robi sa to aj tak vzdy tak, ze nacitas cely bajt (alebo cele slovo) a potrebne bity si z toho "vysekas".

Cisto prakticka otazka: Naco to potrebujes ? Skus trosku popisat kontext problemu.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Assembler
PříspěvekNapsal: 28.12.2013, 21:47 
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
Busy píše:
Instrukcie vzdy citaju z pameti cely bajt, dokonca aj ked potrebujes jediny bit. Pokial mas v pameti data usporiadane tak ze nejaky udaj nezabera celych 8 bitov, robi sa to aj tak vzdy tak, ze nacitas cely bajt (alebo cele slovo) a potrebne bity si z toho "vysekas".

Cisto prakticka otazka: Naco to potrebujes ? Skus trosku popisat kontext problemu.


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á.

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


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