100 SYS 49152 110 ;"[204][207][193][196][197][210][205][193][203][197][210].[211][210][195] -- PROGRAM TO CREATE A ML LOADER PROGRAM ON [199][197][207][211] DISK" 120 ;"[206]ICK [214]RTIS -- [202]ANUARY 1988" 130 ; 140 ; WORK REGISTERS AS IN GEOS PROGRAMMERS REFERENCE 150 R0 = $02 160 R1 = $04 170 R4 = $0A 180 R6 = $0E 190 R9 = $14 200 R10 = $16 210 A0 = $FB 220 A1 = $FD 230 ; 240 .TASC ;ASSEMBLE TRUE ASCII LITERALS 250 ; 260 * = $5000-252 ;ALLOW FOR GEOS INFO SECTOR ($4F04) 270 .BYTE $BF 280 .BYTE $00,$00,$00,$7F,$FF,$FE,$40,$1F 290 .BYTE $FE,$5F,$80,$7E,$6F,$FF,$7E,$77 300 .BYTE $FE,$7E,$77,$05,$FE,$76,$03,$FE 310 .BYTE $74,$FF,$FE,$75,$80,$7E,$75,$FF 320 .BYTE $FE,$75,$80,$7E,$74,$FF,$E6,$76 330 .BYTE $03,$1A,$77,$07,$FC,$77,$FF,$FC 340 .BYTE $77,$A3,$FC,$77,$B8,$FA,$70,$3F 350 .BYTE $06,$7F,$FF,$FE,$00,$00,$00 360 .BYTE $83,$06,$00 370 .WORD BEGIN ;STARTING LOAD ADDRESS 380 .WORD LDREND ;ENDING LOAD ADDRESS 390 .WORD BEGIN ;STARTING EXECUTION ADDRESS 400 .ASC "[204]OADER[205]AKER[214]1.0" 410 .BYTE 0,0,0,0,0 420 .ASC "[206]ICK [214]RTIS -- 1988" 430 .BYTE 0,0 440 .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 450 .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 460 .ASC "[195]REATE A LOADER PROGRAM ON [199][197][207][211] DISK TO LOAD [205][204] FILES " 470 .ASC "CREATED BY A NON-[199][197][207][211] ASSEMBLER" 480 .BYTE 0 490 ; 500 * = $5000 510 MOVETO =$7F40 ;WHERE BOOT CODE WILL EXECUTE FROM 520 BEGIN LDA #TITLE 550 STA R0+1 560 JSR GRPHIC ;DO THE OPENING CREDITS 570 ; 580 DOAGAIN = * ;RESTART POINT 590 LDA #<MAINMENU 600 STA R0 610 LDA #>MAINMENU 620 STA R0+1 630 LDA #1 ;CURSOR ON OPTION #2 640 JMP MENU 650 ; 660 DOQUIT = * ;HANDLE THE QUIT OPTION 670 JMP RESTRT ;BACK TO DESKTOP 680 ; 690 DOHELP = * ;HANDLE THE HELP OPTION 700 LDX #<HELPW 710 LDY #>HELPW 720 JSR XYWINDOW 730 JMP DRWMNU ;REDRAW THE MENU 740 ; 750 DOMAKE = * ;HANDLE THE MAKE OPTION 760 JSR CMENUS ;CLOSE ALL MENUS 770 LDA #<PGMNAME 780 STA R10 790 LDA #>PGMNAME 800 STA R10+1 810 LDX #<LOADNW 820 LDY #>LOADNW 830 JSR XYWINDOW 840 LDA R0 ;CHECK FOR CANCEL 850 CMP #2 860 BEQ DOAGAIN ;..YES-RESTART 870 ; 880 GETLN = * ;GET NAME FOR LOADER FILE 890 LDA #<LDRNAME 900 STA R10 910 LDA #>LDRNAME 920 STA R10+1 930 LDX #<LDRNW 940 LDY #>LDRNW 950 JSR XYWINDOW 960 LDA R0 ;CHECK FOR CANCEL 970 CMP #2 980 BEQ DOAGAIN ;..YES-RESTART 990 LDA #<LDRNAME 1000 STA R6 1010 LDA #>LDRNAME 1020 STA R6+1 1030 LDA DRVSRCH ;CHECK ONLY 'ACTIVE' DRIVE FOR NEW NAME 1040 PHA ;SAVE CURRENT SETTING 1050 LDA #0 1060 STA DRVSRCH 1070 JSR LOOKUP ;TRY TO FIND LOADER NAME 1080 PLA 1090 STA DRVSRCH ;RESET DRIVE SEARCH FLAG 1100 TXA ;CHECK RETURN FROM LOOKUP 1110 BNE FILEOK ;..NOT FOUND--(null)OD 1120 LDX #<ERAFNW 1130 LDY #>ERAFNW 1140 JSR XYWINDOW 1150 LDA R0 ;SEE IF OK TO OVERLAY 1160 CMP #4 1170 BEQ GETLN ;..NO-GET A NEW LOADER NAME 1180 LDA #<LDRNAME 1190 STA R0 1200 LDA #>LDRNAME 1210 STA R0+1 1220 JSR DELETE ;ERASE CURRENT VERSION 1230 ; 1240 FILEOK = * ;FILE SETUP IS OK 1250 LDX #0 ;MOVE LOADER CODE TO WHERE IT WILL RUN FROM 1260 LDRMOVE = * 1270 LDA LDRCODE,X 1280 STA MOVETO,X 1290 INX 1300 CPX #<LDREND-LDRCODE 1310 BNE LDRMOVE 1320 CLC ;CALC END ADDRESS OF SAVE 1330 LDA #<LDREND-LDRCODE 1340 ADC #<MOVETO 1350 STA SAVEND 1360 LDA #>LDREND-LDRCODE 1370 ADC #>MOVETO 1380 STA SAVEND+1 1390 LDA #0 ;TRY STARTING ON 1ST PAGE OF DIRECTORY 1400 STA R10 1410 LDA #<LDRINFO 1420 STA R9 1430 LDA #>LDRINFO 1440 STA R9+1 1450 JSR SAVE ;SAVE NEW FILE 1460 JMP DOAGAIN ;REDO MENU/OPTIONS 1470 ; 1480 XYWINDOW = * ;PRODUCE WINDOW POINTED TO BY X/Y REGS 1490 STX R0 1500 STY R0+1 1510 JMP WINDOW ;(null)T HERE VIA JSR/RETURN DIRECTLY 1520 ; 1530 MAINMENU .BYTE 0 ;START @ TOP OF SCREEN 1540 .BYTE 14 ;TO +14 DOWN 1550 .WORD 0 ;LEFT EDGE 1560 .WORD 92 ;RIGHT EDGE 1570 .BYTE 3 ;3 HORIZONTAL OPTIONS 1580 .WORD DONE 1590 .BYTE $80 ;SUBMENU OPTION 1600 .WORD DONEMENU ;SUBMENU DEFINATION 1610 .WORD MAKE 1620 .BYTE 0 ;FLASH & DO OPTION 1630 .WORD DOMAKE 1640 .WORD HELP 1650 .BYTE 0 1660 .WORD DOHELP 1670 DONE .ASC "[196]ONE" : .BYTE 0 1680 MAKE .ASC "[205]AKE" : .BYTE 0 1690 HELP .ASC "[200]ELP" : .BYTE 0 1700 ; 1710 DONEMENU .BYTE 14 ;START BELOW MAIN 1720 .BYTE 14+14 ;STILL 14 PIXELS HIGH 1730 .WORD 0 ;LEFT EDGE 1740 .WORD 29 ;RIGHT EDGE 1750 .BYTE $80+1 ;ONE VERTICAL ENTRY 1760 .WORD QUIT 1770 .BYTE 0 ;FLASH & DO 1780 .WORD DOQUIT 1790 QUIT .ASC "[209]UIT" : .BYTE 0 1800 ; 1810 TITLE .BYTE $05,28 ;FILL PATTERN 1820 .BYTE $01,0,0,0 ;TOP/LEFT CORNER 1830 .BYTE $03:.WORD 320:.BYTE 199 ;FILL WHOLE SCREEN 1840 .BYTE $05,9 ;NEW FILL PATTERN 1850 .BYTE $03:.WORD 320:.BYTE 20 ;FILL TOP TITLE LINE 1860 .BYTE $06:.WORD 8:.BYTE 190 ;OUTPUT TITLE 1870 .BYTE $18,$20,$1A ; BOLD+OUTLINED 1880 .ASC "[204]OADER[205]AKER" 1890 .BYTE $1B,$18 ; JUST BOLD 1900 .ASC " [214]1.0 [205]ACHINE [204]ANGUAGE [204]OADER [205]AKER " 1910 .BYTE $16,8,0,142 ; NEW POSITION FOR TEXT 1920 .ASC " [206]ICHOLAS [202]. [214]RTIS " 1930 .BYTE $16,200,0,142 1940 .ASC " [195]OPYRIGHT 1988 " 1950 .BYTE $16,8,0,158 1960 .ASC " 5863 [208]INETREE [211].[197]. " 1970 .BYTE $16,8,0,174 1980 .ASC " [203]ENTWOOD, [205][201] 49508 " 1990 .BYTE $1B,0 ;BACK TO PLAINTEXT AT END 2000 ; 2010 HELPW .BYTE $01 ;NON-STANDARD SIZED WINDOW HERE 2020 .BYTE 22,178 ;TOP/BOTTOM PIXELS 2030 .WORD 4 ;LEFT EDGE 2040 .WORD 305 ;RIGHT EDGE 2050 .BYTE $0B,2,15 2060 .WORD HELPMSG 2070 .BYTE $01,31,135,0 ;-CANCEL- BOX 2080 HELPMSG .BYTE $18 2090 .ASC "[212]HIS PROGRAM IS USED TO CREATE A [199][197][207][211] PROGRAM WHICH" 2100 .BYTE $16,6,0,47 ;CHANGE HERE IS WINDOW SIZE ADJUSTED 2110 .ASC "CAN BE RUN FROM THE [196]ESK[212]OP. [212]HE [199][197][207][211] PROGRAM WILL" 2120 .BYTE $16,6,0,57 2130 .ASC "THEN LOAD AND RUN AN ASSEMBLER PROGRAM CREATED AS A" 2140 .BYTE $16,6,0,67 2150 .ASC "'NORMAL' [195]OMMODORE PROGRAM. [212]HIS AVOIDS HAVING TO" 2160 .BYTE $16,6,0,77 2170 .ASC "RUN A SEPERATE PROGRAM TO 'CONVERT' YOUR ASSEMBLER" 2180 .BYTE $16,6,0,87 2190 .ASC "PROGRAM EACH TIME YOU REASSEMBLE IT. [193] 'NORMAL'" 2200 .BYTE $16,6,0,97 2210 .ASC "[195]OMMODORE PROGRAM HAS THE LOAD ADDRESS AS THE FIRST" 2220 .BYTE $16,6,0,107 2230 .ASC "TWO DATA BYTES OF THE FILE, AND STARTS EXECUTION AT" 2240 .BYTE $16,6,0,117 2250 .ASC "THAT ADDRESS AFTER BEING LOADED." 2260 .BYTE $1B,0 2270 ; 2280 LDRNW .BYTE $81 ;STANDARD SIZE WINDOW 2290 .BYTE $0B,10,30 2300 .WORD LNMSG 2310 .BYTE $0B,10,40 ;TWO LINES OF TEXT IN THIS WINDOW 2320 .WORD LNMSG2 2330 .BYTE $0D,10,60 ;GET INPUT IN WINDOW 2340 .BYTE <R10,16 ;R10 IS BUFFER POINTER/MAX 16 CHARACTERS INPUT 2350 .BYTE $02,17,78 ;-CANCEL- BOX 2360 .BYTE 0 2370 LNMSG .BYTE $18 2380 .ASC "[197]NTER NAME FOR [206][197][215] LOADER" 2390 .BYTE 0 2400 LNMSG2 .ASC "PROGRAM TO BE CREATED." 2410 .BYTE $1B,0 2420 ; 2430 LOADNW .BYTE $81 ;AGAIN A STANDARD SIZED WINDOW 2440 .BYTE $0B,10,30 2450 .WORD PLMSG 2460 .BYTE $0D,10,60 2470 .BYTE <R10,16 2480 .BYTE $02,17,78 ;CANCEL BOX 2490 .BYTE 0 2500 PLMSG .BYTE $18 2510 .ASC "[197]NTER NAME OF [208][210][207][199][210][193][205] TO LOAD." 2520 .BYTE $1B,0 2530 ; 2540 ERAFNW .BYTE $81 2550 .BYTE $0B,10,30 2560 .WORD ERRMSG 2570 .BYTE $0B,10,40 2580 .WORD ERRMSG2 2590 .BYTE $03,17,60 ;-YES- BOX 2600 .BYTE $04,17,78 ;-NO- BOX 2610 .BYTE 0 2620 ERRMSG .BYTE $18 2630 .ASC "[212]HAT FILE ALREADY EXISTS." 2640 .BYTE 0 2650 ERRMSG2 .ASC "[207][203] TO OVERLAY ?" 2660 .BYTE $1B,0 2670 ; 2680 LDRINFO .WORD LDRNAME 2690 .BYTE $03,$15,$BF 2700 .BYTE $FF,$FF,$FF,$80,$00,$01,$AA,$A0 2710 .BYTE $01,$A0,$55,$81,$90,$00,$01,$88 2720 .BYTE $01,$81,$80,$F8,$01,$89,$FC,$01 2730 .BYTE $83,$00,$01,$8A,$7F,$81,$82,$00 2740 .BYTE $01,$8A,$7F,$81,$83,$00,$09,$89 2750 .BYTE $FC,$A5,$80,$F8,$03,$88,$00,$01 2760 .BYTE $80,$54,$03,$88,$05,$05,$8D,$40 2770 .BYTE $A9,$80,$00,$01,$FF,$FF,$FF 2780 .BYTE $83,$06,$00 2790 .WORD MOVETO ;BEGIN ADDRESS OF SAVE 2800 SAVEND *=*+2 ;END ADDRESS FOR SAVE 2810 .WORD MOVETO+17 ;EXECUTION START ADDRESS 2820 .ASC "[204]OADER[205]AKER[214]1.0" 2830 .BYTE 0,0,0,0,0 2840 .ASC "[206]ICK [214]RTIS -- 1988" 2850 .BYTE 0,0 2860 .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 2870 .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 2880 .ASC "[204]OAD AND [210]UN A [199][197][207][211] PROGRAM CREATED BY A NON-[199][197][207][211] ASSEMBLER. " 2890 .ASC "[212]HIS PROGRAM LOADS " 2900 ; 2910 LDRNAME .BYTE 0 2920 *=*+16 ;ALLOW FOR FULL NAME + TRAILING NULL 2930 ; 2940 LDRCODE = * ;LOADER CODE STARTS HERE 2950 PGMNAME .BYTE 0 2960 *=*+16 2970 ; 2980 LOADML LDA #<MOVETO ;ADDRESS OF NAME OF PROGRAM TO LOAD 2990 STA R6 3000 LDA #>MOVETO 3010 STA R6+1 3020 JSR LOOKUP 3030 TXA ;CHECK RETURN 3040 BEQ DISKOK ;..FOUND IT OK 3050 JMP RESTRT ;ELSE ABANDON THE LOAD & (null) BACK TO DESKTOP 3060 ; 3070 DISKOK LDA DENTRY+2 ;SECTOR OF FILE BEGINNING 3080 STA R1+1 3090 LDA DENTRY+1 ;TRACK OF FILE BEGINNING 3100 STA R1 3110 LDA #<BUF0 ;SET POINTER TO BUFFER FOR READ 3120 STA R4 3130 LDA #>BUF0 3140 STA R4+1 3150 JSR READ ;READ 1ST BUFFER 3160 LDA BUF0+2 ;GET PROGRAM LOAD ADRESS 3170 STA A0 3180 STA A1 ;ALSO STORE AS STARTING ADDRESS 3190 LDA BUF0+3 3200 STA A0+1 3210 STA A1+1 3220 LDX #3 ;SKIP T/S & ADDRESS 3230 BNE SKIPREAD ;..UNCONDITIONAL-SKIP 1ST READ 3240 READPGM LDA BUF0 ;GET TRACK/SECTOR OF NEXT BLOCK 3250 STA R1 3260 LDA BUF0+1 3270 STA R1+1 3280 JSR READ 3290 LDX #1 ;SKIP T/S POINTER FOR ALL OTHER BLOCKS 3300 SKIPREAD LDY #$FF ;ASSUME A FULL SECTOR 3310 LDA BUF0 ;CHECK NEXT TRACK POINTER 3320 BNE (null)ODNXTT ;..(null)OD NEXT TRACK 3330 LDY BUF0+1 ;ELSE THIS IS LAST SECTOR/PICK UP # VALID BYTES 3340 (null)ODNXTT STY R0 ;SAVE # VALID BYTES (255 FOR FULL SECTOR) 3350 LDY #0 3360 MOVELOOP INX 3370 LDA BUF0,X ;GET INPUT BYTE 3380 STA (A0),Y ;STORE IT 3390 INC A0 ;BUMP POINTER 3400 BNE A0OK 3410 INC A0+1 3420 A0OK CPX R0 ;CHECK IF TO END OF BUFFER 3430 BNE MOVELOOP ;..NOT YET/MORE TO DO 3440 LDA BUF0 ;CHECK IF MORE SECTORS TO (null) 3450 BNE READPGM ;..YES (NEXT TRACK POINTER IS NON-ZERO) 3460 JMP (A1) ;NOW (null) START PROGRAM 3470 ; 3480 LDREND = * ;END OF LOADER CODE TO MOVE 3490 ; 3500 BUF0 = $8000 ;GEOS BUFFER 0 3510 DENTRY = $8400 ;DIRECTORY ENTRY FROM LOOKUP 3520 DRVSRCH = $886E ;DRIVE SEARCH FLAG 3530 ; 3540 GRPHIC = $C136 ;GRAPHIC TABLE PROCESSOR 3550 MENU = $C151 ;MENU PROCESSOR 3560 DRWMNU = $C193 ;REDRAW THE MENU 3570 CMENUS = $C1BD ;CLOSE ALL MENUS 3580 READ = $C1E4 ;READ A SECTOR 3590 SAVE = $C1ED ;SAVE A GEOS FILE 3600 LOOKUP = $C20B ;LOOKUP FILE IN DIRECTORY 3610 RESTRT = $C22C ;RELOAD DESKTOP & RESTART GEOS 3620 DELETE = $C238 ;DELETE GEOS FILE 3630 WINDOW = $C256 ;WINDOW PROCESSOR ROUTINE 3640 ; 3650 .END