10 REM Skeleton for 1 oscli handler
   20 oscli=&FFF7:OSWORD=&FFF1:OSBYTE=&FFF4
   30 OSWRCH=&FFEE:OSNEWL=&FFE4:OSASCI=&FFE3
   40 mcode%=TOP+&1800:HIMEM=mcode%
   50 FOR P=0 TO 1
   60   O%=mcode%:P%=&8000
   70   [OPT P*3+4
   80   JMP lang
   90   JMP serv
  100   EQUB &C2
  110   EQUB copy-&8000
  120   EQUB 10
  130   EQUS "1 Comm. Skeleton ROM":BRK:EQUS "Version string"
  140   .copy
  150   BRK:EQUS "(C)1987 J.G.Harston":BRK
  160   \                   Language part
  170   .lang
  180   LDX #&FF:TXS:CLD:CLI
  190   LDA #err AND 255:STA &202
  200   LDA #err DIV 256:STA &203
  210   .lang_loop
  220   LDA #ASC"*":JSR OSWRCH
  230   LDA #0:LDX #buff AND 255
  240   LDY #buff DIV 256
  250   JSR OSWORD
  260   BCS escape
  270   LDX #0:LDY #7:JSR oscli
  280   JMP lang_loop
  290   .escape
  300   LDA #124:JSR OSBYTE
  310   BRK:EQUB 17:EQUS "Escape":BRK
  320   .buff
  330   EQUW &700
  340   EQUB 255:EQUB 32:EQUB 255
  350   .err
  360   JSR OSNEWL:JSR report
  370   JSR OSNEWL:JMP lang_loop
  380   .report
  390   LDY #1
  400   .errloop
  410   LDA (&FD),Y:CMP #0:BEQ err2
  420   JSR OSWRCH:INY:JMP errloop
  430   .err2
  440   RTS
  450   \                   Service part
  460   .serv
  470   CMP #7:BEQ serv7:\ OSBYTE call
  480   PHA:LDA &DF0,X:AND #128:BEQ disabled:PLA
  490   CMP #9:BEQ serv9:\ *HELP
  500   CMP #4:BEQ serv4:\ *commands
  510   RTS
  520   .disabled:PLA:RTS
  530   .serv7
  540   LDA &EF:CMP #91:BNE serv7not:\ *FX to enable ROM
  550   LDA &DF0,X:STA &F0:ORA #128:STA &DF0,X:LDA #0:RTS
  560   .serv7not:LDA #7:RTS
  570   .serv4:JMP serv4run
  580   .serv9:\ *HELP handler
  590   JSR pr_text
  600   EQUB 13:EQUS "Skeleton 1 ROM 1.00":EQUB13
  610   BRK:STY &AA
  620   LDA (&F2),Y:CMP #ASC".":BEQ help_print:AND #&DF:CMP #ASC"S"
  630   BNE help_not:INY:LDA (&F2),Y:CMP #ASC".":BEQ help_print:AND #&DF:CMP #ASC"K"
  640   BNE help_not:INY:LDA (&F2),Y:CMP #ASC".":BEQ help_print:AND #&DF:CMP #ASC"E"
  650   BNE help_not:INY:LDA (&F2),Y:CMP #ASC".":BEQ help_print:AND #&DF:CMP #ASC"L"
  660   BNE help_not
  670   .help_print:\ *HELP command lister
  680   LDA #(help_mess) AND &FF:STA &A8
  690   LDA #(help_mess) DIV 256:STA &A9
  700   LDX #0:LDY #0
  710   .help_mess_loop
  720   LDA #32:JSR OSWRCH:JSR OSWRCH
  730   .help_mess_loop2
  740   LDA osc_table,X:BEQ help_word
  750   JSR OSWRCH:INX:CLC:BCC help_mess_loop2
  760   .help_word
  770   LDA #32:JSR OSWRCH
  780   .help_mess_loop3
  790   LDA (&A8),Y:BEQ help_text_end
  800   JSR OSWRCH:INY:CLC:BCC help_mess_loop3
  810   .help_text_end
  820   JSR OSNEWL
  830   INY:INX:INX:INX:LDA osc_table,X:CMP #&FF:BNE help_mess_loop
  840   .help_not
  850   \ Optionally print out word responds to. Eg:
  860   \JSR pr_text:\EQUS "  SKEL":\EQUB 13:\BRK
  870   .help_end
  880   LDY &AA:LDX &F4:LDA (&F2),Y:CMP #13:BEQ help_end1
  890   CMP #ASC".":BEQ help_end1:LDA #0:RTS
  900   .help_end1
  910   LDA #9:RTS
  920   .serv4run
  930   JSR serv4look
  940   CMP #0:BEQ serv4look_ok
  950   LDA (&F2),Y:AND #&DF:CMP #ASC"H":BNE serv4look2:\ check if H prefix present
  960   INY:JSR serv4look:DEY:JMP serv4look_ok
  970   .serv4look2:LDA #4:.serv4look_ok
  980   RTS
  990   .serv4look
 1000   TXA:PHA:STY &AF
 1010   LDX #0
 1020   .serv4_main_loop
 1030   LDY &AF
 1040   .serv4_loop
 1050   LDA (&F2),Y:CMP #ASC".":BEQ dot
 1060   CMP osc_table,X:BNE not_equal
 1070   .equal
 1080   INX:INY:LDA osc_table,X:BEQ zero_byte
 1090   BNE serv4_loop
 1100   .dot
 1110   JSR fnd_zero1
 1120   INY
 1130   .zero_byte
 1140   INX:LDA osc_table,X:STA &A8
 1150   INX:LDA osc_table,X:STA &A9
 1160   .no_spaces
 1170   LDA (&F2),Y:CMP #32:BNE jump_to_code
 1180   INY:CLC:BCC no_spaces
 1190   .jump_to_code
 1200   PLA:TAX:JSR jump
 1210   LDA #0:RTS
 1220   .jump
 1230   JMP (&A8)
 1240   .fnd_zero
 1250   INX
 1260   .fnd_zero1
 1270   LDA osc_table,X:BNE fnd_zero
 1280   RTS
 1290   .not_equal
 1300   EOR #32:CMP osc_table,X:BEQ equal
 1310   JSR fnd_zero
 1320   INX:INX:INX:LDA osc_table,X:CMP #&FF
 1330   BNE serv4_main_loop
 1340   PLA:TAX:LDY &AF:LDA #4:RTS
 1350   \                       Tables
 1360   .osc_table
 1370   EQUS "NOSKEL":BRK:EQUW disable_ROM
 1380   EQUB 255
 1390   .help_mess
 1400   EQUS "":BRK
 1410   \                   Routines
 1420   .pr_hex
 1430   PHA:LSR A:LSR A:LSR A:LSR A
 1440   JSR first
 1450   PLA
 1460   .first
 1470   AND #&0F:CMP #10
 1480   BCC over
 1490   ADC #6
 1500   .over
 1510   ADC #48:JMP OSWRCH
 1520   .pr_text
 1530   STA &AA
 1540   PLA:STA &A8:PLA:STA &A9:TXA:PHA:TYA:PHA:LDY #0
 1550   .pr_main_loop
 1560   INC &A8:BNE continue:INC &A9
 1570   .continue
 1580   LDA (&A8),Y:BEQ end_of_string
 1590   JSR OSASCI:JMP pr_main_loop
 1600   .end_of_string
 1610   INC &A8:BNE pr_text_end:INC &A9
 1620   .pr_text_end:PLA:TAY:PLA:TAX
 1630   LDA &AA:JMP (&A8)
 1640   .errors
 1650   PLA:STA &A8:PLA:STA &A9
 1660   LDY #&FF:LDX #0
 1670   .error_main_loop
 1680   INY:LDA (&A8),Y:STA &100,X:INX
 1690   BNE error_main_loop
 1700   LDA #0:STA &100:JMP &100
 1710   .Bad_Command
 1720   JSR errors
 1730   EQUB 254:EQUS "Bad command":BRK
 1740   .Bad_Number
 1750   JSR errors
 1760   EQUB 200:EQUS "Bad Number":BRK
 1770   .disable_ROM
 1780   LDA &DF0,X:AND #127:STA &DF0,X
 1790   JSR pr_text:EQUS "Press CTRL-BREAK":BRK
 1800   .dis_ROMloop:JMP dis_ROMloop
 1810   ]
 1820 NEXT P
 1830 PRINT"SAVE ROM "+STR$~(mcode%)+" "+STR$~(O%+1)+" FE524F4D 8000"