> ROMCMD/src 3 Command hander for Command/Help/Status/Config  by J.G.Harston (: 2 kbd%=3 <OSBYTE=&FFF4:OSARGS=&FFDA F*OSASCI=&FFE3:OSNEWL=&FFE7:OSWRCH=&FFEE P"EVNTV=&220:KEYV=&228:INSV=&22A Zusb_D=&FCF8:usb_S=&FCF9 d mcode% &1000, L%-1 n&ver$="0.01":date$=" (28 May 2018)" x:  pass%=0 1 P%=&8000:O%=mcode% opt%=pass%*3+4 [OPT opt% .rombase EQUB &00:EQUW RelocTable JMP Service #EQUB &82:EQUB copyright-rombase .ROMTitle !EQUB ver$:EQUS "USB Support" EQUB &00:EQUS ver$+date$ .copyright "EQUB &00:EQUS "(C)J.G.Harston"  EQUB &00 :  .Service ":PHA :\ Save service number ,/CMP #&04:BNE P%+5:JMP ServCmd04 :\ *command 6,CMP #&09:BNE P%+5:JMP ServCmd09 :\ *help @1CMP #&28:BNE P%+5:JMP ServCmd28 :\ *configure J.CMP #&29:BNE P%+5:JMP ServCmd29 :\ *status T PLA:RTS ^: h.ServCmd04:.ServCmd09 rLLSR A :\ Convert service call number to bitmap |.ServCmd28:.ServCmd29 PHA '\ 04 -> 02 -> 02 command xxxx0010 '\ 09 -> 04 -> 04 help xxxx0100 '\ 28 -> 28 -> 08 config xxxx1000 '\ 29 -> 29 -> 09 status xxxx1001 \ =LDX #0 :\ Point to start of table >STX &F5 :\ And set command number 0 9LDA (&F2),Y :\ Get first character LCMP #&0D:BEQ ServCmdNull :\ *help, *status, *configure JCMP #&2E:BEQ ServCmdNull :\ *help . *status . *configure . : .ServCmdEntryLp >INC &F5 :\ Increment command number >BEQ ServCmdSkipSpc :\ And step past any spaces H;PLA :\ Drop old line pointer R5TSX:LDA #0:STA &102,X :\ Claim this call \.ServCmdNull fCLDA &F5:ASL A:TAX :\ X=command offset, Carry Clear p.ServCmdDispatch zLDA CmdDispatch+1,X:STA &F7 LDA CmdDispatch+0,X:STA &F6 EPLA:TAX: #1:ADC #&D8:CMP #&01 :\ Convert command type, CC=Status JSR JumpF6 APLA:RTS :\ Return claimed or unclaimed : \ On entry, \ Flags set from A: \ EQ = Status \ PL = Status/Configure \ MI = Help/Command \ (&F2),Y=>command line \ X=command type \  .JumpF6  JMP (&F6) .ServCallStatus $BPHA:PHA:CLC :\ Push command type onto stack .CJMP ServCmdDispatch :\ Jump to call *Status routines 8: B/.cmdUSB :\ *Help USB LDEY V .cmdNull `!CPX #4:BNE cmdHelp:JSR OSNEWL j.cmdTitleLp t'LDA ROMTitle-3,X:BNE P%+4:LDA #" " ~3CMP #"(":BEQ cmdTitleDone :\ Print ROM title !JSR OSWRCH:INX:BNE cmdTitleLp .cmdTitleDone 9JSR OSNEWL:LDX #2 :\ X=2 - list commands #LDA (&F2),Y:CMP #13:BNE cmdHelp JRTS :\ No parameter, only display ROM title  .cmdHelp FTYA:PHA:TXA:PHA :\ Save Y=lineptr, X=command bitmap >LDX #0:LDY #0 :\ Point to start of tables .cmdHelpLp1 AINY:INY :\ Step to next dispatch entry  or . ^%EQUW cmdUSB :\ USB h,EQUW cmdDevices :\ USBDEVICES r(EQUW cmdKBD :\ USBKBD |*EQUW cmdMouse :\ USBMOUSE *EQUW cmdPrint :\ USBPRINT +EQUW cmdStatus :\ USBSTATUS : : #.cmdPrint :LDX #128:BNE cmdDoIt #.cmdMouse :LDX #64 :BNE cmdDoIt .cmdKBD :LDX #63  .cmdDoIt 2BCC cmdStatus2 :\ *Status HPHA:TYA:BEQ cmdSyntax :\ Y=0, *help or *config. syntax requested FLDA (&F2),Y :\ Save command type, get char from line GCMP #13:BEQ cmdStatus1 :\ *command or *configure command BJSR ScanOnOffName :\ Parse parameter OFF|ON| to Y 1PLA:BMI cmdJump :\ *command : :: :\ *Configure &-TYA:PHA :\ Save 04TXA: #255:PHA :\ Mask to keep old bits :1JSR CMOSRead:TSX :\ Get my CMOS byte D8 &102,X: &101,X :\ Merge new setting into byte N &102,X:TAY X3PLA:PLA :\ Drop stacked bytes b: l3.CMOSWrite :\ Write my CMOS byte vLDX #19:LDA #162:JMP OSBYTE 2.CMOSRead :\ Read my CMOS byte CLC .CMOSRead1 D:\LDA &23D:\AND #&C0:\EOR #&80 :\ If keyboard not claimed, use 0 >:\TAY:\BEQ P%+5 :\ else use current setting GLDY &23C:BCS CMOSRead2 :\ If CS or no CMOS, use current setting LDX #19:LDA #161:JSR OSBYTE .CMOSRead2  TYA:RTS :  .cmdJump  TXA:ASL A BCC P%+5:JMP usbPRINT BPL P%+5:JMP usbMOUSE  JMP usbKBD :  .cmdSyntax *PLA:CPX #64:BCS cmdSyntax2 42JSR PrText:EQUS "OFF|":EQUB 13:EQUB 0:RTS >.cmdSyntax2 H/JSR PrText:EQUS "OFF|ON":EQUB 13:EQUB 0:RTS R: \.errBadConfigure fJSR MkError p#EQUB 254:EQUS "Bad command":BRK z: H.cmdStatus1 :\ *command or *configure command 8PLA:BPL errBadConfigure :\ *configure command 3.cmdStatus2 :\ *Status 7TXA:PHA :\ Save parameter bitmap =JSR CMOSRead1:TSX :\ Get CMOS or current setting / &101,X:TAY:PLA :\ Y=value, A=mask 8CMP #64:BCS PrOnOffEtc :\ mask=64 or 128, OFF/ON 5TYA:JSR PrDec:JSR PrSpace :\ Print decimal value .PrOnOffEtc 9TYA:LDX #&FF :\ Look for matching entry .PrOnOffLp1 INX :CMP txtNames,X:BEQ PrOnOffLp2 :\ Matched entry prefix 2LDY txtNames,X:BPL PrOnOffLp1 :\ End of table .PrOnOffDone JMP OSNEWL $.PrOnOffLp2 .LDA txtNames+1,X: #127 8CMP #"A":BCC PrOnOffDone B!JSR OSWRCH:INX:BNE PrOnOffLp2 L: V .txtNames `EQUB 0:EQUS "OFF" jEQUB 1:EQUS "UK" tEQUB 2:EQUS "BBC" ~EQUB 32:EQUS "Japan" EQUB 48:EQUS "USA" EQUB 64:EQUS "ON" EQUB 128:EQUS "ON" EQUB 0 : : ,.cmdDevices :\ USBDEVICES DEX +.cmdStatus :\ USBSTATUS TYA:BNE x:JMP OSNEWL ..usbKBD :\ USBKBD 1.usbMOUSE :\ USBMOUSE ON|OFF 1.usbPRINT :\ USBPRINT ON|OFF \ .x 4JSR PrHex:JSR PrSpace :\ debug, command type (6TXA:JSR PrHex:JSR PrSpace :\ debug, command number 24TYA:JSR PrHex:JMP OSNEWL :\ debug, line pointer <: F P Z d n\ (&F2),Y=> || x\ Returns Y=0 | 0-255 | 255 .ScanOnOffName LDA (&F2),Y: #&DF CMP #"O":BNE ScanOnOffNum INY:LDA (&F2),Y: #&DF &LDY #0:CMP #"F":BEQ ScanOnOffDone #DEY:CMP #"N":BEQ ScanOnOffDone JMP errBadNumber .ScanOnOffNum JSR ScanDec:TAY .ScanOnOffDone RTS : :  .PrDec ETAX:LDA #&99 :\ Move value to X, start at -1 in BCD >SED :\ Switch to decimal arithmetic " .PrDecLp ,5CLC:ADC #1 :\ Add one in BCD mode 6?DEX:BPL PrDecLp :\ Loop for all of source number @BCLD :\ Switch back to binary arithmetic J25, will overflow +ASL A:ASL A:ADC &F5:ASL A :\ num=num*10 7STA &F5:PLA :\ Get current digit back 1ADC &F5:BCC ScanDecLp :\ num=num*10+digit .ScanDecTooBig .errBadNumber JSR MkError "EQUB 252:EQUS "Bad number":BRK .ScanDecDone 8LDA &F5:CLC :\ CC=valid number scanned 7.ScanDecExit :\ CS=bad number or digit *RTS 4: >.ScanChkDigit H:LDA (&F2),Y :\ Get current character R'CMP #"0":BCC ScanDecErr :\ <'0' \'CMP #"9"+1:BCS ScanDecErr :\ >'9' f>INY: #15:RTS :\ Convert character to binary p.ScanDecErr z5SEC:RTS :\ CS=invalid digit : : .MkError 9PLA:STA &FD:PLA:STA &FE :\ Pop address after JSR >LDY #0 :\ Index into the error block .MkErrorLp =INY:LDA (&FD),Y:STA &100,Y :\ Copy error block to stack CBNE MkErrorLp :\ Loop until terminating &00 byte CSTA &100:JMP &100 :\ Store &00 as BRK and jump to it : :  .RelocTable ]: ;"*Save ROMCMD ";~(mcode%);" ";~O%;" FFFF0000 FFFBBC00"  $: