> 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 <.rompath$=":System.ROMs.Filing.Disk.Acorn." F*OSASCI=&FFE3:OSNEWL=&FFE7:OSBYTE=&FFF4 P(BYTEV=&20A:XBYTEV=&DAE:oldBYTEV=&D9B Z#status=&DA5:posn=&DA6:flag=&DAA d% status: b7=enabled, b3-b0=speed n- flag: b7=Compact, b3/b0=movement bits x: * "Source ROM: (RETURN for none) "rom$ ' rom$<>"": rom$,":"):rompath$="" 2 rom$<>"":"LOAD "+rompath$+rom$+" "+~mcode% * 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%>&BCC9:"Not enough space": 'header%=(spare%<&BCC9-49) rom$="" : 'len%=0: pass%=((rom$<>"") 2) 3 P%=spare%+&100-128*(pass%2) +O%=mcode%+spare%-&8000+len%*(pass%2)2 opt%="4647",pass%+1,1) ROMHeader  [OPT opt% " .Service% ,CMP #4:BNE P%+5:JMP Serv4 6CMP #5:BNE P%+5:JMP Serv5 @CMP #8:BNE P%+5:JMP Serv8 JCMP #9:BNE ServExit T: ^ .Serv9 h .Serv4 r;PHA:TYA:PHA:LDX #0 :\ Save registers |6LDA (&F2),Y:CMP #13:CLC:BEQ Serv9Help :\ *Help  .Serv4Lp LDA (&F2),Y:INY CMP #".":BEQ Serv4Found "CMP HelpText+1,X:BEQ Serv4Next  #32 !CMP HelpText+1,X:BNE ServQuit .Serv4Next GINX:CPX #5:BNE Serv4Lp :\ Loop to match 5 characters FLDA (&F2),Y:CMP #"!":BCS ServQuit :\ Not Mouse or Mouse .Serv4Found PLA:TAY:PLA :\ Restore registers 0 .ServExit :RTS D: N.Serv4Command XDEX:BPL InitPosn H5SEC:ROR posn :\ X=&280, Y=&200 R: \7LDA BYTEV+0:STA oldBYTEV+0 :\ Save old vectors fLDA BYTEV+1:STA oldBYTEV+1 p: zJPHP:SEI :\ Disable IRQs while changing vectors *LDA #15:STA BYTEV:LDA #&FF:STA BYTEV+1 !LDA MouseByteV+0:STA XBYTEV+0 !LDA MouseByteV+1:STA XBYTEV+1 LDA &F4:STA XBYTEV+2 : :LDA #&98:STA &FE6E :\ Enable CB1+CB2 IRQs CLDA #&18:STA &FE6D :\ Clear any pending CB1+2 IRQs ;LDA #&00:STA &FE62 :\ Data Direction=Input FCPY #"D":BEQ Compact :\ Marconi is same pinout as Compact =LDX #&FF:JSR OSBYTE :\ A still &00 from above 9LDA #&01:CPX #5:BNE NotCompact :\ Not Master Compact  .Compact JLDA #&88 :\ Set b7, Compact uses different pins .NotCompact 6STA flag :\ Save mouse flag \ b7 = Compact/Marconi $)\ b0 = #&01 for BBC/Master movement .&\ b3 = #&08 for Compact movement 88LDA #&92 :\ Mouse on, speed=2 B: L.MouseDone VESTA status:PLP :\ Set mouse status, restore IRQs `\ b7 = Mouse j"\ b0-b3 = Mouse Speed (unused) t.MouseExit ~1LDA #0:RTS :\ Claim call : .ChkVector #LDA BYTEV+0:CMP #&0F:BNE ChkOff #LDA BYTEV+1:CMP #&FF:BNE ChkOff ,LDA XBYTEV+0:CMP MouseByteV+0:BNE ChkOff ,LDA XBYTEV+1:CMP MouseByteV+1:BNE ChkOff LDA XBYTEV+2:CMP &F4  .ChkOff RTS : .PrintHelpText "LDA HelpText,X:BEQ PrintHelpOk $JSR OSASCI:INX:BNE PrintHelpText  .PrintHelpOk  INX:RTS : ( .HelpText 2 EQUB 13 9 PHP:SEI:TXA:ASL A:TAX 1LDY posn-13,X :\ ADVAL(7)/ADVAL(8) LDA posn-14,X:TAX  PLP:RTS (.rd_buttons :\ ADVAL(9) *LDA &FE60:BIT flag:BMI rd_buttons_comp ROL A:ROL A:ROL A:ROL A .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 4DEX:.rd_key2 >TXA: #&9F:SBC #&92: #3 HCMP #3:ADC #0 R .rd_key3 \BIT flag:BMI rd_key_comp fROR A:ROR A:ROR A:ROR A p.rd_key_comp z &FE60 CMP #1:LDA #0:ADC #&FF TAX:TAY:RTS : \ SERVICE 8 - OSWORD \ ==================  .Serv8 "LDA &EF:CMP #64:BEQ read_mouse .Serv8Quit LDA #8:RTS .read_mouse LDA status:BPL Serv8Quit LDA &F0:PHA:LDA &F1:PHA LDA #&86:JSR OSBYTE PLA:STA &F1:PLA:STA &F0 TYA:LDY #5:STA (&F0),Y TXA:DEY:STA (&F0),Y:DEY $ PHP:SEI . .rd_ms_lp 8LDA posn,Y:STA (&F0),Y:DEY BBPL rd_ms_lp:PLP LLDY #6:LDA &FE60 VBIT flag:BPL rd_ms_bbc `ROR A:ROR A:ROR A:ROR A j.rd_ms_bbc tSTA (&F0),Y ~LDA #0:RTS : .CodeEnd ] ! rom$="":len%=CodeEnd-Start%  sfx$="" 2 rom$<>"":mcode%?4=Start%:mcode%?5=Start%256 ) rom$="" :MakeRelocTable:sfx$="ROM" E"*SAVE ";rom$;"Mse";sfx$;" ";~mcode%+len%;" ";~O%;" 0 FFFBBC00"  : ROMHeader [OPT opt%:.Start%:] + rom$="" :[OPT opt%:BRK:EQUW CodeEnd:] ) rom$<>"":[OPT opt%:JSR OldService:]  header%: ( [OPT opt% 2JMP Service% <+EQUB &82:EQUB Copyright-Start%:EQUB &01 F.EQUS "Mouse":BRK:EQUS "1.00 (12 Mar 2006)" P.Copyright Z!BRK:EQUS "(C)J.G.Harston":BRK d]: n: xMakeRelocTable @base80%=mcode%+len%:base81%=mcode%:byte%=0:count%=0:off%=0: Rbyte80%=base80%?off%:byte81%=base81%?off%: off%>=len%:byte80%=&80:byte81%=&80 ] ((byte81%-byte80%) &FE)<>0 "ERROR: Offset by more than one page at &";~&8000+off% M (byte80% &C0)=&80:byte%=byte%2+128*(byte81%-byte80%):count%=count%+1 1 count%=8:?O%=byte%:O%=O%+1:byte%=0:count%=0 &off%=off%+1:off%>=len% count%=0