10 REM Sideways ROM skeleton
   20 oscli=&FFF7:OSWORD=&FFF1:OSBYTE=&FFF4
   30 OSWRCH=&FFEE:OSNEWL=&FFE4:OSASCI=&FFE3
   40 mcode%=TOP+&1800
   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   BRK
  130   EQUS "Skeleton ROM"
  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_handler AND 255:STA &202
  200   LDA #err_handler 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 #4:JSR oscli
  280   JMP lang_loop
  290   .escape
  300   LDA #124:JSR OSBYTE
  310   BRK:EQUB 17:EQUS "Escape":BRK
  320   .buff
  330   EQUW &400
  340   EQUB 255:EQUB 32:EQUB 255
  350   .err_handler
  360   JSR OSNEWL:JSR report
  370   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   JMP OSNEWL
  450   \                   Service part
  460   .serv
  470   PHA:LDA &DF0,X:CMP #255:BEQ disabled:PLA
  480   CMP #2:BEQ serv2:\ Private WS
  490   CMP #4:BEQ serv4:\ *comms
  500   CMP #6:\BEQ serv6:\Errors
  510   CMP #9:BEQ serv9:\ *HELP
  520   CMP #&22:BEQ serv22:\ Master PV WS
  530   RTS
  540   .disabled:PLA:RTS
  550   .serv2
  560   TYA:PHA:LDA #&81:LDX #0:LDY #255:JSR OSBYTE
  570   CPY #0:BNE serv2go
  580   CPX #253:BEQ serv2end:CPX #245:BNE serv2go
  590   .serv2end:PLA:TAY:LDA #2:RTS
  600   .serv2go:PLA:STA &DF0,X:LDA #2:RTS
  610   .serv22
  620   TYA:STA &DF0,X:LDA #22:RTS
  630   .serv4
  640   JMP serv4run
  650   .serv3
  660   TYA:PHA:LDA #122:JSR OSBYTE
  670   TXA:BMI init_rom
  680   CMP #51:BEQ init_rom:\ R key
  690   PLA:TAY:LDX &F4:LDA #3:RTS
  700   .init_rom:LDA #120:JSR OSBYTE
  710   PLA:\JSR rom_init:\Init the ROM
  720   \ If A=0, boot up at rom_init
  730   LDX &F4:LDA #0:RTS
  740   .run_help_end
  750   LDA #9:LDY &AF:LDX &F4:RTS
  760   .serv9
  770   STY &AF
  780   \ Next few lines check HELP text:
  790   LDA (&F2),Y:CMP #ASC".":BEQ do_help1
  800   AND #&DF:CMP #ASC"F":BNE not_file_help
  810   INY:LDA (&F2),Y:CMP #ASC".":BEQ do_help1:AND #&DF:CMP #ASC"I":BNE not_file_help
  820   INY:LDA (&F2),Y:CMP #ASC".":BEQ do_help1:AND #&DF:CMP #ASC"L":BNE not_file_help
  830   INY:LDA (&F2),Y:CMP #ASC".":BEQ do_help1:AND #&DF:CMP #ASC"E":BNE not_file_help
  840   .do_help1
  850   JSR pr_text:EQUB 13:EQUS "Skeleton Filer":EQUB 13:BRK
  860   LDA #os_comm1_text AND 255:STA &AC
  870   LDA #os_comm1_text DIV 256:STA &AD
  880   LDA #os_comm1 AND 255:STA &A9
  890   LDA #os_comm1 DIV 256:STA &AA
  900   JSR do_help:LDY &AF
  910   LDA (&F2),Y:CMP #ASC".":BNE run_help_finish
  920   JMP do_help2
  930   .run_help_end2:JMP run_help_end
  940   .not_file_help
  950   LDA (&F2),Y:AND #&DF:CMP #ASC"M":BNE run_help_end2
  960   INY:LDA (&F2),Y:CMP #ASC".":BEQ do_help2:AND #&DF:CMP #ASC"O":BNE run_help_end2
  970   INY:LDA (&F2),Y:CMP #ASC".":BEQ do_help2:AND #&DF:CMP #ASC"S":BNE run_help_end2
  980   .do_help2
  990   JSR pr_text:EQUB 13:EQUS "Skeleton MOS 1.00":EQUB 13:BRK
 1000   LDA #os_comm2_text AND 255:STA &AC
 1010   LDA #os_comm2_text DIV 256:STA &AD
 1020   LDA #os_comm2 AND 255:STA &A9
 1030   LDA #os_comm2 DIV 256:STA &AA
 1040   JSR do_help:LDY &AF
 1050   LDA (&F2),Y:CMP #ASC".":BEQ run_help_end2
 1060   .run_help_finish
 1070   LDA #0:RTS
 1080   .do_help
 1090   TYA:PHA:LDA #&BD:STA &A8:LDA #&60:STA &AB
 1100   LDX #0:LDY #0
 1110   .help_mess_loop
 1120   LDA #32:JSR OSWRCH:JSR OSWRCH
 1130   .help_mess_loop2
 1140   JSR &A8:BEQ help_word
 1150   JSR OSWRCH:INX:CLC:BCC help_mess_loop2
 1160   .help_word
 1170   LDA #32:JSR OSWRCH
 1180   .help_mess_loop3
 1190   LDA (&AC),Y:BEQ help_text_end
 1200   JSR OSWRCH:INY:CLC:BCC help_mess_loop3
 1210   .help_text_end
 1220   JSR OSNEWL
 1230   INY:INX:INX:INX:JSR &A8:CMP #&FF:BNE help_mess_loop
 1240   PLA:TAY:RTS
 1250   .search_table
 1260   LDA #&BD:STA &A8
 1270   LDA #&60:STA &AB
 1280   STY &AF
 1290   LDX #0
 1300   .search_main_loop
 1310   LDY &AF
 1320   .search_loop
 1330   LDA (&F2),Y:CMP #ASC".":BEQ dot
 1340   JSR &A8:CMP (&F2),Y:BNE not_equal
 1350   .equal
 1360   INX:INY:JSR &A8:BEQ zero_byte
 1370   BNE search_loop
 1380   .dot
 1390   JSR fnd_zero1
 1400   INY
 1410   .zero_byte
 1420   INX:JSR &A8:STA &AC
 1430   INX:JSR &A8:STA &AD
 1440   .no_spaces
 1450   LDA (&F2),Y:CMP #32:BNE found_code
 1460   INY:CLC:BCC no_spaces
 1470   .found_code
 1480   CLC:RTS
 1490   .fnd_zero
 1500   INX
 1510   .fnd_zero1
 1520   JSR &A8:BNE fnd_zero
 1530   RTS
 1540   .not_equal
 1550   EOR #32:CMP (&F2),Y:BEQ equal
 1560   JSR fnd_zero
 1570   INX:INX:INX:JSR &A8:CMP #&FF
 1580   BNE search_main_loop
 1590   LDY &AF:SEC:RTS
 1600   .serv4run
 1610   LDA #(os_comm1)MOD 256
 1620   STA &A9
 1630   LDA #(os_comm1)DIV 256
 1640   STA &AA
 1650   .serv4bit:JSR search_table
 1660   BCC serv4go
 1670   LDA #4:LDX &F4:RTS
 1680   .serv4go:LDX &F4
 1690   JSR jump
 1700   LDA #0:RTS
 1710   .jump:JMP (&AC)
 1720   \                       Tables
 1730   .os_comm1
 1740   EQUS "TEST":BRK:EQUW 0:\ test
 1750   EQUB 255
 1760   .os_comm1_text
 1770   EQUS "<params>":BRK
 1780   .os_comm2
 1790   EQUS "CHECK":BRK:EQUW 0:\ check
 1800   EQUB 255
 1810   .os_comm2_text
 1820   EQUS "more <params>":BRK
 1830   \                   Routines
 1840   \ Misc. routines
 1850   .pr_hex
 1860   PHA:LSR A:LSR A:LSR A:LSR A
 1870   JSR first
 1880   PLA
 1890   .first
 1900   AND #&0F:CMP #10
 1910   BCC over
 1920   ADC #6
 1930   .over
 1940   ADC #48:JMP OSWRCH
 1950   \
 1960   .pr_text
 1970   STA &AE
 1980   PLA:STA &AC:PLA:STA &AD:TXA:PHA:TYA:PHA
 1990   LDY #0:.pr_main_loop
 2000   INC &AC:BNE continue
 2010   INC &AD:.continue
 2020   LDA (&AC),Y
 2030   BEQ end_of_string
 2040   JSR OSASCI:JMP pr_main_loop
 2050   .end_of_string
 2060   INC &AC:BNE pr_exit_end
 2070   INC &AD:.pr_exit_end
 2080   PLA:TAY:PLA:TAX:LDA &AE:JMP (&AC)
 2090   \
 2100   .errors
 2110   PLA:STA &AC:PLA:STA &AD
 2120   LDY #0:LDX #0
 2130   .error_main_loop
 2140   INX:INY:LDA (&AC),Y:STA &100,X
 2150   BNE error_main_loop
 2160   LDA #0:STA &100:JMP &100
 2170   \
 2180   .Bad_Command
 2190   JSR errors
 2200   EQUB 254:EQUS "Bad command":BRK
 2210   .Bad_Number
 2220   JSR errors
 2230   EQUB 200:EQUS "Bad Number":BRK
 2240   .get_hex_addr
 2250   LDX #&A8:LDA #0
 2260   STA 0,X:STA 1,X:STA 2,X
 2270   .next_char
 2280   LDA (&F2),Y:JSR ascii_to_binary
 2290   BCS get_hex_error
 2300   ASL A:ASL A:ASL A:ASL A
 2310   STY 2,X:LDY #4
 2320   .get_hex_again
 2330   ASL A:ROL 0,X:ROL 1,X
 2340   DEY:BNE get_hex_again
 2350   LDY 2,X:INY:BNE next_char
 2360   .get_hex_error
 2370   LDA 2,X:RTS
 2380   .ascii_to_binary
 2390   CMP #48:BCC illegal
 2400   CMP #58:BCC zero_nine
 2410   SBC #7:BCC illegal
 2420    CMP #64:BCS ascii_return
 2430   .zero_nine
 2440   AND #&0F
 2450   .ascii_return
 2460   RTS
 2470   .illegal
 2480   SEC:RTS
 2490   .find_ws
 2500   PHA:LDX &F4:LDA &DF0,X:STA &A9:LDA #0:STA &A8:PLA:RTS
 2510   \
 2520   ]
 2530 NEXT P
 2540 PRINT"SAVE ROM "+STR$~(mcode%)+" "+STR$~(O%+1)+" 8000 8000"