OldComp.cz

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


Právě je 26.04.2024, 22:28

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 31 ]  Přejít na stránku 1, 2, 3  Další
Autor Zpráva
 Předmět příspěvku: Vykresleni horizontalni usecky
PříspěvekNapsal: 10.06.2015, 14:31 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1119
Has thanked: 100 times
Been thanked: 161 times
Ahoj, pokud uz jste nekdy tvorili grafickou knihovnu tak jste zjistili ze se vam hodi pro kresleni vyplnenych utvaru nejaka jednoducha a rychla rutina na kresleni usecky. Vetsinou je nejjednodusi pro danou reprezentaci dat kreslit vodorovnou usecku. Na ZX je to stejne. Diky tomu ze ZX ma jednobitovou grafiku a do bajtu se vleze 8 pixelu je otazka jakzvolit souradnicovy system. Pomoci 2 bajtu X,Y? Nebo pomoci dvoubajtove adresy a jednobajtove masky pixelu? Nebo dvoubajtove adresy a jednobajtoveho indexu pixelu? Jejich kombinace? Prvni moznost je vyhodna, protoze vetsina algoritmu co najdete na netu pocita s touto variantou, ale prepocet na fyzickou adresu daneho bitu pixelu bude zdlouhavy. Druha kombinace bude rychlejsi, ale budete si muset algoritmy ruzne upravovat a bez pochopeni jak vznikly to nepujde. Treti vypada zdlouhavejsi a urcite je delsi, ale nakonec se ukazala jako nejrychlejsi moznost, protoze zjednodusuje vykresleni pocatku usecky, nez pixel preleze na zacatek dalsiho znaku. Neni potreba smycky, protoze presne vite kde jste.
Kód:
; Rutina invertuje pixel
; vstup:
; HL = adresa bajtu s pixelem
; C = index pixelu v bajtu, kde 7 je uplne vlevo a 0 uplne vpravo
; zmeni: A
XorMask:
  ld a,DATA_PIXEL % 256      ;  7:2 o bajt delsi varianta, ale rychlejsi jak s ukladanim hl na zasobnik
  add a,c         ;  4:1
  ld (XM_Self+1),a      ; 13:3
XM_Self: 
  ld a,(DATA_PIXEL)      ; 13:3
  xor (hl)
  ld (hl),a
  ret            ; 10:1
 
DATA_PIXEL:
 db $01
 db $02
 db $04
 db $08
 db $10
 db $20
 db $40
 db $80
DATA_PIXEL_End
 
if ( DATA_PIXEL / 256) != ( DATA_PIXEL_End / 256 )
    .error 'Tabulka DATA_PIXEL preteka segment!'
endif

Kód:
; Rutina posune adresu pixelu o jeden vpravo
; vstup:
; HL = adresa bajtu s pixelem
; C = index pixelu v bajtu, kde 7 je uplne vlevo a 0 uplne vpravo
; vystup: sign pokud se preslo na dalsi znak
PosunVpravo:
  dec c      ; 4:1 bohuzel nemeni carry
  ret p      ; 7..1 -> 6..0
  ld c,7   ; 0 -> $ff -> 7
  inc hl   ; pomalejsi ale nemeni priznaky
  ret

Kód:
; Rutina vrati adresu bajtu obsahujiciho pixel o mikroradek nizsi nez byl
; vstup:
; HL = adresa bajtu s pixelem
; Pro spravnou funkcnost musi mit screen nebo buffer pocatek na adrese se segmentem delitelnym osmi 
; meni: A
PosunDolu:
  inc h
  ld a,$07   ; 7:2
  and h
  ret nz   ; nepretekli jsme do dalsiho znakoveho radku
 
  ld a,$20
  add a,l
  ld l,a
  ret c      ; jsme na zacatku dalsi tretiny
 
  ld a,h   ; preteceni do dalsiho znakoveho radku
  sub 8
  ld h,a
  ret

Kód:
; Rutina vrati adresu bajtu obsahujiciho pixel o mikroradek vys nez byl
; vstup:
; HL = adresa bajtu s pixelem
; Pro spravnou funkcnost musi mit screen nebo buffer pocatek na adrese se segmentem delitelnym osmi 
; meni: A
PosunNahoru:
  ld a,h
  dec h
  and $07   
  ret nz   ; nepretekli jsme do dalsiho znakoveho radku
 
  ld a,l
  sub $20
  ld l,a
  ret c      ; jsme na konci dalsi tretiny
 
  ld a,h   ; preteceni do dalsiho znakoveho radku
  add a,8
  ld h,a
  ret

Kód:
; Rutina zmeni adresu pixelu o B pozic doleva
; Vstup:
; HL = adresa bajtu s pixelem
; C = index pixelu v bajtu, kde 7 je uplne vlevo a 0 uplne vpravo
; B = o kolik doleva > 0
; Meni: A,B,C,L
PosunHodneVlevo:
   ld a,b
PHV_8x:
   dec l
   sub 8
   jr nc, PHV_8x
   inc l
   add a,8
   ret z      ; posun byl delitelny 8, nemusime hrabat na index pixelu
; zbyva posunout pixel o 1 az 7 pozic
   add a,c
   ld c,a
   sub 8
   ret c      ; vlezli jsme se do bajtu
; pretekli jsme o bajt vlevo
   dec l
   ld c,a
   ret

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Vykresleni horizontalni usecky
PříspěvekNapsal: 10.06.2015, 14:51 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1119
Has thanked: 100 times
Been thanked: 161 times
Tak pomocne rutiny na zmenu polohy "kurzoru" mame za sebou a ted ty horizontalni usecky. Prvne minimalistickou variantu.
Kód:
; Rutina nakresli vodorovnou caru od zadaneho bodu vcetne doprava   
; vstup:
; HL = adresa bajtu s pocatecnim pixelem, C obsahuje index prvniho pixelu v bajtu kde 7 je uplne vlevo a 0 uplne vpravo
; B = delka > 0
HorizontLine:
   push bc
   push hl
HL_loop:
   call XorMask
   call PosunVpravo
   djnz HL_loop            ; 13/8:2
   pop hl
   pop bc
   ret

Ale zjistite ze je to kvuli rychlosti fakt nepouzitelne... Testovaci program trva 3 minuty a 50 vterin. A pritom staci kreslit uprostred usecky pokud to jde po celych bajtech.
Kód:
; Rutina nakresli vodorovnou caru od zadaneho bodu vcetne doprava   
; vstup:
; HL = adresa bajtu s pocatecnim pixelem, C obsahuje index prvniho pixelu v bajtu kde 7 je uplne vlevo a 0 uplne vpravo
; B = delka > 0
HorizontLine:
   push bc
   push hl
   xor a            ; vynuluje priznaky
HL_loop:
   call m,ZrychleniHorizontLine      ; 17/10:3 nepovinne zrychleni
   call XorMask
   call PosunVpravo
   djnz HL_loop            ; 13/8:2
   pop hl
   pop bc
   ret

Kód:
; Podrutina na zrychleni vykresleni vodorovne usecky
; vstup:
; HL = adresa bajtu s pocatecnim pixelem, C obsahuje index prvniho pixelu v bajtu kde 7 je uplne vlevo a 0 uplne vpravo
; B = delka v pixelech a ne znacich
; meni: A, B vraci v rozsahu 1..7, Pokud by B = 0 tak umaze na zasobniku navratovou adresu a skoci na predchozi, kvuli DJNZ 0
ZrychleniHorizontLine:
  ld a,b
  sub 8
  ret c         ; mene jak 8
  ld b,a

  ld a,(hl)      ; 7:1 !!!  nejpomalejsi cast programu
  cpl         ; 4:1 xor $ff !!!  nejpomalejsi cast programu
  ld (hl),a      ; 7:1 !!!  nejpomalejsi cast programu
  inc l         ; 4:1 !!!  nejpomalejsi cast programu

  ld a,b
  or a
  jr nz,ZrychleniHorizontLine+1
 
  pop af       ; chceme zrusit jeden ret
  pop hl
  pop bc
  ret

Ted testovaci program bezi 33 vterin. A kdyz vsadime vse na rychlost a pouzijeme tabulky. Protoze na pocatecni i koncovy bajt muzeme mit masku.
Kód:
; Rutina na rychle vykresleni vodorovne usecky, ktera invertuje pozadi
; vstup:
; HL = adresa bajtu s pocatecnim pixelem, C obsahuje index prvniho pixelu v bajtu kde 7 je uplne vlevo a 0 uplne vpravo
; B = delka, kde 0 = 256
; vystup:
; uchova HL, BC, ale nici A

FastHorizontLine:

IF 0
  inc b
  dec b
ENDIF
  ld a,c
IF 0
  jr z,FHL_DokonciZnak      ; 0 = 256
  cp b
  jr c,FHL_DokonciZnak
 
; Primka nedokaze dolezt ani na konec prvniho znaku

  push bc         ; 11:1 kvuli jednomu pouziti C
  push hl         ; 11:1
  ld h,DATA_ZBYTEKZNAKU / 256   ; 7:2
  add a,DATA_ZBYTEKZNAKU % 256   ; 7:2
  ld l,a         ; 4:1
  sub b            ; 4:1
  ld c,(hl)         ; 7:1
  ld l,a         ; 4:1
  ld a,(hl)         ; 7:1
  xor c            ; 4:1 rozdil masek
  pop hl         ; 10:1
  pop bc         ; 10:1
  xor (hl)
  ld (hl),a
  ret            ; HL,BC zachovan

ENDIF
; Pokud mam osu soumernosti na predelu znaku tak vzdy dokoncim znak, takze mohu vse nahore smazat, krome ld a,c

FHL_DokonciZnak:      ; b > c
   
  add a,DATA_ZBYTEKZNAKU % 256   ; 7:2
  ld (FHL_Self0+1),a      ; 13:3
FHL_Self0: 
  ld a,(DATA_ZBYTEKZNAKU)   ; 13:3
 
  xor (hl)         ; 7:1
  ld (hl),a         ; 7:1
 
  ld a,b
  sub c
  dec a            ; 4:1
  ret z            ; 11/5:1 HL,BC zachovan

; Zbyva max 31 znaku, takze jsme v rozsahu skoku JR u rozbalene smycky

  push bc
  push hl
  inc l            ; 4:1
  ld b,a         ; b = F8..1
 
  ld a,$FF
  sub b
  and $F8
  rra
  ld (FHL_SelfJump+1),a
 
FHL_SelfJump:
  jr FHL_SelfJump;FHL_Zbytek

REPT 31
  ld a,(hl)         ; 7:1 !!!  nejpomalejsi cast programu
  cpl            ; 4:1 xor $ff !!!  nejpomalejsi cast programu
  ld (hl),a         ; 7:1 !!!  nejpomalejsi cast programu
  inc l            ; 4:1 !!!  nejpomalejsi cast programu
ENDM
 
  ld a,b
  and 7

  ld b,ZBYTEKPRIMKY / 256
  add a,ZBYTEKPRIMKY % 256
  ld  c,a

  ld a,(bc)
  xor (hl)
  ld (hl),a
 
  pop hl
  pop bc
  ret

DATA_ZBYTEKZNAKU:
db $01  ; 0
db $03   ; 1
db $07   ; 2
db $0F   ; 3
db $1F   ; 4
db $3F   ; 5
db $7F   ; 6
db $FF   ; 7
DATA_ZBYTEKZNAKU_End:

if ( DATA_ZBYTEKZNAKU / 256) != ( DATA_ZBYTEKZNAKU_End / 256 )
    .error 'Tabulka DATA_ZBYTEKZNAKU preteka segment!'
endif

ZBYTEKPRIMKY:
db $00  ; 0
db $80   ; 1
db $C0   ; 2
db $E0   ; 3
db $F0   ; 4
db $F8   ; 5
db $FC   ; 6
db $FE   ; 7
ZBYTEKPRIMKYend:

if ( ZBYTEKPRIMKY / 256) != ( ZBYTEKPRIMKYend / 256 )
    .error 'Tabulka ZBYTEKPRIMKY preteka segment!'
endif

A jsme na 12 vterinach.


Přílohy:
Poznámka: 12 vterin
test03.z80 [3.88 KiB]
213 krát
Poznámka: 32 vterin
test02.z80 [1.8 KiB]
210 krát
Poznámka: 230 vterin
test01.z80 [1.8 KiB]
196 krát

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Vykresleni horizontalni usecky
PříspěvekNapsal: 11.06.2015, 09:47 
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
V tejto suvislosti by mohlo byt zaujimave, ako som problem vykreslovania vodorovnych useciek pred cca 22 rokmi riesil ja:
http://busy.speccy.cz/tvorba/x04rovnz.htm


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Vykresleni horizontalni usecky
PříspěvekNapsal: 11.06.2015, 10:26 
Offline
Radil
Uživatelský avatar

Registrován: 13.05.2013, 17:48
Příspěvky: 531
Bydliště: Košice
Has thanked: 430 times
Been thanked: 265 times
O kreslení čiar, kružníc i kruhov píše Universum v knihe Assembler a ZX Spectrum 2 v kapitole Jemá grafika od strany 34.

_________________
https://pmd85.borik.net - PMD 85 Emulátor, PMD 85, PMD 32-SD
https://pp01.borik.net - PP 01 Emulátor, PP 01, SD-ROM Modul


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Vykresleni horizontalni usecky
PříspěvekNapsal: 11.06.2015, 21:44 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1119
Has thanked: 100 times
Been thanked: 161 times
Jsem rad, ze nejsem sam koho to zajima a ozvali jste se. Nemam patent na rozum, takze budu rad za kazdou radu. Do nedele mam ale hodne prace, jak bylo teplo tak se hodne chlasta. Ale pak se na to mrknu, hlavne ty kruhy jsou nedodelany.

Busy skoda ze nepises komentare rovnou v kodu, zjistil jsem ze od urcite delky rutiny musim vynakladat zvysene usili, abych to rovnou nevzdal. .) Ne, ze bych nenapsal sam nejake naproste silenosti, kde souvisi vse se vsim.

Rombor dik za odkaz, tohle jsem prehledl. Zbezne jsem se na to dival, zvlast ta vodorovna usecka ma hodne spolecneho. Ale opravdu tam invertuji akumulator pomoci XOR A,E kde v E maji $FF :bang: A tu kruznici kresli pomoci rutiny na odmocneni? A na zrychleni doporucuji udelet si 200 bajtovou tabulku? :mrblue: Jen doufam ze me ted necetl autor.. .) Doba bez internetu.. Nevedomost je sila.

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Vykresleni horizontalni usecky
PříspěvekNapsal: 12.06.2015, 19:59 
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
Citace:
Přílohy:
Poznámka: 12 vterin
test03.z80 [3.88 KiB]

Poznámka: 32 vterin
test02.z80 [1.8 KiB]

Poznámka: 230 vterin
test01.z80 [1.8 KiB]
Chcel som sa na to pozriet ale vsetky tri snapy po spusteni ... vypisu kto a kedy uviedol nas najoblubenejsi pocitac na trh ... :cry:


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Vykresleni horizontalni usecky
PříspěvekNapsal: 12.06.2015, 21:47 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1119
Has thanked: 100 times
Been thanked: 161 times
Uz se to tu resilo, nevim co s tim. Je to vytvoreny pomoci fuse 1.1.1 na linuxu. Priponu jsem tam dohodil sam.

Zacina to: ZXST..CRTRj..Fuse..gcrypt: 1.5.3
libspectrum: 1.1.1
uname: Linux x86_64 3.13.0-53-generic...Z80R..SPCR..JOY..KEYB..RAMP

Ale to neva postupne stejne zverejnim cely kod. .) A bude i o trosku lepsi.

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Vykresleni horizontalni usecky
PříspěvekNapsal: 12.06.2015, 22:08 
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
A kde a kedy sa to riesilo ? By som si to precital.

Trosku som na tie snapy pozrel, a je uplne jasne preco padaju.
Ako hodnota PC registra je tam zapisana adresa #0001 takze je jasne ze sa to resetuje :shrug:

Ale popri tom som zistil ze tie subory vobec nezodpovedaju formatu snap Z80
http://www.worldofspectrum.org/faq/reference/z80format.htm
ale nejakemu uplne inemu (mne neznamemu).

Neda sa z FUSE vyexportovat nejaky iny snap ? Napr. SNA, s nim obvykle nebyvaju problemy (aspon u mna).
A vobec, nemozes to sem hodit ako standartne tapky ?


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Vykresleni horizontalni usecky
PříspěvekNapsal: 12.06.2015, 23:00 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1119
Has thanked: 100 times
Been thanked: 161 times
Ja to dovnitr dostal jako binarni soubor od urcite adresy a hotovo. Zkousel jsem to ted stahnout a po ceste se nic nezmenilo. Jinak to ulozit nez jako "File->Save Snapshot.." to nenabizi. Takze muzu poslat ten bin, promazat zdrojak a poslat ho, nebo vyzkousej to fuse ve win. Jeste jsem to mozna otevrel v jinem emulatoru a ulozil v nem, aby to slo ostatnim.

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Vykresleni horizontalni usecky
PříspěvekNapsal: 12.06.2015, 23:03 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1119
Has thanked: 100 times
Been thanked: 161 times
Napsalo to varovani.

File, Save Snapshot...
Save a snapshot (machine state, memory contents, etc.) to file.
You can select the filename to be saved to. If it has a .szx,
.z80 or .sna extension, the snapshot will be saved in that
format. Otherwise, it will be saved as a .szx file.


Přílohy:
test03.tap [3.88 KiB]
204 krát
test03.sna [48.03 KiB]
207 krát

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Vykresleni horizontalni usecky
PříspěvekNapsal: 13.06.2015, 06:30 
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
Citace:
Přílohy:
test03.tap [3.88 KiB]
test03.sna [48.03 KiB]
Snapshot SNA pekne funguje, ale ta tapka nie. Subor test03.tap nie je tapka, ale nieco uplne ine co sa na tapku ani zdaleka nepodoba. Pravdepodobne zase nejaky proprietarny format Fuse.
_dworkin píše:
Takze muzu poslat ten bin
Pokial mas priamo bin, prezen ho utilitkou bin2tap http://zeroteam.sk/bin2tap.html a to potom sem pripichni.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Vykresleni horizontalni usecky
PříspěvekNapsal: 15.06.2015, 00:06 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1119
Has thanked: 100 times
Been thanked: 161 times
Busy píše:
V tejto suvislosti by mohlo byt zaujimave, ako som problem vykreslovania vodorovnych useciek pred cca 22 rokmi riesil ja:
http://busy.speccy.cz/tvorba/x04rovnz.htm


Dival jsem se na to a zkousel to spustit, ale padalo mi to. Takze jsem to zacal probirat pekne od zacatku, rutinu za rutinou. Hlavni problem byl ze jsem nepochopil ze ">" znamena "/ 256". Ale jak jsem krokoval mkbod tak jsem ted narazil na http://busy.speccy.cz/tvorba/x02bodka.htm
Kód:
        ld    a,xl
    cpl    
    add    a,a
    add    a,a
    add    a,a
    or    #c7
coz mi hlava nebere. Vim co to udela, ale nedokazi si predstavit -8*(xl+1) OR $c7. Tzn 32 moznosti OR $c7. Ja bych to resil ze bych prirozene prvne orezal rozsah na 0..7, ten vynasobil 8 a pak provedl -1*(n + 1) pres to cpl.
Kód:
    ld    a,l
    and   $07
    add    a,a      ; 2*l
    add    a,a       ; 4*l
    add    a,a       ; 8*l
    cpl         ; invertuje bity = -a-1

Taky nevim proc si to resil pres IX a nepouzil DE, protoze s tim je to asi o 17 bajtu kratsi a rychlejsi.
Kód:
; ========================
; rutina pro vytvoreni prevodnich tabulek z X,Y na adresa bajtu s pixelem a jeho maska
; vstup: nic
; vystup: inicializuje tabulku tabbod
; prvnich 256 bajtu obsahuje segmenty pocatku radku od Y = 0 az 255
; druhych 256 bajtu obsahuje jejich ofsety
; tretich 265 bajtu obsahuje bajt na radku s pixelem
; ctvrtych 256 bajtu obsahuje masku
IF Original
; meni: a,hl,ix
mkbod    ld    ix,tabbod
    ld    hl,#4000
; inicializace prvnich dvou 256 bajtovych tabulek obsahujicich adresy pocatku radku
mkbb1    ld    (ix+#00),h
    inc    ixh
    ld    (ix+#00),l
    dec    ixh
    call    dole
    inc    ixl
    jr    nz,mkbb1
; inicializace druhych dvou tabulek
    inc    ixh
    inc    ixh
mkbb2    ld    a,ixl
    rrca    
    rrca    
    rrca    
    and    #1f       ; a / 8, nebo a >>= 3, nebo zjisteni v jakem jsme bajtu s pixelem o souradnici X
    ld    (ix+#00),a
    ld    a,ixl
    cpl         ; invertuje bity
    add    a,a      ; 2*(-ixl-1)
    add    a,a       ; 4*
    add    a,a       ; 8*(-ixl-1) => 0,1,2,3,4.. => -8,-16,-24,-32, => F8,F0,E8
    or    #c7       ;                                              => FF,F7
    ld    (mkbb3+1),a
    xor    a
mkbb3    set    1,a      ; $CB $C7 + x*8 = set x,a; $C7,CF,D7,DF,E7,EF,F7,FF = -8*x-1 = and a,$07: 3x add a,a: cpl
    inc    ixh
    ld    (ix+#00),a
    dec    ixh
    inc    ixl
    jr    nz,mkbb2
    ret
ELSE
; meni: a,hl,de   
mkbod    ld    hl,tabbod
    ld    de,#4000
; inicializace prvnich dvou 256 bajtovych tabulek obsahujicich adresy pocatku radku
loop1    ld    (hl),d
    inc    h
    ld    (hl),e
    dec    h
    ex de,hl
    call    dole
    ex de,hl
    inc    l
    jr    nz,loop1
; inicializace druhych dvou tabulek
    inc    h
    inc    h
loop2    ld    a,l
    rra    
    rra    
    rra    
    and    #1f       ; a / 8, nebo a >>= 3, nebo zjisteni v jakem jsme bajtu s pixelem o souradnici X
    ld    (hl),a
    ld    a,l
    and   $07
    add    a,a      ; 2*l
    add    a,a       ; 4*l
    add    a,a       ; 8*l
    cpl         ; invertuje bity = -a-1
    ld    (self+1),a
    xor    a
self    set    1,a      ; $CB $C7 + x*8 = set x,a; $C7,CF,D7,DF,E7,EF,F7,FF = -8*x-1 = and a,$07: 3x add a,a: cpl
    inc    h
    ld    (hl),a
    dec    h
    inc    l
    jr    nz,loop2
    ret
ENDIF

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Vykresleni horizontalni usecky
PříspěvekNapsal: 15.06.2015, 11:47 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1119
Has thanked: 100 times
Been thanked: 161 times
Tak uz jsem se dostal k te rutine rovno na strance http://busy.speccy.cz/tvorba/x04rovnz.htm
Docela jsem se divil ze si nepouzil tabulku s maskou od pixelu do konce znaku a ze si to vytvarel pomoci smycky a rotace, protoze si tipnu ze to i s tou maskou bude kratsi a rychlejsi.
Nasel jsem tam zas 2 chybicky.. .) jedna je ze pouzivas "cp e" a pak to vetvis na 2 varianty. Kde v prvni hned prepises akumulator a v te druhe zacinas sub e! Druha je, ze si tam zapomnel po nejake editaci kodu instrukci co vlastne nic nedela, protoze uz na ten registr nesahas.
Kód:
; ========================
; Rutina vykresli vodorovnou usecku podle rezimu nastaveneho rutinou "over"
; vstup: [Y,X] krajniho bodu v [B,C]
; D = X konec
; meni: A,HL,BC,DE
rovno    ld    a,d
    cp    c
    jr    nc,rov01      ; X konec > X pocatek?
    ld    d,c
    ld    c,a          ; prohozeni C a D
rov01    ld    h,hitbod+2      ; segment 256 bajtove tabulky obsahujici bajt na radku podle X
    ld    l,c
    ld    a,(hl)         ; a = kolikaty je to bajt radku
    dec    h
    ld    l,b
    or    (hl)          ; a = ofset adresy bajtu s pixelem
    dec    h
    ld    h,(hl)         ; h = segment adresy bajtu s pixelem
    ld    l,a         ; hl = adresa bajtu s pixelem
    ld    a,c
    and    #f8
    ld    e,a         ; e = pocatecni bajt * 8
    ld    a,d
    and    #f8          ; a = koncovy bajt * 8
IF Original
    cp    e         ; chybka, tady melo byt sub e
ELSE
   sub   e
ENDIF
    jr    nz,r2byte
; usecka neopusti prvni bajt
    ld    a,c
    and    #07         
    ld    b,a          ; index prvniho pixelu v bajtu, zleva doprava 0..7
    ld    a,#ff          
    jr    z,rov02
rov03    srl    a
    djnz    rov03
rov02    ld    c,a          ; maska od prvniho pixelu do konce
; sem skocime i v pripade ze je usecka delsi, pri poslednim bajtu s maskou c = $ff
rov99    ld    a,d
    and    #07          
    ld    b,a         ; index posledniho pixelu v bajtu, zleva doprava 0..7
    ld    a,#80
    jr    z,rov04         ; tohle by melo nastat jen pokud je usecka dlouha jeden pixel a to ten uplne nalevo
rov05    scf            ; set carry flag
    rra    
    djnz    rov05         ; vytvarime masku od zacatku bajtu az po posledni pixel
rov04    and    c          ; maska usecky
ooset1    xor    (hl)
    ld    (hl),a
    ret
; usecka je preleza bajt
r2byte
IF Original
   sub    e         ; nechapu proc predtim jsem teda delali cp e, kdyz u druhe varianty hned prepisem registr a
ENDIF
   rrca    
    rrca    
    rrca    
    ld    e,a         ; rozdil bajtu
; vykresleni pro prvni bajt
    ld    a,c
    and    #07
    ld    b,a         ; index prvniho pixelu v bajtu, zleva doprava 0..7
    ld    a,#ff
    jr    z,ooset2
rov06    srl    a
    djnz    rov06         ; vytvareni masky prvniho pixelu az do konce bajtu
ooset2    xor    (hl)
    ld    (hl),a
; prvni bajt vyresen
IF Original
    ld    b,c         ; nadbytecna instrukce?
ENDIF
    ld    c,#ff
rov40    inc    l
    dec    e         ; v e je citac bajtu do konce
    jr    z,rov99
    ld    a,c
ooset3    xor    (hl)
    ld    (hl),a         ; kresleni pres cely bajt
    jr    rov40

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Vykresleni horizontalni usecky
PříspěvekNapsal: 15.06.2015, 12:05 
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:
Dival jsem se na to a zkousel to spustit, ale padalo mi to. Takze jsem to zacal probirat pekne od zacatku, rutinu za rutinou. Hlavni problem byl ze jsem nepochopil ze ">" znamena "/ 256".
Ano, to je pravda, mohol som to tam jasnejsie napisat, alebo namiesto samotneho zdrojaku dat aspon protokol o preklade, aby to bolo z dat hned jasne. Znaky ">" a "<" pouziva MRS ako operatory vracajuce vyssi a nizsi bajt z dvojbajtovej hodnoty. Je to rychlejsie a efektivnejsie ako pisat high,low,/256,%256.
_dworkin píše:
Ale jak jsem krokoval mkbod tak jsem ted narazil na http://busy.speccy.cz/tvorba/x02bodka.htm
Kód:
        ld    a,xl
    cpl    
    add    a,a
    add    a,a
    add    a,a
    or    #c7
coz mi hlava nebere. Vim co to udela, ale nedokazi si predstavit -8*(xl+1) OR $c7. Tzn 32 moznosti OR $c7. Ja bych to resil ze bych prirozene prvne orezal rozsah na 0..7, ten vynasobil 8 a pak provedl -1*(n + 1) pres to cpl.
A nie je to jedno ? Obe riesenia zaberu rovnaky pocet bajtov aj taktov a daju presne ten isty vysledok :)
_dworkin píše:
Taky nevim proc si to resil pres IX a nepouzil DE, protoze s tim je to asi o 17 bajtu kratsi a rychlejsi.
Pretoze to bolo pred cca stvrtstorocim a lubila sa mi ta moznost ulozenia registrov H a L priamo do pameti jedinou instrukciou :) Samozrejme v demach pouzivam ovela kratsie a efektivnejsie riesenie.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Vykresleni horizontalni usecky
PříspěvekNapsal: 15.06.2015, 12:22 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1119
Has thanked: 100 times
Been thanked: 161 times
Busy píše:
A nie je to jedno ? Obe riesenia zaberu rovnaky pocet bajtov aj taktov a daju presne ten isty vysledok :)

Ja vim jsou na takty a delku shodne. Jen me proste hlava nebere jak jsi prisel na tohle reseni a pritom minul pro me mnohem snazsi na pochopeni. Ten OR me proste vadi a musel bych to cele projit pro vsechny vstupy, abych mel jistotu, ze to dela co ma. Jestli si to mel napsane pekne na papire nebo jsi tohle dal z hlavy.

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


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ů: 31 ]  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 10 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