Děkuju za další pěkný článek.
Když jsem se po zkušenostech s 8080, 8086, 8051 (no a trochu 6502) dostal k 8-bitovému atmelu tak moje první reakce na instrukční sadu byla že autoři si vzali to nejlepší z Intelu, Motoroly a možná i jiných.
Hlavně se mi líbily instrukce pro čtení/zapis z/do paměti, které automaticky inkremetují/dekrementují ukazatele.
ldi r26,low(SCREEN_ADR) ;nastaveni ukazatele X
ldi r27,high(SCREEN_ADR)
ldi r28,low(SECOND_SCREEN_BLOCK) ;nastaveni ukazatele Y
ldi r29,high(SECOND_SCREEN_BLOCK)
ldi r18,low(SCREEN_BLOCK_SIZE) ;nastaveni pocitadla opakovani
ldi r19,high(SCREEN_BLOCK_SIZE)
cyklus: ld r16,X+ ;nacteni hodnoty z pameti 2
st Y+,r16 ;zapis do pameti 2
dec r18 ;snizeni pocitadla 1
brne cyklus ;opakovani dokud R18<>0 2
dec r19 ;snizeni pocitadla
brne cyklus ;opakovani dokud R19<>0
Vnitřní smyčka trvá tedy pouze 7 taktů (a vzhledem k běžné frekvenci 16MHz je tedy asi 6x rychlejší). Je vidět že zkušenosti více než 20 let s prvními mikroporcesory se při návrhu zúročily. Předpokládám že svoji roli tady hraje také dvojúrovňový pipelining.
2. 5. 2023, 16:30 editováno autorem komentáře
to se vám možná bude líbit Uzebox: https://www.root.cz/clanky/herni-konzole-uzebox-s-osmibitovym-mikroradicem-atmega644/
(ten video výstup by bylo lepší upravit na něco modernějšího, ale kompozitní vstup se dá ještě najít, nebo nějakej konvertor pro něj).
Uzebox je pěkná hračka. (Četl jsem všechny články o hardware....)
Učím na střední škole a asi před 5 roky jsem měl žáka který se zajímal o herní konzole a v rámci praktické práce si chtěl pořídit Uzebox a zkusit si do něj napsat nějakou hru. Bohužel už se stavebnice nedala koupit. Jako náhradní program nakonec vznikla vektorová "herní konzole" (2x 8bitD/A - R-2R sít přímo na dvou portech a výstupy operačních zesilovačů připojené na X a Y vstupy CRT osciloskopu).
Pěkná hračka je taky emulátor čipu AY-3-8500 pro TV hry založený na arduinu http://searle.x10host.com/AVRPong/index.html (použitý byl upravený návrh od Nostalcompa). Po připojení na dataprojektor málokdo odolal....
tak to musim gratulovat k dobremu zaku! ze mel zajem, ktery presahoval hrani Minecraftu :-)
K te vektorove konzoli: takze ty operacni zesilovace byly pouzity jako linearni interpolatory? Tj. "semtam" se zapsaly nove souradnice [x,y] a pockalo se, az to paprsek dokresli? To by bylo pekne reseni, jeste bych asi pridal Z vystup s intenzitou paprsku (pokud to osciloskop umi).
Mě šlo o to, že třeba na Vectrexu to je takto řešeno. Program musí generovat jen koncové body vektorů a zbytek si dopočítají integrátory (na vstupu asi bude výstup z toho r2r žebříku). Takže ten program nakonec může být docela pomalý a určitě nemusí počítat nějakého Bresenhama atd.
Je to vidět tady
https://www.root.cz/clanky/historie-vyvoje-pocitacovych-her-16-cast-herni-konzole-vectrex/#k07
hlavně na schématu https://i.iinfo.cz/images/391/7720.png
Takhle dokonalý jako Vectrex to není. Vykreslování je realizováno softwarově jeden 8.bitový port X a druhý Y. Aby se vykreslila čára musí se kreslit "pomalu" 1b za 5us (0,2b/us) což prři opakovací frekvenci 150Hz vychází na celkovou délku čáry 1300 bodů. Na herní ploše 160x160 jsou vykreslovány objekty o velikosti 20x20 (délka čáry 80-120) no a víc jak 10 se jich na obrazovku nevejde. Žádné složité výpočty program nedělá, objekty se skládají z vodorovné, svislé a šikmé (45°) čáry takže na všechno stačí jednoduchá smyčka s DEC a INC
ukázka vykreslovaní:
.macro CaraL ;Cara vlevo
ldi r21,@0
cal: out PORTB,r8 ;vystup X
out PORTD,r9 ;vystup Y
dec r8 ;zmena souradnice
call delay_cara ;zpozdeni
dec r21 ;snizeni pocitadla
brne cal ;cyklus
.endmacro
;..............................................................
.macro CaraUR ;Sikma cara v pravo nahoru
ldi r21,@0
caur: out PORTB,r8 ;vystup X
out PORTD,r9 ;vystup Y
inc r8 ;zmena souradnice do prava
inc r9 ;zmena souradnice nahoru
call delay_cara ;zpozdeni
dec r21 ;snizeni pocitadla
brne caur ;cyklus
.endmacro
;-------Vykresleni hrace---------------------------------------
Hrac: mov r8, r5
ldi r20, YHrac
mov r9, r20
CaraDR VelObj/2
CaraD VelObj/4
CaraDL VelObj/4
CaraL VelObj/2
CaraUL VelObj/4
CaraU VelObj/4
CaraUR VelObj/2
ret
;-------Objekt04 Ctverec X-------------------------------------
.org AdrObj04*0x100
ldi r20, VelObj/2
sub r8, r20
CaraR VelObj
CaraU VelObj
CaraL VelObj
CaraD VelObj
CaraUR VelObj
ldi r20, VelObj
sub r8, r20
CaraDR VelObj
ret3. 5. 2023, 20:51 editováno autorem komentáře
Na to by ale dva operaky skutocne nestacili. Podla toho co vidim v tej scheme k vectrexu, tak sa to chova podobne ako turtle grafika s tym ze jediny sposob ako ovladat zelvu (elektronovy luc, kresliaci na luninofor) je nastavovat napatie ktore udava cielove suradnice do ktorych sa ma zelva dostat. Zelva ma 2 rychlosti - vykreslovanie a "teleport" (analogovy spinac v spatnej vazbe integratoru, tvoreny 4066). Naviac procesor nema spatnu vezbu kde sa v skutocnosti zelva nachadza, vie len to kde by sa nachadzat mala. Pride mi ze kod procesoru bude za tychto podmienok o dost zlozitejsi ako jednoduche priame hybanie zelvou. Ale umozni to vykreslit komplikovanejsiu grafiku.
Ten operak tvoriaci prudovo napatovy konvertor mate vo vectrexu pripojeny na vystup MC1408. V spominanom skolskom projekte budu predpokladam tie r2r prevodniky dva a tym padom aj dva operaky ktore prevadzaju prudovy vystup (vysoka impedancia) na napatovy vystup (nizka impedancia).