OldComp.cz

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


Právě je 27.04.2024, 09:57

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 28 ]  Přejít na stránku Předchozí  1, 2
Autor Zpráva
 Předmět příspěvku: Re: 4bitový počítač
PříspěvekNapsal: 29.06.2023, 10:54 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3675
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
_dworkin píše:
Zkusil jsem se zabyvat navrhem instrukcni sady jeste hloubeji a vychazi me stale, ze cim je mensi ta delka instrukce tim vetsi bude program!
Toto je velmi znama dilema medzi RISC a CISC procesormi. Vzdy bude nieco jednoduche a male a nieco zlozite a velke. Bud bude maly a jednoduchy procesor (RISC) ale nasledne program pre neho bude dlhy, alebo bude zlozity procesor (CISC) a program bude moct byt vdaka tomu kratky a jednoduchy.

Krasne to vidno ked portujem programy medzi Z80 (co je klasicky CISC) a 6502 (co by sa tu dalo oznacit ako RISC) - typicke 1k intro pre Z80 po preportovani na 6502 ma tak 1.5 az 2kB. Pokial sa musim zmestit do dlzky 1kB, tak musim osekat funkcionalitu. Pekne to vidno napriklad na mojom Tochi1k - verzia pre ZX (Z80) ma vela roznych sposobov "nabehu" a "dobehu jednotlivych vzorov, kdezto verzia pre C64 (6502) je ovela chudobnejsia, vsetky vzory nabiehaju rovnako a velmi jednoduchym sposobom, pretoze uz proste v tom 1kB na tie rozne nabehy nebolo miesto.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: 4bitový počítač
PříspěvekNapsal: 29.06.2023, 13:50 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Busy píše:
_dworkin píše:
Zkusil jsem se zabyvat navrhem instrukcni sady jeste hloubeji a vychazi me stale, ze cim je mensi ta delka instrukce tim vetsi bude program!
Toto je velmi znama dilema medzi RISC a CISC procesormi. Vzdy bude nieco jednoduche a male a nieco zlozite a velke. Bud bude maly a jednoduchy procesor (RISC) ale nasledne program pre neho bude dlhy, alebo bude zlozity procesor (CISC) a program bude moct byt vdaka tomu kratky a jednoduchy.

Krasne to vidno ked portujem programy medzi Z80 (co je klasicky CISC) a 6502 (co by sa tu dalo oznacit ako RISC) - typicke 1k intro pre Z80 po preportovani na 6502 ma tak 1.5 az 2kB. Pokial sa musim zmestit do dlzky 1kB, tak musim osekat funkcionalitu. Pekne to vidno napriklad na mojom Tochi1k - verzia pre ZX (Z80) ma vela roznych sposobov "nabehu" a "dobehu jednotlivych vzorov, kdezto verzia pre C64 (6502) je ovela chudobnejsia, vsetky vzory nabiehaju rovnako a velmi jednoduchym sposobom, pretoze uz proste v tom 1kB na tie rozne nabehy nebolo miesto.


Tohle je tak strasne tezke porovnavat, je tam prilis mnoho faktoru co to ovlivnuji.

Zalezi jak moc dobry programator jsi pro obe architektury, protoze jak uz jsme se bavili predtim, tak kazde CPU miluje jine algoritmy a vlatne i jine mysleni nad ukolem.

Z80 sice nema nejlepsi navrh jak kodovat instrukce, ale ma dost dobry navrh, takze se tezko bude porazet.

A hardwarove toho umi mnohem vice (zase tezke porovnat protoze 6502 ma jiny pristup), takze pohodlne zaplni 256 moznosti pro jednobajtovou instrukci, ktere se pouzivaji nejcasteji a to dela hodne.

Ale jo verim ti ze Z80 bude mit obecne "hustsi" kod nez 6502.

Jenze vnitrne minimalisticky procesor to muze obchazet. Jakmile ten procesor umi mene jak 256 instrukci, tak se to muze snazit obejit, nezna AND, XOR, OR atd? Ok tak to budu vnitrne emulovat pres tu svoji jedinou NOR. Takze to navenek bude umet, jen pomaleji.
Nebo jak uz jsem psal, muze mit tech par instrukci udelane komplexneji spojenim se signalizacnimi bity s dodatecnymi efekty jako ARM. Napriklad pro platnost instrukce jen kdyz je nastaven priznak, nebo zmenou +-1 index registru atd. Takze obcas usetri kratkou instrukci za cenu vsechny trvale prodlouzit.

Jak jsem se ted dival na svuj kod

CP 0x33
JR z, xxx
Kód:
16b LD  i, tmp
4b  LD (i), a       ; x
8b  LD  a, 0x33
4b  CP (i)          ; array + carry
16b LD  i, xxx
4b  ONLYZ
4b  CALL i


tak to ma obracenou logiku. V akumulatoru je hodnota na kterou se to porovnava a v pamet je vlastne "mnozina registru". Naopak je tezke to mit, protoze stale nechapu jak inicializovat RAMku. ROM je napevno vypalena a RAMka je pouzivana jako buffer a nejefektivnejsi zpusob nastaveni je pres
Kód:
16b LD  i, array
16b LD (tmp), i

Kde nastaveni 12 bitu RAMky stoji 32 bitu ROMky. (2.66 bitu ROM pro 1 bit RAM)

Popripade
Kód:
16b LD  i, tmp
8b  LD  a, 0x33
4b  LD (i), (a)     ; array + carry
4b  INC i
...

Kde je to kdyz vynecham inicializaci 4 bity RAM za cenu 16 bitu ROM (4 bity ROM pro 1 bit RAM).

Jedna se teda o velkou ruznorodou konstantu, jinak je to samozrejme jinak.

Proc o tom mluvim? Protoze misto instukce "CP (i)" je lepsi mit instrukci "SUB (i)"!

CP 0x33
JR z, xxx
Kód:
16b LD  i, tmp
4b  LD (i), a       ; x
8b  LD  a, 0x33
4b  SUB (i)          ; array + carry
16b LD  i, xxx
4b  ONLYZ
4b  CALL i


Kod je uplne ten samy a porovnavana hodnota zustava nezmenena v pameti.

Vyhody SUB (i):

Dokaze snadneji nastavit nulu s vynulovanym carry.

Misto:
Kód:
4b  NOR(i)          ; clear carry
8b  LD  a, 0x00


Staci:
Kód:
4b  LD  a,(i)       ; ?
4b  SUB(i)          ; ?-?=0


Dalsi mala vyhoda je ze krome "CP" umime i odcitat. (To slo i predtim pres ADC).

Nevyhody:
Asi pro algoritmy kdy v retezci hledame treba nulu, pak si drzime nulu v akumulatoru a menime index a provadime pokazde CP.
Ted uz musime akumulator obnovovat.
Kód:
16b LD  i, string-1
16b LD (result),i

; tady je vhodne misto pro zacatek fce s parametrem v (result)
loop:
16b LD i,(result)
4b  INC i
16b LD (result),i

8b  LD  a, 0x00
4b  SUB(i)
16b LD  i, loop
4b  ONLYC           ; ONLYNZ neni nastesti nam pomuze ONLYC
4b  CALL loop       ; JP nz/c, loop
; vysledny 12 bitovy index s nulovym znakem je ulozen na adrese result
...

Tady by sel asi provest trik se spravne umistenym programem i retezcem pres to nastaveni i pri skoku.

Hmm... ale program predpoklada retezec v RAM! Protoze ROM neumi cist... zvlastni.
Takze bud ten pocitac ma schopnost nacitat odnekud RAM (a nejen menit ROM za jinou) nebo uz nevim. Pres porty do akumulatoru a odtam do RAM?

Ten zacatek by slo zkratit pokud vime ze je vynulovano carry
Kód:
16b LD  i, string-1

; tady je vhodne misto pro zacatek fce s parametrem v (result)
4b  ONLYC           ; prefix rozseknuty smyckou! To me nikdy nenapadlo, to musim vyzkouset v Z80 zda se to nekde nehodi
loop:
16b LD i,(result)
4b  INC i
16b LD (result),i

8b  LD  a, 0x00
4b  SUB(i)
16b LD  i, loop
4b  ONLYC           ; ONLYNZ neni nastesti nam pomuze ONLYC
4b  CALL loop       ; JP nz/c, loop
; vysledny 12 bitovy index s nulovym znakem je ulozen na adrese result
...

A ten retezec nebude asi ASCII kdyz to ma 4 bity... ale to je snadne predelat.

Kód:
4 bits instruction
------------------
 0) LD  (i), a
 1) LD   a,(i)
 2) ADC  a,(i)
 3) SUB (i)
 4) NOR (i)
 5) DEC  i          ; no flag
 6) INC  i          ; no flag
 7) CALL i          ; after i = ret
 8) ONLYC prefix
 9) ONLYZ prefix

8 bits instruction
------------------
10) LD   a, 4bit

4+sizeof(port) bits instruction
-----------------------
11) IN   port
12) OUT  port       ; prinejhorsim to jde spojit s IN

16 bits instruction
-------------------
13) LD   i, 12bit
14) LD   i,(12bit)
15) LD  (12bit), i

Pro me je to schopna a zabavna sada instrukci. Navic ze je to Z80-like syntaxe je to pro me o dost pritazlivejsi.

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: 4bitový počítač
PříspěvekNapsal: 29.06.2023, 15:54 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3675
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
_dworkin píše:
Busy píše:
Krasne to vidno ked portujem programy medzi Z80 (co je klasicky CISC) a 6502 (co by sa tu dalo oznacit ako RISC) - typicke 1k intro pre Z80 po preportovani na 6502 ma tak 1.5 az 2kB. ...
Tohle je tak strasne tezke porovnavat, je tam prilis mnoho faktoru co to ovlivnuji.
Zalezi jak moc dobry programator jsi pro obe architektury, protoze jak uz jsme se bavili predtim, tak kazde CPU miluje jine algoritmy a vlatne i jine mysleni nad ukolem.
Toto je diskusia o 4 bitovom pocitaci, preto som nechcel moc zabiehat do podrobnosti. Chcel som len ukazat zakladny princip vztahu medzi zlozitostou CPU a dlzkou programu na dvoch platformach, ktore velmi dobre poznam a kde na oboch viem pisat vysoko optimalizovane programy. A na priklade komplexneho audiovizualneho diela, kde uz nejde o elementarne algoritmy ktore mozu a nemusia sadnut danemu CPU, ale o celkovy aplikacny vysledok ako ciel, stanoveny nezavisle od vhodnosti implementacie pre tieto platformy.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: 4bitový počítač
PříspěvekNapsal: 30.06.2023, 16:40 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Pokud se nahradi cp za sub tak jde zmenit
Kód:
; a=array[x]
16b LD  i, tmp
4b  LD (i), a       ; x
4b  NOR(i)          ; clear carry
8b  LD  a, array
4b  ADC a, (i)      ; array + x
4b  LD (i), a

4b  INC i
8b  LD  a, array >> 4
4b  LD (i), a
8b  LD  a, 0x00
4b  ADC a, (i)      ; array + carry
4b  LD (i), a

4b  INC i
8b  LD  a, array >> 8
4b  LD (i), a
8b  LD  a, 0x00
4b  ADC a, (i)      ; array + carry
4b  LD (i), a

16b LD  i,(tmp)
4b  LD  a, (i)


na o 8 bitu kratsi
; a=array[x]
Kód:
16b ...
4b  ...
4b  ...
8b  ...
4b  ...
4b  ...

4b  ...
8b  ...
4b  ...
8b  ...
4b  ...
4b  ...

8b  LD  a, array >> 8
4b  ADC a, (i)      ; ((array >> 8) + (array >> 4) + carry) + carry
4b  SUB a, (i)      ; (array >> 8) + carry
4b  INC i
4b  LD (i), a

16b ...
4b  ...


PS: Jinak samozrejme kdyby to pole nebylo umisteno tak blbe tak to slo zkratit. Staci nemit druhy nibble 0xF. A nebo jeste lepe to na nibble zarovnat.
; a=array[x] zarovnana adresa na 16
Kód:
16b LD  i, array
16b LD (tmp), i
16b LD  i, tmp
4b  LD (i), a       ; x

16b LD  i,(tmp)
4b  LD  a, (i)


a nebo

; a=array[x] zarovnana adresa na 16
Kód:
16b LD  i, tmp
4b  LD (i), a       ; x
4b  INC i
8b  LD  a, array >> 4
4b  LD (i), a
4b  INC i
8b  LD  a, array >> 8
4b  LD (i), a

16b LD  i,(tmp)
4b  LD  a, (i)

ktera jde pro opakovane pouziti zrychlit pokud uz tu adresu mame jednou nactenou v RAM.

PPS: Mozna by stalo jeste za uvahu vyhodit uplne ZERO priznak a teda i ONLYZ. Misto toho pridat "4bit DEC a" s nastavovanym priznakem CARRY. Takze misto
CP 0x33
JR z, xxx
Kód:
16b LD  i, tmp
4b  LD (i), a       ; x
8b  LD  a, 0x33
4b  SUB(i)          ; 0x33-x
16b LD  i, xxx
4b  ONLYZ
4b  CALL i


by slo trosku delsi

CP 0x33
JR z, xxx
Kód:
16b LD  i, tmp
4b  LD (i), a       ; x
8b  LD  a, 0x33
4b  SUB(i)          ; 0x33-x
4b  DEC a           ; 0-1?
16b LD  i, xxx
4b  ONLYC
4b  CALL i


S tim ze testovani na nulu je mnohem jednoduzsi a taky tvorba smycek. Dokazes odecitat konstantu, kterou nemusis mit v RAM a cachrovat s indexy.

CP 0
JR alfa
CP 1
JR beta
CP 3
JR gama
...
Kód:
4b  DEC a
16b LD  i, alfa
4b  ONLYC
4b  CALL i

4b  DEC a
16b LD  i, beta
4b  ONLYC
4b  CALL i

4b  DEC a
16b LD  i, gama
4b  ONLYC
4b  CALL i

...


I kdyz mozna by mohlo byt vyhodnejsi to jeste prodlouzit a misto "dec a" mit 8 bitove "ADD a, const."

Dvojite ONLYC za sebou by mohlo byt ONLY_NC.

PPPS: Zajimave cteni o 4 bitovem navrhu pro 12 bitove adresovani je tady https://www.eeweb.com/building-a-4-bit-computer-the-instruction-set/

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: 4bitový počítač
PříspěvekNapsal: 01.07.2023, 00:26 
Offline
Óm Nejvyšší

Registrován: 16.06.2014, 12:23
Příspěvky: 3677
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 280 times
Žonglujete s jiným instrukčním souborem, ale neříkáte, co je zapotřebí udělat s hw.

Mě by zajimal optimální instrukční soubor s operační pamětí 4x256b a s pamětí mikroprogramu také 4x256b.

Jak třeba využiji 12bitové adresování RAM s absolutním adresováním prgramem s délkou také 12 bitů, když potřebuji minimálně 2 instrukce (a asi dvojnásobné délky) abych někde data zapsal a jinde přečetl ?
V tomto hw modelu, je přiměřená paměť tak 256 nible.

_________________
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: 4bitový počítač
PříspěvekNapsal: 01.07.2023, 01:37 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
danhard píše:
Žonglujete s jiným instrukčním souborem, ale neříkáte, co je zapotřebí udělat s hw.

Mě by zajimal optimální instrukční soubor s operační pamětí 4x256b a s pamětí mikroprogramu také 4x256b.

Jak třeba využiji 12bitové adresování RAM s absolutním adresováním prgramem s délkou také 12 bitů, když potřebuji minimálně 2 instrukce (a asi dvojnásobné délky) abych někde data zapsal a jinde přečetl ?
V tomto hw modelu, je přiměřená paměť tak 256 nible.


Nechapu presne otazce.


4x256 bajtu je 1024 bajtu to je na 10 bitovou adresu.
Popripade 11 bitovou pokud to nebude oddelene.

"...potrebuji minimalne 2 instrukce (a asi dvojnasobne delky) abych nekde data zapsal a jinde precetl?" ???

Jestli to bylo na me tak to asi budou 2 instrukce.

Dva typy instrukci nacitaji hodnotu do index registru "i" pouziteho jak pro skoky tak pro cteni(4bity + 12 bitu).

ld i, 12 bit konstanta
ld i,(12 bit adresa)

Jeste jeden typ umi "i" ulozit na adresu.

ld (12 bit adresa).i

Dalsi instrukce jsou uz male (4bity), protoze se odkazuji na to "i".
EDIT: Vcetne relativni zmeny "i" +-1. Taky uz staci 4 bity. Je to stejne jako s optimalizaci ulozeni dat pro Z80, kdy pouzivas INC/DEC HL a pak ADC A,(HL) nebo SUB (HL).

Krome nacteni konstanty do akumulatoru to je 4+4 bity.

O hardwaru mluvit nebudu, protoze je to uplne mimo me znalosti. Jen se snazim najit kompromisni navrh instrukcni sady, co je minimalni, ale co nejvic efektivni. Zadna 1 mov instrukce co dela vse vcetne inkrementace a podminky...

Jedine co vim ze to CPU musi mit

12 bit PC
12 bit I
4 bit A
3 bity pro priznaky

pak to vnitrne kvuli

ld i,(12bit)
ld (12bit),i

bude mozna muset mit asi jeden registr navic pro tu konstantni adresu.

U skoku dela hardware ulohu
Kód:
ex i,pc  ; v pc je kam se skace a zaroven
i++     ; v i je ret


I musi umet spocitat 12 bitove +-1.
PC musi umet spocita 12 bitove +1, +2, +3 a +4 podle delky instrukce.

Adresy jsou vsechny v nibblech.
Asi by to slo i v bajtech pro ROM, pak se musi instrukce zaokrouhlit nahoru na bajty.
Pro RAM taky, ale to by A by mel byt spis 8bitovy.

A jeste to musi umet zpracovat ten prefix ONLYC pro zpracovani nasledujici instrukce jen pokud je priznak.
Popripade pri dvojitem prefixu znegovany priznak.
Takze asi 3 bity navic pro priznaky.

Zas tak mnoho me to neprijde... .)

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


Naposledy upravil _dworkin dne 01.07.2023, 01:49, celkově upraveno 1

Nahoru
 Profil  
 
 Předmět příspěvku: Re: 4bitový počítač
PříspěvekNapsal: 01.07.2023, 01:37 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Ted me nepada ze ten puvodni projekt ma problem i odecist od sebe dva nibbly...

Protoze jedine reseni je jedno cislo prevest na zaporne (NOT + INC) a pak je spolu secist.

Takze pro A -=B:

16b ld A,(mem_b)
16b NORM (mem_b)
8b ADDI 1
...mozna to chce jeste vynulovat carry...
16b ADDM (mem_a)
16b st A,(mem_a)

Kód:
16b ld i, mem_a
4b  ld a,(i)
4b  inc i
4b  sub (i)
4b  dec i
4b  ld (i),a

pri nahodnem umisteni by to bylo o dost horsi, ale stale lepsi jak puvodni navrh
Kód:
16b ld i, mem_a
4b  ld a,(i)
16b ld i, mem_b
4b  sub (i)
16b ld i, mem_a
4b  ld (i),a


Premyslel jsem i nad slozitejsim CPU se dvema zasobniky.

Dvouzasobnikovy navrh:
Kód:
8 bits instruction
------------------
 0) PUSH(nibble)    ; push(5) ( -- 5 )
 1) PICK(nibble)    ; pick(1) ( .. n2 n1 n0 -- .. n2 n1 n0 n1 )
 2) SWAP(nibble)    ; swap(x) -> ex nx n0 -> ( .. nx .. n1 n0 -- .. n0 .. n1 nx )

4 bits instruction
------------------
 3) ADC         ; top=nos+top
 4) SBC         ; top=nos-top
 5) >R          ; NIBBLE>R ( n --   )( R:   -- n )
 6) R>          ; R>NIBBLE (   -- n )( R: n -- )
 7) !           ; store  ( n -- ) ( R: addr -- )
 8) @           ; fetch  ( -- n ) ( R: addr -- )
 9) NOR         ;
10) IN          ;
11) OUT         ;
12) JMP c       ; JMP c,3R> ( R: addr -- )
13) JMP/RET     ; JMP 3R> ( R: addr -- )

14) CALL???     ; JMP 3R> ( R: addr -- ret )


16 bit instruction
------------------
15) TRIBBLE>R   ; addr>R (ciste kvuli zrychleni skoku a call, misto 9 nibble PUSH(lo) PUSH(me) PUSH(hi) >R >R >R jsou to jen 4 nibble)



Q = A OR B = ( A NOR B ) NOR ( A NOR B )
Q = A AND B = ( A NOR A ) NOR ( B NOR B )
Q = A XOR B = [ ( A NOR A ) NOR ( B NOR B ) ] NOR ( A NOR B )

over ( 1 2 -- 1 2 1 ): PICK(1)
not: PICK(0) NOR
4 nibble or: NOR PICK(0) NOR
9 nibble and: PICK(0) NOR SWAP(0) PICK(0) NOR NOR
17 nibble xor: PICK(1) PICK(1) NOR >R PICK(0) NOR SWAP(0) PICK(0) NOR NOR R> NOR
drop: PICK(0) - PICK(0) - +
clear carry: PUSH(F) PUSH(F) NOR ADC
clear carry: PIC(0) NOR PICK(0) NOR
r@: R> dup >R
push(carry): PUSH(0) PUSH(0) ADC
rot ( 1 2 3 -- 2 3 1 ): >R swap R> swap
2dup( 1 2 -- 1 2 1 2 ): PICK(1) PICK(1)
2swap ( 1 2 3 4 -- 3 4 1 2 ): XSWAP(1) >R XSWAP(1) R>
2over ( 1 2 3 4 -- 1 2 3 4 1 2 ): PICK(3) PICK(3)
3dup ( 123 -- 123123 ): PICK(2) PICK(2) PICK(2)


array[x]
Kód:
16 addr>R
4 R>
4 +
4 R>
4 @



call Fce
Kód:
 3next>R
 3fce>R
 JMP
next:

Fce:
...
 JMP

5 bytes (4.5*x + 0.5)


"inline" fce, usetri se pri prvnim pouziti jedno volani
Kód:
  3end_fce>R
fce:
  ...
  JMP
end_fce:
  ...
  3next>R
  3fce>R
  JMP
next:

7 bytes (4.5*(x-1)+2.5)

neco jako

Kód:
3:10 ld hl, end_fce
1:11 push hl
fce:
...
1:10 ret
end_fce:
...

3:10 ld hl, next
1:11 push hl
3:10 ld hl, fce
1:11 push hl
1:10 ret
next:

14 bytes

oproti
Kód:
  3end_fce>R
fce:
  ...
  JMP
end_fce:
  ...
  3fce>R
  CALL
next:

5 bytes (2.5*(x-1)+2.5)
To je dost slusny, vzhledem k tomu ze neni problem s parametry fce diky PICK(0..15). To je snadny pristup k az 15 parametrum.
To by melo vytvaret zahusteny kod.

neco jako

Kód:
3:17 call Fce
...
3:17 call Fce
...
fce:
...
1:10 ret

7 bytes

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: 4bitový počítač
PříspěvekNapsal: 01.07.2023, 08:37 
Offline
Óm Nejvyšší

Registrován: 16.06.2014, 12:23
Příspěvky: 3677
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 280 times
4x256 bitů (b - bity , B - bajty)
Konkrétně chci použít MH74S287 na mikroprogram a MHB6561 na společnou paměť programu a dat.
Data budou adresovatelná jen 4 bity na konci paměti, 16 registrů.
Chytré by to mělo být asi jako ten Nibler :D

Bavite se o hw architektuře uvedeného "nibleru" a vymýšlíte instrukce, které se tam nedají realizovat bez hw změn a mě zajímají právě ty hw úpravy.

_________________
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: 4bitový počítač
PříspěvekNapsal: 03.07.2023, 11:44 
Offline
Óm Nejvyšší

Registrován: 16.06.2014, 12:23
Příspěvky: 3677
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 280 times
_dworkin píše:
O hardwaru mluvit nebudu, protoze je to uplne mimo me znalosti.


To je ale neštěstí, u těhle demonstračních hraček jde vždy o to, co umí zjednodušený hw a instrukční sada se pasuje na jeho možnosti.

U toho Nibbleru je třeba nesmyslná přímá 12-ti bitová adresace datové paměti, protože s 12-ti bitovou adresací programu to nemám šanci nijak využít.
Přiměřená velikost datové paměti je tak 256 nible, takže zkrátím adresaci na 8 bitů, přidám do I/O prostoru jeden 4-bitový stránkovací registr a mám to ošetřené.
Stránkování se dá použít k 4-bitové indexaci.
Uvolněné 4 bity instrukce můžu použít následovně:
1 bit, adresace základní, nebo mapované stránky
1 bit, ukládání výsledku do akumulátoru, nebo zpět na adresu operandu
2 bity rozšíření instrukce, takže z NOR, můžu udělat třeba NOR, OR, NAND, AND
dtto v aritmetice.
Na rozšířené instrukce stačí zatáhnout 4 takto získané bity operandu do paměti mikroprogramu, kde nyní nejsou využity.

_________________
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: 4bitový počítač
PříspěvekNapsal: 04.07.2023, 16:01 
Offline
Óm Nejvyšší

Registrován: 16.06.2014, 12:23
Příspěvky: 3677
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 280 times
Zajímavý projekt 4-bit, mnohem líp propracovaný a nápaditý, než Nibbler.
https://github.com/edson-acordi/4bit-microcomputer

_________________
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: 4bitový počítač
PříspěvekNapsal: 05.07.2023, 02:29 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
danhard píše:
Zajímavý projekt 4-bit, mnohem líp propracovaný a nápaditý, než Nibbler.
https://github.com/edson-acordi/4bit-microcomputer


U toho nibbleru jsem se v komentarich docetl, ze to jeho omezni byl primo ucel. Slo mu ciste o zjednoduseni po hw strance, takze jsem to vzdal.

Ale tohle je az luxusni...

Mas v podstate ctyri 4 bitove registry.
Akumulator a tri pomocne RC, RB a RA.

Pricemz muzes jak pracovat primo s konstantama tak s pomocnyma registrama a i s tou pameti. A tu pamet dokonce ve dvou rezimech.
Bud se odkazujes na adresu pres RC:medium_konst:low_konst a nebo RC:RB:RA. Kupodivu obe varianty adresovani maji stejnou delku instrukce. Protoze vsechny instrukce jsou 16 bitove, i kdyz asi v polovine pripadu vubec druhy bajt nevyuzije.
Takze nejake divoke optimalizace asi nejdou cekat... proste se snazit udelat co nejmene instrukci. A pokud to jde pouzivat to adresovani s dolnim bytem co je konstanta.

Kupodivu je ten kod pro CALL dost velky i kdyz nechci zadny parametr:
Kód:
16 ldi acc,>next  ; acc=high next
16 ldi rb, medium next
16 ldi ra, low next
16 ldi rc,>fce  ; rc=high fce
16 jpi fce    ; jmp fce
next:
...
fce:
... ; pokud chci manipulovat s Acc, RC, RB a RA musim je nekam ulozit
...
ldr RC   ; rc = high next
jpi @R  ; jmp rc:rb:ra

Ve stejnem segmentu si moc nepomuzeme.

Pokud chceme nekam dat parametr tak celkem boli ze do a z RAM to jde jen pres Acc a vzdy se musi pouzit spravny RC.

Shodne RC pro next a fce.
Kód:
;acc=parametr
16 ldi rc,>next  ; rc=high next=high fce
16 ldi rb, medium next
16 ldi ra, low next
16 jpi fce    ; jmp fce
next:
...
fce:
... ; pokud chci manipulovat s RC, RB a RA musim je nekam ulozit
...
jpi @R  ; jmp rc:rb:ra


Odlisne RC a jeste chci parametry
Kód:
16 ldi rc,0  ;
16 ldi acc, >next  ; high
16 stw @00
16 ldi acc, medium next
16 stw @01
16 ldi acc, low next
16 stw @01
; Acc, RB,RC jsou volne pro parametry
16 ldi rc,>fce  ; rc=high fce
16 jpi fce    ; jmp fce
next:
...
fce:
...
16 ldw @00
16 ldr rc     ; rc = high next
16 ldw @01
16 ldr rb     ; rb = medium next
16 ldw @02
16 ldr ra     ; ra = low next
16 jpi @R  ; jmp rc:rb:ra

Pro RET se pouziva konstantni adresa 000:002.

I kdyz tam pise ze je to harwardska architektura tak tam vznikaji zvlastni optimalizace kvuli pouziti RC jak pro pristup do RAM tak pro ty skoky.
Kdyz nastavim do RC hodnotu pro navratovy skok (v ROM) tak zaroven tim vytvorim 256 adres pro "lokalni" parametry (v RAM). Takze pokud chci parametry v RAM a ne registrech tak to bude vypadat takto:

Kód:
16 ldi rc,>next  ;
16 ldi acc, param1
16 stw @00
16 ldi acc, param2
16 stw @01
...
16 ldi ACC,>next  ;
16 ldi RB, medium next
16 ldi RC, low next
16 ldi rc,>fce  ; rc=high fce
16 jpi fce    ; jmp fce
next:
...
fce:
16 ldr RC  ; RC = high next v ROM pro navrat a vlastne zaroven i to okno v RAM pro ty parametry
16 ldw @xx  ; nacteni do ACC libovolneho parametru v jakemkoliv poradi
...
16 jpi @R  ; jmp rc:rb:ra


Nevim jestli se me to libi, protoze to volani CALL slo asi udelat snadneji. Nebo me neco nedochazi?
Asi bylo lepsi to navrhnout s tim, ze adresovani a skok by sel udelat cely pres konstantu. Takze RC:RB:RA by bylo pro navratovou adresu a na CALL by se pouzilo proste "JPI fce". ACC je pak uplne volny. To by ale musel jinak preskladat to kodovani instrukci.
Takze vidim ze to RC je problematicke.

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: 4bitový počítač
PříspěvekNapsal: 05.07.2023, 10:33 
Offline
Óm Nejvyšší

Registrován: 16.06.2014, 12:23
Příspěvky: 3677
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 280 times
Je to složité :D

A já to chci všechno na jedné paměti ROM mikroprogramu 4bity x 256 a na jedné paměti RAM 4bity x 256, kde bude jak program, tak 16 nible data, I/O prostor 16 nible IN/OUT.
Instrukce budou dlouhé 1 až 4 nible, mikroprogram 16 instrukcí x 16 taktů a jednoúrovňový CALL tam bude také programově možný, užere 2 nible datové oblasti RAM.

Se 4-mi bity je to ale opruz, jako dobrej a dostupnej stavební materiál jsou 8-mi bitový RAMky a EEPROMky, příští demo procesor bude 8-mi bitovej.
Něco mezi PIC16C54, 8051 a 6502 :lol:

_________________
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: 4bitový počítač
PříspěvekNapsal: 09.07.2023, 20:16 
Offline
Óm Nejvyšší

Registrován: 16.06.2014, 12:23
Příspěvky: 3677
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 280 times
4-biťáky se dlouho udrželi ve spotřební elektronice, televize, videa.
https://pdf1.alldatasheet.com/pdfjsview ... asheet.pdf

_________________
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  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 28 ]  Přejít na stránku Předchozí  1, 2

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 15 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