code SEGMENT para public 'CODE' ASSUME cs:code .386 LOCALS PUBLIC _back _back dw 0,0 PUBLIC _rotpic _rotpic dw 0,0 PUBLIC _rotpic90 _rotpic90 dw 0,0 DOWORD MACRO diadd,siadd mov bx,ds:[si+(siadd)] ;4 mov al,fs:[bx+di] ;3 mov bx,ds:[si+(siadd)+2] ;4 mov ah,fs:[bx+di] ;3 or ax,dx ;2 mov es:[bp+(diadd)],ax ;5 ENDM ;=21 PUBLIC _dorow _dorow PROC FAR push bp mov bp,sp push si push di push ds mov fs,cs:_back[2] mov ax,0a000h mov es,ax mov ds,[bp+8] mov dx,[bp+14] mov dh,dl mov di,[bp+10] mov si,[bp+12] shl si,2 mov cx,ds:[si+2] mov si,ds:[si] cmp cx,4 jge @@2 jmp @@0 @@2: add di,ds:[si] mov bp,di add si,2 test bp,1 jz @@1 mov bx,ds:[si] add si,2 mov al,fs:[bx+di] or ax,dx mov es:[bp],al inc bp dec cx @@1: push cx shr cx,1 sub si,320 sub bp,320 mov ax,cx ;*1 shl cx,2 add ax,cx ;*4 shl cx,2 add ax,cx ;*16 neg ax ;bx=-count*21 add ax,OFFSET @@l jmp ax zzz=64 REPT 64 zzz=zzz-1 DOWORD 320+zzz*2,320+zzz*4 ENDM @@l: pop cx test cx,1 jz @@0 and cx,not 1 add bp,cx add cx,cx add si,cx mov bx,ds:[si+320] mov al,fs:[bx+di] or ax,dx mov es:[bp+320],al @@0: pop ds pop di pop si pop bp ret _dorow ENDP PUBLIC _dorow2 _dorow2 PROC FAR push bp mov bp,sp push si push di push ds mov fs,[bp+8] mov si,[bp+12] shl si,2 mov cx,fs:[si+2] mov si,fs:[si] or cx,cx jcxz @@0 mov ds,cs:_back[2] mov ax,0a000h mov es,ax mov dx,[bp+14] mov dh,dl mov di,[bp+10] add di,fs:[si] mov ax,di lea bp,[si+2] mov si,ax @@3: mov bx,fs:[bp+2] mov al,ds:[bx+di] or al,dl mov bx,fs:[bp] add bp,4 mov es:[bx+si],al dec cx jnz @@3 @@0: pop ds pop di pop si pop bp ret _dorow2 ENDP PUBLIC _dorow3 _dorow3 PROC FAR push bp mov bp,sp push si push di push ds mov fs,[bp+8] mov si,[bp+12] shl si,2 mov cx,fs:[si+2] mov si,fs:[si] or cx,cx jcxz @@0 mov ds,cs:_back[2] mov ax,0a000h mov es,ax mov di,[bp+10] add di,fs:[si] add si,2 @@3: mov bx,fs:[si] add si,2 mov al,ds:[bx+di] mov es:[bx+di],al dec cx jnz @@3 @@0: pop ds pop di pop si pop bp ret _dorow3 ENDP PUBLIC _setborder _setborder PROC FAR push bp mov bp,sp mov dx,3dah in al,dx mov dx,3c0h mov al,11h+32 out dx,al mov al,[bp+6] out dx,al pop bp ret _setborder ENDP PUBLIC _inittwk _inittwk PROC FAR push bp mov bp,sp push si push di push ds ;clear palette mov dx,3c8h xor al,al out dx,al inc dx mov cx,768 @@1: out dx,al loop @@1 ;400 rows mov dx,3d4h mov ax,00009h out dx,ax ;tweak mov ax,00014h out dx,ax mov ax,0e317h out dx,ax mov dx,3c4h mov ax,0604h out dx,ax ; mov dx,3c4h mov ax,0f02h out dx,ax mov ax,0a000h mov es,ax xor di,di mov cx,32768 xor ax,ax rep stosw ; ;set 4 x vertical mov dx,3d4h mov al,9 out dx,al inc dx in al,dx and al,not 31 or al,3 out dx,al ; pop ds pop di pop si pop bp ret _inittwk ENDP PUBLIC _setpalarea _setpalarea PROC FAR push bp mov bp,sp push si push di push ds lds si,[bp+6] mov ax,[bp+10] mov dx,3c8h out dx,al mov cx,[bp+12] mov ax,cx shl cx,1 add cx,ax inc dx rep outsb sti pop ds pop di pop si pop bp ret _setpalarea ENDP ALIGN 16 xpos dd 0 ypos dd 0 xadd dd 0 yadd dd 0 ZOOMXW equ 160 ZOOMYW equ 100 PUBLIC _rotate _rotate PROC FAR push bp mov bp,sp push si push di push ds mov ax,[bp+6] shl eax,16 mov cs:xpos,eax mov ax,[bp+8] shl eax,16 mov cs:ypos,eax mov ax,[bp+12] cwde shl eax,6 mov ebx,eax mov ax,[bp+10] cwde shl eax,6 mov ecx,eax mov edx,ebx mov ds,cs:_rotpic[2] cmp ecx,0 jge @@s1 neg ecx @@s1: cmp edx,0 jge @@s2 neg edx @@s2: cmp ecx,edx jle @@s3 mov ds,cs:_rotpic90[2] xchg eax,ebx neg eax mov ecx,cs:xpos mov edx,cs:ypos xchg ecx,edx neg ecx mov cs:xpos,ecx mov cs:ypos,edx @@s3: mov cs:xadd,eax mov cs:yadd,ebx xor ax,ax mov cx,word ptr cs:yadd[0] mov dx,word ptr cs:xadd[0] mov bl,byte ptr cs:yadd[2] mov bh,byte ptr cs:xadd[2] neg bh neg dx sbb bh,0 xor si,si xor di,di ;si=lowx,di=lowy,ax=y/x ;cx=addx,dx=addy,bx=yah/xah zzz=0 REPT ZOOMXW/4 add si,cx adc al,bl add di,dx adc ah,bh mov word ptr cs:[OFFSET @@moda+zzz+2],ax add si,cx adc al,bl add di,dx adc ah,bh mov word ptr cs:[OFFSET @@modb+zzz+2],ax add si,cx adc al,bl add di,dx adc ah,bh mov word ptr cs:[OFFSET @@moda+zzz+6],ax add si,cx adc al,bl add di,dx adc ah,bh mov word ptr cs:[OFFSET @@modb+zzz+6],ax zzz=zzz+13 ENDM ;aspect ratio mov eax,307 mul dword ptr cs:xadd sar eax,8 mov cs:xadd,eax mov eax,307 mul dword ptr cs:yadd sar eax,8 mov cs:yadd,eax mov ax,0a000h mov es,ax mov di,-1000h mov cx,ZOOMYW @@2: mov ebx,cs:ypos add ebx,cs:yadd mov cs:ypos,ebx shr ebx,8 mov eax,cs:xpos add eax,cs:xadd mov cs:xpos,eax shr eax,16 mov bl,al mov si,bx ; mov dx,3c4h mov ax,0302h out dx,ax @@moda: zzz=1000h REPT ZOOMXW/4 mov al,ds:[si+1234h] ;4 mov ah,ds:[si+1234h] ;4 mov es:[di+zzz],ax ;5 zzz=zzz+2 ENDM mov dx,3c4h mov ax,0c02h out dx,ax @@modb: zzz=1000h REPT ZOOMXW/4 mov al,ds:[si+1234h] ;4 mov ah,ds:[si+1234h] ;4 mov es:[di+zzz],ax ;5 zzz=zzz+2 ENDM ; add di,80 dec cx jz @@1 jmp @@2 @@1: pop ds pop di pop si pop bp ret _rotate ENDP PUBLIC _rotatez _rotatez PROC FAR push bp mov bp,sp push si push di push ds mov ax,[bp+6] shl eax,16 mov cs:xpos,eax mov ax,[bp+8] shl eax,16 mov cs:ypos,eax mov ax,[bp+12] cwde shl eax,6 mov ebx,eax mov ax,[bp+10] cwde shl eax,6 mov ecx,eax mov edx,ebx mov ds,cs:_rotpic[2] cmp ecx,0 jge @@s1 neg ecx @@s1: cmp edx,0 jge @@s2 neg edx @@s2: cmp ecx,edx jle @@s3 mov ds,cs:_rotpic90[2] xchg eax,ebx neg eax mov ecx,cs:xpos mov edx,cs:ypos xchg ecx,edx neg ecx mov cs:xpos,ecx mov cs:ypos,edx @@s3: mov cs:xadd,eax mov cs:yadd,ebx xor ax,ax mov cx,word ptr cs:yadd[0] mov dx,word ptr cs:xadd[0] mov bl,byte ptr cs:yadd[2] mov bh,byte ptr cs:xadd[2] neg bh neg dx sbb bh,0 xor si,si xor di,di ;si=lowx,di=lowy,ax=y/x ;cx=addx,dx=addy,bx=yah/xah zzz=0 REPT ZOOMXW/4 add si,cx adc al,bl add di,dx adc ah,bh mov word ptr cs:[OFFSET @@moda+zzz+2],ax add si,cx adc al,bl add di,dx adc ah,bh mov word ptr cs:[OFFSET @@modb+zzz+2],ax add si,cx adc al,bl add di,dx adc ah,bh mov word ptr cs:[OFFSET @@moda+zzz+6],ax add si,cx adc al,bl add di,dx adc ah,bh mov word ptr cs:[OFFSET @@modb+zzz+6],ax zzz=zzz+13 ENDM ;aspect ratio mov eax,307 mul dword ptr cs:xadd sar eax,8 mov cs:xadd,eax mov eax,307 mul dword ptr cs:yadd sar eax,8 mov cs:yadd,eax mov ax,0a000h mov es,ax mov di,-1000h mov cx,ZOOMYW @@2: mov ebx,cs:ypos add ebx,cs:yadd mov cs:ypos,ebx shr ebx,8 mov eax,cs:xpos add eax,cs:xadd mov cs:xpos,eax add cs:xadd,256 sub cs:yadd,256 shr eax,16 mov bl,al mov si,bx ; mov dx,3c4h mov ax,0302h out dx,ax @@moda: zzz=1000h REPT ZOOMXW/4 mov al,ds:[si+1234h] ;4 mov ah,ds:[si+1234h] ;4 mov es:[di+zzz],ax ;5 zzz=zzz+2 ENDM mov dx,3c4h mov ax,0c02h out dx,ax @@modb: zzz=1000h REPT ZOOMXW/4 mov al,ds:[si+1234h] ;4 mov ah,ds:[si+1234h] ;4 mov es:[di+zzz],ax ;5 zzz=zzz+2 ENDM ; add di,80 dec cx jz @@1 jmp @@2 @@1: pop ds pop di pop si pop bp ret _rotatez ENDP code ENDS END