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
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
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
800 STA R10+1
810 LDX #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
920 STA R10+1
930 LDX #LDRNW
950 JSR XYWINDOW
960 LDA R0 ;CHECK FOR CANCEL
970 CMP #2
980 BEQ DOAGAIN ;..YES-RESTART
990 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
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
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
1370 ADC #>MOVETO
1380 STA SAVEND+1
1390 LDA #0 ;TRY STARTING ON 1ST PAGE OF DIRECTORY
1400 STA R10
1410 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 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
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