0010 ; 20:02:28 SUNDAY NOV 18 1990 0020 0030 ; Boot loader for FODS 0035 ; THIS PROGRAM IS LOADED INTO PAGE $00 AND EXECUTED. 0040 0050 0060 BOOT .DE $00 0070 POINTER .DE $C3 0080 0090 ; FODS CONTROLLER LOCATIONS 0100 0110 DSK.REGB .DE $A880 0120 DSK.REGA .DE $A881 0130 DSK.DDRB .DE $A882 0140 DSK.DDRA .DE $A883 0150 DSK.PCR .DE $A88C 0160 DSK.IFR .DE $A88D 0170 0180 FODS .DE $7300 ; FODS cold entry point 0190 MON.WARM .DE $8003 ; MON warm entry 0200 0210 .BA $6000 0220 0230 6000- A2 C2 0240 START LDX #$C2 ; LENGTH OF PROGRAM 6002- BD 0F 60 0250 MOVE LDA ZSTART+$600F,X 6005- 95 00 0260 STA *BOOT,X 6007- CA 0270 DEX 6008- E0 FF 0280 CPX #$FF 600A- D0 F6 0290 BNE MOVE 600C- 4C 00 00 0300 JMP BOOT 0310 0320 .BA $0000 0325 .MC $600F 0330 0000- 20 A7 00 0340 ZSTART JSR SETUP ; turn on disk 0003- A9 BF 0350 LDA #$BF 0005- 8D 82 A8 0360 STA DSK.DDRB 0008- A2 00 0370 LDX #$0 ; One second delay 000A- A0 00 0380 LDY #$0 000C- E6 C3 0390 DELAY INC *POINTER 000E- E6 C3 0400 INC *POINTER 0010- E8 0410 INX 0011- D0 F9 0420 BNE DELAY 0013- C8 0430 INY 0014- D0 F6 0440 BNE DELAY 0016- 86 C3 0450 LOAD STX *POINTER ; FODS start load address 0018- A9 73 0460 LDA #$73 ; change for your FODS, Mine starts at $D3 001A- 85 C4 0470 STA *POINTER+1 001C- A0 F4 0480 DSK.WAIT LDY #$F4 001E- 20 92 00 0490 JSR Y.OUT 0021- 20 A0 00 0500 JSR STATUS 0024- D0 F6 0510 BNE DSK.WAIT 0026- A0 A4 0520 NXT.TRK LDY #$A4 0028- 20 92 00 0530 JSR Y.OUT 002B- 20 A0 00 0540 JSR STATUS 002E- D0 5C 0550 BNE XWARM ; ERROR - jump to MON for message 0030- A2 FE 0560 LDX #$FE ; First sector to be read 0032- CE 83 A8 0570 NXT.SECT DEC DSK.DDRA ; change DDRA to output 0035- A9 10 0580 LDA #$10 0037- 8D 80 A8 0590 STA DSK.REGB 003A- 8E 81 A8 0600 STX DSK.REGA 003D- A0 77 0610 LDY #$77 003F- 20 92 00 0620 JSR Y.OUT 0042- EE 83 A8 0630 INC DSK.DDRA ; change to input 0045- A9 38 0640 LDA #$38 0047- 8D 80 A8 0650 STA DSK.REGB 0660 0670 ; READ A SECTOR 0680 004A- A0 7F 0690 LDY #$7F ; 128 bytes 004C- AD 8D A8 0700 READBYTE LDA DSK.IFR ; wait for a low to 004F- 29 02 0710 AND #$02 ; high transition 0051- F0 F9 0720 BEQ READBYTE ; of the CA1 flag 0053- AD 81 A8 0730 LDA DSK.REGA 0056- 91 C3 0740 CHECK STA (POINTER),Y 0058- D0 00 0750 BNE NXT.INSTR 005A- 88 0760 NXT.INSTR DEY 005B- 10 EF 0770 BPL READBYTE 005D- 20 A0 00 0780 JSR STATUS 0060- D0 2A 0790 BNE XWARM ; jump to MON for error message 0800 0810 ; NEXT SECTOR 0820 0062- D8 0830 CLD ; bump store address by $80 0063- 18 0840 CLC ; for next sector 0064- A5 C3 0850 LDA *POINTER 0066- 69 80 0860 ADC #$80 0068- 85 C3 0870 STA *POINTER 006A- A5 C4 0880 LDA *POINTER+1 006C- 69 00 0890 ADC #$00 006E- 85 C4 0900 STA *POINTER+1 0070- C9 80 0910 CMP #$80 ; FODS loaded? (change to load end), Mine is $F8 0072- D0 11 0920 BNE CONT.LD 0074- A5 59 0930 LDA *NXT.INSTR-1 ; has load been checked? 0076- D0 17 0940 BNE X.FODS ; run FODS if it has 0950 0960 ; MODIFY CODE TO CHECK 2nd LOAD AGAINST 1st 0970 0078- A9 D1 0980 LDA #$D1 ; change STA (91) to CMP (D1) 007A- 85 56 0990 STA *CHECK ; at zero page location $56 007C- A9 32 1000 LDA #XWARM-CHECK-4 007E- 85 59 1010 STA *NXT.INSTR-1 ; branch to WARM 0080- A2 00 1020 LDX #$00 ; start load address low 0082- 4C 16 00 1030 JMP LOAD 0085- E0 EF 1040 CONT.LD CPX #$EF ; read 16 sectors 0087- F0 9D 1050 BEQ NXT.TRK 0089- CA 1060 DEX 008A- D0 A6 1070 BNE NXT.SECT 008C- 4C 03 80 1080 XWARM JMP MON.WARM 008F- 4C 00 73 1090 X.FODS JMP FODS 0092- A9 FF 1100 Y.OUT LDA #$FF 0094- 8D 83 A8 1110 STA DSK.DDRA ; all lines to output 0097- A9 00 1120 LDA #$00 0099- 8D 80 A8 1130 STA DSK.REGB ; send %0000 0000 009C- 8C 81 A8 1140 STY DSK.REGA ; output data in y reg 009F- 60 1150 RTS 00A0- AD 8D A8 1160 STATUS LDA DSK.IFR 00A3- 29 10 1170 AND #$10 00A5- F0 F9 1180 BEQ STATUS ; wait for bit 4 set 00A7- A9 00 1190 SETUP LDA #$00 00A9- 8D 83 A8 1200 STA DSK.DDRA ; all lines to input 00AC- A9 20 1210 LDA #$20 00AE- 8D 80 A8 1220 STA DSK.REGB 00B1- A9 DB 1230 LDA #$DB ; send "0" pulse from CB2 (norm hi) 00B3- 8D 8C A8 1240 STA DSK.PCR ; CA1 & CA2 int flag set on 00B6- A9 FB 1250 LDA #$FB ;low to high transition 00B8- 8D 8C A8 1260 STA DSK.PCR 00BB- AD 81 A8 1270 LDA DSK.REGA ; check status 00BE- 49 FF 1280 EOR #$FF ; flip bits 00C0- 29 98 1290 AND #$98 ; mask bits 7,4,3 00C2- 60 1300 RTS 1310 .EN 0000,00C3,00C3 >