ô > Mouse121/s 0ô Mouse Driver Source for BBC/Master/Compact : (ô v1.13 Version for BBC 2/ô v1.15 Self-modifies to read Compact mouse <6ô v1.16 Almost correctly aligns buttons on Compact F%ô v1.17 Fully works on B, M and C P/ô v1.18 Old vectors now in correct location Z5ô v1.19 Allows manual selection of Marconi pinout d2ô v1.20 SEI when reading posn, some tidying up n0ô v1.21 Self-modifies to read Electron mouse x: ‚5ô Allows: *MOUSE [AMX|COMPACT|MARCONI|ON|OFF|RB5] Œô Data: 7 6 5 4 3 2 1 0 –(ô BBC: R M L - - Y - X (aka AMX)  ,ô Compact: - - - Y X R M L (aka Marconi) ª: ´ô Standard locations: ¾ô &D99/A=old IRQ1V Èô &D9B/C=old BYTEV Òô &D9D/E=old WORDV Ü"ô &DA5 =mouse status (unused) æô &DA6/7=mouse X position ðô &DA8/9=mouse Y position ú!ô &DAA =mouse flags (unused) : OSBYTE=&FFF4:OSARGS=&FFDA $IRQ1V=&204:BYTEV=&20A:WORDV=&20C "!Þ mcode% &200:norm%=&FFFF0933 ,ñ"Normal: &";~norm% 6%è"Start: &"A$:ç A$="":A$=Ã~norm% @load%= ("&FFFF0"+ÂA$,3)) Jposn=&DA6:oldvecs=&D99 T: ^ ã P=0 ¸ 1 hP%=load%:O%=mcode% r[OPT P*3+4 |EQUS "v1.21":EQUB 13 † .newvecs )EQUW newirq:EQUW newbyte:EQUW newword š .exec% ¤LDA #1:LDY #0:LDX #&A8 ®HJSR OSARGS:PHP:SEI :\ Disable IRQs while changing vectors ¸/LDA IRQ1V+0:CMP #newirq € 255:BNE chkVector Â0LDA IRQ1V+1:€ #&FC:CMP #(newirq 256) € &FC Ì.chkVector ÖKPHP :\ EQ=Already installed, NE=Not installed àLDA (&A8),Y:€ #&DF ê,CMP #—"O":BNE mouseOn :\ *Mouse On ôINY:LDA (&A8),Y:€ #&DF þ1CMP #—"F":BNE mouseOn :\ Not *Mouse Off :  .mouseOff ;PLP:BNE exit1 :\ NE=Mouse not installed &?LDX #5:LDY #WORDV+1-&200 :\ Initially copy BYTEV+WORDV 0 .oldveclp :7LDA oldvecs,X:STA &200,Y :\ Restore old vector DCPX #2:BNE oldvec2 N3LDY #IRQ1V+2-&200 :\ Now copy IRQ1V X .oldvec2 bDEY:DEX:BPL oldveclp l .exit1 v PLP:RTS €: Š .mouseOn ”?PLP:BEQ exit3 :\ EQ=Mouse already installed ž8CLC:ADC #2:€ #&E4:PHA :\ Save *Mouse parameter ¨?LDX #5:LDY #WORDV+1-&200 :\ Initially copy BYTEV+WORDV ² .newveclp ¼4LDA &200,Y:STA oldvecs,X :\ Copy old vector Æ3LDA newvecs,X:STA &200,Y :\ Set new vector Ð"CPX #2:BCC newvec3:BNE newvec2 Ú3LDY #IRQ1V+2-&200 :\ Now copy IRQ1V ä .newvec2 î7TXA:€ #1:ASL A:STA posn-2,X :\ Set initial position ø .newvec3 DEY:DEX:BPL newveclp  3SEC:ROR posn+0 :\ Initial X=&280 ?LDA #0:JSR OSBYTE :\ Read MOS, X=&FF from above  TXA:BNE NotElectron:LDA #&FC *.ElectronLp 4+LDY ld1%,X:CPY #&FE:BNE P%+5:STA ld1%,X >+LDY ld2%,X:CPY #&FE:BNE P%+5:STA ld2%,X H8 àDPHP:SEI:TXA:ASL A:TAX :\ Prevent IRQs while reading position ê*LDY posn-13,X :\ –(7)/–(8) ôLDA posn-14,X:TAX þ PLP:RTS  .rd_key CPY #&FF:BNE do_old_byte CPX #&93:BCC do_old_byte &CPX #&96:BCC rd_key2 0CPX #&F4:BCC do_old_byte :CPX #&F7:BCS do_old_byte DDEX:.rd_key2 NTXA:€ #&9F:SBC #&92:‚ #3 XCMP #3:ADC #0 b .rd_key3 l:ROR A:ROR A:ROR A:ROR A :\ NOP these out for Compact v € &FE60 €CMP #1:LDA #0:ADC #&FF ŠTAX:TAY:RTS ”]:ld1%=exit2:ld2%=P%-256 ží ¨GB%=0:ã A%=exit2-(load%€&FFFF)+mcode% ¸ O%-1:ç ?A%=&FE:B%=B%+1:í ‹ í ²*ç B%<>8:ñ"ERROR: Too many &FE bytes":à ¼Cñ"*SAVE Mouse ";~mcode%;" ";~O%;" ";~exec%„&FFFF0000;" ";~load% ÿ