10
20
30
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%