home *** CD-ROM | disk | FTP | other *** search
- .MODEL LARGE
- .DATA
-
- PUBLIC _ScreenWidth
- PUBLIC _ScreenHeight
- PUBLIC _MouseInstalled
-
- _ScreenArea EQU DWord Ptr _ScreenOffset
- _ScreenOffset DW ? ; 0000h
- _ScreenSegment DW ? ; B800h
- _ScreenWidth DB ? ; 80
- _ScreenHeight DB ? ; 25
- _ScreenLength DW ? ; 80*25
- _MouseInstalled DW ? ; 0 or 1
- _LastKeyShifts DW ? ;
- _LastMousePosX DW ? ;
- _LastMousePosY DW ? ;
- _LastMouseBtns DW ? ;
- OriginalTimer1 DW ? ;
- OriginalTimer2 DW ? ;
-
- .CODE
- LOCALS
-
- PUBLIC _conio_init
- PUBLIC _conio_exit
- PUBLIC _show_mouse
- PUBLIC _hide_mouse
- PUBLIC _move_mouse
- PUBLIC _cursor_size
- PUBLIC _move_cursor
- PUBLIC _get_event
- PUBLIC _write_char
- PUBLIC _write_string
- PUBLIC _load_window
- PUBLIC _save_window
- PUBLIC _clear_window
- PUBLIC _scroll_window
- PUBLIC _border_window
-
-
- Show_Mouse MACRO
- cmp _MouseInstalled, 1
- jne @@nomouse1
- mov ax, 0001h
- int 33h
- @@nomouse1:
- ENDM
-
-
- Hide_Mouse MACRO
- cmp _MouseInstalled, 1
- jne @@nomouse2
- mov ax, 0002h
- int 33h
- @@nomouse2:
- ENDM
-
-
- ;----------------------------------------------------------------
-
-
- _conio_init PROC
- push bp
- mov bp, sp
- push es
- push si
- push di
-
- mov ah,0Fh ; Check current video mode
- int 10h
-
- cmp al,07h
- je @@Mono
- cmp al,03h
- je @@Color
- @@Reset:
- mov ax,03 ; If unknown set Color 80x25
- int 10h
- @@Color:
- mov _ScreenSegment, 0B800h
- jmp @@skip1
- @@Mono:
- mov _ScreenSegment, 0B000h
- @@skip1:
- push ds
- mov ax, 0
- mov ds, ax
- mov bx, 484h
- mov al, [bx]
- pop ds
- inc al
- mov _ScreenHeight, al
- mov ah,0Fh
- int 10h
- mov _ScreenWidth, ah
- mov al, _ScreenHeight
- mov ah, _ScreenWidth
- mul ah
- mov _ScreenLength, ax
- mov _ScreenOffset, 0h
-
- mov ax,0000h ; Check for a mouse
- int 33h
- cmp ax, 0h
- je @@No_Mouse
- cmp ax, 3h
- je @@_Mouse
- cmp ax, 2h
- je @@_Mouse
- cmp ax, 0FFFFh
- mov ax, 2h
- je @@_Mouse
- mov ax, 1h
- @@_Mouse:
- mov _MouseInstalled, 1
- mov ax, 0003h ; Reset mouse
- int 33h
- mov _LastMousePosX, cx
- mov _LastMousePosY, dx
- mov _LastMouseBtns, bx
- jmp @@skip2
- @@No_Mouse:
- mov _MouseInstalled, 0
- @@skip2:
- mov ah, 12h ; Get keyboard status
- int 16h
- mov _LastKeyShifts, ax
-
- pop di
- pop si
- pop es
- pop bp
- retf
- _conio_init ENDP
-
-
- _conio_exit PROC
- retf
- _conio_exit ENDP
-
-
- ;----------------------------------------------------------------
-
-
- _show_mouse PROC
- Show_Mouse
- retf
- _show_mouse ENDP
-
-
-
- _hide_mouse PROC
- Hide_Mouse
- retf
- _hide_mouse ENDP
-
-
-
- _move_mouse PROC
-
- Y EQU [bp+08h]
- X EQU [bp+06h]
-
- push bp
- mov bp, sp
- mov ax, 0004h
- mov cx, X
- mov dx, Y
-
- dec cx
- shl cx, 1
- shl cx, 1
- shl cx, 1
-
- dec dx
- shl dx, 1
- shl dx, 1
- shl dx, 1
-
- int 33h
- pop bp
- retf
- _move_mouse ENDP
-
-
- ;----------------------------------------------------------------
-
-
- _move_cursor PROC
-
- Y EQU [bp+08h]
- X EQU [bp+06h]
-
- push bp
- mov bp, sp
- mov ah, 02
- mov bh, 00
- mov dl, X
- mov dh, Y
- sub dx, 0101h
- int 10h
- pop bp
- retf
- _move_cursor ENDP
-
-
- _cursor_size PROC
-
- Bottom EQU [bp+08h]
- Top EQU [bp+06h]
-
- push bp
- mov bp, sp
- mov ah, 01
- mov cl, Top
- mov ch, Bottom
- and cx, 1F1Fh
- int 10h
- pop bp
- retf
-
- _cursor_size ENDP
-
-
- ;----------------------------------------------------------------
-
-
- _write_char PROC
-
- C EQU [bp+0Ch]
- Y EQU [bp+0Ah]
- X EQU [bp+08h]
- Attribute EQU [bp+06h]
-
- Hide_Mouse
-
- push bp
- mov bp, sp
- push ds
- push di
- push si
- sub ax, ax
- mov bx, ax
- mov cx, bx
- mov dx, cx
-
- mov dl, _ScreenWidth
- mov al, Y
- mov bl, X
- dec al
- dec bl
- mul dl
- add ax, bx
- shl ax, 1
- les di, _ScreenArea
- add di, ax
-
- mov al, C
- mov ah, Attribute
- stosw
-
- pop si
- pop di
- pop ds
- pop bp
-
- Show_Mouse
- retf
- _write_char ENDP
-
-
-
- _write_string PROC
-
- S EQU [bp+0Ch]
- Y EQU [bp+0Ah]
- X EQU [bp+08h]
- Attribute EQU [bp+06h]
-
- Hide_Mouse
-
- push bp
- mov bp, sp
- push ds
- push di
- push si
- sub ax, ax
- mov bx, ax
- mov cx, bx
- mov dx, cx
-
- mov dl, _ScreenWidth
- mov al, Y
- mov bl, X
- dec al
- dec bl
- mul dl
- add ax, bx
- shl ax, 1
- les di, _ScreenArea
- lds si, S
- add di, ax
-
- mov ah, Attribute
- jmp @@first
- @@next:
- stosw
- @@first:
- lodsb
- cmp al, 0
- jne @@next
-
- pop si
- pop di
- pop ds
- pop bp
-
- Show_Mouse
- retf
- _write_string ENDP
-
-
- ;----------------------------------------------------------------
-
-
- _save_window PROC
-
- Destination EQU [bp+0Eh]
- H EQU [bp+0Ch]
- W EQU [bp+0Ah]
- Y EQU [bp+08h]
- X EQU [bp+06h]
-
- Hide_Mouse
-
- push bp
- mov bp, sp
- push ds
- push di
- push si
- sub ax, ax
- mov bx, ax
- mov cx, bx
- mov dx, cx
-
- mov dl, _ScreenWidth
- mov al, Y
- mov bl, X
- dec al
- dec bl
- mul dl
- add ax, bx
- shl ax, 1
- les di, Destination
- lds si, _ScreenArea
- add si, ax
- mov bl, W
- mov bh, H
- sub dl, bl
- shl dx, 1
- @@next_row:
- mov cl, bl
- rep
- movsw
- add si, dx
- dec bh
- jne @@next_row
-
- pop si
- pop di
- pop ds
- pop bp
-
- Show_Mouse
- retf
- _save_window ENDP
-
-
-
- _load_window PROC
-
- Source EQU [bp+0Eh]
- H EQU [bp+0Ch]
- W EQU [bp+0Ah]
- Y EQU [bp+08h]
- X EQU [bp+06h]
-
- Hide_Mouse
-
- push bp
- mov bp, sp
- push ds
- push di
- push si
- sub ax, ax
- mov bx, ax
- mov cx, bx
- mov dx, cx
-
- mov dl, _ScreenWidth
- mov al, Y
- mov bl, X
- dec al
- dec bl
- mul dl
- add ax, bx
- shl ax, 1
- les di, _ScreenArea
- lds si, Source
- add di, ax
-
- mov bl, W
- mov bh, H
- sub dl, bl
- shl dx, 1
-
- @@next_row:
- mov cl, bl
- rep
- movsw
- add di, dx
- dec bh
- jne @@next_row
-
- pop si
- pop di
- pop ds
- pop bp
-
- Show_Mouse
- retf
- _load_window ENDP
-
-
- ;----------------------------------------------------------------
-
-
- _clear_window PROC
-
- H EQU [bp+0Eh]
- W EQU [bp+0Ch]
- Y EQU [bp+0Ah]
- X EQU [bp+08h]
- Attribute EQU [bp+06h]
-
- Hide_Mouse
-
- push bp
- mov bp, sp
- push ds
- push di
- push si
- sub ax, ax
- mov bx, ax
- mov cx, bx
- mov dx, cx
-
- mov dl, _ScreenWidth
- mov al, Y
- mov bl, X
- dec al
- dec bl
- mul dl
- add ax, bx
- shl ax, 1
- les di, _ScreenArea
- add di, ax
-
- mov bl, W
- mov bh, H
- sub dl, bl
- shl dx, 1
-
- mov ah, Attribute
- mov al, ' '
-
- @@next_row:
- mov cl, bl
- rep
- stosw
- add di, dx
- dec bh
- jne @@next_row
-
- pop si
- pop di
- pop ds
- pop bp
-
- Show_Mouse
- retf
- _clear_window ENDP
-
-
-
- _scroll_window PROC
-
- Len EQU [bp+10h]
- H EQU [bp+0Eh]
- W EQU [bp+0Ch]
- Y EQU [bp+0Ah]
- X EQU [bp+08h]
- Attribute EQU [bp+06h]
-
- Hide_Mouse
-
- push bp
- mov bp, sp
- push ds
- push di
- push si
- sub ax, ax
- mov bx, ax
- mov cx, bx
- mov dx, cx
-
- mov dl, _ScreenWidth
- les di, _ScreenArea
- lds si, _ScreenArea
- mov cl, dl
- sub dl, W
- shl dx, 1
-
- mov al, Len
- imul cl
- shl ax, 1
- add si, ax
- or ax, ax
-
- mov al, Y
- mov ah, X
- mov bl, H
- mov bh, W
- jns @@n12
-
- std
- neg Byte Ptr Len
- neg dx
- add ax, bx
- sub ax, 0101h
- @@n12:
- sub ax, 0101h
- xchg ah, cl
- mul ah
- add ax, cx
- shl ax, 1
- add si, ax
- add di, ax
- sub bl, Len
-
- @@next_row:
- mov cl, bh
- rep
- movsw
- add di, dx
- add si, dx
- dec bl
- jne @@next_row
-
- mov bl, Len
- mov ah, Attribute
- mov al, ' '
-
- @@clr_row:
- mov cl, bh
- rep
- stosw
- add di, dx
- dec bl
- jne @@clr_row
-
- cld
-
- pop si
- pop di
- pop ds
- pop bp
-
- Show_Mouse
- retf
- _scroll_window ENDP
-
-
-
- _border_window PROC
-
- Border EQU [bp+10h]
- H EQU [bp+0Eh]
- W EQU [bp+0Ch]
- Y EQU [bp+0Ah]
- X EQU [bp+08h]
- Attribute EQU [bp+06h]
-
- Hide_Mouse
-
- push bp
- mov bp, sp
- push ds
- push di
- push si
- sub ax, ax
- mov bx, ax
- mov cx, bx
- mov dx, cx
-
- mov dl, _ScreenWidth
- mov al, Y
- mov bl, X
- dec al
- dec bl
- mul dl
- add ax, bx
- shl ax, 1
- les di, _ScreenArea
- lds si, Border
- add di, ax
-
- mov bl, W
- mov bh, H
- sub dl, bl
- shl dx, 1
- sub bx, 0202h
-
- mov ah, Attribute
-
- lodsb ; Upper row
- stosw
- mov cl, bl
- lodsb
- rep
- stosw
- lodsb
- stosw
- add di, dx
- cmp bh, 00
- je @@NoMiddleRows
-
- @@next_row:
- lodsb ; All rows in the middle
- stosw
- mov cl, bl
- lodsb
- cmp al, 00
- je @@NoFill
- rep
- stosw
- jmp @@FillDone
- @@NoFill:
- add di, cx
- add di, cx
- @@FillDone:
- lodsb
- stosw
- add di, dx
- sub si, 03
- dec bh
- jne @@next_row
-
- @@NoMiddleRows:
- add si, 03 ; Bottom row
- lodsb
- stosw
- mov cl, bl
- lodsb
- rep
- stosw
- lodsb
- stosw
-
- pop si
- pop di
- pop ds
- pop bp
-
- Show_Mouse
- retf
- _border_window ENDP
-
-
- ;----------------------------------------------------------------
-
-
- _get_event PROC
-
- flags EQU Word Ptr [bp+0Ah]
- event EQU [bp+06h]
-
- ev_type EQU Word Ptr es:[si]
-
- key EQU Word Ptr es:[si+2]
- scan EQU Word Ptr es:[si+4]
- shift EQU Word Ptr es:[si+6]
- shiftX EQU Word Ptr es:[si+8]
-
- x EQU Word Ptr es:[si+10]
- y EQU Word Ptr es:[si+12]
- left EQU Word Ptr es:[si+14]
- right EQU Word Ptr es:[si+16]
- middle EQU Word Ptr es:[si+18]
-
- timer1 EQU Word Ptr es:[si+20]
- timer2 EQU Word Ptr es:[si+22]
-
- EV_KEY EQU 1
- EV_SHIFT EQU 2
- EV_MOUSE EQU 4
- EV_TIMER EQU 8
- EV_NONBLOCK EQU 16
-
- push bp
- mov bp, sp
- push ds
- push es
- push si
- push di
- les si, event
- sub ax, ax
- mov ev_type, ax
-
- test flags, EV_TIMER
- jz @@main_loop
- mov ah, 0h
- int 1Ah
- mov OriginalTimer1, dx
- mov OriginalTimer2, cx
-
- @@main_loop:
- test flags, EV_KEY
- jz @@test_shifts
-
- mov ah, 11h ; Check for a key
- int 16h
- jz @@test_shifts
-
- or ev_type, EV_KEY ; Key was pressed
- mov ah, 10h
- int 16h
- mov scan, ax
- cmp al, 0E0h ; Is it an extended key
- jne @@normal_key
- cmp ah, 0
- je @@normal_key
- mov al, 0
- @@normal_key:
- mov ah, 0
- mov key, ax
- jmp @@break_out
-
- @@test_shifts:
- test flags, EV_SHIFT
- jz @@test_mouse
-
- mov ah, 12h ; Check if shifts changed
- int 16h
- cmp ax, _LastKeyShifts
- jz @@test_mouse
-
- or ev_type, EV_SHIFT
- mov bx, _LastKeyShifts
- xor bx, ax
- mov shift, ax
- mov shiftX, bx
- mov _LastKeyShifts, ax
- jmp @@break_out2
-
- @@test_mouse:
- test flags, EV_MOUSE
- jz @@test_time
- cmp _MouseInstalled, 1
- jne @@test_time
-
- mov ax, 0003h ; Check mouse status
- int 33h
- cmp bx, _LastMouseBtns
- jne @@mouse
- cmp cx, _LastMousePosX
- jne @@mouse
- cmp dx, _LastMousePosY
- je @@test_time
- @@mouse:
- or ev_type, EV_MOUSE
-
- mov _LastMouseBtns, bx
- mov _LastMousePosX, cx
- mov _LastMousePosY, dx
- jmp @@break_out
- @@test_time:
- test flags, EV_TIMER
- jz @@loop_tail
-
- mov ah, 0h ; Check timer
- int 1Ah
- sub dx, OriginalTimer1
- sbb cx, OriginalTimer2
- cmp cx, timer2
- jb @@loop_tail
- cmp dx, timer1
- jb @@loop_tail
- or ev_type, EV_TIMER
- jmp @@break_out
- @@loop_tail:
- test flags, EV_NONBLOCK
- jnz @@break_out
- jmp @@main_loop
-
- @@break_out:
- mov ah, 12h ; Updayte shift status
- int 16h
- mov shift, ax
- mov bx, _LastKeyShifts
- xor bx, ax
- mov shiftX, bx
-
- @@break_out2:
- cmp _MouseInstalled, 1
- jne @@end
-
- mov ax, 0003h ; Update mouse status
- int 33h
-
- shr cx, 1
- shr cx, 1
- shr cx, 1
- inc cx
- mov x, cx
- shr dx, 1
- shr dx, 1
- shr dx, 1
- inc dx
- mov y, dx
-
- test bx, 0001h
- jne @@left
- mov word ptr left, 0h
- jmp @@leftE
- @@left:
- mov word ptr left, 1h
- @@leftE:
- test bx, 0002h
- jne @@right
- mov word ptr right, 0h
- jmp @@rightE
- @@right:
- mov word ptr right, 1h
- @@rightE:
- test bx, 0004h
- jne @@middle
- mov word ptr middle, 0h
- jmp @@middleE
- @@middle:
- mov word ptr middle, 1h
- @@middleE:
-
- @@end:
- pop di
- pop si
- pop es
- pop ds
- pop bp
- retf
- _get_event ENDP
-
- END
-