OldComp.cz

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


Právě je 23.04.2024, 13:33

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 29 ]  Přejít na stránku 1, 2  Další
Autor Zpráva
PříspěvekNapsal: 24.06.2013, 00:14 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1118
Has thanked: 100 times
Been thanked: 160 times
Ahoj. Testuji schopnosti a limity ZX pro ctvereckovy dungeon podobny hre EOB a vykresluji obraz 18*14 znaku prvne do bufferu ( je to v podstate kopie screen na jine adrese s identickym rozlozenim obrazu a atributu ) a az jsem hotov kopiruji to na screen. Myslel jsem si, ze to delam celkem rychle, ale ve fuse emulatoru mi to trosku problikava. Pritom jsem videl mnohem cistsi obraz v jednom demu a pro kopirovani pouzivali taky ldi. Nevim zda problem neni v tom, ze kopiruji prvne data po microradcich pro prvni tretinu, pak to same pro druhou a pak atributy. Zda nema lepsi opticky efekt do delat jakoby po znacich. Pripadne po radcich.

Kód:
; Kopirovani 18*14 znaku vcetne atributu z bufferu na screen
; Buffer ma rozmery a rozlozeni dat stejne jako SCREEN, jen jinou adresu
; Na obrazovce bude obsah zobrazen vlevo nahore
COPY_BUFFER2SCREEN:
   ld   h,Adr_Buffer/256      ;  7:2
   ld   d,$40            ;  7:2
   ld   ix,224*256+8         ; 14:4
CB2S_NEXT_MICROLINE:
   ld   a,ixh            ;  8:2 d = {160,224}

CB2S_RADKY:
   ld   e,a            ;  4:1 e = {0,32,64,96,128,160,192,224}
   ld   l,a            ;  4:1
   ldi               ; 16:2 (de++) = (hl++), ignore bc--
   ldi               ; 16:2
   ldi               ; 16:2  3x
   ldi               ; 16:2
   ldi               ; 16:2
   ldi               ; 16:2  6x
   ldi               ; 16:2
   ldi               ; 16:2
   ldi               ; 16:2  9x
   ldi               ; 16:2
   ldi               ; 16:2
   ldi               ; 16:2 12x
   ldi               ; 16:2
   ldi               ; 16:2
   ldi               ; 16:2 15x
   ldi               ; 16:2
   ldi               ; 16:2
   ldi               ; 16:2 18x
   sub   32            ;  4:1 o radek nahoru
   jr   nc,CB2S_RADKY

   inc   h            ; 4:1 o microline nize
   inc   d            ; 4:1 o microline nize
   dec   ixl
   jr   nz,CB2S_NEXT_MICROLINE

   ld   a,d            ; $965E

   ld   ix,160*256+8         ; 14:4
   cp   $48
   jr   z,CB2S_NEXT_MICROLINE      ; Druha tretina, jen 6 radku = a = 160

   ld   h,Adr_Attr_Buffer/256      ;  7:2
   ld   d,$58            ;  7:2   
   ld   ix,224*256+1         ; 14:4
   cp   $50
   jr   z,CB2S_NEXT_MICROLINE      ; Prvni tretina atributu

   inc   h
   inc   d
   ld   ix,160*256+1         ; 14:4
   cp   $59
   jr   z,CB2S_NEXT_MICROLINE      ; Druha tretina atributu

   ret


http://ulozto.cz/xpdGR5Ph/zx-dungeon-demo-v0-2-z80

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


Nahoru
 Profil  
 
PříspěvekNapsal: 24.06.2013, 11:59 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1118
Has thanked: 100 times
Been thanked: 160 times
dex píše:
... a halt je kde?
Doporučuju pro ladící účely na začátek a konec kopírování přidat změnu borderu (klasicky ld a, konstanta: out (254),a).

Ted jsi mne dostal. Tuhle instrukci jsem ignoroval, protoze jsem predpokladal ze zastavi nadobro procesor. Aspon tak to vypadalo ve fuse debuggeru, kdyz jsem se koukal kde to skoncilo a vetsinou nekde v ROM na HALT. Takze HALT ceka na preruseni, aby se pak neaktivovalo ve spatnou chvili, jenze ja ve fci VIEW pouzivam SP pro presun dat a tak jsem ji mel obalenou di - ei a prvni co jsem udelal pri problikavani COPY_BUFFER2SCREEN, ze jsem ji strcil do casti bez preruseni takze mi HALT nepomuze. Problem je v konstrastnich atributech, je to videt kdyz se to meni.
Kód:
MAIN_LOOP:
   di
   call   VIEW
   call   COPY_BUFFER2SCREEN
   ei
   call   KEYPRESSED
   jp   MAIN_LOOP


Nebo to HALT ma i jinou fci? Ze zaroven s nim se zrovna vykresluje paprsek? Jde zjistit kdy se to dela a synchronizovat s tim BUFFER2SCREEN?

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


Nahoru
 Profil  
 
PříspěvekNapsal: 24.06.2013, 12:57 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3668
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
Preco aj pri volani COPY_BUFFER2SCREEN mas zakazane prerusenie ked tam uz zasobnik na prenos udajov nepouzivas ?

Skus to takto:

MAIN_LOOP:
di
call VIEW
ei
halt
call COPY_BUFFER2SCREEN
call KEYPRESSED
jp MAIN_LOOP

PS: Pokial nemusis, prerusenie radsej nezakazuj. Pokial budes chciet v buducnosti mat na pozadi nejake AY zvuky alebo hudbu, je vhodne prerusenie nechat povolene. Pokial potrebujes zasobnik na rychly prenos udajov kvoli generovaniu obrazu, je vhodne tieto presuny synchronizovat s prerusenim (to robi prave ten halt) aby k preruseniu doslo az vtedy, ked SP nebude ukazovat na data ktore by nemali byt prepisane.


Nahoru
 Profil  
 
PříspěvekNapsal: 24.06.2013, 13:48 
Offline
Pan Štábní

Registrován: 12.05.2013, 22:24
Příspěvky: 1524
Bydliště: u Prahy
Has thanked: 44 times
Been thanked: 386 times
Pokud mám mluvit za sebe (http://www.worldofspectrum.org/infoseekid.cgi?id=0015216), tak grafika, má-li být trochu rozmanitější, sežere tolik, že je stejně potřeba ZX 128.
Čili bych nějaké blikání neřešil a použil bych dvě VRAM.
Něco jiného ovšem je, pokud to opravdu musí vystačit se Spectrem 48 kB.


Nahoru
 Profil  
 
PříspěvekNapsal: 24.06.2013, 14:51 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3668
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
dex píše:
grafika, má-li být trochu rozmanitější, sežere tolik, že je stejně potřeba ZX 128. Čili bych nějaké blikání neřešil a použil bych dvě VRAM.

To je samozrejme pravda, ale v tomto pripade sa zda ze problem bol v chybajucej synchronizacii s obrazom. Pretoze preniest obraz 18*14 znakov sa v pohode stiha za menej ako dve tretiny pedesiatiny a pri spravnej synchronizacii to pekne ide aj s jednou videoramkou.


Nahoru
 Profil  
 
PříspěvekNapsal: 24.06.2013, 15:28 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1118
Has thanked: 100 times
Been thanked: 160 times
Grafika ma zatim velikost 13.7 kb a stale je tu moznost vyhodit pravou stranu a udelat si tabulku vertikalne zrcadlenych 256 hodnot a nechat si jen levou cast a stredy. Zatim jsem to vubec neoptimalizoval, jsem rad ze dokazi najit vubec nejake reseni dalsich problemu co na mne vyskakuji. Mel jsem doma klasickeho gumaka 48, tak je to takove osobni rozhodnuti zkusit co se z toho da vytahnout. Chci vedet zda Bloodwych pro 128 je opravdu to nejlepsi co ZX umi. Pokud to nepujde zkusim prvne cachry s diskem. Pak 128 nebo to vzdam. .)

Zapnout to preruseni a ohlidat si aby mne neskocilo doprostred kopirovani udelam, ale problem to neresi. Nastavil jsem ve fuse rychlost na 20% a zjistitl, ze to bude opravdu problem s atributy. Horizont podlahy mi konci v pulce znaku. Horni je cerny INK a spodni zluty PAPER. Pri prekresleni na cervenou zed v PAPER mi to na kratickou chvilicku zezloutne a blikne. Napsal jsem teda verzi kde kopiruji po radcich a uz mne nektere veci neblikaji, ale nejake zustalo:

Kód:
; Kopirovani 18*14 znaku vcetne atributu z bufferu na screen
; Buffer ma rozmery a rozlozeni dat stejne jako SCREEN, jen jinou adresu
; Na obrazovce bude obsah zobrazen vlevo nahore
; Fce prepsana na kopirovani po radku a okamzitou zmenu atributu daneho radku kvuli problikavani
COPY_BUFFER2SCREEN:
   
   ld   a,8+Adr_Buffer/256      ;  7:2
   ld   (CB2S_SELFMODIFYING+1),a   ; 13:3 druha tretina pro pixely v bufferu
   ld   a,1+Adr_Attr_Buffer/256      ;  7:2
   ld   (CB2S_SELFMODIFYING_2+1),a   ; 13:3 druha tretina pro atributy v bufferu
   ld   a,160            ;  7:2 zbyva jen 6 radku
   ld   ix,$4859         ; 14:4 druhe tretiny pro pixely a pro atributy   

   jp   CB2S_SELFMODIFYING
   
CB2S_NEXT_RADEK:
   sub   32            ;  7:2 a = {224,192,160,128,96,64,32,0}
   jr   c,CB2S_NEXT_TRETINA      ; 12/7:2
   
CB2S_SELFMODIFYING:
   ld   h,0            ;  7:2 self-modifying code {Adr_Buffer/256,8+Adr_Buffer/256}
   ld   d,ixh            ;  8:2 {$40,$48}
   ld   bc,$0890         ; 10:3 $90 = 18*8
CB2S_RADEK:
   ld   e,a            ;  4:1 e = {224,192,160,128,96,64,32,0}
   ld   l,a            ;  4:1
   ldi               ; 16:2 (de++) = (hl++), bc--
   ldi               ; 16:2
   ldi               ; 16:2  3x
   ldi               ; 16:2
   ldi               ; 16:2
   ldi               ; 16:2  6x
   ldi               ; 16:2
   ldi               ; 16:2
   ldi               ; 16:2  9x
   ldi               ; 16:2
   ldi               ; 16:2
   ldi               ; 16:2 12x
   ldi               ; 16:2
   ldi               ; 16:2
   ldi               ; 16:2 15x
   ldi               ; 16:2
   ldi               ; 16:2
   ldi               ; 16:2 18x
   inc   d            ;  4:1 o microline dolu
   inc   h            ;  4:1 o microline dolu
   djnz   CB2S_RADEK         ; 13/8:2 8x
      
   dec   c            ;  4:1  c = {0 = musime nakopirovat atributy, $6F}
   jp   p,CB2S_NEXT_RADEK      ; 10:3 jump not sign

; nakopirujeme i atributy
CB2S_SELFMODIFYING_2:
   ld   h,0            ;  7:2 self-modifying code {Adr_Buffer/256,8+Adr_Buffer/256}
   ld   d,ixl            ;  8:2 {$40,$48}
   inc   b            ;  4:1 "b" bude 1 a v "c" je $ff
   jp   CB2S_RADEK         ; 10:3

CB2S_NEXT_TRETINA:
   ld   a,$40            ;  7:2
   cp   ixh            ;  8:2
   ret   z            ; 11/5:1 obe tretiny mame za sebou

   ld   ix,$4058         ; 14:4 prvni tretiny pro pixely a pro atributy
   ld   a,Adr_Buffer/256      ;  7:2
   ld   (CB2S_SELFMODIFYING+1),a   ; 13:3 prvni tretina pro pixely v bufferu
   ld   a,Adr_Attr_Buffer/256      ;  7:2
   ld   (CB2S_SELFMODIFYING_2+1),a   ; 13:3 prvni tretina pro atributy v bufferu
   ld   a,224            ;  7:2

   jp   CB2S_SELFMODIFYING      ; 10:3

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


Nahoru
 Profil  
 
PříspěvekNapsal: 24.06.2013, 16:14 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1118
Has thanked: 100 times
Been thanked: 160 times
Prohnal jsem to pres profiler fuse.

Kód:
0x0038   11            
0x0039   11            
0x003a   16            
0x003d   6            
0x003e   16            
0x0041   4            
0x0042   4            
0x0043   12            
0x0048   11            
0x0049   11            
0x004a   17            
0x004d   10            
0x004e   10            
0x004f   10            
0x0050   10            
0x0051   4            
0x0052   10            
0x028e   7            
0x0290   10            
0x0293   10            
0x0296   96            
0x0298   32            
0x0299   56            
0x029b   96            
0x02ab   32            
0x02ac   64            
0x02ae   91            
0x02b0   4            
0x02b1   4            
0x02b2   11            
0x02bf   17            
0x02c2   5            
0x02c3   10            
0x02c6   24            
0x02c8   19            
0x02ca   6            
0x02cb   11            
0x02cc   6            
0x02cd   12            
0x02d1   8            
0x02d2   20            
0x02d5   8            
0x02d6   19            
0x02d8   17            
0x02db   11            
0x031e   4            
0x031f   7            
0x0321   4            
0x0322   7            
0x0324   11            

0xd63c   7      ld   a,8+Adr_Buffer/256      ;  7:2
0xd63e   13      ld   (CB2S_SELFMODIFYING+1),a   ; 13:3 druha tretina pro pixely v bufferu
0xd641   7      ld   a,1+Adr_Attr_Buffer/256      ;  7:2
0xd643   13      ld   (CB2S_SELFMODIFYING_2+1),a   ; 13:3 druha tretina pro atributy v bufferu
0xd646   7      ld   a,160            ;  7:2 zbyva jen 6 radku
0xd648   14      ld   ix,$4859         ; 14:4 druhe tretiny pro pixely a pro atributy
0xd64c   10      jp   CB2S_SELFMODIFYING   

CB2S_NEXT_RADEK:
0xd64f   98      sub   32            ;  7:2 a = {224,192,160,128,96,64,32,0}
0xd651   108      jr   c,CB2S_NEXT_TRETINA      ; 12/7:2

CB2S_SELFMODIFYING:
0xd653   98      ld   h,0            ;  7:2 self-modifying code {Adr_Buffer/256,8+Adr_Buffer/256}
0xd655   125      ld   d,ixh            ;  8:2 {$40,$48}
0xd657   140      ld   bc,$0890         ; 10:3 $90 = 18*8

CB2S_RADEK:
0xd65a   840      ld   e,a            ;  4:1 e = {224,192,160,128,96,64,32,0}
0xd65b   840      ld   l,a            ;  4:1
0xd65c   3781      ldi               ; 16:2 (de++) = (hl++), bc--
0xd65e   3821      ldi               ; 16:2
0xd660   3870      ldi               ; 16:2  3x
0xd662   3891      ldi               ; 16:2
0xd664   3920      ldi               ; 16:2
0xd666   3833      ldi               ; 16:2  6x
0xd668   3736      ldi               ; 16:2
0xd66a   3650      ldi               ; 16:2
0xd66c   3622      ldi               ; 16:2  9x
0xd66e   3596      ldi               ; 16:2
0xd670   3595      ldi               ; 16:2
0xd672   3714      ldi               ; 16:2 12x
0xd674   3789      ldi               ; 16:2
0xd676   3877      ldi               ; 16:2
0xd678   3919      ldi               ; 16:2 15x
0xd67a   3941      ldi               ; 16:2
0xd67c   3875      ldi               ; 16:2
0xd67e   3760      ldi               ; 16:2 18x
0xd680   840      inc   d            ;  4:1 o microline dolu
0xd681   840      inc   h            ;  4:1 o microline dolu
0xd682   2170      djnz   CB2S_RADEK         ; 13/8:2 8x
0xd684   448      dec   c            ;  4:1  c = {0 = musime nakopirovat atributy, $6F}
0xd685   1120      jp   p,CB2S_NEXT_RADEK      ; 10:3 jump not sign

CB2S_SELFMODIFYING_2:   
0xd688   686      ld   h,0            ;  7:2 self-modifying code {Adr_Buffer/256,8+Adr_Buffer/256}
0xd68a   784      ld   d,ixl            ;  8:2 {$40,$48}
0xd68c   392      inc   b            ;  4:1 "b" bude 1 a v "c" je $ff
0xd68d   980      jp   CB2S_RADEK         ; 10:3

CB2S_NEXT_TRETINA:
0xd690   14      ld   a,$40            ;  7:2
0xd692   16      cp   ixh            ;  8:2
0xd694   16      ret   z            ; 11/5:1 obe tretiny mame za sebou
0xd695   14      ld   ix,$4058         ; 14:4 prvni tretiny pro pixely a pro atributy
0xd699   7      ld   a,Adr_Buffer/256      ;  7:2
0xd69b   13      ld   (CB2S_SELFMODIFYING+1),a   ; 13:3 prvni tretina pro pixely v bufferu
0xd69e   7      ld   a,Adr_Attr_Buffer/256      ;  7:2
0xd6a0   13      ld   (CB2S_SELFMODIFYING_2+1),a   ; 13:3 prvni tretina pro atributy v bufferu
0xd6a3   7      ld   a,224            ;  7:2
0xd6a5   10      jp   CB2S_SELFMODIFYING      ; 10:3


Bez ROM rutiny je to 78887 cyklu = 0,02253914285714 vteriny = 44,3672594977626x za vterinu. Aby to bylo 50x za vterinu musel bych usetrit presne 8887 cyklu. Rozbalit smycku, nebo to jinak prepsat.

PS: To 50x za vterinu potrebuji kvuli obnovovci frekvenci TV?

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


Naposledy upravil _dworkin dne 24.06.2013, 18:47, celkově upraveno 3

Nahoru
 Profil  
 
PříspěvekNapsal: 24.06.2013, 18:10 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1118
Has thanked: 100 times
Been thanked: 160 times
Tak nakonec jsem skoncil zase u prvni verze. Jen jsem pridal atributy hned za kazdou prekopirovanou tretinu. Takze jsem to blikani omezil 2x. A po dalsich testech jsem to otocil a atributy jdou jako prvni v kazde tretine a az pak hrnu pixely. Protoze verze po radcich "plave" odspoda nahoru. A ta prvni verze jak jede po mikroradcich tak se ty chyby jakoby rozprostrou po celem obrazu. U tech radku bych musel zkouset delat to sude a pak liche, nebo jinak a ta fce uz by byla zase zbytecne dlouha.

Otazka je, jak to vypada na realnem hardwaru.

Kód:
; Kopirovani 18*14 znaku vcetne atributu z bufferu na screen
; Buffer ma rozmery a rozlozeni dat stejne jako SCREEN, jen jinou adresu
; Na obrazovce bude obsah zobrazen vlevo nahore
COPY_BUFFER2SCREEN:
   ; 1. faze atributy 1. tretiny obrazovky
   ld   h,Adr_Attr_Buffer/256      ;  7:2
   ld   d,$58            ;  7:2
   ld   ix,224*256+1         ; 14:4
CB2S_NEXT_MICROLINE:
   ld   a,ixh            ;  8:2 d = {160,224}

CB2S_RADKY:
   ld   e,a            ;  4:1 e = {0,32,64,96,128,160,192,224}
   ld   l,a            ;  4:1
   ldi               ; 16:2 (de++) = (hl++), ignore bc--
   ldi               ; 16:2
   ldi               ; 16:2  3x
   ldi               ; 16:2
   ldi               ; 16:2
   ldi               ; 16:2  6x
   ldi               ; 16:2
   ldi               ; 16:2
   ldi               ; 16:2  9x
   ldi               ; 16:2
   ldi               ; 16:2
   ldi               ; 16:2 12x
   ldi               ; 16:2
   ldi               ; 16:2
   ldi               ; 16:2 15x
   ldi               ; 16:2
   ldi               ; 16:2
   ldi               ; 16:2 18x
   sub   32            ;  4:1 o radek nahoru
   jr   nc,CB2S_RADKY

   inc   h            ; 4:1 o microline nize
   inc   d            ; 4:1 o microline nize
   dec   ixl            ;  {8x,1x}
   jr   nz,CB2S_NEXT_MICROLINE

   ld   a,d            ; budeme zkouset v jake ze 4 fazi jsme

   ld   h,Adr_Buffer/256      ;  7:2
   ld   d,$40            ;  7:2   
   ld   ixl,8            ; 11:3 2. faze bude kopirovat 8x microline
   cp   $59            ; test na konec faze 1
   jr   z,CB2S_NEXT_MICROLINE      ; Zacatek 2. faze = kopiruj prvni tretinu pixelu

   ld   h,1+Adr_Attr_Buffer/256      ;  7:2
   ld   d,$59            ;  7:2   
   ld   ix,160*256+1         ; 14:4
   cp   $48            ; test na konec faze 2
   jr   z,CB2S_NEXT_MICROLINE      ; Zacatek 3. faze = kopiruj druhou tretinu atributu

   ld   h,8+Adr_Buffer/256      ;  7:2
   ld   d,$48            ;  7:2
   ld   ixl,8            ; 11:3
   cp   $5A            ; test na konec faze 3
   jr   z,CB2S_NEXT_MICROLINE      ; Zacatek 4. faze = druha tretina pixelu, jen 6 radku = a = 160

   ret


Je to 46377 cyklu. Zabil jsem si tim cely jeden volnej destivej den. .)

PS: Diky vsem za pomoc.

PSS: Netusil jsem ze Busy je ze slovenska.

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


Nahoru
 Profil  
 
PříspěvekNapsal: 25.06.2013, 06:57 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3668
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
dex píše:
Zkušenost praví, že co se nestihne vykreslit před paprskem, stihne se vykreslit po něm.
Kdyby byla ta verze s OUTy do borderu, tak by bylo hned vidět, kde se co stíhá a co ne (počítání taktů člověku tak přehledně neřekne, kde se zrovna nachází paprsek).
Jeden dát hned před CB2S_NEXT_MICROLINE a druhý před koncový RET (každý jinou barvou).

Presne tak :thumbup: Tento sposob vizualizacie casovych pomerov v ramci pedesiatiny pouzivam aj ja. Vid SS+E v Echologii (SS+Q to zase vypne).


Nahoru
 Profil  
 
PříspěvekNapsal: 25.06.2013, 18:28 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1118
Has thanked: 100 times
Been thanked: 160 times
Dobre, chapu to teda tak, ze ta HALT instrukce zastavi procesor dokud neprobehne to prekresleni 50x za vterinu a pote ho zase spusti? Ja to prvne pochopil, ze probehne jen preruseni ROM, zkontroluje se stisk klaves a nevim co jeste dela.

citace ASSEMBLER A ZX Spectrum 1 dil:
Citace:
"Instrukce čekání na přerušení - halt. Zastaví procesor do doby, než dojde k přijetí
žádosti o přerušení. Pokud je ovšem přerušení zakázáno, bude procesor čekat věčně - dosti
častý důvod, proč se program "zadře". Proto raději před každou instrukci halt vložte ještě
instrukci ei."


... než dojde k přijetí žádosti o přerušení. To zni jako by pri rozjeti po HALT nasledovalo hned to pro mne nezname preruseni. Ted jsem si uvedomil, ze by stejne probehlo a vratilo se na prvni istrukci za HALT, tak je to pro mne bezvyznamne. Kolize nebude nikdy.

Udelal jsem teda tu verzi s BORDER, ale fuse zda se neumi emulovat TV, tak bez jineho emulatoru nebo realneho ZX to nezjistim. Protoze ve fuse ted blikam a blikam... :) Bylo by fajn vedet ze na realnem hardwaru problem nemam.

PS: Zacal jsem (znovu) programovat na ZX nekdy pred 13.5.2013, proto jsem tohle dal pod zacatecniky.
PSS: Ten ctrl+x (funguje pod fuse) je na originalnim hardwaru ta klavesa co po stisku + P udela uvozovky po LOAD (SYMBOL SHIFT?). Pri RUN 100 a stisku to vraci kod 96 ( libra?).


Přílohy:
Poznámka: Test Dungeonu na ZX Spectrum 48kb,
pocatecni verze 0.3 se zmenou atributu BORDERU pred kopirovanim bufferu na obrazovku a navrat na cernou na konci.

zx_dungeon_border_ver.tap [9.06 KiB]
217 krát

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH
Nahoru
 Profil  
 
PříspěvekNapsal: 25.06.2013, 19:42 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3668
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
_dworkin píše:
Dobre, chapu to teda tak, ze ta HALT instrukce zastavi procesor dokud neprobehne to prekresleni 50x za vterinu a pote ho zase spusti? Ja to prvne pochopil, ze probehne jen preruseni ROM, zkontroluje se stisk klaves a nevim co jeste dela.
citace ASSEMBLER A ZX Spectrum 1 dil:
Citace:
"Instrukce čekání na přerušení - halt. Zastaví procesor do doby, než dojde k přijetí
žádosti o přerušení. Pokud je ovšem přerušení zakázáno, bude procesor čekat věčně - dosti
častý důvod, proč se program "zadře". Proto raději před každou instrukci halt vložte ještě
instrukci ei."

... než dojde k přijetí žádosti o přerušení. To zni jako by pri rozjeti po HALT nasledovalo hned to pro mne nezname preruseni. Ted jsem si uvedomil, ze by stejne probehlo a vratilo se na prvni istrukci za HALT, tak je to pro mne bezvyznamne. Kolize nebude nikdy.

Je to sice napisane spravne, ale mozno prilis komplikovane. Pre zaciatok uplne staci, ked si zapametas, ze instrukcia HALT synchronizuje program so zobrazovanim. To znamena, ze ked v programe urobis HALT, program tam zastane a pokracovat bude v okamihu, ked ULA zacne vykreslovat obraz zase odznovu. A toto sa deje 50x za sekundu.
_dworkin píše:
Udelal jsem teda tu verzi s BORDER, ale fuse zda se neumi emulovat TV, tak bez jineho emulatoru nebo realneho ZX to nezjistim. Protoze ve fuse ted blikam a blikam... :) Bylo by fajn vedet ze na realnem hardwaru problem nemam.

On moze byt problem aj v tom, ze emulator sice emuluje ZX Spektrum vykresujuce obraz 50x za sekundu, ale obvykla obnovovacia frekvencia LCD monitorov byva 60 Hz. Takze pekne plynule to v emulatore nikdy nebude.
_dworkin píše:
PS: Zacal jsem (znovu) programovat na ZX nekdy pred 13.5.2013, proto jsem tohle dal pod zacatecniky.
PSS: Ten ctrl+x (funguje pod fuse) je na originalnim hardwaru ta klavesa co po stisku + P udela uvozovky po LOAD (SYMBOL SHIFT?). Pri RUN 100 a stisku to vraci kod 96 ( libra?).

Ked mas msdos/windows, skus pouzit RealSpec (RS32): http://zxm.speccy.cz/realspec/ . To je (zatial) najvernejsi emulator ZX Spektra. Ja na v nom napriklad ladim multicolory.

Btw. ten tap co si prilozil sa neda nacitat - to nie je standartny format tap, ale nejaky interny fusacky. Ked chces nieco zverejnit, prosim pouzivaj standartny TAP http://www.nvg.ntnu.no/sinclair/faq/fileform.html#TAPZ


Nahoru
 Profil  
 
PříspěvekNapsal: 25.06.2013, 20:17 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1118
Has thanked: 100 times
Been thanked: 160 times
Mel jsem Mageiu, ale ta nemela myslim zadny emulator spectra v repozitari. Potreboval jsem aktualizovat na vyssi a cekal jsem na trojku az mne dosla trpelivost a dal tam Xubuntu. Jeden z duvodu proc jsem se zblaznil a zacal delat ten dungeon. Nastahoval prvne dema, uzasne. Pak hry, vcetne Bloodwych a Mezi Vezemi, ale nebylo to ono..

S temi formaty ve fuse bojuji. Interni je SZX. Uklada to samozrejmne bez pripony, dulezita je jen hlavicka. A v te je "ZXST" a z toho jsem to vygooglil. SZX umi ale uz jen ten Realspectrum. Pak jsem ho prinutil udelat i Z80 myslim, ze jsem mu vnutil priponu. Ted koukam ze ta verze Tap co jsem tu dal je vlastne taky SZX s falesnou priponou.

Zkousel jsem to ukladat primo pomoci SAVE, ale to ulozilo jen BASIC. Kdyz jsem ukladal data od nejake adresy, tak to druhy emulator co tu mam neprecetl. Zkousel jsem i ukladat od adresy kde je BASIC az skoro k zasobniku a taky nic. Jak se to predtim delalo, aby to melo i hlavicku.. slepit BASIC a DATA? A Basic hned zacal nacitat druhou cast?


Přílohy:
zx_dungeon_border_ver.z80 [18.06 KiB]
174 krát

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH
Nahoru
 Profil  
 
PříspěvekNapsal: 25.06.2013, 20:28 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1118
Has thanked: 100 times
Been thanked: 160 times
Mam tu cely zdrojak + gimpove bmp soubory. Ma to hlavne i 2 tapky co potrebujete. Jednu s kodem a druhou s grafikou. Pridal jsem bokem i save basicu.

LOAD "super" CODE 24320
LOAD "dungeon3" CODE 53248
RANDOMIZE USR 53523


Přílohy:
zx_dungeon_demo_v_0_3.tar.gz [80.23 KiB]
177 krát

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH
Nahoru
 Profil  
 
PříspěvekNapsal: 25.06.2013, 21:05 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1118
Has thanked: 100 times
Been thanked: 160 times
Busy píše:
Pre zaciatok uplne staci, ked si zapametas, ze instrukcia HALT synchronizuje program so zobrazovanim. To znamena, ze ked v programe urobis HALT, program tam zastane a pokracovat bude v okamihu, ked ULA zacne vykreslovat obraz zase odznovu. A toto sa deje 50x za sekundu.

A neni to presny opak toho co chci? Takhle to zacnu delat ve stejnou dobu co ta ULA. Jak rychle to vlastne provede, to ze to udela 50x za vterinu jeste neznamena ze to nema skoro hned a pak ceka.

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


Nahoru
 Profil  
 
PříspěvekNapsal: 25.06.2013, 21:09 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3668
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
_dworkin píše:
zx_dungeon_border_ver.z80[18.06 KiB]

Tak som si to pozrel (v RealSpec) a naozaj je tam konflikt medzi zobrazovacou rutinkou (COPY_BUFFER2SCREEN) a vycitavanim videoramky, a vidno ako preblikavaju atributy.
Jednym z rieseni je presunut zobrazovacie okno 18x14 atributov uplne dole, aby lezalo na spodnom okraji PAPERu.

Este sa chcem opytat - ako vyzera rutinka VIEW ? Ako dlho trva ? Pokial trva dlho, a nie je nutne aby cele zobrazovanie bezalo pod 50 FPS, dalsim riesenim je zaradit kratku casovu slucku za instrukciu HALT. Zobrazovacia rutinka sa tak voci vycitavaniu videoramky casovo posunie a konflikty nebudu nastavat. Casova slucka by mala trvat tak dlho, aby sa zobrazovanie zacalo tak dva az tri atributy pod hornym okrajom PAPERu (to uvidis podla tych OUTov). Mala by to byt okolo 17000 az 20000 taktov.


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ů: 29 ]  Přejít na stránku 1, 2  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 3 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