Difference between revisions of "83Plus:Software:usb8x/Sample Code"
(Added tasm mouse demo) |
|||
| Line 1: | Line 1: | ||
Example code using the usb8x assembly and BASIC interfaces | Example code using the usb8x assembly and BASIC interfaces | ||
== BASIC == | == BASIC == | ||
| − | === Mouse | + | === Mouse Demo === |
This example uses the [[../BASIC_Interface/MouseInit|MouseInit]], [[../BASIC_Interface/MouseDo|MouseDo]], and [[../BASIC_Interface/KillUSB|KillUSB]] entry points to control a point on the screen with the mouse cursor. | This example uses the [[../BASIC_Interface/MouseInit|MouseInit]], [[../BASIC_Interface/MouseDo|MouseDo]], and [[../BASIC_Interface/KillUSB|KillUSB]] entry points to control a point on the screen with the mouse cursor. | ||
<nowiki>OpenLib(USBDRV8X | <nowiki>OpenLib(USBDRV8X | ||
| Line 32: | Line 32: | ||
{1 ;KillUSB | {1 ;KillUSB | ||
ExecLib</nowiki> | ExecLib</nowiki> | ||
| + | |||
| + | == Assembly (TASM) == | ||
| + | Code for TASM-compatible assemblers. Use usb8xtsm.inc instead of usb8x.inc. TASM itself is apparently incompatible with usb8x macros, but Brass and SPASM work correctly. | ||
| + | === Mouse Demo === | ||
| + | This code uses [[../Asm_Interface/DriverInit|DriverInit]], [[../Asm_Interface/MouseInit|MouseInit]], [[../Asm_Interface/MouseGetKey|MouseGetKey]], [[../Asm_Interface/HostKill|HostKill]], and [[../Asm_Interface/DriverKill|DriverKill]]. It is a replica of the mouse demo code from usb8x, though it doesn't include routines unrelated to USB. In this case the address of the callback routine passed to U_CALL_INIT doesn't matter, because MouseInit redefine the callback to handle the mouse data. | ||
| + | <nowiki> U_CALL_INIT(Stub) ;Initialize U_CALL system | ||
| + | jp c,error | ||
| + | ld hl,USBDriverBuf | ||
| + | U_CALL(uDriverInit) ;Initialize Driver | ||
| + | jp c,error | ||
| + | ld hl,DBuf | ||
| + | ld bc,256 | ||
| + | bcall(_MemClear) ;Clear descriptor buffer | ||
| + | ld hl,DBuf | ||
| + | ld b,0 ;allow diagonal keys | ||
| + | U_CALL(uMouseInit) ;Initialize Mouse | ||
| + | jp c,error | ||
| + | bcall(_GrBufClr) | ||
| + | xor a | ||
| + | ld (MouseBtn),a | ||
| + | ld a,50*2 | ||
| + | ld (MouseX),a | ||
| + | ld a,32*2 | ||
| + | ld (MouseY),a | ||
| + | call DispCursor ;Display mouse cursor | ||
| + | MainLoop: | ||
| + | bcall(_GrBufCpy) | ||
| + | bcall(_GetCSC) | ||
| + | cp skClear | ||
| + | jr z,MouseDone | ||
| + | call DispCursor ;Erase cursor | ||
| + | ld b,4 ;Buffer to screen copy is kind of slow, so let's | ||
| + | gkloop: ; update the cursor a few times for each buffer copy | ||
| + | push bc | ||
| + | U_CALL(uMouseGetKey) ;Get mouse info from usb8x | ||
| + | call MouseUpdateCursor ;Update cursor position | ||
| + | pop bc | ||
| + | djnz gkloop | ||
| + | call DispCursor ;Re-display cursor | ||
| + | jr MainLoop | ||
| + | |||
| + | MouseDone: | ||
| + | U_CALL(uHostKill) ;Disconnect power from mouse | ||
| + | U_CALL(uDriverKill) ;Kill driver | ||
| + | ret | ||
| + | </nowiki> | ||
Revision as of 10:04, 16 July 2006
Example code using the usb8x assembly and BASIC interfaces
BASIC
Mouse Demo
This example uses the [[../BASIC_Interface/MouseInit|MouseInit]], [[../BASIC_Interface/MouseDo|MouseDo]], and [[../BASIC_Interface/KillUSB|KillUSB]] entry points to control a point on the screen with the mouse cursor.
OpenLib(USBDRV8X
{2 ;MouseInit
ExecLib
If Ans(1 ;If MouseInit returns error,
Return ; then quit
-968->Xmin
968->Xmax
-640->Ymin
640->Ymax
0->X
0->Y
Repeat getKey
{3 ;MouseDo
ExecLib
Ans->L1
If L1(1 ;If MouseDo returns error,
Goto 1 ; restart loop
If 127<L1(3 ;If x direction is left,
L1(3)-256->L1(3 ; change to negative #
If 127<L1(4 ;If y direction is up,
L1(4)-256->L1(4 ; change to negative #
Pt-Off(X,Y
X+L1(3->X
Y-L1(4->Y
Pt-On(X,Y
Lbl 1
End
{1 ;KillUSB
ExecLib
Assembly (TASM)
Code for TASM-compatible assemblers. Use usb8xtsm.inc instead of usb8x.inc. TASM itself is apparently incompatible with usb8x macros, but Brass and SPASM work correctly.
Mouse Demo
This code uses [[../Asm_Interface/DriverInit|DriverInit]], [[../Asm_Interface/MouseInit|MouseInit]], [[../Asm_Interface/MouseGetKey|MouseGetKey]], [[../Asm_Interface/HostKill|HostKill]], and [[../Asm_Interface/DriverKill|DriverKill]]. It is a replica of the mouse demo code from usb8x, though it doesn't include routines unrelated to USB. In this case the address of the callback routine passed to U_CALL_INIT doesn't matter, because MouseInit redefine the callback to handle the mouse data.
U_CALL_INIT(Stub) ;Initialize U_CALL system
jp c,error
ld hl,USBDriverBuf
U_CALL(uDriverInit) ;Initialize Driver
jp c,error
ld hl,DBuf
ld bc,256
bcall(_MemClear) ;Clear descriptor buffer
ld hl,DBuf
ld b,0 ;allow diagonal keys
U_CALL(uMouseInit) ;Initialize Mouse
jp c,error
bcall(_GrBufClr)
xor a
ld (MouseBtn),a
ld a,50*2
ld (MouseX),a
ld a,32*2
ld (MouseY),a
call DispCursor ;Display mouse cursor
MainLoop:
bcall(_GrBufCpy)
bcall(_GetCSC)
cp skClear
jr z,MouseDone
call DispCursor ;Erase cursor
ld b,4 ;Buffer to screen copy is kind of slow, so let's
gkloop: ; update the cursor a few times for each buffer copy
push bc
U_CALL(uMouseGetKey) ;Get mouse info from usb8x
call MouseUpdateCursor ;Update cursor position
pop bc
djnz gkloop
call DispCursor ;Re-display cursor
jr MainLoop
MouseDone:
U_CALL(uHostKill) ;Disconnect power from mouse
U_CALL(uDriverKill) ;Kill driver
ret