Rev 49 | Blame | Compare with Previous | Last modification | View Log | Download
;todo тючьюцэюёЄ№ ёфтшурЄ№ яю тхЁЄшърыш тхё№ ръЄштэ√щ ¤ъЁрэ (шыш ыєў°х хую эхчртшёшь√х ЇЁруьхэЄ√, ё юуЁрэшўхэшхь эр эрыюцхэшх ёяЁрщЄют эр уЁрэшЎх);шёяюЁЄшЄё Ўшъы Єрщы->scrbuf: 24t loop, fit for contention; ld a,(de); inc de; ld (bc),a; inc b;шыш ышэхщэ√щ ¤ъЁрээ√щ сєЇхЁ? (эр э╕ь єфюсэхх ышэшш ш яюышуюэ√) 0x6000: startup, ISR, music, data(?), scrbuf, gfx engine, logic engine, gfx/logic/data (pageable) + INT vector;todo юЄЁшёютър ¤ыхьхэЄют ярэхы№ъш ш фшрыюуют;todo тючьюцэюёЄ№ т√тюфшЄ№ ёяЁрщЄ√ яютхЁї ярэхы№ъш??? ЇЁхщьютю яЁ ью эр ¤ъЁрэх, ъръ ёЄЁхыър т ╫┬?;todo ъышяшЁютрЄ№ ёяЁрщЄ√ тэєЄЁш ръЄштэюую ¤ъЁрэр?? Єюы№ъю ё яхЁхсЁюёъющ?? (128╩ ¤ъЁрэ тЁ ф ыш сєфхЄ ¤ЇЇхъЄштэ√ь - ьрыю ьхёЄр яюф уЁрЇшъє т эшцэхщ ярь Єш);ьюцэю эр ATM ЁшёютрЄ№ т ¤ъЁрэх, р эр 48K т ¤ъЁрээюь сєЇхЁх;эр └╥╠ ёфтшу ¤ъЁрэр ьюцэю фхырЄ№ ёфтшуюь (хёыш чряюьшэрЄ№ ърЁЄшэъє яюф ёяЁрщЄрьш), р эр 48╩ яхЁхЁшёютъющ (Є.ъ. ёяЁрщЄ√ эхы№ч ёэ Є№);шыш тхчфх яхЁхЁшёютър?;PROC prspr(BYTE x, BYTE y, PBYTE data);;wid8xhgt sprite (wid8, hgt, (antimask, antipixels, ...));ъышяшЁютрэш эхЄ!prsprprspr.A.=$+1 ;xprspr.B.=$+2 ;yld bc,0ld a,brrarrarraxor band 0xf8xor band 0x1fadd a,scrbuf/256ld d,ald a,crlcarlcarlcaxor band 0xc7xor brlcarlcald e,a;de=screen addrld a,cand 7;a=shift right 0..7exxprspr.C.=$+1 ;datald hl,0ld c,(hl) ;wid8inc hlld b,(hl) ;hgtinc hldec cjp z,prspr8.dec cjp z,prspr16.dec cjp z,prspr24.dec cjp z,prspr32.ret;8xhgt sprite (antimask, antipixels);hgt=16:;x=0: 5411 =12.1/byteshift;x=1: 5043;x=2: 4675;x=3: 4307;x=4: 3939;x=5: 3571;x=6: 3203 =50.0/byteshift;x=7: 2835 =44.3/byte (no shift) (159 before loop)prspr8.;a=shift right 0..7add a,aadd a,ald (prspr8jr.),aexxld a,eand 0x1fcp 0x1fret ncexx;b = counter;hl = data (2 accesses);hl' = pixels;de' = screen (4 accesses);ac' = maskprspr8line.ld a,(hl) ;mask1inc hlexxld c,a ;mask1exxld a,(hl) ;pixels1inc hlexxld l,a ;pixels1xor ald h,aprspr8jr.=$+1 ;shift maskjr $ ;+0 = shift left 7 (right 1), +28 = shift left 0 (right 8)add hl,hlsla crlaadd hl,hlsla crlaadd hl,hlsla crlaadd hl,hlsla crlaadd hl,hlsla crlaadd hl,hlsla crlaadd hl,hlsla crlaex de,hlor (hl) ;scr0ex de,hlxor h ;pixels0ld (de),a ;scr0inc eld a,(de) ;scr1or c ;mask1xor l ;pixels1ld (de),a ;scr1dec einc dld a,dand 7jr z,prspr8down.exxdjnz prspr8line.retprspr8down.ld a,esub -32ld e,asbc a,aand -8add a,dld d,aexxdjnz prspr8line.ret;16xhgt sprite (antimask, antipixels);hgt=16:;x=0: 7932 =11.8/byteshift;x=1: 7452;x=2: 6972;x=3: 6492;x=4: 6012;x=5: 5532;x=6: 5052 =52.6/byteshift;x=7: 4572 =47.6/byte (no shift)prspr16.;a=shift right 0..7add a,ald (prspr16jr1.),ald (prspr16jr2.),aexxld a,eand 0x1fcp 0x1eret ncexx;b = counter;ade = pixels;hl = data (4 accesses);de' = screen (6 accesses);chl' = mask, maskedprspr16line.ld a,(hl) ;mask1inc hlexxld h,a ;mask1exxld d,(hl) ;pixels1inc hlld a,(hl) ;mask2inc hlexxld l,a ;mask2xor aprspr16jr1.=$+1 ;shift maskjr $ ;+0 = shift left 7 (right 1), +14 = shift left 0 (right 8)add hl,hlrlaadd hl,hlrlaadd hl,hlrlaadd hl,hlrlaadd hl,hlrlaadd hl,hlrlaadd hl,hlrlaex de,hlor (hl) ;scr0ex de,hlld c,a ;masked0inc einc eld a,(de) ;scr2or l ;mask2ex af,af' ;keep masked2exxld e,(hl) ;pixels2inc hlex de,hlxor aprspr16jr2.=$+1 ;shift pixelsjr $ ;+0 = shift left 7 (right 1), +14 = shift left 0 (right 8)add hl,hlrlaadd hl,hlrlaadd hl,hlrlaadd hl,hlrlaadd hl,hlrlaadd hl,hlrlaadd hl,hlrlaex de,hlex af,af' ;masked2, keep pixels0xor e ;pixels2exxld (de),a ;scr2dec eld a,(de) ;scr1or h ;mask1exxxor d ;pixels1exxld (de),a ;scr1dec eex af,af' ;pixels0xor c ;masked0ld (de),a ;scr0inc dld a,dand 7jr z,prspr16down.exxdjnz prspr16line.retprspr16down.ld a,esub -32ld e,asbc a,aand -8add a,dld d,aexxdjnz prspr16line.ret;PROC prspr24(BYTE x, BYTE y, PBYTE data);;24xhgt sprite (antimask, antipixels);hgt=16:;x=0: 10951 =12.2/byteshift;x=1: 10210;x=2: 9474;x=3: 8738;x=4: 8002;x=5: 7266;x=6: 6530 =51.0/byteshift;x=7: 5794 =45.3/byte (no shift)prspr24.;a=shift right 0..7add a,aadd a,ald (prspr24jr1.),ald (prspr24jr2.),aexxld a,eand 0x1fcp 0x1dret ncexx;b = counter;hl = data (6 accesses);acde = pixels;de' = screen (8 accesses);bchl' = mask, maskedprspr24line.ld a,(hl) ;mask1inc hlexxld c,a ;mask1exxld c,(hl) ;pixels1inc hlld a,(hl) ;mask2inc hlexxld h,a ;mask2exxld d,(hl) ;pixels2inc hlld a,(hl) ;mask3inc hlexxld l,a ;mask3xor aprspr24jr1.=$+1 ;shift maskjr $ ;+0 = shift left 7 (right 1), +28 = shift left 0 (right 8)add hl,hlrl crlaadd hl,hlrl crlaadd hl,hlrl crlaadd hl,hlrl crlaadd hl,hlrl crlaadd hl,hlrl crlaadd hl,hlrl crlaex de,hlor (hl) ;scr0ex de,hlld b,a ;masked0inc einc einc eld a,(de) ;scr3or l ;mask3ex af,af' ;keep masked3exxld e,(hl) ;pixels3inc hlex de,hlxor aprspr24jr2.=$+1 ;shift pixelsjr $ ;+0 = shift left 7 (right 1), +28 = shift left 0 (right 8)add hl,hlrl crlaadd hl,hlrl crlaadd hl,hlrl crlaadd hl,hlrl crlaadd hl,hlrl crlaadd hl,hlrl crlaadd hl,hlrl crlaex de,hlex af,af' ;masked3, keep pixels0xor e ;pixels3exxld (de),a ;scr3dec eld a,(de) ;scr2or h ;mask2exxxor d ;pixels2exxld (de),a ;scr2dec eld a,(de) ;scr1or c ;mask1exxxor c ;pixels1exxld (de),a ;scr1dec eex af,af' ;pixels0xor b ;masked0ld (de),a ;scr0inc dld a,dand 7jr z,prspr24down.exxdjnz prspr24line.retprspr24down.ld a,esub -32ld e,asbc a,aand -8add a,dld d,aexxdec bjp nz,prspr24line.ret;PROC prspr32(BYTE x, BYTE y, PBYTE data);;32xhgt sprite (antimask, antipixels);hgt=16:;x=0: 14101 =12.6/byteshift;x=1: 13109;x=2: 12117;x=3: 11125;x=4: 10133;x=5: 9141;x=6: 8149 =50.9/byteshift;x=7: 7157 =44.7/byte (no shift)prspr32.;a=shift right 0..7ld c,aadd a,aadd a,cadd a,ald (prspr32jr1.),ald (prspr32jr2.),aexxld a,eand 0x1fcp 0x1cret ncexxld hx,b;hx = counter;hl = data (6 accesses);abcde = pixels;de' = screen (8 accesses);abchl'/lbcha' = mask, maskedprspr32line.ld a,(hl) ;mask1inc hlexxld b,a ;mask1exxld b,(hl) ;pixels1inc hlld a,(hl) ;mask2inc hlexxld c,a ;mask2exxld c,(hl) ;pixels2inc hlld a,(hl) ;mask3inc hlexxld h,a ;mask3exxld d,(hl) ;pixels3inc hlld a,(hl) ;mask4inc hlexxld l,a ;mask4xor aprspr32jr1.=$+1 ;shift pixelsjr $ ;+0 = shift left 7 (right 1), +7*6 = shift left 0 (right 8);max 217 (43.4/byte)add hl,hlrl crl brlaadd hl,hlrl crl brlaadd hl,hlrl crl brlaadd hl,hlrl crl brlaadd hl,hlrl crl brlaadd hl,hlrl crl brlaadd hl,hlrl crl brlaex de,hlor (hl) ;scr0ex de,hlex af,af' ;masked0ld a,eadd a,4ld e,ald a,(de) ;scr4or l ;mask3ex af,af' ;masked0, keep masked4ld l,a ;masked0exxld e,(hl) ;pixels4inc hlex de,hlxor aprspr32jr2.=$+1 ;shift pixelsjr $ ;+0 = shift left 7 (right 1), +7*6 = shift left 0 (right 8);max 217 (43.4/byte)add hl,hlrl crl brlaadd hl,hlrl crl brlaadd hl,hlrl crl brlaadd hl,hlrl crl brlaadd hl,hlrl crl brlaadd hl,hlrl crl brlaadd hl,hlrl crl brlaex de,hlex af,af' ;masked4, keep pixels0xor e ;pixels4exxld (de),a ;scr3dec eld a,(de) ;scr3or h ;mask2exxxor d ;pixels3exxld (de),a ;scr3dec eld a,(de) ;scr2or c ;mask2exxxor c ;pixels2exxld (de),a ;scr2dec eld a,(de) ;scr1or b ;mask1exxxor b ;pixels1exxld (de),a ;scr1dec eex af,af' ;pixels0xor l ;masked0ld (de),a ;scr0inc dld a,dand 7jr z,prspr32down.exxdec hxjp nz,prspr32line.retprspr32down.ld a,esub -32ld e,asbc a,aand -8add a,dld d,aexxdec hxjp nz,prspr32line.ret;тюёёЄрэртыштрхь Їюэ шч ърЁЄ√ Єрщыют Єхъє∙хую ¤ъЁрэр (Єрь Єюы№ъю рфЁхёр Єрщыют);фы ¤Єюую эрфю чэрЄ№, ъръшх Єрщы√ шчьхэшышё№ - яЁю∙х тёхую яю ъююЁфшэрЄрь ёяЁрщЄют;(яЁютхЁър ёЄрЁ√ї/эют√ї рфЁхёют Єрщыют 8x8 ёыш°ъюь ьхфыхээр фы тёхую ¤ъЁрэр);PROC respr(BYTE x, BYTE y, PBYTE data);;data: wid8, hgt, linegfx, linegfx...;ъышяшЁютрэшх ёыхтр (яю scrx): ёфхырэю (ъюЁЁхъЎш °шЁшэ√ ш x + Ёрээшщ т√їюф яЁш яюыэюь эхёююЄтхЄёЄтшш);ъышяшЁютрэшх ёяЁртр (яю scrx+scrwid): ёфхырэю (ъюЁЁхъЎш °шЁшэ√ + Ёрээшщ т√їюф яЁш яюыэюь эхёююЄтхЄёЄтшш);ъышяшЁютрэшх ётхЁїє (яю scry): ёфхырэю (ъюЁЁхъЎш т√ёюЄ√ ш y + Ёрээшщ т√їюф яЁш яюыэюь эхёююЄтхЄёЄтшш);ъышяшЁютрэшх ёэшчє (яю scry+scrhgt): ёфхырэю (ъюЁЁхъЎш т√ёюЄ√ + Ёрээшщ т√їюф яЁш яюыэюь эхёююЄтхЄёЄтшш)resprrespr.A.=$+1 ;xrespr.B.=$+2 ;yld de,0respr.C.=$+1ld hl,0 ;datald a,(hl) ;wid8inc hlinc a ;for shifted sprite positionld ly,a ;wid8srl esrl esrl e ;e=x8add a,esub scrx+scrwid ;a=wid8+x8-scrrightjr c,resprnwide.sub ly ;a=x8-scrrightret p ;x8>=scrright (x8 overflow)negld ly,a ;wid8 = scrright-x8resprnwide.ld a,e ;x8sub scrx ;a=x8-scrxjp nc,resprnleft.add a,lyret zret mld ly,a ;wid8 = wid8 - (scrx-x8)ld e,scrxresprnleft.ld a,(hl) ;hgtadd a,d ;yadd a,7 ;for full chrrrarrarraand 0x1f ;bottom y8srl dsrl dsrl d ;d=y8sub d;cp 1;jp nz,$+3+3;jp $ld b,a ;hgt8add a,dsub scry+scrhgt ;a=hgt8+y8-scrbottomjp c,resprnhigh.sub b ;a=y8-scrbottomret p ;y8>=scrbottom (y8 overflow)negld b,a ;hgt8 = scrbottom-y8resprnhigh.ld a,d ;y8sub scry ;a=y8-scryjp nc,resprntop.add a,bret zret mld b,a ;hgt8 = hgt8 - (scry-y8)ld d,scryresprntop.jp prtileboxgo.;яхўрЄ№ Їюэр шч ърЁЄ√ Єрщыют Єхъє∙хую ¤ъЁрэр (Єрь Єюы№ъю рфЁхёр Єрщыют);PROC prtilebox(BYTE x8, BYTE y8, BYTE wid8, BYTE hgt8);;ъышяшЁютрэш эхЄ!prtileboxprtilebox.C.=$+2ld ly,0 ;wid8prtilebox.D.=$+1ld b,0 ;hgt8prtilebox.A.=$+1 ;x8prtilebox.B.=$+2 ;y8ld de,0prtileboxgo.xor ald h,d ;0b000yyyyysrl h ;0b0000yyyy = hrra ;0by0000000add a,e ;0b000xxxxxadd a,e ;0b000xxxxxld l,a ;0by0xxxxx0 = lld a,d ;0b000yyyyyrrcarrcarrcaand 0b11100000or e ;0b000xxxxxld c,a ;0byyyxxxxx = cld a,d ;0b000yyyyyand 0b00011000add a,scrbuf/256ld hx,a ;0b010yy000 = hxrrcarrcarrcaadd a,0x18+(scrbuf/256)-(scrbuf/0x800)ld lx,a ;0byyyxxxxx = lxld de,tilemapadd hl,de;hl= tilemap + 0b0000yyyy y0xxxxx0;hx(lx)c=scr = 0b010yy000 yyyxxxxx;b=hgt8prtileboxline.push bc ;scrpush hl ;tilemapld hy,ly ;wid8prtileboxchr.ld e,(hl)inc lld d,(hl)inc lld b,hx;24t loop, fit for contentionld a,(de)inc deld (bc),ainc bld a,(de)inc deld (bc),ainc bld a,(de)inc deld (bc),ainc bld a,(de)inc deld (bc),ainc bld a,(de)inc deld (bc),ainc bld a,(de)inc deld (bc),ainc bld a,(de)inc deld (bc),ainc bld a,(de)inc deld (bc),ald b,lxld a,(de)ld (bc),a ;attrinc cdec hyjp nz,prtileboxchr.pop hl ;tilemapld bc,128 ;tilemapwid*2add hl,bcpop bc ;scrld a,cadd a,32ld c,ajp nc,prtileboxndown.ld a,hxadd a,8ld hx,arrcarrcarrcaadd a,0x18+(scrbuf/256)-(scrbuf/0x800)ld lx,a ;0byyyxxxxx = lxprtileboxndown.djnz prtileboxline.ret;т√тюф ¤ыхьхэЄр Їюэр т Єрщыют√щ сєЇхЁ;PROC pretile(BYTE x8, BYTE y8, BYTE wid8, BYTE hgt8, PBYTE data);;data: [wid8, hgt8,] chrgfx, chrgfx...;x8,y8 чфхё№ ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь;ъышяшЁютрэшх яю ыхтюьє ъЁр■ ртЄюьрЄшўхёъюх;ъышяшЁютрэшх яю яЁртюьє ъЁр■ ртЄюьрЄшўхёъюх;ъышяшЁютрэшх яю эшцэхьє ъЁр■ ёфхырэю (ъюЁЁхъЎш т√ёюЄ√ + Ёрээшщ т√їюф яЁш яюыэюь эхёююЄтхЄёЄтшш);ъышяшЁютрэшх яю тхЁїэхьє ъЁр■ ёфхырэю (яЁюяєёъ ёЄЁюъ)pretilepretile.A.=$+1 ;x8pretile.B.=$+2 ;y8ld bc,0xor ald h,b ;0b000yyyyysrl h ;0b0000yyyy = hrra ;0by0000000add a,c ;0b000xxxxxadd a,c ;0b000xxxxxld l,a ;0by0xxxxx0 = lld de,tilemapadd hl,de;hl= tilemap + 0b0000yyyy y0xxxxx0pretile.E.=$+1ld de,0 ;data;ld a,(de) ;wid8;inc de;ld lx,a ;wid8;ld a,(de) ;hgt8;inc de;ld hx,a ;hgt8pretile.C.=$+2 ;wid8pretile.D.=$+3 ;hgt8ld ix,0add a,b ;y8sub scry+scrhgt ;a=hgt8+y8-scrbottomjp c,pretilenhigh.sub hx ;a=y8-scrbottom;ret p ;y8>=scrbottom (y8 overflow) ;TODO fixneg;ld hx,a ;hgt8 = scrbottom-y8 ;TODO fixpretilenhigh.pretileline.;фы Їюэр 28xNpush deld a,hcp tilemap/256ld a,ejr c,pretilenline.push hlld b,lx ;wid8pretilechr.ld (hl),ainc lld (hl),dinc ladd a,9 ;chr gfx sizejp nc,$+4inc ddjnz pretilechr.pop hlpretilenlineq.ld e,a;фы Їюэр 28xNpop deinc dld bc,128 ;tilemapwid*2add hl,bcdec hxjp nz,pretileline.retpretilenline.ld b,lx ;wid8pretilenchr.add a,9 ;chr gfx sizejp nc,$+4inc ddjnz pretilenchr.jp pretilenlineq.;PROC showscr();;яюярфрхЄ яюф ыєў!showscrld de,scrtopld hl,scrbuf-scraddr ;0x4000 ;screen5add hl,deld b,scrhgtshowscrtileline.push bcld a,8showscrline.push depush hlld bc,scrwidldirpop hlpop deinc hinc ddec ajp nz,showscrline.push depush hl;ld a,h;rrca;rrca;rrca;add a,0x18+(scrbuf/256)-(scrbuf/0x800)-1;ld h,ald a,drrcarrcarrcaadd a,0x18+(scraddr/256)-(scraddr/0x800)-1 ;0x58-(0x40/8)-1 ;screen5ld d,aadd a,+(scrbuf-scraddr)/256ld h,ald bc,scrwidldirpop hlpop depop bcld a,esub -32ld e,asbc a,aand -8add a,dld d,ald a,lsub -32ld l,asbc a,aand -8add a,hld h,adjnz showscrtileline.ret;PROC clearscrbuf(BYTE attr);clearscrbufld de,scrbuf+1ld bc,0x1800ld h,dld l,cld (hl),lldirclearscrbuf.A.=$+1ld (hl),7 ;attrld bc,0x2ffldirret;PROC cleartilemap(PCHAR tileaddr);cleartilemapld hl,tilemap+1ld de,tilemap+2cleartilemap.A.=$+1ld bc,0;emptytileld (hl),bdec lld (hl),cld bc,0xbfeldirret;FUNC BOOL readpix(BYTE x, BYTE y);;0x00 - pixel off;0xff - pixel onreadpixreadpix.A.=$+1 ;xreadpix.B.=$+2 ;yld bc,0call scrbufaddr.;hl=screen addr;a = 128..1and (hl)ret z ;0x00 - pixel offld a,0xff ;0xff - pixel onret;PROC setpixscrbuf(BYTE x, BYTE y, BYTE color);setpixscrbufsetpixscrbuf.A.=$+1 ;xsetpixscrbuf.B.=$+2 ;yld bc,0call scrbufaddr.;hl=screen addr;a = 128..1ld c,a ;bitsetpixscrbuf.C.=$+1 ;colorld a,0xor (hl)and c ;bitxor (hl);or (hl)ld (hl),aret;PROC setpix(BYTE x, BYTE y, BYTE color);setpixsetpix.A.=$+1 ;xsetpix.B.=$+2 ;yld bc,0call scraddr.;hl=screen addr;a = 128..1ld c,a ;bitsetpix.C.=$+1 ;colorld a,0xor (hl)and c ;bitxor (hl);or (hl)ld (hl),aret;PROC invpixscrbuf(BYTE x, BYTE y);invpixscrbufinvpixscrbuf.A.=$+1 ;xinvpixscrbuf.B.=$+2 ;yld bc,0call scrbufaddr.;hl=screen addr;a = 128..1xor (hl)ld (hl),aret;PROC onpixscrbuf(BYTE x, BYTE y);onpixscrbufonpixscrbuf.A.=$+1 ;xonpixscrbuf.B.=$+2 ;yld bc,0call scrbufaddr.;hl=screen addr;a = 128..1or (hl)ld (hl),aret;PROC offpixscrbuf(BYTE x, BYTE y);offpixscrbufoffpixscrbuf.A.=$+1 ;xoffpixscrbuf.B.=$+2 ;yld bc,0call scrbufaddr.;hl=screen addr;a = 128..1cpland (hl)ld (hl),aret;PROC invpix(BYTE x, BYTE y);invpixinvpix.A.=$+1 ;xinvpix.B.=$+2 ;yld bc,0call scraddr.;hl=screen addr;a = 128..1xor (hl)ld (hl),aret;PROC onpix(BYTE x, BYTE y);onpixonpix.A.=$+1 ;xonpix.B.=$+2 ;yld bc,0call scraddr.;hl=screen addr;a = 128..1or (hl)ld (hl),aret;PROC offpix(BYTE x, BYTE y);offpixoffpix.A.=$+1 ;xoffpix.B.=$+2 ;yld bc,0call scraddr.;hl=screen addr;a = 128..1cpland (hl)ld (hl),aretscraddr.ld a,brrarrarraxor band 0xf8xor band 0x1fadd a,scraddr/256ld h,ald a,crlcarlcarlcaxor band 0xc7xor brlcarlcald l,a;hl=screen addrld a,cand 7;a=shift right 0..7inc ald b,a ;b=1..8ld a,1rrcadjnz $-1;a = 128..1retscrbufaddr.ld a,brrarrarraxor band 0xf8xor band 0x1fadd a,scrbuf/256ld h,ald a,crlcarlcarlcaxor band 0xc7xor brlcarlcald l,a;hl=screen addrld a,cand 7;a=shift right 0..7inc ald b,a ;b=1..8ld a,1rrcadjnz $-1;a = 128..1ret