From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/CONTRIB/SNIP/vio.asm | 896 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 896 insertions(+) create mode 100755 reference/C/CONTRIB/SNIP/vio.asm (limited to 'reference/C/CONTRIB/SNIP/vio.asm') diff --git a/reference/C/CONTRIB/SNIP/vio.asm b/reference/C/CONTRIB/SNIP/vio.asm new file mode 100755 index 0000000..58ae831 --- /dev/null +++ b/reference/C/CONTRIB/SNIP/vio.asm @@ -0,0 +1,896 @@ +; +; screen handling primitives +; +; by: jim nutt +; + +.model large + +.data + +vseg dw 0b000h +vmode db ? +x dw 0 +y dw 0 +color db 07h +ofs dw 0 +xhite db 8 + +; video information block + +VIOinfo struc + level db ? + db ? + dw ? + flags dw ? + mode db ? + db ? + colors dw ? + pixcol dw ? + pixrow dw ? + txtcol dw ? + txtrow dw ? +VIOinfo ends + +info VIOinfo <0,0,14,1,0,0,2,0,0,80,25> + +.code + +public _VIOopen, _VIOclose, _VIOcolumns, _VIOrows, _VIOmode +public _VIOscrollright, _VIOscrollleft, _VIOscrollup, _VIOscrolldown +public _VIOclear, _VIOputc, _VIOputs, _VIOgetca, _VIOgetra, _VIOheight, +public _VIOsetfore, _VIOsetback, _VIOgetfore, _VIOgetback +public _VIOgotoxy, _VIOupdate, _VIOwherex, _VIOwherey, _VIOputr +public _VIOcursor, _VIOsegment, _VIOsetSegment, _VIOsetRows, _VIOsetCols + +;int _far _pascal VIOheight(void) + +_VIOheight proc + + mov al, xhite; + xor ah,ah; + ret + +_VIOheight endp + +;int _far _pascal VIOopen(void); + +_VIOopen proc + + push ds + + mov ax,3000h ; get dos version, v4 can do this from dos + int 21h + + cmp al,4 + je odos4 + + mov ax,0f00h ; get screen mode and width + int 10h + + mov vmode, al + + cmp al,7 + je mono + + xor al,al + xchg al,ah + mov info.txtcol,ax + mov vseg,0b800h + + push di + mov ax,0fe00h + mov es,vseg + mov di,0 + int 10h + pop di + mov vseg,es + + push bp ; how many rows + mov ax,1130h + mov bh,1h + xor dx,dx + int 10h + pop bp + + cmp dl,0 + je cga + + mov xhite,cl + inc dl + xor dh,dh + mov info.txtrow,dx + +mono: mov ax,0 + pop ds + ret + +odos4: mov ax,440ch + mov bx,0 + mov cx,037fh + mov dx,offset info + int 21h + jnc l1 + pop ds + ret + +cga: mov info.txtrow,25 + +l1: mov ax,0 + pop ds + ret + +_VIOopen endp + +;void _far _pascal VIOclose(void); + +_VIOclose proc + + mov ax,3000h + int 21h + + cmp al,4 + jne l2 + + mov ax,440ch + mov bx,0 + mov cx,035fh + mov dx,offset info + int 21h + +l2: ret + +_VIOclose endp + +;int _far VIOcolumns(void); + +_VIOcolumns proc + + mov ax,info.txtcol + ret + +_VIOcolumns endp + +;int _far VIOrows(void); + +_VIOrows proc + + mov ax,info.txtrow + ret + +_VIOrows endp + +;int _far VIOmode(void); + +_VIOmode proc + + mov al,vmode + xor ah,ah + ret + +_VIOmode endp + +;int _far VIOwherex(void); + +_VIOwherex proc + + mov ax,x + ret + +_VIOwherex endp + +;int _far VIOwherey(void); + +_VIOwherey proc + + mov ax,y + ret + +_VIOwherey endp + +;void _far VIOscrollright(int x1, int y1, int x2, int y2, int count); + +_VIOscrollright proc + + push bp + mov bp,sp + pushf + + std + + push di + push si + + mov ax,[bp+8] + mov bx,[bp+12] + sub bx,ax + mov cx,info.txtcol + mul cl + mov dx,[bp+10] + add dx,ax + shl dx,1 + mov cx,[bp+10] + sub cx,[bp+6] + + add bx,2 + mov [bp+6],cx + mov [bp+8],bx + + mov es,vseg + +sr1: dec word ptr [bp+8] + jz sr3 + mov bx,[bp+14] + + push ds + mov ah,color + mov al,20h + + push es + pop ds + +sr2: mov di,dx + mov si,di + dec si + dec si + mov cx,[bp+6] + rep movsw + stosw + dec bx + jnz sr2 + + pop ds + mov ax,info.txtcol + shl ax,1 + add dx,ax + jmp sr1 + +sr3: pop si + pop di + + popf + pop bp + ret + +_VIOscrollright endp + +;void _far VIOscrollleft(int x1, int y1, int x2, int y2, int count); + +_VIOscrollleft proc + + push bp + mov bp,sp + pushf + + push di + push si + + mov ax,[bp+8] + mov bx,[bp+12] + sub bx,ax + mov cx,info.txtcol + mul cl + mov dx,[bp+6] + add dx,ax + shl dx,1 + mov cx,[bp+10] + sub cx,[bp+6] + + add bx,2 + mov [bp+6],cx + mov [bp+8],bx + + mov es,vseg + +sl1: dec word ptr [bp+8] + jz sl3 + mov bx,[bp+14] + + push ds + mov ah,color + mov al,20h + + push es + pop ds + +sl2: mov di,dx + mov si,di + inc si + inc si + mov cx,[bp+6] + rep movsw + stosw + dec bx + jnz sl2 + + pop ds + mov ax,info.txtcol + shl ax,1 + add dx,ax + jmp sl1 + +sl3: pop si + pop di + + popf + pop bp + ret + +_VIOscrollleft endp + +;void _far VIOscrollup(int x1, int y1, int x2, int y2, int count); + +_VIOscrollup proc + + push bp + mov bp,sp + push di + push si + + mov es,vseg + + mov bx,[bp+6] + mov ax,[bp+8] + mov dx,info.txtcol + mul dl + add ax,bx + shl ax,1 + shl dx,1 + + push ax + push ds + push ax + + mov cx,[bp+10] + sub cx,bx + mov bx,cx + + mov ax,[bp+12] + sub ax,[bp+8] + mov [bp+12],ax + + push es + pop ds + inc word ptr [bp+14] + +l9: dec word ptr [bp+14] + jz l11 + mov ax,[bp+12] + +l10: pop di + mov si,di + add si,dx + push si + mov cx,bx + rep movsw + dec ax + jne l10 + + pop di + pop ds + mov al,20h + mov ah,color + mov cx,bx + rep stosw + + pop di + push di + push ds + push di + + push es + pop ds + jmp l9 + +l11: pop ax + pop ds + pop ax + pop si + pop di + + pop bp + ret + +_VIOscrollup endp + +;void _far VIOscrolldown(int x1, int y1, int x2, int y2, int count); + +_VIOscrolldown proc + + push bp + mov bp,sp + push di + push si + + mov es,vseg + + mov bx,[bp+6] + mov ax,[bp+12] + mov dx,info.txtcol + mul dl + add ax,bx + shl ax,1 + shl dx,1 + + push ax + push ds + push ax + + mov cx,[bp+10] + sub cx,bx + mov bx,cx + + mov ax,[bp+12] + sub ax,[bp+8] + mov [bp+12],ax + + push es + pop ds + inc word ptr [bp+14] + +l6: dec word ptr [bp+14] + jz l7 + mov ax,[bp+12] + +l8: pop di + mov si,di + sub si,dx + push si + mov cx,bx + rep movsw + dec ax + jne l8 + + pop di + pop ds + mov al,20h + mov ah,color + mov cx,bx + rep stosw + + pop di + push di + push ds + push di + + push es + pop ds + jmp l6 + +l7: pop ax + pop ds + pop ax + pop si + pop di + pop bp + ret + +_VIOscrolldown endp + +;void _far VIOclear(int x1, int y1, int x2, int y2); + +_VIOclear proc + + push bp + mov bp,sp + push di + push si + + mov es,vseg + + mov ax,[bp+8] + mov bx,[bp+6] + mov cx,info.txtcol + mul cl + add ax,bx + shl ax,1 + mov si,ax + mov bx,[bp+10] + sub bx,[bp+6] + inc bx + mov dx,[bp+12] + sub dx,[bp+8] + inc dx + mov al,20h + mov ah,color + +l5: mov di,si + mov cx,bx + rep stosw + mov cx,info.txtcol + shl cx,1 + add si,cx + dec dx + jne l5 + + pop si + pop di + pop bp + ret + +_VIOclear endp + +;void _far VIOputc(const char c); + +_VIOputc proc + + push bp + mov bp,sp + push di + + mov es,vseg + mov di,ofs + + mov ax,[bp+6] + mov ah,color + + stosw + + mov ofs,di + pop di + + mov ax,x + inc ax + cmp ax,info.txtcol + jge cwrap + + mov x,ax + + pop bp + ret + +cwrap: inc y + sub ax,info.txtcol + mov x,ax + + pop bp + ret + +_VIOputc endp + +;void _far VIOputs(const char far * s); + +_VIOputs proc + + push bp + mov bp,sp + push di + push si + push ds + + mov es,vseg + mov di,ofs + + mov ah,color + lds si,[bp+6] + mov bx,x + +l3: lodsb + cmp al,0 + je l4 + stosw + inc bx + + jmp l3 + +l4: mov ofs,di + pop ds + pop si + pop di + + cmp bx,info.txtcol + jge swrap + + mov x,bx + + pop bp + ret + +swrap: inc y + sub bx,info.txtcol + mov x,bx + + pop bp + ret + +_VIOputs endp + +;int _far VIOgetca(const int x, const int y); + +_VIOgetca proc + + push bp + mov bp,sp + + mov es,vseg + mov ax,[bp+8] + mov bx,[bp+6] + mov cx,info.txtcol + mul cl + add ax,bx + shl ax,1 + + xchg ax,bx + mov ax,es:[bx] + + pop bp + ret + +_VIOgetca endp + +;int *_far VIOgetra(int x1, int y1, int x2, int y2, int * b); + +_VIOgetra proc + + push bp + mov bp,sp + push di + push si + push ds + + mov ax,[bp+8] ; y1 + mov bx,info.txtcol + mul bl ; y1 * width of screen + add ax,[bp+6] + shl ax,1 ; x1 * 2 + shl bx,1 ; width * 2 + mov cx,[bp+10] + sub cx,[bp+6] ; x2 - x1 + mov dx,[bp+12] + sub dx,[bp+8] ; y2 - y1 + inc dx + inc cx + les di,[bp+14] + mov ds,vseg + push cx + +gr1: pop cx + push cx + mov si,ax + rep movsw + add ax,bx + dec dx + jnz gr1 + + pop cx + + pop ds + pop si + pop di + pop bp + ret + +_VIOgetra endp + +;void _far VIOputr(int x, int y, int w, int h, int far * b); + +_VIOputr proc + + push bp + mov bp,sp + + push ds + push si + push di + + mov ax,[bp+8] + mov bx,info.txtcol + mul bl ; y * width + add ax,[bp+6] + shl ax,1 + shl bx,1 + + mov es,vseg + + lds si,[bp+14] + mov dx,[bp+10] + +pr1: mov cx,dx + mov di,ax + rep movsw + add ax,bx + dec word ptr [bp+12] + jnz pr1 + + pop di + pop si + pop ds + + pop bp + ret + +_VIOputr endp + +;void _far VIOsetfore(const int c); + +_VIOsetfore proc + + push bp + mov bp,sp + + mov bl,color + and bx,00f0h + mov ax,[bp+6] + and ax,000fh + or ax,bx + mov color,al + + pop bp + ret + +_VIOsetfore endp + +;void _far VIOsetback(const int c); + +_VIOsetback proc + + push bp + mov bp,sp + + mov bl,color + and bx,000fh + mov ax,[bp+6] + and ax,000fh + shl ax,1 + shl ax,1 + shl ax,1 + shl ax,1 + or ax,bx + mov color,al + + pop bp + ret + +_VIOsetback endp + +;int _far VIOgetfore(void); + +_VIOgetfore proc + + mov al,color + and ax,000fh + ret + +_VIOgetfore endp + +;int _far VIOgetback(void); + +_VIOgetback proc + + mov al,color + and ax,00f0h + shr al,1 + shr al,1 + shr al,1 + shr al,1 + ret + +_VIOgetback endp + +;void _far VIOgotoxy(int x, int y); + +_VIOgotoxy proc + + push bp + mov bp,sp + + mov bx,[bp + 6] + mov ax,[bp + 8] + + mov x,bx + mov y,ax + + mov cx,info.txtcol + mul cl + + add ax,bx + shl ax,1 + + mov ofs,ax + + pop bp + ret + +_VIOgotoxy endp + +;void _far VIOupdate(int x1, int y1, int x2, int y2); + +_VIOupdate proc + + mov ah,2 + mov bh,0 + mov cx,y + mov dx,x + mov dh,cl + int 10h + + ret + +_VIOupdate endp + +;void _far VIOcursor(int _far * x, int _far * y, int _far * shape); + +_VIOcursor proc + + push bp + mov bp,sp + push ds + + mov ah,3 + mov bh,0 + int 10h + + mov al,dl + cbw + lds bx,[bp + 6] + mov [bx],ax + + mov al,dh + cbw + lds bx,[bp + 10] + mov [bx],ax + + lds bx,[bp + 14] + mov [bx],cx + + pop ds + pop bp + ret + +_VIOcursor endp + +;unsigned int _far VIOsegment(void); + +_VIOsegment proc + + mov ax, vseg + ret + +_VIOsegment endp + +;void _far VIOsetSegment(unsigned int s); + +_VIOsetSegment proc + + push bp + mov bp,sp + + mov ax, [bp + 6] + mov vseg,ax + + pop bp + ret + +_VIOsetSegment endp + +;void _far VIOsetRows(int r); + +_VIOsetRows proc + + push bp + mov bp,sp + + mov ax,[bp + 6] + mov info.txtrow,ax + + pop bp + ret + +_VIOsetRows endp + +;void _far VIOsetCols(int c); + +_VIOsetCols proc + + push bp + mov bp,sp + + mov ax,[bp + 6] + mov info.txtcol, ax + + pop bp + ret + +_VIOsetCols endp + +end -- cgit v1.2.3-54-g00ecf