10 REM > Keys/s
   20 REM Source for *Keys command - list function key definitions
   30 REM Also *Show (<nn>), "*Show" is same as "*Keys"
   40 :
   50 OSARGS=&FFDA:OSFIND=&FFCE:OSBGET=&FFD7:OSNEWL=&FFE7
   60 OS_CLI=&FFF7:OSBYTE=&FFF4:OSWRCH=&FFEE:BRKV=&202
   70 load%=&FFFF0900:DIM mcode% &200
   80 zp=&A8:kptr=&A8:kend=&AA:num=&AC:host=&AD:tmp=&AE
   90 :
  100 FOR P=0 TO 1
  110   P%=load%:O%=mcode%
  120   [OPT P*3+4
  130   .chkDigit6
  140   CMP #ASC"6":BCS errSyntax             :\ >'5', error
  150   .chkDigit9
  160   CMP #ASC"9"+1:BCS errSyntax           :\ >'9', error
  170   CMP #ASC"0":BCS chkDigitOk            :\ <'0', error
  180   .errSyntax
  190   BRK:EQUB 250:EQUS "Bad key":EQUB 0
  200   :
  210   .go%
  220   LDA #0:LDX #1:JSR OSBYTE:STX host     :\ Find MOS system
  230   TAY:LDA #1:LDX #zp:JSR OSARGS         :\ Find parameters
  240   LDX #0:LDA (zp),Y:CMP #13:BNE ShowNum :\ *Show <num>
  250   .ShowAll
  260   JSR ShowKey:INX:CPX #16:BNE ShowAll   :\ Loop through 0 to 15
  270   .chkDigitOk:RTS
  280   :
  290   .ShowNum
  300   JSR chkDigit9:CMP #ASC"1":BNE ShowNumOk :\ Check '0'-'9'
  310   INY:LDA (zp),Y
  320   LDX #1:CMP #ASC"!":BCC ShowNumOk1     :\ '1'
  330   JSR chkDigit6:ADC #9                  :\ '10'-'15'
  340   .ShowNumOk
  350   AND #15:TAX:INY                       :\ X=key, step past last digit
  360   .ShowNumOk1
  370   LDA (zp),Y:CMP #ASC"!":BCS errSyntax  :\ Check end of <num>
  380   :
  390   .ShowKey                              :\ Show key X
  400   LDA &F4:PHA:ORA #128:JSR RomSelect    :\ Page workspace in
  410   LDA host:CMP #3:BCS ShowMaster        :\ Master
  420   PHP:SEI:LDA &B10:SEC:SBC &B00,X       :\ Copied from MOS 1.20
  430   STA tmp:TYA:PHA:LDY #16               :\ Find length of string
  440   .LE3B7
  450   LDA &B00,Y:SEC:SBC &B00,X
  460   BCC LE3C8:BEQ LE3C8
  470   CMP tmp:BCS LE3C8:STA tmp
  480   .LE3C8
  490   DEY:BPL LE3B7:PLA:TAY:PLP
  500   LDA #1:ADC &B00,X:STA kptr+0
  510   ADC tmp:STA kend+0
  520   LDA #&B:STA kptr+1:STA kend+1         :\ kptr/kend=>BBC definition
  530   BNE KeyDisplay                        :\ Show key definition
  540   .ShowMaster
  550   LDA &8000,X:STA kptr+0:LDA &8011,X:STA kptr+1
  560   LDA &8001,X:STA kend+0:LDA &8012,X:STA kend+1
  570   :
  580   .KeyDisplay
  590   \LDA kptr+0:\CMP kend+0:\BNE KeyNotEmpty
  600   \LDA kptr+1:\CMP kend+1:\BEQ KeyEmpty
  610   \.KeyNotEmpty
  620   LDY #0:.PrKey
  630   LDA KeyString,Y:JSR OSWRCH:INY        :\ Print "Key "
  640   CMP #ASC" ":BNE PrKey
  650   TXA:CMP #10:BCC KeyDigit              :\ num<10
  660   LDA #ASC"1":JSR OSWRCH:TXA:CLC:SBC #9 :\ Print "1", A=next digit
  670   .KeyDigit
  680   ORA #ASC"0":JSR OSWRCH                :\ Print units digit
  690   LDA #32:JSR OSWRCH:JSR PrQuote        :\ Print <spc><quot>
  700   :
  710   .KeyPrintLp
  720   LDA kptr+0:CMP kend+0:BNE KeyChar     :\ Not at end of defintion
  730   LDA kptr+1:CMP kend+1:BEQ KeyEnd      :\ End of definition
  740   .KeyChar
  750   LDY #0:LDA (kptr),Y:BPL KeyLowChar    :\ Char<128
  760   PHA:JSR PrBar:LDA #ASC"!":JSR OSWRCH  :\ Print "|!" for char>127
  770   PLA:AND #127                          :\ Print as low char
  780   .KeyLowChar
  790   EOR #64
  800   CMP #ASC"""" EOR 64:BEQ KeyCtrlChar   :\  "  -> |"
  810   CMP #ASC"|" EOR 64:BEQ KeyCtrlChar    :\  |  -> |"
  820   EOR #64:CMP #127:BEQ KeyCtrlChar      :\ Del -> |?
  830   CMP #32:BCS KeyPrintChar              :\ <32 -> |X
  840   .KeyCtrlChar
  850   PHA:JSR PrBar:PLA:EOR #64
  860   .KeyPrintChar
  870   JSR OSWRCH:INC kptr+0:BNE KeyPrintLp  :\ Print and loop back
  880   INC kptr+1:BNE KeyPrintLp
  890   .KeyEnd
  900   JSR PrQuote:JSR OSNEWL:PLA
  910   .RomSelect
  920   STA &F4:STA &FE30:RTS
  930   :
  940   .PrBar  :LDA #ASC"|":JMP OSWRCH
  950   .PrQuote:LDA #34:JMP OSWRCH
  960   .KeyString:EQUS "*Key "
  970   EQUS "v1.01":BRK
  980   ]
  990 NEXT
 1000 PRINT"*SAVE Keys ";~mcode%;" ";~O%;" ";~go%OR&FFFF0000;" ";~load%
 1010 PRINT"*SAVE Show ";~mcode%;" ";~O%;" ";~go%OR&FFFF0000;" ";~load%