> ROMMouse/s 1.00 1 Add mouse code to spare area in a ROM image " 1.00 17-Mar-2006 J.G.Harston (: 2 A%(4096):: mcode% &40FF <*OSASCI=&FFE3:OSNEWL=&FFE7:OSBYTE=&FFF4 F(BYTEV=&20A:XBYTEV=&DAE:oldBYTEV=&D9B P#status=&DA5:posn=&DA6:flag=&DAA Z: d* "Source ROM: (RETURN for none) "rom$ nH rom$<>"":"LOAD :System.ROMs.Filing.Disk.Acorn."+rom$+" "+~mcode% x* rom$<>"":OldService=mcode%!4 &FFFF J rom$<>"":spare%=&4000::spare%=spare%-1:mcode%?spare%<>mcode%?&3FFF  rom$="":spare%=-1 8spare%=spare%+&8001:"ROM space starts at &";~spare% ( spare%>&BCC7:"Not enough space": : P=0 1 P%=spare%:O%=P%-&8000+mcode%  rom$="":ROMHeader [OPT P*2+4 .Service% ,]: rom$<>"":[OPT P*2+4:JSR OldService:] [OPT P*2+4 CMP #4:BNE P%+5:JMP Serv4 CMP #5:BNE P%+5:JMP Serv5 CMP #8:BNE P%+5:JMP Serv8 CMP #9:BEQ Serv9 "RTS ,: 6 .Serv9 @;TAX:PHY :\ Save registers J2LDA (&F2),Y:CMP #13:CLC:BEQ Serv9Help :\ *Help T2CMP #".":BEQ Serv9Help :\ *Help . ^4 #&DF:CMP #"M":BNE Serv9Quit :\ *Help Mouse h8LDX #0 :\ Claim *Help r.Serv9Help |DPHX:PHP :\ Save claim/noclaim/full =LDX #0:JSR PrintHelpText :\ Print help title @PLP:BCC P%+5:JSR PrintHelpText :\ Print detailed help PLX .Serv9Quit >TXA:LDX &F4:PLY:RTS :\ Restore registers : .PrintHelpText "LDA HelpText,X:BEQ PrintHelpOk $JSR OSASCI:INX:BNE PrintHelpText .PrintHelpOk  INX:RTS :  .HelpText  EQUB 13 !EQUS "Mouse 1.00":EQUB 13:BRK #EQUS " MOUSE [ON|OFF]":EQUB 13 &6EQUS " ADVAL(7) returns mouse X position":EQUB 13 06EQUS " ADVAL(8) returns mouse Y position":EQUB 13 :8EQUS " ADVAL(9) returns mouse buttons %rml":EQUB 13 D@EQUS " INKEY-10,-11,-12 return mouse buttons l,m,r":EQUB 13 NBEQUS " OSWORD 64 returns mouse X,Y text X,Y, buttons":EQUB 13 XBRK b: l .Serv4 vPHY:LDX #0  .Serv4Lp (LDA (&F2),Y:CMP #".":BEQ Serv4Found "CMP HelpText+1,X:BEQ Serv4Next  #32 "CMP HelpText+1,X:BNE Serv4Quit .Serv4Next INY:INX:CPX #5:BNE Serv4Lp #LDA (&F2),Y:CMP #13:BEQ MouseOn CMP #32:BNE Serv4Quit .Serv4Found PLA  .Serv4Spc (INY:LDA (&F2),Y:CMP #32:BEQ Serv4Spc CMP #13:BEQ MouseOn  ! #&DF:CMP #"F":BEQ MouseOff BNE Serv4Spc  .Serv4Quit *PLY:LDX &F4:LDA #4:RTS 4: > .MouseOff H9JSR ChkVector:BNE MouseExit :\ Vector not claimed R PHP:SEI \5LDA oldBYTEV+0:STA BYTEV+0 :\ Restore vector fLDA oldBYTEV+1:STA BYTEV+1 p:LDA status: #&3F :\ Flag mouse turned off zBPL MouseDone :  .MouseOn =JSR ChkVector:BEQ MouseExit :\ Vector already claimed LDX #3:.InitPosn 8TXA: #1:ASL A:STA posn,X :\ Initialise position DEX:BPL InitPosn 5LDA #&80:STA posn :\ X=&280, Y=&200 : 7LDA BYTEV+0:STA oldBYTEV+0 :\ Save old vectors LDA BYTEV+1:STA oldBYTEV+1 : JPHP:SEI :\ Disable IRQs while changing vectors *LDA #15:STA BYTEV:LDA #&FF:STA BYTEV+1 %LDA #MouseByte 255:STA XBYTEV+0 %LDA #MouseByte 256:STA XBYTEV+1 LDA &F4:STA XBYTEV+2 $: .;LDA #&00:STA &FE62 :\ Data Direction=Input 8:LDA #&98:STA &FE6E :\ Enable CB1+CB2 IRQs BCLDA #&18:STA &FE6D :\ Clear any pending CB1+2 IRQs LLDA #0:LDX #&FF:JSR OSBYTE V9LDA #&01:CPX #5:BNE NotCompact :\ Not Master Compact `JLDA #&88 :\ Set b7, Compact uses different pins j.NotCompact t3STA flag :\ Save OS flag ~\ b7 = Compact )\ b0 = #&01 for BBC/Master movement &\ b3 = #&08 for Compact movement 8LDA #&92 :\ Mouse on, speed=2 : .MouseDone 7STA status:PLP :\ Set mouse status .MouseExit ?LDA #0:RTS :\ Restore IRQs, claim call : .ChkVector #LDA BYTEV+0:CMP #&0F:BNE ChkOff #LDA BYTEV+1:CMP #&FF:BNE ChkOff 0LDA XBYTEV+0:CMP #MouseByte 255:BNE ChkOff  0LDA XBYTEV+1:CMP #MouseByte 256:BNE ChkOff LDA XBYTEV+2:CMP &F4  .ChkOff (RTS 2: <\ ERUPT - ȗ MAY HAVE D F%\ =============================== P .Serv5 Z8LDA status:BMI MouseIRQ :\ Mouse enabled, check VIA d.Serv5Quit nLDA #5:RTS x .MouseIRQ 2LDA &FE6D:LDY &FE60 :\ Get axis+direction ; #&18:BEQ Serv5Quit :\ Not mouse movement, ignore it .STA &FE6D :\ Ack. mouse IRQ 0\ Rest of code from *Mouse transient command CMP #&10:BCS do_X /PHA:LDX #2:TYA:LSR A :\ X=2 for Y coord 'BIT flag:BMI dir_compact :\ Compact  LSR A .dir_compact SEC:JSR change PLA:CMP #&18:BNE done  .do_X 0LDX #0:TYA:CLC:JSR change :\ X=0 for X coord  .done LDA #0:RTS : " .change ,"PHP: flag: #&09:BEQ chg_decr 6 .chg_incr @CLC J5LDA posn,X:ADC #4:STA posn,X :\ inc position T$LDA posn+1,X:ADC #0:STA posn+1,X ^9 0TXA:ASL A:TAX :)LDA posn-13,X:TAY :\ (7)/(8) DLDA posn-14,X:TAX NRTS X$.rd_buttons :\ (9) b*LDA &FE60:BIT flag:BMI rd_buttons_comp lROL A:ROL A:ROL A:ROL A v.rd_buttons_comp  #7: #7:TAX:LDY #0:RTS  .rd_key CPY #&FF:BNE do_old_byte CPX #&93:BCC do_old_byte CPX #&96:BCC rd_key2 CPX #&F4:BCC do_old_byte CPX #&F7:BCS do_old_byte DEX:.rd_key2 TXA: #&9F:SBC #&92: #3 CMP #3:ADC #0  .rd_key3 BIT flag:BMI rd_key_comp ROR A:ROR A:ROR A:ROR A .rd_key_comp  &FE60 CMP #1:LDA #0:ADC #&FF  TAX:TAY:RTS *: 4\ SERVICE 8 - OSWORD >\ ================== H .Serv8 R"LDA &EF:CMP #64:BEQ read_mouse \LDA #8:RTS f.read_mouse pLDA &F0:PHA:LDA &F1:PHA zLDA #&86:JSR OSBYTE PLA:STA &F1:PLA:STA &F0 TYA:LDY #5:STA (&F0),Y TXA:DEY:STA (&F0),Y:DEY  .rd_ms_lp LDA posn,Y:STA (&F0),Y:DEY BPL rd_ms_lp LDY #6:LDA &FE60 BIT flag:BPL rd_ms_bbc ROR A:ROR A:ROR A:ROR A .rd_ms_bbc STA (&F0),Y LDX &F0:LDY &F1:LDA #0:RTS ] 6 rom$<>"":mcode%?4=Service%:mcode%?5=Service%256 8"*SAVE ";rom$;"Mse ";~mcode%;" ";~O%;" 0 FFFBBC00"  $ROMHeader .[OPT P*2+4 8BRK:BRK:BRK:JMP Service% B*EQUB &82:EQUB Copyright-&8000:EQUB &01 L.EQUS "Mouse":BRK:EQUS "1.00 (12 Mar 2006)" V.Copyright `!BRK:EQUS "(C)J.G.Harston":BRK j]: