;/* DESKOS30.A86 4/18/84 - 04/08/85 Lee Jay Lorenzen */ ; from DESKOSIF 4/22/86 MDF ;/* ;* Copyright 1999, Caldera Thin Clients, Inc. ;* This software is licenced under the GNU Public License. ;* Please see LICENSE.TXT for further information. ;* ;*/ ; KEYENTRY equ 016h VIDENTRY equ 010h DOSENTRY equ 021h ; ; cseg PUBLIC cxc33, cxm33, cxd33 PUBLIC __DOS, __EXEC, chrout, chrin PUBLIC takedos, givedos PUBLIC takekey, givekey PUBLIC takevid, givevid EXTRN dr_code:near ; ; dseg PUBLIC drawaddr EXTRN DOS_AX:WORD, DOS_BX:WORD, DOS_CX:WORD, DOS_DX:WORD EXTRN DOS_DS:WORD, DOS_ES:WORD, DOS_SI:WORD, DOS_DI:WORD EXTRN DOS_ERR:WORD EXTRN pr_itbl:WORD ; ; cseg ; ; dossav dw 0 dw 0 keysav dw 0 dw 0 vidsav dw 0 dw 0 savax dw 0 savds dw 0 savss dw 0 savsp dw 0 f10cnt dw 0 keycnt dw 0 keytab dw 01c0dh ; carriage return dw 0314eh ; N dw 01c0dh ; carriage return ; dw 02e03h ;ctrl-c dw 0 ;end of list is null dw 0 ;end of list is null dw 0 ;end of list is null dw 0 ;end of list is null dw 0 ;end of list is null ; ; __EXEC: ret ; ; for all dos calls except exec ; ; __DOS: push bp mov bp,sp push es push si push di mov ax,DOS_DI mov di,ax mov ax,DOS_SI mov si,ax mov ax,DOS_ES mov es,ax mov ax,DOS_AX mov bx,DOS_BX mov cx,DOS_CX mov dx,DOS_DX mov savax,ax push ds mov ax,DOS_DS mov ds,ax mov ax,savax int 21h mov savax,ax mov ax,ds mov savds,ax pop ds mov ax,savax jc d_error mov DOS_ERR,0 jmps d_exit d_error: mov DOS_ERR,1 d_exit: mov DOS_AX,ax mov DOS_BX,bx mov DOS_CX,cx mov DOS_DX,dx mov ax,savds mov DOS_DS,ax mov ax,es mov DOS_ES,ax mov ax,si mov DOS_SI,ax mov ax,di mov DOS_DI,ax pop di pop si pop es pop bp ret ; ; ; chrout: push bp mov bp,sp mov dx,4[bp] mov ax,0200h int 21h pop bp ret ; ; chrin: push bp mov bp,sp chr2: mov ax,0600h mov dl,0FFH int 21h jz chr2 xor ah,ah pop bp ret ; ; ; cxc33: push bx push dx cmp ax,cx jnz cxc1 shr bx,1 shr dx,1 cmp bx,dx jnz cxc1 pop dx pop bx cmp bx,dx jmps cxc2 cxc1: pop dx pop bx cxc2: ret ; ; cxd33: xchg ax,bx mov cx,dx jcxz div0 cmp cx,1 jne not_div1 xchg ax,bx xor cx,cx mov dx,cx ret not_div1: xor dx,dx xchg ax,bx push ax div cx mov di,ax mul cx pop dx sub dx,ax mov ax,bx div cx sub cx,cx mov bx,ax mov ax,di ret div0: mov ax,-1 mov bx,ax ret ; ; cxm33: push dx mul dx pop dx push ax mov ax,bx push dx mul cx mov cx,ax mov ax,bx pop dx mul dx add dx,cx pop cx add dx,cx mov bx,ax mov ax,dx ret ; ; ; inttake: push ds mov cl, 2 shl ax, cl mov bx, pr_itbl ; offset mov cx, pr_itbl + 2 ; segment add ax, bx mov bx, ax mov ds, cx mov cx, 02[bx] mov ax, [bx] mov cs:word ptr 2[bp],cx ; saving current values mov cs:word ptr 0[bp],ax mov [bx],dx ; set new offset mov ax,cs mov 02[bx],ax pop ds ret ; ; ; intgive: push ds mov cl, 2 shl ax, cl mov bx, pr_itbl ; offset mov cx, pr_itbl + 2 ; segment add ax, bx mov bx, ax mov ds, cx mov dx,cs:word ptr 0[bp] ; set up old offset mov ax,cs:word ptr 2[bp] ; and segbase mov [bx],dx ; restore old offset mov 02[bx],ax ; restore old segment pop ds ret ; ; ; ; ; ; keycod: cmp ah,00h ; if keyboard input jz dinkey cmp ah,01h ; if con out jz dinkey jmpf dword ptr keysav ; let other guy do iret ; ; vidcod: iret ; ; ; clrky: mov ah,al cmp ah,0 jg chkhi iret chkhi: cmp ah,0ah jle doscod iret ; ; doscod: cmp ah,01h ; if keyboard input jz dinkey cmp ah,02h ; if con out jz doutstr cmp ah,06h ; if direct i/o jz ddirio cmp ah,07h ; if no echo jz ddirio cmp ah,08h ; if keyboard input jz dofunc8 cmp ah,09h ; if console output jz doutstr cmp ah,0ah ; if buffered input jz dofunc10 cmp ah,0bh ; if console status jz csout cmp ah,0ch ; if clear keyboard jz clrky jmpf dword ptr dossav ; let other guy do iret ; ; ; ddirio: cmp dl,0ffh jnz doutstr ; ignore output dinkey: push bx mov ax, keycnt mov bx, offset keytab add bx, ax inc ax inc ax mov keycnt, ax mov ax, cs:[bx] pop bx cmp ax, 0 jnz doutstr mov keycnt, ax jmp dinkey doutstr: sti retf 2 ; ; dofunc8: inc f10cnt cmp f10cnt,3 jl dof8 mov ax,4c00h ; terminate the guy jmpf dword ptr dossav dof8: jmp dinkey ; ; dofunc10: inc f10cnt cmp f10cnt,3 jl dof10 mov ax,4c00h ; terminate the guy jmpf dword ptr dossav dof10: push bx mov bx,dx inc bx ; skip buffer size mov ds: byte ptr[bx],1 ; say one char was read inc bx mov ds: byte ptr[bx],04eh ; stuff the one char inc bx mov ds: byte ptr[bx],00dh ; add on carriage return pop bx jmp doutstr ; ; csout: mov al,0ffh iret ; ; ; ; takekey: mov keycnt,0 mov f10cnt,0 cli push bp mov ax,KEYENTRY mov bp,offset keysav mov dx,cs:offset keycod call inttake pop bp sti ret ; ; ; givekey: cli push bp mov ax,KEYENTRY mov bp,offset keysav call intgive pop bp sti mov ax,f10cnt ret ; ; takevid: cli push bp mov ax,VIDENTRY mov bp,offset vidsav mov dx,cs:offset vidcod call inttake pop bp sti ret ; ; ; givevid: cli push bp mov ax,VIDENTRY mov bp,offset vidsav call intgive pop bp sti ret ; ; ; takedos: cli push bp mov ax,DOSENTRY mov bp,offset dossav mov dx,cs:offset doscod call inttake pop bp sti ret ; ; ; givedos: cli push bp mov ax,DOSENTRY mov bp,offset dossav call intgive pop bp sti ret ; ; ; far_draw() ; ax = hi part of long pointer to PARMBLK ; bx = lo part of long pointer to PARMBLK ; ; need to save the regs, get on a local stack, and call ; the dr_code() routine with the parameters pointed at ; in PARMBLK ; ; far_draw: push bp mov bp,sp push ds push es push si push di mov cx,ax ; remember hi ptr to parm blk mov ax,ss mov drawss,ax mov ax,sp mov drawsp,ax cli mov ax,seg drawstk mov ss,ax mov ds,ax mov es,ax mov sp,offset drawstk sti push cx ; push hi ptr to parmblk push bx ; push lo ptr to parmblk call dr_code ; state = dr_code((LONG)pparmblk) add sp,4 mov bx,ax ; remember state cli mov ax,drawss mov ss,ax mov ax,drawsp mov sp,ax sti pop di pop si pop es pop ds mov ax,bx ; restore state pop bp retf ; ; dseg drawaddr dw offset far_draw drawseg dw seg far_draw rw 256 drawstk dw 0 ; ; cseg drawsp dw 0 drawss dw 0 ; ; end