OldComp.cz

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


Právě je 29.03.2024, 00:51

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 38 ]  Přejít na stránku 1, 2, 3  Další
Autor Zpráva
 Předmět příspěvku: ASM challenge - putpixel
PříspěvekNapsal: 22.01.2019, 16:03 
Offline
Kecálek

Registrován: 04.02.2016, 10:21
Příspěvky: 91
Has thanked: 7 times
Been thanked: 18 times
Ahoj, napadlo mne udělat tady malou soutěž. Rutina, která v assembleru rozsvítí jeden pixel na screenu MZ-800. Barva se neřeší, obrazovka je inicializovaná a vymazaná a do rutiny vstupuje X = [0..319], Y = [0..199] v jakýchkoli vámi zvolených registrech.

Co vy na to ? Svoji sem pošlu, jen ji musím pročistit a přepočítat.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ASM challenge - putpixel
PříspěvekNapsal: 22.01.2019, 17:14 
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 co bude kriterium hodnotenia ? Dlzka, rychlost, alebo sucin rychlosti a dlzky ?
Len pre inspiraciu - ak by sa hodnotila rychlost, tak na ZX Spektre som nieco podobne stihol za 73T ;)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ASM challenge - putpixel
PříspěvekNapsal: 22.01.2019, 19:29 
Offline
Kecálek

Registrován: 28.10.2016, 21:03
Příspěvky: 122
Has thanked: 13 times
Been thanked: 50 times
Jedno řešení mám, připravil jsem i testovací příklad. Po nahrání příkladu přejděte do monitoru,
na adrese 2001h upravte x hodnotu (16 bit, little endian), na adrese 2004h upravte y hodnotu
(16 bit, little endian). Potom spusťte program pomocí J2000.
Příloha:
scrn23.png
scrn23.png [ 783 bajtů | Zobrazeno 11252 krát ]

Po spuštění se objeví černá obrazovka a jeden světlý pixel.
Kód:
 
  ; Putpixel for Sharp MZ-800
  ; January 2019, by Lukas Petru
  ; Open source under the MIT License (Expat)

  ; input:
  ; ld de,x   ; 0-319
  ; ld hl,y   ; 0-199
putpixel:
  ld b,h
  ld c,l
  add hl,hl
  add hl,hl
  add hl,bc
  add hl,hl
  add hl,hl
  add hl,hl

  ex de,hl

  add hl,hl
  add hl,hl
  add hl,hl
  add hl,hl
  add hl,hl

  ld a,l
  ld c,1
  rlc c
  sub 32
  jr nz,$-4 

  ld l,h
  ld h,80h
  add hl,de
  ld (hl),c


Přílohy:
putpix.zip [197 bajtů]
628 krát


Naposledy upravil lukz dne 22.01.2019, 20:03, celkově upraveno 1
Nahoru
 Profil  
 
 Předmět příspěvku: Re: ASM challenge - putpixel
PříspěvekNapsal: 22.01.2019, 19:34 
Offline
Kecálek

Registrován: 04.02.2016, 10:21
Příspěvky: 91
Has thanked: 7 times
Been thanked: 18 times
Myslím, že rychlost je důležitější. Na ZX Spectru si to můžete dát ve vaší konvi, hecneš se udělat tu rutinu i pro Sharpa ?

Já zprasil následující kód, stopro nebude optimální. Délka je 55 bajtů, rutina sežere 248-421 taktů (pokud jsem se někde nesekl - trochu moc mi to přijde):
Kód:
; v B je Y souradnice
; v DE je X souradnice
putpixel:
   ; adresa z X
   ld    A,E
   and    $7
   push   AF ; na stack
   sra   D
   rr      E
   sra   D
   rr      E
   sra   D
   rr      E
   ld      HL,#$8000
   add   HL,DE
   ld      DE,#$28 ; 101 taktu
   ;adresa z Y
lpp1:   add   HL,DE
   djnz   lpp1 ; 19-192 taktu
   ; v HL mame finalni adresu
   pop   AF
   push   HL
   ld      HL,pixtbl
   ld      C,A
   xor   A
   ld      B,A
   add   HL,BC ; 54 taktu
   ; nastavit kresleni
   ld    A,0x4e   ; mod OR, barva zluta
   out   (0xcc),a
   in    A,(0xe0)

   ld      A,(HL)
   pop   HL
   ld      (HL),A
   in    A,(0xe1)
   ret ; 74 taktu

pixtbl: defb $01,$02,$04,$08,$10,$20,$40,$80


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ASM challenge - putpixel
PříspěvekNapsal: 22.01.2019, 20:06 
Offline
Kecálek

Registrován: 04.02.2016, 10:21
Příspěvky: 91
Has thanked: 7 times
Been thanked: 18 times
lukz píše:
Jedno řešení mám, připravil jsem i testovací příklad.

To vypadá kratší, kolik to má taktů a bajtů ?


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ASM challenge - putpixel
PříspěvekNapsal: 22.01.2019, 23:17 
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
vaclavpe píše:
Myslím, že rychlost je důležitější.
Ako kedy. Vo velkom deme, v efekte kde treba kreslit toho co naviac a co najrychlejsie, ano. Ale napriklad v nejakom tom 1k (256,512...) intre, kde je najvecsim umenim vsetko nacpat do urciteho priestoru, je dlzka kodu dolezitejsia.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ASM challenge - putpixel
PříspěvekNapsal: 23.01.2019, 15:32 
Offline
Kecálek

Registrován: 04.02.2016, 10:21
Příspěvky: 91
Has thanked: 7 times
Been thanked: 18 times
Tak jsem spočítal LUKZovo řešení, kód je dlouhý 29B a potřebuje 205-394 taktů (v závislosti na pozici bitu v bajtu).

Já zkusil "složit" obě řešení dokupy a vyšlo 42B a 244 taktů konstantně - viz níže. Povede se někomu zvýšit rychlost nebo snížit délku kódu ?

Kód:
; v BC je Y souradnice
; v DE je X souradnice
putpixel:
   ; adresa z Y - BC*40 = BC*(8*(1+4))
   ld    L,C
   ld    H,B
   add   HL,HL
   add   HL,HL
   add   HL,BC
   add   HL,HL
   add   HL,HL
   add   HL,HL  ; 74 taktu
   ; adresa z X*32
   push  DE ; na stack kvuli offsetu X
   ex    DE,HL
   add   HL,HL
   add   HL,HL
   add   HL,HL
   add   HL,HL
   add   HL,HL
   ld    L,H
   ld    H,#$80
   add   HL,DE ; 92 taktu
   ; v HL mame finalni adresu VRAM
   ; ted najit pozici bitu do VRAM
   ex    DE,HL ; VRAM do DE
   pop   BC
   ld    A,#$7
   and   C
   ld    C,A
   ld    B,0
   ld    HL,pixtbl
   add   HL,BC ; 60 taktu
   ; kresli
   ld    A,(HL) ; pixel z pole
   ld    (DE),A ; a do VRAM
   ret   ; 24 taktu
   ; suma 244 taktu
pixtbl: defb $01,$02,$04,$08,$10,$20,$40,$80


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ASM challenge - putpixel
PříspěvekNapsal: 23.01.2019, 16:06 
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
vaclavpe píše:
Povede se někomu zvýšit rychlost nebo snížit délku kódu ?
Ak by si mi vysvetlil, ako je organizovana videoramka, mozem skusit... ;)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ASM challenge - putpixel
PříspěvekNapsal: 23.01.2019, 16:35 
Offline
Kecálek

Registrován: 04.02.2016, 10:21
Příspěvky: 91
Has thanked: 7 times
Been thanked: 18 times
Busy píše:
Ak by si mi vysvetlil, ako je organizovana videoramka, mozem skusit... ;)

VRAM začíná na adrese 0x8000 lineárně od levého horního rohu screenu 40 bajtů na řádek, 200 řádků. Každý bajt obsahuje 8 řádkových pixelů, tj. rozlišení 320x200 bodů, např:
Pixel v levém horním rohu [0,0] je adresa 0x8000 bit0 (tj. 0x01).
Pixel na [3,0] je adresa 0x8000 bit3 (tj. 0x08).
Pixel na [8,0] je adresa 0x8001 bit0.
Pixel na druhém řádku [3,1] je adresa 0x8028 bit3 (tj. 0x08).

Tak nevím, jestli se mi to povedlo vysvětlit...


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ASM challenge - putpixel
PříspěvekNapsal: 23.01.2019, 23:20 
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
vaclavpe píše:
Tak nevím, jestli se mi to povedlo vysvětlit...
Vysvetlenie uplne jasne, vdaka !


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ASM challenge - putpixel
PříspěvekNapsal: 24.01.2019, 13:42 
Offline
Radil
Uživatelský avatar

Registrován: 12.05.2013, 20:32
Příspěvky: 457
Bydliště: Kladno
Has thanked: 46 times
Been thanked: 118 times
Tak taky přispěju do challenge ;) Moje rutina vykreslí každý pixel za konstantních 186 taktů (i s RET), a je mu jedno který pixel a kde je. Neovlivňuje okolní pixly, ani v rámci bajtu. Rutina má 32 Bajtů. Doufám že jsem tam něco nepomotal, Sharpa moc neznám, ani nevím jestli rutina může být na adrese 65400, kdyžtak opravte ORG. Videoram počítám na adrese 32768, 40 bajtů na řádku, celková videoram tedy 8000 Bajtů. Myslím že by to ještě šlo maličko optimalizovat ;)

PS: jedna optimalizace proběhla ve 14:15 ;) nyní 190 T (původně 194 T)
... a další v 14:40 - 186 T :)

Kód:
; LnxSpectrum ASM editor (www.ilnx.cz) 24.1.2019

   org   65400

   ld   de,319   ; 0-319
   ld   hl,199   ; 0-199

Pixel   ld   b,h
   ld   c,l
   
   add   hl,hl
   add   hl,hl
   add   hl,bc
   add   hl,hl
   add   hl,hl
   add   hl,hl
   
   ld   a,e
   
   rlca
   rlca
   rlca

   and   56
;   xor   254   ;první bit zleva začíná bitem 7 (ZX Spectrum)
   xor   198   ;první bit zleva začíná bitem 0 (Sharp?)
         
   ld   (.set_pixel+1),a

   scf
   rr   d
   rr   e
   srl   e
   srl   e
   
   add   hl,de

#watchreg   hl Videoram

.set_pixel:   set   0,(hl)

   ret


_________________
>>eLeMeNt, MB03+, Amiga 1200, ZX Spectrum 128 +2A, ZX Spectrum+, Didaktik Gama, LnxSpectrum, LnxTracker, LnxAmigaImageConvertor, https://www.ilnx.cz <<


Naposledy upravil Lanex dne 24.01.2019, 15:42, celkově upraveno 2

Nahoru
 Profil  
 
 Předmět příspěvku: Re: ASM challenge - putpixel
PříspěvekNapsal: 24.01.2019, 15:34 
Offline
Kecálek

Registrován: 04.02.2016, 10:21
Příspěvky: 91
Has thanked: 7 times
Been thanked: 18 times
Lanex píše:
Tak taky přispěju do challenge ;) Moje rutina vykreslí každý pixel za konstantních 190 taktů (i s RET), a je mu jedno který pixel a kde je. Neovlivňuje okolní pixly, ani v rámci bajtu. Rutina má 33 Bajtů.

Dobře ty! Rutina je funkční, emulátor mi změřil 199 taktů. Tady se mi líbí ten sebemodifikující kód.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ASM challenge - putpixel
PříspěvekNapsal: 24.01.2019, 19:34 
Offline
Radil

Registrován: 18.10.2014, 23:10
Příspěvky: 377
Has thanked: 28 times
Been thanked: 120 times
Odo mňa len taká drobnosť v časti programu:
Kód:
   ld    a,e
   add   a,a
   add   a,a
   or   227
   add   a,a
   ld   (.set_pixel+1),a
 ; scf



Nahoru
 Profil  
 
 Předmět příspěvku: Re: ASM challenge - putpixel
PříspěvekNapsal: 24.01.2019, 20:42 
Offline
Kecálek

Registrován: 04.02.2016, 10:21
Příspěvky: 91
Has thanked: 7 times
Been thanked: 18 times
Antony/DTA píše:
Odo mňa len taká drobnosť v časti programu

Ano, změna je funkční a nyní máme 187 taktů včetně RET a 30 bajtů.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ASM challenge - putpixel
PříspěvekNapsal: 24.01.2019, 20:54 
Offline
Radil
Uživatelský avatar

Registrován: 12.05.2013, 20:32
Příspěvky: 457
Bydliště: Kladno
Has thanked: 46 times
Been thanked: 118 times
Antony/DTA píše:
Odo mňa len taká drobnosť v časti programu:
Kód:
   ld    a,e
   add   a,a
   add   a,a
   or   227
   add   a,a
   ld   (.set_pixel+1),a
 ; scf


Jenže to je pro ZX Spectrum nepoužitelný... :booo: Ale podmínky pro Sharp to splňuje.
Jinak já naměřil od Pixel až po vykonání RET 179 taktů... můžete mi poslat BIN soubor vámi zkompilovaný, který má těch 187 taktů? Chtěl bych udělat rozborku kde se vzalo těch 8 taktů navíc...

_________________
>>eLeMeNt, MB03+, Amiga 1200, ZX Spectrum 128 +2A, ZX Spectrum+, Didaktik Gama, LnxSpectrum, LnxTracker, LnxAmigaImageConvertor, https://www.ilnx.cz <<


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