Mercurial > hg > Members > kono > nitros9-code
view level2/modules/joydrv_joy.asm @ 1262:67e11bfc9cd4
More 6309 optimizations
author | boisy |
---|---|
date | Mon, 18 Aug 2003 22:54:07 +0000 |
parents | 6641a883d6b0 |
children | 205b4fbc08cd |
line wrap: on
line source
******************************************************************** * JoyDrv - Joystick Driver for CoCo 3 Hi-Res Mouse * * $Id$ * * Ed. Comments Who YY/MM/DD * ------------------------------------------------------------------ * 6 L2 Upgrade distribution version * Annotations by Robert Gault RG 98/10/09 nam JoyDrv ttl Joystick Driver for CoCo 3 Hi-Res Mouse * Disassembled 98/09/09 09:07:45 by Disasm v1.6 (C) 1988 by RML ifp1 use defsfile endc tylg set Systm+Objct atrv set ReEnt+rev rev set $01 edition set 6 mod eom,name,tylg,atrv,start,size size equ . name fcs /JoyDrv/ fcb edition start lbra Init setup for special button state & clear buttons lbra Term clear button but don't change special flag lbra SSMsBtn read and process button values lbra SSMsXY read joystick values; with processing lbra SSJoyBtn clear keyboard input and return raw button info SSJoyXY pshs y,x,b,a read joystick values pshs x,b,a ldx #PIA0Base point to PIA#1 lda <$23,x read sound enable state? ldb <$20,x read 6-bit DAC pshs b,a save current states anda #%11110111 clear sound enable sta <$23,x set switch lda $01,x read MUX SEL#1 ldb $03,x read MUX SEL#2 pshs b,a save current state orb #$08 set SEL#2 lda $08,s read ?what? anda #$02 keep only left or right joystick bne L0047 if left then don't andb #%11110111 clear SEL#2 L0047 stb $03,x enable SEL#2 value leay <L0097,pcr point to high res routine ldb $0D,s flag for high/low res bne L0054 leay >L010F,pcr point to low res routine L0054 lda ,s ora #$08 set MUX SEL#1 jsr ,y read pot tst $0D,s here the same byte seems to be used for x/y flag?? beq L0060 bsr L00DB convert from width to height value L0060 std $06,s return joystick value lda ,s now read the other direction anda #$F7 flip the MUX SEL#1 bit jsr ,y read the second pot std $04,s save the other value puls b,a sta $01,x stb $03,x puls b,a stb <$20,x reset the DAC and sound selector sta <$23,x puls y,x lda ,s flag for double button? cmpa #$01 bne L0094 ldb #$80 minimum flag lda $05,s bne L008B cmpx #32 minimum joystick value bcc L0092 L008B cmpx #320 maximum joystick value bcc L0092 if less than don't change flag ldb #$C0 maximum flag L0092 stb ,u save max/min flag value L0094 leas $06,s rts L0097 pshs cc high res routine sta $01,x select x/y pot lda #$FF full DAC value sta <$20,x store in DAC to charge capacitor lda #$5A timing loop; wait for voltage to settle L00A2 deca bne L00A2 wait ldd #$0329 pshs a lda #$02 orcc #IntMasks kill interrupts sta <$20,x clear DAC; mask RS-232; start cap. discharge L00B1 lda ,x test comparator bmi L00C0 decb counter bne L00B1 loop until state change dec ,s 3 -> 0 bpl L00B1 loop again puls a bra L00D6 branch to maximum value L00C0 puls a decb pshs b,a ldd #640 subd ,s++ convert from 640 -> 0 to 0 -> 640 bcc L00D0 clra minimum value is $00 clrb puls pc,cc L00D0 cmpd #639 bcs L00D9 L00D6 ldd #639 maximum value L00D9 puls pc,cc * This routine converts a pot value from width (640) to height (192) to match * possible screen values; ie. value divided by 3.33 L00DB pshs a lda #$09 pshs a lda #$03 mul pshs b,a lda $03,s ldb #$03 mul exg b,a addd ,s++ L00EF clr $01,s cmpa #$0A bcs L00F9 inc $01,s suba #$0A L00F9 lsr $01,s rolb rola dec ,s bne L00EF cmpb #$BF beq L010B cmpa #$0A bcs L010B addb #$01 L010B clra leas $02,s rts * Low res binary tree search for joystick value L010F sta $01,x set MUX SEL#1 lda #$7F DAC value ldb #$40 bra L0122 L0117 lsrb reset DAC offset value cmpb #$01 bhi L0122 lsra lsra tfr a,b clra rts return with voltage L0122 pshs b sta <$20,x set DAC tst ,x test comparator bpl L012F adda ,s+ adjust binary tree search bra L0117 L012F suba ,s+ adjust binary tree search bra L0117 SSMsXY leay ,y get flag?? lbne SSJoyXY go read joystick pots lbsr SSJoyXY go read joystick pots and then convert values tfr x,d multiply regX by 10 and regY by 3 lda #$0A mul tfr d,x cmpx #630 bcs L014B ldx #634 maximum limit on regX * may be an error and could be 639 L014B tfr y,d lda #$03 mul tfr d,y rts Init ldb #$80 stb ,u Term clr $01,u rts SSJoyBtn ldx #PIA0Base PIA#1 base address clrb comb stb $02,x clear PIA#1 key strobe lines ldb ,x read data lines comb only buttons and comparator valid andb #$0F only buttons; 0=off 1=on rts SSMsBtn bsr SSJoyBtn tfr b,a anda #%11111010 regA=left buttons; should be $0A not $FA pshs a save left button values andb #$05 regB=right buttons orb $01,u ORB with previous state?? leax <L0187,pcr point to sequential switch table possibilities lda b,x anda #%00001010 keep only left values sta $01,u save for change test ldb b,x repeat andb #%10000101 keep flag and right values bpl L0184 ldb ,u previous min/max state L0184 orb ,s+ ORB with current left values and pop stack rts L0187 fcb $00,$03,$00,$03,$08,$06,$02,$06,$80,$02,$00,$02,$08,$06,$0a,$06 emod eom equ * end