0010 0020 ; RAE-FODS linkage program 0030 ; written by Thomas Gettys 0040 0050 ; The new FODS addresses appear in this version 0060 ; date of change: 2/17/81 0070 0080 ; The multiple FODS-command feature is in this version 0090 ; date of change: 5/2/81 0100 0110 0120 .OS 0130 .BA $6B00 0140 0150 ; PAGE 0 AND 1 USAGE 0160 0170 TPRES .DE $D3 !PRESENT END OF RAE TEXT FILE 0180 JOBPTR .DE $A0 !MULTIPLE COMMAND PNTR INTO TXBUF 0190 EOT .DE $A8 !END OF FODS FILE 0200 DISCC.VEC .DE $EC !DISK COMMAND VECTOR 0210 DISCO .DE $EF !RAE TAPE/DISK OUTPUT FLAG 0220 DISC1 .DE $F0 !RAE DISK OUTPUT VECTOR 0230 DISC2 .DE $F2 !RAE DISK INPUT VECTOR 0240 DISCI.VEC .DE $F6 !RAE DISK IN DATA VECTOR 0250 TXST .DE $100 !START OF RAE FILE ADDRESS 0260 TXEN .DE $102 !END OF RAE FILE ADDRESS 0270 CON.TAPE .DE $114 !CONTINUE ON TAPE FLAG 0280 CRT .DE $135 !RAE INPUT BUFFER 0290 0300 ; FODS ADDRESSES 0310 0320 TXBUF .DE $7280 !FODS TEXT BUFFER 0330 SET2 .DE $7634 !SELECT DRIVE 2 0340 DSKRW .DE $765D !DRIVE CONTROL ROUTINE 0350 CMDINT .DE $79B3 !FODS COMMAND INTERPRETER 0360 0370 ; SUPERMON ADDRESSES 0380 0390 USRENT .DE $8035 !PSEUDO-INTERRUPT ENTRY 0400 SAVER .DE $8188 0410 NIBASC .DE $8309 !CONVERT NIBBLE IN A TO ASCII 0420 RIN .DE $887E 0430 ACCESS .DE $8B86 !UNWRITE PROTECT SYS. RAM 0440 0450 ; SYM SYSTEM RAM USAGE 0460 0470 SCRA .DE $A63A 0480 INVEC .DE $A660 0490 UBRKVC .DE $A676 !USER BREAK VECTOR 0500 0510 ; RAE ADDRESSES 0520 0530 RAE.COLD .DE $B000 !RAE COLD START 0540 RAE.WARM .DE $B003 !RAE WARM START 0550 ERROR .DE $B00E !RAE ERROR ROUTINE VECTOR 0560 RAE.HOT .DE $B05E !RAE WARM W/NO MESSAGE 0562 VECT1 .DE $DF68 0564 VECT2 .DE $DF80 0570 0580 0590 0600 6B00- 4C 09 6B 0610 INIT JMP COLD !THIS IS THE COLD ENTRY POINT 6B03- 20 0D 6C 0620 WARM JSR SET.VEC !THIS IS THE WARM ENTRY POINT 6B06- 4C 03 B0 0630 JMP RAE.WARM 0640 6B09- 20 0D 6C 0650 COLD JSR SET.VEC 0660 6B0C- 4C 00 B0 0670 JMP RAE.COLD 0830 0840 0850 ; All RAE disk files are prefaced with a colon. 0860 ; An error code of 30 means missing filename. 0870 6B0F- C0 50 0880 ENTER CPY #$50 !IF Y=50 FILENAME IS MISSING 6B11- D0 05 0890 BNE EN1 !Y POINTS AT FILENAME 6B13- A2 30 0900 LDX #$30 !ERR 30=NO FILENAME 6B15- 6C 0E B0 0910 JMP (ERROR) !PRINT ERROR MESSAGE 0920 6B18- A2 00 0930 EN1 LDX #0 6B1A- 86 EF 0940 STX *DISCO !RE-ENABLE TAPE OUTPUT 0950 0960 ; Build command string: ENT $s.adr$e.adr=:name 0970 ; Put it in FODS buffer and let FODS do the work 0980 6B1C- BD 93 6C 0990 EN2 LDA SAVE,X !GET NEXT CMD CHARACTER 6B1F- F0 06 1000 BEQ EN3 !ARE WE DONE? 6B21- 9D 80 72 1010 STA TXBUF,X !MOVE TO FODS BUFFER 6B24- E8 1020 INX 6B25- D0 F5 1030 BNE EN2 6B27- 20 7B 6C 1040 EN3 JSR RAE.STR !TELL FODS WHERE FILE STARTS 6B2A- A9 24 1050 LDA #'$ 6B2C- 9D 80 72 1060 STA TXBUF,X 6B2F- E8 1070 INX 6B30- 20 88 6C 1080 JSR RAE.END !TELL FODS WHERE FILE ENDS 6B33- 20 5C 6C 1090 JSR NAM.CMD !GO PUT NAME IN AND DO CMD 1100 6B36- 20 3E 6C 1110 EN4 JSR RST.DSK 6B39- A2 FF 1120 LDX #$FF !RESET STACK IN CASE WE 6B3B- 9A 1130 TXS !GOT A BRK FROM FODS 6B3C- 4C 5E B0 1140 JMP RAE.HOT !AND GO BACK TO RAE 1150 1160 1170 ; The file specified is loaded into the current text 1180 ; file area. If the file exceeds the current file 1190 ; boundary an error 31 results. The entire file has 1200 ; been brought in (if memory exists there) but the 1210 ; upper limit should be set to accommodate the whole 1220 ; file before any processing begins. If the filename 1230 ; is preceded with a plus sign it will be appended 1240 ; to the current file. Error 30=filename missing. 1250 6B3F- C0 50 1260 LOAD CPY #$50 6B41- D0 05 1270 BNE LO1 !Y POINTS AT FILENAME 6B43- A2 30 1280 LDX #$30 !ERR 30=NO FILENAME 6B45- 6C 0E B0 1290 JMP (ERROR) !PRINT ERROR MESSAGE 1300 6B48- 20 61 6B 1310 LO1 JSR DSK.LOD !BRING IN FILE 1320 6B4B- CD 03 01 1330 CMP TXEN+1 !TEST FOR 6B4E- 90 E6 1340 BCC EN4 !TEXT FILE 6B50- D0 07 1350 BNE LO6 !OVERFLOW 6B52- AD 02 01 1360 LDA TXEN !HIGH BYTES EQUAL, 6B55- C5 D3 1370 CMP *TPRES !SO MUST TEST 6B57- B0 DD 1380 BCS EN4 !LOW BYTES 1390 6B59- 20 3E 6C 1400 LO6 JSR RST.DSK 6B5C- A2 31 1410 LDX #$31 !ERR 31=OVERFLOW OF THE 6B5E- 6C 0E B0 1420 JMP (ERROR) !TEXT FILE ON DISK LOAD 1430 1440 1450 ; Build command string: LOD $s.adr=:name 1460 ; Put it in FODS buffer and let FODS do the work 1470 6B61- BD 99 6C 1480 DSK.LOD LDA LOD,X !GET NEXT CMD CHARACTER 6B64- F0 06 1490 BEQ LO3 !ARE WE DONE? 6B66- 9D 80 72 1500 STA TXBUF,X !MOVE TO FODS BUFFER 6B69- E8 1510 INX 6B6A- D0 F5 1520 BNE DSK.LOD 6B6C- B9 35 01 1530 LO3 LDA CRT,Y !GET 1ST CHARACTER IN NAME STRING 6B6F- C9 2B 1540 CMP #'+ !IS IT TO BE APPENDED? 6B71- D0 06 1550 BNE LO4 !IF NOT, SKIP 6B73- C8 1560 INY !BYPASS THE "+" 6B74- 20 88 6C 1570 JSR RAE.END !TELL FODS WHERE ATTACH POINT IS 6B77- D0 03 1580 BNE LO5 6B79- 20 7B 6C 1590 LO4 JSR RAE.STR !TELL FODS WHERE TO BEGIN FILE 6B7C- 20 5C 6C 1600 LO5 JSR NAM.CMD !GO PUT IN NAME AND DO CMD 1610 1620 ; Set EOT pointer and test for overflow 1630 6B7F- A9 00 1640 LDA #0 6B81- A0 02 1650 LDY #2 6B83- 91 A8 1660 STA (EOT),Y !FLAG EOT FOR RAE 6B85- A5 A8 1670 LDA *EOT !TELL RAE 6B87- 85 D3 1680 STA *TPRES !WHERE THE 6B89- A5 A9 1690 LDA *EOT+1 !END OF THE 6B8B- 85 D4 1700 STA *TPRES+1 !FILE IS 6B8D- 60 1710 RTS 1720 1730 1740 ; DC command entry point. Error 32 means 1750 ; command string missing. 1760 6B8E- C0 50 1770 DISK.CMD CPY #$50 6B90- D0 05 1780 BNE DC1 !Y POINTS AT COMMAND STRING 6B92- A2 32 1790 LDX #$32 !ERR 32=NO COMMAND STRING 6B94- 6C 0E B0 1800 JMP (ERROR) !PRINT ERROR MESSAGE 1810 6B97- 84 A0 1820 DC1 STY *JOBPTR 6B99- A2 00 1830 DC1.1 LDX #0 6B9B- A4 A0 1840 LDY *JOBPTR 6B9D- B9 35 01 1850 DC2 LDA CRT,Y !GET NEXT CMD CHARACTER 6BA0- 9D 80 72 1860 STA TXBUF,X !PUT IT IN FODS BUFFER 6BA3- E8 1870 INX 6BA4- C8 1880 INY 6BA5- C9 2C 1890 CMP #', 6BA7- F0 0B 1900 BEQ NXT.CMD 1910 6BA9- C9 20 1920 CMP #$20 !A BLANK? 6BAB- D0 F0 1930 BNE DC2 !NO, KEEP GOING 6BAD- B9 35 01 1940 LDA CRT,Y !GET CHARACTER AFTER SPACE 6BB0- C9 20 1950 CMP #$20 !ANOTHER ONE? 6BB2- D0 E9 1960 BNE DC2 !NOPE, STILL MORE 1970 6BB4- A9 0D 1980 NXT.CMD LDA #$D !PUT IN THE 6BB6- 84 A0 1990 STY *JOBPTR 6BB8- 9D 7F 72 2000 STA TXBUF-1,X 6BBB- 20 B3 79 2010 JSR CMDINT !LET FODS DEAL WITH IT 2020 6BBE- A4 A0 2030 DC3 LDY *JOBPTR 6BC0- B9 34 01 2040 LDA CRT-1,Y 6BC3- C9 2C 2050 CMP #', 6BC5- F0 D2 2060 BEQ DC1.1 6BC7- 4C 36 6B 2070 JMP EN4 2080 2090 6BCA- AD 14 01 2100 CON.DSK LDA CON.TAPE 6BCD- C9 0F 2110 CMP #$F 6BCF- D0 1C 2120 BNE TAPE !REALLY A TAPE CALL 2130 6BD1- AD 25 01 2140 LDA $125 6BD4- C9 01 2150 CMP #1 6BD6- D0 20 2160 BNE CT.OUT !IGNORE 2ND CALL 6BD8- 20 88 81 2170 JSR SAVER 6BDB- A0 0F 2180 LDY #$F 6BDD- B9 35 01 2190 NAM.CHK LDA CRT,Y 6BE0- C9 3B 2200 CMP #'; 6BE2- F0 09 2210 BEQ TAPE !LINE COMMENT - IGNORE IT 6BE4- C9 20 2220 CMP #$20 6BE6- D0 0D 2230 BNE NAM.FND !WE FOUND A FILE NAME 6BE8- C8 2240 INY 6BE9- C0 50 2250 CPY #$50 6BEB- D0 F0 2260 BNE NAM.CHK 2270 6BED- A9 00 2280 TAPE LDA #0 6BEF- 8D 10 01 2290 STA $110 6BF2- 4C 68 DF 2300 JMP VECT1 2310 6BF5- 20 61 6B 2320 NAM.FND JSR DSK.LOD 6BF8- 20 3E 6C 2330 CT.OUT JSR RST.DSK 6BFB- 18 2340 CLC 6BFC- 4C 80 DF 2350 JMP VECT2 2360 2370 2380 ; ^C.CHK is entered whenever a BRK instruction 2390 ; occurs. If the break was due to a CTRL-C in 2400 ; RAE we exit to SUPERMON, otherwise it must 2410 ; have come from FODS, so we stay in RAE. 2420 6BFF- BA 2430 ^C.CHK TSX 6C00- BD 03 01 2440 LDA $103,X !GET PC,HIGH 6C03- C9 B0 2450 CMP #$B0 !BRK FROM RAE? 6C05- D0 B7 2460 BNE DC3 !NO, SO STAY IN RAE 6C07- 20 35 80 2470 JSR USRENT !ELSE GOTO SUPERMON 6C0A- 4C 03 6B 2480 JMP WARM !DO A WARM START 2490 2500 2510 ; *** SUPPORT SUBROUTINES *** 2520 2530 2540 ; SETUP ALL NECESSARY VECTORS FOR FODS AND RAE 2550 6C0D- 20 3E 6C 2560 SET.VEC JSR RST.DSK 2570 6C10- A9 CA 2580 LDA #L,CON.DSK 6C12- 85 F6 2590 STA *DISCI.VEC 6C14- A9 6B 2600 LDA #H,CON.DSK 6C16- 85 F7 2610 STA *DISCI.VEC+1 2620 6C18- A9 0F 2630 LDA #L,ENTER 6C1A- 85 F0 2640 STA *DISC1 6C1C- A9 6B 2650 LDA #H,ENTER 6C1E- 85 F1 2660 STA *DISC1+1 2670 6C20- A9 3F 2680 LDA #L,LOAD 6C22- 85 F2 2690 STA *DISC2 6C24- A9 6B 2700 LDA #H,LOAD 6C26- 85 F3 2710 STA *DISC2+1 2720 6C28- A9 8E 2730 LDA #L,DISK.CMD 6C2A- 85 EC 2740 STA *DISCC.VEC 6C2C- A9 6B 2750 LDA #H,DISK.CMD 6C2E- 85 ED 2760 STA *DISCC.VEC+1 2770 6C30- 20 86 8B 2780 JSR ACCESS 6C33- A9 FF 2790 LDA #L,^C.CHK 6C35- 8D 76 A6 2800 STA UBRKVC 6C38- A9 6B 2810 LDA #H,^C.CHK 6C3A- 8D 77 A6 2820 STA UBRKVC+1 2830 6C3D- 60 2840 RTS 2850 2860 2870 ; RESET DRIVES OFF AND DEFAULT TO DRIVE 2 2880 6C3E- A9 20 2890 RST.DSK LDA #$20 !DRIVES OFF CODE 6C40- 20 5D 76 2900 JSR DSKRW !GO TURN 'EM OFF 6C43- 20 34 76 2910 JSR SET2 !DEFAULT IS DRIVE 2 6C46- 60 2920 RTS 2930 2940 2950 ; CONVERT A TO 2 HEX DIGITS & PUT 'EM IN TXBUF 2960 6C47- 48 2970 HEX.ASC PHA 6C48- 4A 2980 LSR A 6C49- 4A 2990 LSR A 6C4A- 4A 3000 LSR A 6C4B- 4A 3010 LSR A 6C4C- 20 09 83 3020 JSR NIBASC 6C4F- 9D 80 72 3030 STA TXBUF,X 6C52- E8 3040 INX 6C53- 68 3050 PLA 6C54- 20 09 83 3060 JSR NIBASC 6C57- 9D 80 72 3070 STA TXBUF,X 6C5A- E8 3080 INX 6C5B- 60 3090 RTS 3100 3110 3120 ; PUT NAME IN FODS BUFFER & PASS COMMAND TO FODS 3130 6C5C- A9 3D 3140 NAM.CMD LDA #'= 6C5E- 9D 80 72 3150 STA TXBUF,X 6C61- E8 3160 INX 6C62- A9 3A 3170 LDA #': !ALL RAE FILES BEGIN WITH ":" 6C64- 9D 80 72 3180 STA TXBUF,X 6C67- B9 35 01 3190 MOV.NAM LDA CRT,Y !MOVE FILENAME INTO FODS BUFFER 6C6A- E8 3200 INX 6C6B- C8 3210 INY 6C6C- 9D 80 72 3220 STA TXBUF,X 6C6F- C9 20 3230 CMP #$20 6C71- D0 F4 3240 BNE MOV.NAM 6C73- A9 0D 3250 LDA #$D 6C75- 9D 80 72 3260 STA TXBUF,X !PUT IN A 6C78- 4C B3 79 3270 JMP CMDINT !AND LET FODS FIGURE IT OUT 3280 3290 3300 ; TELL FODS WHERE RAE TEXT AREA BEGINS 3310 6C7B- AD 01 01 3320 RAE.STR LDA TXST+1 !CONVERT RAE 6C7E- 20 47 6C 3330 JSR HEX.ASC !START ADDRESS 6C81- AD 00 01 3340 LDA TXST !TO ASCII 6C84- 20 47 6C 3350 JSR HEX.ASC !AND PUT IN FODS BUFFER 6C87- 60 3360 RTS 3370 3380 3390 ; TELL FODS WHERE RAE TEXT AREA ENDS 3400 6C88- A5 D4 3410 RAE.END LDA *TPRES+1 !CONVERT RAE 6C8A- 20 47 6C 3420 JSR HEX.ASC !END ADDRESS 6C8D- A5 D3 3430 LDA *TPRES !TO ASCII 6C8F- 20 47 6C 3440 JSR HEX.ASC !AND PUT IN FODS BUFFER 6C92- 60 3450 RTS 3460 6C93- 45 4E 54 3470 SAVE .BY 'ENT $' 0 6C96- 20 24 00 6C99- 4C 4F 44 3480 LOD .BY 'LOD $' 0 6C9C- 20 24 00 3490 3540 .EN 0000,6C9F,6C9F >