diff level2/modules/joydrv_6551L.asm @ 0:6641a883d6b0

Initial revision
author boisy
date Thu, 04 Apr 2002 16:34:12 +0000
parents
children 7a973074acbe
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level2/modules/joydrv_6551L.asm	Thu Apr 04 16:34:12 2002 +0000
@@ -0,0 +1,277 @@
+********************************************************************
+* JoyDrv - Joystick Driver for 6551/Logitech Mouse
+*
+* $Id$
+*
+* Ed.    Comments                                       Who YY/MM/DD
+* ------------------------------------------------------------------
+* 6      L2 Upgrade distribution version
+
+         nam   JoyDrv
+         ttl   Joystick Driver for 6551/Logitech Mouse
+
+* Disassembled 98/09/09 09:22:44 by Disasm v1.6 (C) 1988 by RML
+
+         ifp1  
+         use   defsfile
+         use   l51.defs
+         endc  
+
+tylg     set   Systm+Objct
+atrv     set   ReEnt+rev
+rev      set   $01
+edition  set   6
+
+MPISlot  set   $00
+
+         mod   eom,name,tylg,atrv,start,$FF68
+
+name     fcs   /JoyDrv/
+         fcb   edition
+
+SlotSlct equ   MPISlot
+
+start    lbra  Init
+         lbra  Term
+         lbra  SSMsBtn
+         lbra  SSMsXY
+         lbra  SSJoyBtn
+
+SSJoyXY  pshs  x,b,a
+         ldx   #PIA0Base
+         lda   <$23,x
+         ldb   <$20,x
+         pshs  b,a
+         anda  #$F7
+         sta   <$23,x
+         lda   $01,x
+         ldb   $03,x
+         pshs  b,a
+         andb  #$F7
+         lsr   $04,s
+         bcs   L0043
+         orb   #$08
+L0043    stb   $03,x
+         lda   ,s
+         ora   #$08
+         bsr   L0065
+         std   $06,s
+         lda   ,s
+         anda  #$F7
+         bsr   L0065
+         std   $04,s
+         puls  b,a
+         sta   $01,x
+         stb   $03,x
+         puls  b,a
+         stb   <$20,x
+         sta   <$23,x
+         puls  pc,y,x
+L0065    sta   $01,x
+         lda   #$7F
+         ldb   #$40
+         bra   L0078
+L006D    lsrb  
+         cmpb  #$01
+         bhi   L0078
+         lsra  
+         lsra  
+         tfr   a,b
+         clra  
+         rts   
+L0078    pshs  b
+         sta   <$20,x
+         tst   ,x
+         bpl   L0085
+         adda  ,s+
+         bra   L006D
+L0085    suba  ,s+
+         bra   L006D
+
+IRQPckt  equ   *
+Pkt.Flip fcb   Stat.Flp   D.Poll flip byte
+Pkt.Mask fcb   Stat.Msk   D.Poll mask byte
+         fcb   $01        priority
+
+Init     clra
+         clrb 
+         sta   Btn.Cntr,u set up Rx data sync, no button(s) pressed
+         std   CrntXPos,u set up X position at left screen edge
+         ldd   #HResMaxY*2
+         std   CrntYPos,u set up Y position at top screen edge
+         ldd   M$Mem,pcr get base hardware address
+         addd  #StatReg   status register address
+         leax  IRQPckt,pcr
+         leay  IRQSvc,pcr
+         os9   F$IRQ
+         bcs   InitExit   go report error...
+         ldx   M$Mem,pcr get base hardware address again
+         ldd   #(TIC.RTS!Cmd.DTR)*256+(DB.8!Ctl.RClk!BR.01200) [D]=command:control
+         pshs  cc
+         orcc  #IntMasks  disable IRQs while setting up hardware
+         sta   PRstReg,x  reset 6551
+         std   CmdReg,x   set command and control registers
+         lda   >PIA1Base+3 get PIA CART* input control register
+         anda  #$FC       clear PIA CART* control bits
+         sta   >PIA1Base+3 disable PIA CART* FIRQs
+         lda   >PIA1Base+2 clear possible pending PIA CART* FIRQ
+         lda   #$01       GIME CART* IRQ enable
+         ora   <D.IRQER   mask in current GIME IRQ enables
+         sta   <D.IRQER   save GIME CART* IRQ enable shadow register
+         sta   >IrqEnR    enable GIME CART* IRQs
+         ldb   DataReg,x  *ensure old error,
+         ldb   StatReg,x  *Rx data, and
+         ldb   DataReg,x  *IRQ flags
+         ldb   StatReg,x  *are clear
+         andb  Pkt.Mask,pcr IRQ bits still set?
+         bne   InitErr    yes, go disable ACIA and return...
+         lda   SlotSlct,pcr get MPI slot select value
+         bmi   InitExit   no MPI slot select, go exit...
+         sta   >MPI.Slct  set MPI slot select register
+         puls  pc,cc recover original regs, return...
+
+Term     pshs  cc         save regs we alter
+         orcc  #IntMasks  mask IRQs while disabling ACIA
+InitErr  ldx   M$Mem,pcr  get base address
+         lda   #TIC.RTS!Cmd.RxIE!Cmd.DTR *disable all
+         sta   CmdReg,x   *ACIA IRQs
+         puls  cc
+         leax  StatReg,x  point to status register
+         tfr   x,d        copy status register address
+         ldx   #$0000     remove IRQ table entry
+         leay  IRQSvc,pcr
+         os9   F$IRQ
+InitExit rts
+
+SSJoyBtn ldb   #$FF
+         ldx   #PIA0Base
+         stb   $02,x
+         ldb   ,x
+         comb  
+         andb  #$0F
+         rts   
+
+SSMsBtn  pshs  cc
+         orcc  #IntMasks
+         lda   ,u
+         tfr   a,b
+         andb  #$C0
+         bne   L0120
+         bita  #$20
+         beq   L011A
+         orb   #$03
+L011A    bita  #$10
+         beq   L0120
+         orb   #$0C
+L0120    anda  #$3F
+         sta   ,u
+         puls  pc,cc
+
+SSMsXY   ldd   #$017E
+         pshs  cc
+         orcc  #IntMasks
+         ldx   CrntXPos,u
+         subd  CrntYPos,u
+         lsra  
+         rorb  
+         tfr   d,y
+         puls  pc,cc
+
+***
+* Mouse IRQ service routine.
+*
+* INPUT:  A = flipped and masked device status byte
+*         U = mouse data area address
+*
+* OUTPUT:  updated serial mouse data
+*          CC Carry clear
+*          D, X, Y, and U registers may be altered
+*
+* ERROR OUTPUT:  none
+IRQSvc   ldx   M$Mem,pcr
+         bita  #Stat.Err  any error(s)?
+         beq   ChkRDRF    no, go check Rx data
+         ldb   DataReg,x  read Rx data register to clear error flags
+ClrRxCnt lda   Btn.Cntr,u get current button status and Rx data counter
+         anda  #^BC.RxCnt clear Rx data counter
+ButnExit sta   Btn.Cntr,u reset Rx mouse data counter to wait for sync...
+IRQExit  clrb             clear Carry to mark IRQ serviced
+         rts   
+
+ChkRDRF  bita  #Stat.RxF  Rx data?
+         beq   IRQExit    no, but this branch should never be taken...
+         ldb   DataReg,x  get Rx data
+         lda   Btn.Cntr,u get button status and Rx counter
+         anda  #BC.RxCnt  waiting for sync with mouse data?
+         bne   ChkOfst    no, go check Rx offset...
+         tfr   b,a        copy Rx data
+         anda  #SyncMask  clear button status bits
+         cmpa  #SyncData  is it *PROBABLY* the initial (sync) byte?
+         bne   IRQExit    no, just ignore it...
+         comb             invert button bits to match SS.Mouse format
+         lslb             *move button
+         lslb             *status into
+         lslb             *bits 5-3
+         andb  #BC.Butns  clear everything but the button bits
+         incb             set Rx counter to first XY position byte
+         pshs  b
+         lda   ,u
+         bita  #$08
+         beq   L017A
+         bitb  #$08
+         bne   L017A
+         lda   #$C0
+         ldx   CrntXPos,u
+         cmpx  #$0140
+         bcs   L017A
+         lsla
+L017A    anda  #$C0
+         ora   ,s+
+         bra   ButnExit   go save new button status and Rx counter, exit...
+ChkOfst  cmpa  #PcktSize-1 last byte in mouse packet?
+         bcs   SaveData   no, go save mouse data to Rx buffer...
+         ldx   #HResMaxY*2 get maximum Y position
+         pshs  x          save it for CalcPos subroutine
+         leax  CrntYPos,u point to current Y position
+         leay  Buffer+1,u point to primary Y offset
+         bsr   CalcPos    go calculate & save mouse's new Y position
+         ldb   Buffer+2,u get mouse packet's secondary X offset
+         ldx   #HResMaxX  get maximum X position
+         stx   ,s         save it for CalcPos subroutine
+         leax  CrntXPos,u point to current X position
+         leay  Buffer+0,u point to primary X offset
+         bsr   CalcPos    go calculate & save mouse's new X position
+         leas  2,s        clean up stack
+         bra   ClrRxCnt   go save button status and clear Rx counter, exit...
+SaveData stb   a,u        save XY position byte to mouse data Rx buffer
+         inc   Btn.Cntr,u point to next byte in Rx buffer
+         clrb             clear Carry to mark IRQ serviced
+         rts   
+
+CalcPos  sex              sign extend mouse packet's 2nd XY offset ([D] = -128 to +127)
+         pshs  d          save it temporarily...
+         ldb   ,y         get mouse packet's 1st XY offset
+         sex              sign extend it ([D] = -128 to +127)
+         addd  ,s         add mouse's 2nd XY offset
+         std   ,s         save XY offset total temporarily...
+         bpl   PosAdjst   go de-sensitize positive "ballistic" XY offset...
+         orb   #%00000111 if -8<XYoffset<0, no "ballistic" response
+         addd  #1         "fix" negative offset "ballistic" response
+         bra   RShiftD    go calculate "ballistic" offset...
+PosAdjst andb  #%11111000 if 0<XYoffset<8, no "ballistic" response
+RShiftD  asra             *calculate 50% of XY offset
+         rorb             *for "ballistic" response
+         addd  ,s++       add original XY offset total, clean up stack
+         addd  ,x         add mouse's current XY position
+         bpl   CheckPos   zero or positive XY position, go check it...
+         clra             *set minimum
+         clrb             *XY position
+CheckPos cmpd  2,s        past maximum XY position?
+         bls   SavePos    no, go save it...
+         ldd   2,s        get maximum XY position
+SavePos  std   ,x         save new XY position
+         rts   
+
+         emod  
+eom      equ   *
+         end