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