0,0 → 1,386 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved. ;; |
;; Distributed under terms of the GNU General Public License ;; |
;; ;; |
;; FT232 SyncBB mode demonstration for KolibriOS ;; |
;; ;; |
;; Written by gtament@gmail.com ;; |
;; ;; |
;; GNU GENERAL PUBLIC LICENSE ;; |
;; Version 2, June 1991 ;; |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
format binary as "" |
use32 |
org 0x0 |
|
; The header |
|
db 'MENUET01' |
dd 0x01 |
dd INIT |
dd I_END |
dd 0x100000 |
dd 0x7fff0 |
dd 0, 0 |
|
; The code area |
|
include '../../macros.inc' |
include '../../debug.inc' |
|
struct IOCTL |
handle dd ? |
io_code dd ? |
input dd ? |
inp_size dd ? |
output dd ? |
out_size dd ? |
ends |
|
BUTTONXSIZE = 60 |
BUTTONYSIZE = 60 |
BUTTONXSTART= 20 |
BUTTONYSTART= 50 |
BUTTONXSPACE= 10 |
BUTTONCOUNT = 8 |
ONCOLOR = 0x0018c015 |
OFFCOLOR = 0x00db2521 |
|
INIT: |
mov [btn_state], 0xFF |
mov [btn_io], 0xFF |
|
mcall 68, 11 |
call draw_window |
mov edi, drv_name |
mcall 68, 16, edi |
cmp eax, 0 |
jnz @f |
debug_print 'Error while loading driver\n' |
@@: |
mov [IOCTLs+IOCTL.handle], eax |
mov eax, 8 |
mov [IOCTLs+IOCTL.inp_size], eax |
mov [IOCTLs+IOCTL.out_size], eax |
mov eax, out_buf |
mov [IOCTLs+IOCTL.output], eax |
mov eax, in_buf |
mov [IOCTLs+IOCTL.input], eax |
|
call drivercomm.getlist |
call drivercomm.getlock |
call drivercomm.bitmode |
call drivercomm.baud |
|
event_wait: |
mov eax, 10 |
mcall |
|
cmp eax, 1 ; Event redraw request ? |
je redraw |
|
cmp eax, 2 ; Event key in buffer ? |
je key |
|
cmp eax, 3 ; Event button in buffer ? |
je button |
|
jmp event_wait |
|
redraw: |
call draw_window |
jmp event_wait |
|
key: |
mcall 2 |
cmp ah, '8' |
jg event_wait |
cmp ah, '1' |
jl event_wait |
sub ah, 0x2F |
jmp button.noclose |
|
button: |
mov eax,17 |
mcall |
|
cmp ah, 1 |
jle .noclose |
call drivercomm.unlock |
mov eax, -1 |
mcall |
|
.noclose: |
cmp ah, 10 |
jge .toggleb |
movzx edx, ah |
dec ah |
dec ah |
mov cl, ah |
mov ah ,1 |
shl ah, cl |
xor byte[btn_state], ah |
push edx |
call drivercomm.write |
call drivercomm.read |
pop edx |
call redraw_obutton |
jmp event_wait |
|
.toggleb: |
cmp ah, 18 |
jg event_wait |
movzx edx, ah |
mov cl, ah |
sub cl, 10 |
mov ah, 1 |
shl ah, cl |
xor byte[btn_io], ah |
call draw_tbutton |
jmp event_wait |
|
drivercomm: ;Driver communication procs |
.baud: |
mov [IOCTLs+IOCTL.io_code], 10 |
mov edi, in_buf |
mov eax, [pid] |
mov [edi], eax |
mov eax, [dev] |
mov [edi+4], eax |
mov [edi+8], dword 9600 |
mcall 68, 17, IOCTLs |
ret |
|
.write: |
mov [IOCTLs+IOCTL.io_code], 8 |
mov edi, in_buf |
mov eax, [pid] |
mov [edi], eax |
mov eax, [dev] |
mov [edi+4], eax |
mov [edi+8], dword 1 |
mov al, [btn_state] |
mov byte[edi+12], al |
mcall 68, 17, IOCTLs |
ret |
|
.read: |
mov [IOCTLs+IOCTL.io_code], 9 |
mov edi, in_buf |
mov eax, [pid] |
mov [edi], eax |
mov eax, [dev] |
mov [edi+4], eax |
mov [edi+8], dword 1 |
mcall 68, 17, IOCTLs |
mov al, byte[out_buf] |
mov [btn_state], al |
newline |
ret |
|
.getlock: |
mcall 9, thread_inf, 0 |
mov eax, dword[thread_inf+30] |
mov [pid], eax |
mov edi, in_buf |
mov [edi], eax |
mov eax, 2 |
mov [IOCTLs+IOCTL.io_code], eax |
mov eax, [dev] |
mov [edi+4], eax |
mov eax, 8 |
mov [IOCTLs+IOCTL.inp_size], eax |
mcall 68, 17, IOCTLs |
ret |
|
.getlist: |
mov eax, 1 |
mov [IOCTLs+IOCTL.io_code], eax |
mcall 68, 17, IOCTLs |
mov edi, out_buf |
mov eax, [edi+12] |
mov [dev], eax |
ret |
|
.bitmode: |
mov [IOCTLs+IOCTL.io_code], 11 |
mov edi, in_buf |
mov eax, [pid] |
mov [edi], eax |
mov eax, [dev] |
mov [edi+4], eax |
xor eax, eax |
mov al, [btn_io] |
mov ah, 0x04 |
mov [edi+8], eax |
mcall 68, 17, IOCTLs |
ret |
|
.unlock: |
mov eax, [pid] |
mov edi, in_buf |
mov [edi], eax |
mov eax, 3 |
mov [IOCTLs+IOCTL.io_code], eax |
mov eax, [dev] |
mov [edi+4], eax |
mov eax, 8 |
mov [IOCTLs+IOCTL.inp_size], eax |
mcall 68, 17, IOCTLs |
ret |
|
; ********************************************* |
; ****** WINDOW DEFINITIONS AND DRAW ******** |
; ********************************************* |
|
draw_window: |
mov eax, 12 |
mov ebx, 1 |
mcall |
|
mov eax, 0 |
mov ebx, 100 * 65536 + (BUTTONXSIZE+BUTTONXSPACE)*BUTTONCOUNT+BUTTONXSTART*2 |
mov ecx, 100 * 65536 + 120 |
mov edx, 0x14E1E1E1 |
mov esi, 0x808899ff |
mov edi, title |
mcall |
|
mov edx, BUTTONCOUNT+1 |
.oloop: |
push edx |
call draw_obutton |
pop edx |
dec edx |
cmp edx, 1 |
jnz .oloop |
|
mov edx, BUTTONCOUNT+9 |
.tloop: |
push edx |
call draw_tbutton |
pop edx |
dec edx |
cmp edx, 9 |
jnz .tloop |
|
mov eax, 12 |
mov ebx, 2 |
mcall |
ret |
|
redraw_obutton: |
mov eax, 8 |
push edx |
or edx, 0x80 shl 24 |
mcall |
pop edx |
draw_obutton: |
mov ecx, edx |
dec ecx |
dec ecx |
xor ebx, ebx |
mov bl, [btn_state] |
mov bh, 1 |
shl bh, cl |
and bl, bh |
jz .off |
mov esi, ONCOLOR |
jmp .aftercolor |
.off: |
mov esi, OFFCOLOR |
.aftercolor: |
mov bl, [btn_io] |
and bl, bh |
jne .output |
or edx, 1 shl 29 |
.output: |
push ecx |
imul bx, cx, word(BUTTONXSPACE+BUTTONXSIZE) |
add bx, BUTTONXSTART |
imul ebx, 65536 |
add ebx, BUTTONXSIZE |
mov ecx, BUTTONYSTART*65536+BUTTONYSIZE |
mcall 8 |
pop ecx |
xor ebx, ebx |
mov bl, [btn_io] |
mov bh, 1 |
shl bh, cl |
and bl, bh |
jnz .text |
ret |
.text: |
mov bl, [btn_state] |
and bl, bh |
jz .off_text |
mov edx, on_text |
jmp .aftertext |
.off_text: |
mov edx, off_text |
.aftertext: |
imul bx, cx, word(BUTTONXSPACE+BUTTONXSIZE) |
add bx, (BUTTONXSTART + (BUTTONXSIZE/2)-5) |
shl ebx, 16 |
add ebx, BUTTONYSTART + (BUTTONYSIZE/2) |
mcall 4,,1 shl 31 |
ret |
|
draw_tbutton: |
mov ecx, edx |
sub ecx, 10 |
push edx ecx |
or edx, 1 shl 31 |
mcall 8 |
xor edi, edi |
imul di, cx, word(BUTTONXSPACE+BUTTONXSIZE) |
push edi |
shl edi, 16 |
mov ebx, (BUTTONXSTART)*65536+BUTTONYSTART-12 |
add ebx, edi |
mcall 4,, 1 shl 31, i_text |
mov ebx, (BUTTONXSTART+5)*65536+BUTTONXSIZE-5*2 |
add ebx, edi |
mcall 13,, (BUTTONYSTART-13)*65536+9, 0xFFFFFF |
mov ebx, (BUTTONXSTART+BUTTONXSIZE-4)*65536+BUTTONYSTART-12 |
add ebx, edi |
mcall 4,, 1 shl 31, o_text |
pop edi ecx edx |
mov ebx, edi |
add ebx, (BUTTONXSTART+7) |
mov al, [btn_io] |
mov ah, 1 |
shl ah, cl |
and al, ah |
jz .input |
add ebx, (BUTTONXSIZE-14)/2 |
.input: |
shl ebx, 16 |
add ebx, (BUTTONXSIZE-14)/2 |
mcall 8,,(BUTTONYSTART-12)*65536+6,, 0x00576B8C |
ret |
|
; ********************************************* |
; ************* DATA AREA ***************** |
; ********************************************* |
|
btn_state db ? |
btn_io db ? |
dev dd ? |
pid dd ? |
counter dd ? |
drv_name db 'usbother', 0 |
off_text db 'OFF', 0 |
on_text db 'ON', 0 |
i_text db 'I', 0 |
o_text db 'O', 0 |
out_buf rd 10 |
in_buf rd 10 |
IOCTLs rd 6 |
thread_inf rb 1024 |
title db "FT232 Control Center", 0 |
|
I_END: |