Two Autorun Routines that can start Atari Basic Programs

!! Version 1

{{{
10 ;LIST #D:AUTOBAS.SRC
20 ;
30 ;for creating AUTORUN.SYS
40 ;
50 ;MAC65 source code with
60 ;conversions to Atari Assembler
65 ;Editor
70 ;
80 ;Equates:
90 HATABS =  $031A
0100 TEMP =  $CB
0110 ;
0120	  *=  $4000	;or anywhere
0130 ;
0140 ;Modify the Handler table
0150 MAIN
0160	  LDX #36	  ;search from END
0165 ;					 of table
0170 ELOOP LDA HATABS,X
0180	  CMP #'E	  ;for 'E:' handler
0190	  BEQ CHANGE
0200	  DEX
0210	  DEX 
0220	  DEX 
0230	  BPL ELOOP
0240 CHANGE ;		  the table address
0250	  INX 
0260	  STX EDEX	 ;save HATABS loc
0270	  LDA HATABS,X ;and E: vector
0280	  STA TEMP
0290	  LDA # <NEWTAB ;or NEWTAB&$FF
0300	  STA HATABS,X
0310	  INX 
0320	  LDA HATABS,X
0330	  STA TEMP+1
0340	  LDA # >NEWTAB ;or NEWTAB/256
0350	  STA HATABS,X
0360 ;now transfer ROM table to RAM
0370	  LDY #$00
0380	  STY YSAV
0390 XLOOP LDA (TEMP),Y
0400	  STA NEWTAB,Y
0410	  INY 
0420	  CPY #$10	 ;16 BYTES
0430	  BCC XLOOP	;branch if <16
0440 ;now setup new getbyte routine
0450	  LDA # <NEWGET-1
0455	  ;			  or (NEWGET-1)&$FF
0460	  STA GETBYTE
0470	  LDA # >NEWGET-1
0475	  ;			  or (NEWGET-1)/256
0480	  STA GETBYTE+1
0490	  RTS 
0500 ;Handler table space
0510 NEWTAB
0520 OPEN .WORD 0	 ;see Atari OS
0530 CLOSE .WORD 0	;Manual,
0540 GETBYTE .WORD 0 ;DeRe Atari, or
0550 PUTBYTE .WORD 0 ;Mappng the Atari
0560 STATUS .WORD 0
0570 SPECIAL .WORD 0
0580 JUMP .BYTE 0,0,0
0590	  .BYTE 0,0	;16th byte
0595	  ;			  & insurance
0600 YSAV .BYTE 0
0610 EDEX .BYTE 0
0620 ;
0629 ;Our new GETBYTE routine
0630 NEWGET
0640	  LDY YSAV
0650	  LDA CMDLIN,Y ;get 1 char
0660	  CMP #$9B	 ;if C/R then done
0670	  BEQ DONE
0680	  INC YSAV	 ;indx next char
0690	  LDY #$01	 ;tell O.S. OK
0700	  RTS 
0710 DONE
0720	  PHA			;save C/R
0730	  TXA			;save X register
0740	  PHA 
0750	  LDX EDEX	 ;find 'E:' entry
0760	  LDA TEMP	 ;in HATABS
0770	  STA HATABS,X ;replace our
0775	  ;			  routine
0780	  INX			;with the real
0785	  ;			  vector
0790	  LDA TEMP+1
0800	  STA HATABS,X
0810	  PLA			;restore X reg
0820	  TAX 
0830	  PLA			;restore C/R to A
0840	  LDY #$01	 ;set status OK
0850	  RTS 
0860 ;
0870 CMDLIN ;		  passed to BASIC
0880	  .BYTE "? ",$22,"Loading... MYPROG",$22
0890	  .BYTE ":RUN ",$22,"D:myprog.bas",$22
0900	  .BYTE $9B	; C/R!!
0910 ;
0920 ;set to execute when loaded
0930	  *=  $02E2
0940	  .WORD MAIN
}}}

!! Version 2

{{{
10 ; Routine for AUTORUN.SYS
20 HATABS =  $031A
30 TEMP  =	$CB
40		 *=  $4000
50 ;Modify the Handler table
60 MAIN
70		 LDA #$00	 ;turn off antic
80		 STA 559	  ;and set the
90		 LDA #192	 ;screen color.
0100	  STA 710	  ;
0110	  STA 712	  ;
0120	  LDX #36
0130 ELOOP LDA HATABS,X
0140	  CMP #'E
0150	  BEQ CHANGE
0160	  DEX 
0170	  DEX 
0180	  DEX 
0190	  BPL ELOOP
0200 CHANGE
0210	  INX 
0220	  STX EDEX
0230	  LDA HATABS,X
0240	  STA TEMP
0250	  LDA # <NEWTAB
0260	  STA HATABS,X
0270	  INX 
0280	  LDA HATABS,X
0290	  STA TEMP+1
0300	  LDA # >NEWTAB
0310	  STA HATABS,X
0320 ;Move Rom to Ram
0330	  LDY #$00
0340	  STY YSAV
0350 XLOOP LDA (TEMP),Y
0360	  STA NEWTAB,Y
0370	  INY 
0380	  CPY #$10
0390	  BCC XLOOP
0400	  LDA # <NEWGET-1
0410	  STA GETBYTE
0420	  LDA # >NEWGET-1
0430	  STA GETBYTE+1
0440	  RTS 
0450 ;Handler table
0460 NEWTAB
0470 OPEN .WORD 0
0480 CLOSE .WORD 0
0490 GETBYTE .WORD 0
0500 PUTBYTE .WORD 0
0510 STATUS .WORD 0
0520 SPECIAL .WORD 0
0530 JUMP .BYTE 0,0,0
0540	  .BYTE 0,0
0550 YSAV .BYTE 0
0560 EDEX .BYTE 0
0570 ;New Getbyte rutine
0580 NEWGET
0590	  LDY YSAV
0600	  LDA CMDLIN,Y
0610	  CMP #$9B
0620	  BEQ DONE
0630	  INC YSAV
0640	  LDY #$01
0650	  RTS 
0660 DONE
0670	  PHA 
0680	  TXA 
0690	  PHA 
0700	  LDX EDEX
0710	  LDA TEMP
0720	  STA HATABS,X
0730	  INX 
0740	  LDA TEMP+1
0750	  STA HATABS,X
0760	  PLA 
0770	  TAX 
0780	  PLA 
0790	  LDY #$01
0800	  RTS 
0810 ;The command line
0820 CMDLIN
0830	  .BYTE "? ",$22,"Loading.",$22
0840	  .BYTE ":RUN ",$22,"D:MENU",$22
0850	  .BYTE $9B
0860 ;
0870	  *=  $02E2
0880	  .WORD MAIN
}}}