.model small .386 DGROUP group _DATA extrn _linelen:dword extrn _screen:dword extrn _curcolor:word extrn _charcolors:word[7] extrn _pictlen:dword extrn _screen_buffer_size:dword SEGA000 equ 0a0000h _TEXT segment byte public 'CODE' use32 assume CS:_TEXT assume DS:DGROUP public getadr32_ getadr32_: getadr_:mul _linelen ;EAX - y; ESI - X; shl esi,1 add eax,esi add eax,_screen ret public point32_ ;EAX - Y; ESI - X; ECX - COLOR point32_: call getadr_ mov [eax],cx ret public bar32_ ;AX - X1, BX - Y1, CX - X2, DX - Y2 bar32_: cmp cx,ax ;x1x1 jnc horlin1 xchg ecx,esi ;jestli ne tak je prohod horlin1:sub ecx,esi ;xs=x2-x1+1 inc ecx ; mov si,ds ;ds -> es mov es,si mov edi,eax ;esi je adresa mov ax,_curcolor ;nacti barvu shl eax,16 mov ax,_curcolor shr ecx,1 rep stosd ;nakresli caru rcl ecx,1 rep stosw ;popripade jeste jeden bod pop es ;obnov es ret public ver_line32_ ver_line32_: ;EAX - Y1 ESI - X ECX - Y2 cmp ecx,eax ;y2>y1 jnc verlin1 xchg ecx,eax ;jestli ne tak je prohod verlin1:sub ecx,eax inc ecx call getadr_ ;eax obsahuje adresu bodu mov esi,eax mov ax,_curcolor ;nacti barvu verlin2:mov [esi],ax ;kresli caru po bodech add esi,_linelen dec ecx jnz verlin2 ret public line_32_ line_32_: ;eax - Y, esi - X, ecx - xs, ebx - ys (xs,ys muze byt zaporne) or ecx,ecx jns line1 ;kdyz je ecx (xs) zaporny je nutne otocit smer a presunout se na druhy konec linky add esi,ecx add eax,ebx neg ebx neg ecx line1: push es ;uchovej es or ecx,ecx ;kdyz je ecx=0 pak je to specialni pripad inc ecx jz lnext call getadr_ ;zjisti adresu prvnihi bodu mov edi,eax ;vloz ji do di mov ax,ds ;ds -> es mov es,ax mov ax,_curcolor ;nacti aktualni barvu or ebx,ebx ;kontrola zda je ebx>=0 js lineup ;neni pak bude se kreslit nahoru xor esi,esi ;vynuluj esi - pocitadlo mezikroku mov edx,ecx ;delku cary na ose x do porovnavaciho registru inc ebx lined3: add esi,ebx ;do mezikroku pricti ys cmp esi,edx ;kdyz to prekrocilo poronavaci registr jc lined1 ;zacnes kreslit dolu, jinak v pravo lined2: mov [edi],ax;zapis bod add edi,_linelen ;a posun dolu sub esi,edx ;odect od mezikroku hodnotu v porovnavacim registru cmp esi,edx ;je stale preteceni? jnc lined2 ;pokud ano opakuj zapsani bodu add edi,2 ;dalsi xs dec ecx ;sniz citac Xs jnz lined3 ;pokracuj pro dalsi Xs jmp linee ;pokud to byl posledni, pak konec lined1: stosw ;zapis bod a posun v pravo dec ecx ;pokracuj pro dalsi ys jnz lined3 ;dokud neni konec jmp linee ;pak jdi na lineEnd lineup: neg ebx ;neguj ebx xor esi,esi ;vynuluj esi - pocitadlo mezikroku mov edx,ecx ;delku cary na ose x do porovnavaciho registru inc ebx lineu3: add esi,ebx ;do mezikroku pricti ys cmp esi,edx ;kdyz to prekrocilo poronavaci registr jc lineu1 ;zacnes kreslit nahoru, jinak v pravo lineu2: mov [edi],ax;zapis bod sub edi,_linelen ;a posun nahoru sub esi,edx ;odect od mezikroku hodnotu v porovnavacim registru cmp esi,edx ;je stale preteceni? jnc lineu2 ;pokud ano opakuj zapsani bodu add edi,2 ;dalsi xs dec ecx ;sniz citac Xs jnz lineu3 ;pokracuj pro dalsi Xs jmp linee ;pokud to byl posledni, pak konec lineu1: stosw ;zapis bod a posun v pravo dec ecx ;pokracuj pro dalsi ys jnz lineu3 ;dokud neni konec jmp linee lnext: mov ecx,ebx add ecx,eax call ver_line32_ linee: pop es ret public char_32_ char_32_: ;edi - pozice na obrazovce ;esi - ukazatel na font ;al - znak and eax,0ffh mov ax,[esi][eax*2] or ax,ax jz chrend add esi,eax lodsw xor dl,dl ;dl - je citac transparetnich pozic mov cx,ax ;cl - XRES, ch - YRES chr6: mov ebx,edi ;ebx - ukazuje po radcich v jednom sloupci mov dh,ch ;dh - bude citac radku chr5: or dl,dl ;pokud je dl = 0 pak se cte dalsi bajt jnz chr1 ;jinak je dalsi bod jenom transparetni lodsb ;cti barvu or al,al ;pokud je 0 pak je transparetni jz chr2 ;preskoc kresleni cmp al,8 ;8 a vice jsou informace o opakovanych transparetnich bodech jnc chr3 ;(viz FONTEDIT.DOC). Pak se podle toho zarid and eax,0ffh;v eax jen dolnich 8 bitu dec al mov ax,_charcolors[EAX*2] ;vyjmi barvu cmp ax,0ffffh;0xffff je barva ktera se nekresli; jz chr4 ; mov [ebx],ax;zobraz ji na obrazovce jmp chr4 ;a skoc na konec smycky chr3: cmp al,0ffh ;pokud je al=255 pak jsme narazily na terminator. jz chrend ;V tom pripade KONEC sub al,6 ;odecti do al 6. Ziskas pocet transparetnich pozic mov dl,al ;uloz je do citace chr1: dec dl ;pro kazdou pozici to dl odecti dokud neni 0 chr2: chr4: add ebx,_linelen;dalsi radka dec dh ;odecti citac radek jnz chr5 ;dokud neni nula add edi,2 ;dalsi sloupec dec cl ;odecti citac sloupcu jnz chr6 ;dokud neni nula chrend: ret ;konec public char2_32_ char2_32_: ;edi - pozice na obrazovce ;esi - ukazatel na font ;al - znak and eax,0ffh mov ax,[esi][eax*2] or ax,ax jz chr2end add esi,eax lodsw xor dl,dl ;dl - je citac transparetnich pozic mov cx,ax ;cl - XRES, ch - YRES chr26: mov ebx,edi ;ebx - ukazuje po radcich v jednom sloupci mov dh,ch ;dh - bude citac radku chr25: or dl,dl ;pokud je dl = 0 pak se cte dalsi bajt jnz chr21 ;jinak je dalsi bod jenom transparetni lodsb ;cti barvu or al,al ;pokud je 0 pak je transparetni jz chr22 ;preskoc kresleni cmp al,8 ;8 a vice jsou informace o opakovanych transparetnich bodech jnc chr23 ;(viz FONTEDIT.DOC). Pak se podle toho zarid and eax,0ffh;v eax jen dolnich 8 bitu dec al mov ax,_charcolors[EAX*2] ;vyjmi barvu push ebx mov [ebx],ax;zobraz ji na obrazovce mov [ebx+2],ax;zobraz ji na obrazovce add ebx,_linelen mov [ebx],ax;zobraz ji na obrazovce mov [ebx+2],ax;zobraz ji na obrazovce pop ebx jmp chr24 ;a skoc na konec smycky chr23: cmp al,0ffh ;pokud je al=255 pak jsme narazily na terminator. jz chr2end ;V tom pripade KONEC sub al,6 ;odecti do al 6. Ziskas pocet transparetnich pozic mov dl,al ;uloz je do citace chr21: dec dl ;pro kazdou pozici to dl odecti dokud neni 0 chr22: chr24: add ebx,_linelen;dalsi radka add ebx,_linelen dec dh ;odecti citac radek jnz chr25 ;dokud neni nula add edi,4 ;dalsi sloupec dec cl ;odecti citac sloupcu jnz chr26 ;dokud neni nula chr2end: ret ;konec public charsize_ charsize_: ;esi - ukazatel na font ;al - znak and eax,0ffh mov ax,[esi][eax*2] or ax,ax jz chsend add esi,eax lodsw chsend: and eax,0ffffh ret public put_picture_ put_picture_: ;esi - X ;eax - Y ;edi - obrazek mov ecx,esi ;uchovej x v ecx mov ebx,eax ;uchovej y v ebx call getadr_ ;zjisti adresu bodu mov esi,eax ;vloz ji do esi xchg esi,edi ;prohod esi a edi aby obsahovali zpravne informace xor eax,eax ;vynuluj pripadne bajty v horni polovine eax lodsw ;nacti xs mov _pictlen,eax mov edx,eax ;z kopiruj jeste do pracovniho dx add edx,ecx ;pricti k nemu souradnici cmp edx,640 ;je-li vetsi nez max velikost obrazovky x jc ppok1 ; mov eax,640 ;pak za eax dosad plnou velikost sub eax,ecx ;odecti souradnici ppok1: mov ecx,eax ;vloz do ecx lodsw ;totez pro y mov edx,eax add edx,ebx cmp edx,400 jc ppok2 mov eax,400 sub eax,ebx ppok2: mov edx,eax lodsw mov ebx,edi cmp al,15 jnz pp_next jmp pp15bit pp_next:cmp al,8 jnz pp_nxt2 jmp pp8bit pp_nxt2:ret pp15bit:mov eax,ecx pp15bi1:shr ecx,1 rep movsd rcl ecx,1 rep movsw mov ecx,_pictlen sub ecx,eax shl ecx,1 add esi,ecx mov ecx,eax add ebx,_linelen mov edi,ebx dec edx jnz pp15bi1 ret pp8bit: push ebp mov ebp,ecx mov ebx,esi add esi,512 pp8bit1:xor eax,eax lodsb or al,al jz pp8bit2 mov eax,[ebx+eax*2] stosw pp8bit4:dec ecx jnz pp8bit1 mov ecx,ebp sub edi,ecx sub edi,ecx add edi,_linelen sub esi,ebp add esi,_pictlen dec edx jnz pp8bit1 pop ebp ret pp8bit2:add edi,2 jmp pp8bit4 public setPal_ setPal_:mov edx,3c6h mov al,255 out dx,al xor ah,ah setpal1:mov edx,3c8h mov al,ah out dx,al mov edx,3c9h lodsb out dx,al lodsb out dx,al lodsb out dx,al inc ah jne setPal1 ret public Redraw_lo_ Redraw_lo_: ;esi 512Kb obrazovka ;edi lbuffer ;ebx xlattable test ebx,1 jz rdrwlo3 inc ebx rdrwlo3:push ebp mov ebp,200 shl 16 xor eax,eax xor ecx,ecx xor edx,edx rdrwlo2:mov bp,160 rdrwlo1:mov ecx,[esi] mov edx,[esi+1280] and ecx,7bdf7bdfh and edx,7bdf7bdfh add ecx,edx shr ecx,1 shrd ecx,edx,16 and edx,7bdfh and ecx,7bdfh add edx,ecx shr edx,1 mov al,[ebx+edx*2] xor ebx,1 add esi,4 mov ecx,[esi] mov edx,[esi+1280] and ecx,7bdf7bdfh and edx,7bdf7bdfh add ecx,edx shr ecx,1 shrd ecx,edx,16 and edx,7bdfh and ecx,7bdfh add edx,ecx shr edx,1 mov ah,[ebx+edx*2] stosw xor ebx,1 add esi,4 dec bp jnz rdrwlo1 xor ebx,1 add esi,1280 sub ebp,65536 jnz rdrwlo2 pop ebp ret public Redraw256_ Redraw256_: ;esi - source ;edi - target ;ebx - xlat test ebx,1 jz rdrwlo7 inc ebx rdrwlo7:xor eax,eax rdrwlo4:mov ecx,400*65536 rdrwlo6:mov cx,320 rdrwlo5:mov edx,[esi] add esi,4 mov ax,dx mov al,[ebx+eax*2] shr edx,16 xor ebx,1 mov ah,[ebx+edx*2] stosw xor ebx,1 dec cx jnz rdrwlo5 xor ebx,1 sub ecx,65536 jnz rdrwlo6 ret public redraw32_ redraw32_: ;esi source ;edi target ;ebx notused (xlat) mov ecx,128000 rep movsd ret public redrawbox_lo_ redrawbox_lo_: ;esi source ;edi target ;ebx xlat ;ecx xs ;edx,ys shr ecx,1 shr edx,1 dec edx test ebx,1 jz rboxlo3 inc ebx rboxlo3:push ebp mov ebp,edx shl ebp,16 mov bp,cx xor eax,eax xor ecx,ecx xor edx,edx rboxlo2:push ebp push esi push edi rboxlo1:mov ecx,[esi] mov edx,[esi+1280] and ecx,7bdf7bdfh and edx,7bdf7bdfh add ecx,edx shr ecx,1 shrd ecx,edx,16 and edx,7bdfh and ecx,7bdfh add edx,ecx shr edx,1 mov al,[ebx+edx*2] stosb xor ebx,1 add esi,4 dec bp jnz rboxlo1 pop edi pop esi pop ebp xor ebx,1 add esi,_linelen add esi,_linelen add edi,320 sub ebp,65536 jnc rboxlo2 pop ebp ret public Redrawbox256_ Redrawbox256_: ;esi - source ;edi - target ;ebx - xlat ;ecx - ys ;edx - xs shl ecx,16 shr edx,1 mov cx,dx test ebx,1 jz rboxlo7 inc ebx rboxlo7:xor eax,eax rboxlo6:push ecx push esi push edi rboxlo5:mov edx,[esi] add esi,4 mov ax,dx mov al,[ebx+eax*2] shr edx,16 xor ebx,1 mov ah,[ebx+edx*2] stosw xor ebx,1 dec cx jnz rboxlo5 pop edi pop esi pop ecx add esi,_linelen add edi,640 xor ebx,1 sub ecx,65536 test ecx,0ffff0000h jnz rboxlo6 ret public redrawbox32_ redrawbox32_: ;esi source ;edi target ;ebx xs ;edx ys shr ebx,1 rbox32: mov ecx,ebx rep movsd mov ecx,ebx shl ecx,2 sub esi,ecx sub edi,ecx add esi,_linelen add edi,_linelen dec edx jnz rbox32 ret public get_picture_ get_picture_: ;esi - X ;eax - Y ;ebx - xs ;ecx - ys ;edi - obrazek mov [edi],ebx ;zapis velikost obrazku mov [edi+2],ecx mov ecx,esi ;uchovej x v ecx mov ebx,eax ;uchovej y v ebx call getadr_ ;zjisti adresu bodu mov esi,eax ;vloz ji do esi xor eax,eax ;vynuluj pripadne bajty v horni polovine eax mov ax,[edi];vem velikost x add edi,2 mov _pictlen,eax mov edx,eax ;z kopiruj jeste do pracovniho dx add edx,ecx ;pricti k nemu souradnici cmp edx,640 ;je-li vetsi nez max velikost obrazovky x jc gpok1 ; mov eax,640 ;pak za eax dosad plnou velikost sub eax,ecx ;odecti souradnici gpok1: mov ecx,eax ;vloz do ecx mov ax,[edi];vem velikost y add edi,2 mov edx,eax add edx,ebx cmp edx,400 jc gpok2 mov eax,400 sub eax,ebx gpok2: mov edx,eax mov ax,15 ;nastav typ 15 stosw ;zapis mov ebx,esi ;uloz esi jeste do ebx gp15bit:mov eax,ecx ;uloz ecx jeste do eax gp15bi1:shr ecx,1 ;pocet dvojic bodu rep movsd ;presun do pameti rcl ecx,1 ;pokud zbyl jeste jeden rep movsw ;tak ted mov ecx,_pictlen sub ecx,eax shl ecx,1 add edi,ecx ;jdi na dalsi radku v obrazku mov ecx,eax ;obnov counter add ebx,_linelen ;jdi na dalsi radku na obrazovce mov esi,ebx ;obnov esi dec edx ;dokud neni konec jnz gp15bi1 ret public hor_line_xor_ Hor_line_xor_: ;EAX - Y ESI - X1 ECX - X2 call getadr_ ;eax obsahuje adresu bodu shr esi,1 cmp ecx,esi ;x2>x1 jnc xhorlin1 xchg ecx,esi ;jestli ne tak je prohod xhorlin1:sub ecx,esi ;xs=x2-x1+1 inc ecx ; mov edi,eax ;esi je adresa mov ax,_curcolor ;nacti barvu xhorlin2:xor [edi],ax add edi,2 dec ecx jnz xhorlin2 ret public ver_line_xor_ ver_line_xor_: ;EAX - Y1 ESI - X ECX - Y2 cmp ecx,eax ;y2>y1 jnc xverlin1 xchg ecx,eax ;jestli ne tak je prohod xverlin1:sub ecx,eax inc ecx call getadr_ ;eax obsahuje adresu bodu mov esi,eax mov ax,_curcolor ;nacti barvu xverlin2:xor [esi],ax ;kresli caru po bodech add esi,_linelen dec ecx jnz xverlin2 ret _TEXT ends END