0005 0010 ; BASIC-FODS linkage program 0015 ; written by Thomas Gettys 0020 0025 ; THIS PROGRAM CONTAINS THE ADDRESSES FOR 0030 ; THE NEWEST VERION OF FODS (1/20/81) 0035 0040 .ES 0045 .OS 0050 .BA $6000 0055 0060 ; PAGE 0 AND 1 USAGE 0065 0070 RESULT .DE $1C !BUFFER FOR RESULT OF A CONVERSION 0075 BAS.ST .DE $7B !START OF BASIC POINTER 0080 BAS.EN .DE $7D !START OF SIMPLE VARIABLES POINTER 0085 PROGEND .DE $81 !START OF FREE MEMORY 0090 STRPTR .DE $83 !START OF STRINGS POINTER 0095 TOPMEM .DE $87 !TOP OF MEMORY POINTER 0100 EOT .DE $A8 !END OF FODS FILE 0105 LINNUM .DE $AF !BINARY OF ASCII STRING 0110 TRIG.PATCH .DE $C4 !TRIG PACKAGE PATCH POINT 0115 CHRGET .DE $CC !BASIC'S CHARACTER GETTING ROUTINE 0120 CHRGOT .DE $D2 !RE-GET LAST CHARACTER 0125 BAS.PTR .DE $D3 !BASIC'S CHARACTER POINTER 0130 STACK .DE $101 !STACK TOP=STACK+S 0135 BUFFER .DE $0135 !INPUT BUFFER 0140 0145 ; FODS ADDRESSES 0150 0155 TXBUF .DE $7280 !FODS INPUT BUFFER 0160 SET2 .DE $7634 !SELECT DRIVE 2 0165 DSKRW .DE $765D !DRIVE CONTROL ROUTINE 0170 CMDINT .DE $79B3 !FODS COMMAND INTERPRETER 0175 FODBRK .DE $7AF0 !ENTRY POINT AFTER ^C 0180 0185 0190 ; SUPERMON ADDRESSES 0195 0200 USRENT .DE $8035 !USER PSEUDO-INTERRUPT ENTRY 0205 PSHOVE .DE $8208 !PUSH PARMS DOWN 0210 PARM .DE $8220 !GET PARAMETERS FROM USER 0215 P2SCR .DE $829C !MOVE PARM 2 TO FE,FF 0220 OUTXAH .DE $82F4 !PRINT X,A AS HEX DIGITS 0225 NIBASC .DE $8309 !CONVERT NIBBLE IN A TO ASCII 0230 SPACE .DE $8342 !PRINT A SPACE 0235 CRLF .DE $834D !PRINT A , 0240 BLKMOV .DE $8740 !BLOCK MOVE ROUTINE 0245 PTRIN .DE $8872 !MOVE PARM 3 TO FA,FB 0250 RESXAF .DE $8A3E !RESTORE ALL BUT A AND F 0255 INTCHR .DE $8A58 !INPUT CHARACTER ROUTINE 0260 ACCESS .DE $8B86 !UNWRITE PROTECT SYS RAM 0265 0270 ; SYM SYSTEM RAM USAGE 0275 0280 PARNR .DE $A649 !NO. PARMS ENTERED 0285 P3 .DE $A64A !PARAMETER 3 0290 P2 .DE $A64C !PARAMETER 2 0295 P1 .DE $A64E !PARAMETER 1 0300 INVEC .DE $A660 !INPUT TRANSFER VECTOR 0305 OUTVEC .DE $A663 !OUTPUT TRANSFER VECTOR 0310 UBRKVC .DE $A676 !USER BREAK VECTOR 0315 0320 ; BASIC ADDRESSES 0325 0330 BASIC.COLD .DE $C000 !COLD START TO BAS-1 0335 ERR.MES .DE $C25A !BASIC'S MESSAGE PRINTER 0340 BASIC.WARM .DE $C27E !WARM START TO BAS-1 0345 FXLNK2 .DE $C32C 0350 FNDNUM .DE $C427 !FIND LINE W/NUMBER IN 1C,1D 0355 FXLNK1 .DE $C46D 0360 INFIX .DE $C7F5 !ASCII -> BINARY IN 1C,1D 0365 0370 0375 ; DOUBLE STORE MACRO DEFINITION 0380 0385 !!!DS .MD (DATA ADDRS) ;PUT DATA IN ADDRS 0390 LDA #L,DATA 0395 STA ADDRS 0400 LDA #H,DATA 0405 STA ADDRS+1 0410 .ME 0415 0420 0425 0430 ; THIS IS THE COLD ENTRY POINT 0435 0440 ; BEGIN is the cold entry point, and WARM is the 0445 ; warm entry point. INVEC is reset so control is 0450 ; passed to the initialization routine when BASIC 0455 ; wants the memory size input, as by the BASIC is 0460 ; done with its own intiializations. 0465 6000- 4C 06 60 0470 BEGIN JMP COLD !BASIC PATCH COLD START 6003- 4C 02 61 0475 WARM JMP ^C.ENTRY !BASIC PATCH WARM START 0480 6006- 20 86 8B 0485 COLD JSR ACCESS 0490 DS (INITIAL INVEC+1) 6009- A9 16 600B- 8D 61 A6 600E- A9 60 6010- 8D 62 A6 6013- 4C 00 C0 0495 JMP BASIC.COLD 0500 0505 ; INITIAL provides the necessary vector changes 0510 ; and a memory size default so this program is 0515 ; protected from BASIC blowing it away. The link 0520 ; to BASIC is done through CHRGET in page 0. 0525 6016- 20 BA 63 0530 INITIAL JSR SETUP 6019- 20 54 60 0535 JSR GET.LINE !INPUT MEMORY SIZE 601C- C0 01 0540 CPY #1 ! ONLY? 601E- D0 0C 0545 BNE TCP !IF NOT, USE SUPPLIED SIZE 0550 6020- 88 0555 DEY !Y=0 NOW 6021- B9 F6 64 0560 SET.MEM LDA MEMORY,Y !GET NEXT DIGIT 6024- 99 35 01 0565 STA BUFFER,Y !PUT IT IN BUFFER 6027- C8 0570 INY 6028- C0 06 0575 CPY #6 !LAST DIGIT? 602A- 90 F5 0580 BCC SET.MEM !IF NOT, DO NEXT ONE 0585 602C- 68 0590 TCP PLA 602D- 68 0595 PLA 602E- 4C 3B 60 0600 JMP LINE+3 !JUMP INTO TERMINAL CONTROL PATCH 0605 0610 0615 ; The following code is the terminal control patch. 0620 ; It provides the following features to SYM BASIC: 0625 0630 ; cancel last characer - control H 0635 ; cancel current line - control X 0640 ; exit to SUPERMON - control C 0645 ; auto line numbering - control A 0650 0655 ; -------------------------------- 0660 0665 0670 ; BAS.GET is pointed to by INVEC, so BASIC comes 0675 ; here for its input. As each character is input 0680 ; it is put into BUFFER and processed until a CR 0685 ; is entered. If BUFFER is not empty the contents 0690 ; are passed to BASIC 1 character per request. 0695 6031- 68 0700 BAS.GET PLA !PULL OFF RETURN ADDRESS 6032- 68 0705 PLA !TO ALLOW LOWERCASE INPUT 6033- AD E2 64 0710 LDA NUMBER !CRT BUFFER EMPTY? 6036- D0 0B 0715 BNE CHAR !IF NOT GET NEXT CHARACTER 0720 0725 ; BUFFER EMPTY - GET NEXT LINE 0730 6038- 20 54 60 0735 LINE JSR GET.LINE 603B- 8C E2 64 0740 STY NUMBER !SAVE # CHARS. INPUTTED 603E- A9 00 0745 LDA #0 6040- 8D E3 64 0750 STA INDEX !INITIALIZE BUFFER INDEX 0755 0760 ; PASS BASIC NEXT CHARACTER 0765 6043- AC E3 64 0770 CHAR LDY INDEX 6046- B9 35 01 0775 LDA BUFFER,Y 6049- EE E3 64 0780 INC INDEX !UPDATE BUFFER POINTER 604C- CE E2 64 0785 DEC NUMBER !UPDATE COUNT REMAINING 604F- C9 0D 0790 CMP #$D !SET FLAGS EXPECTED BY BASIC 6051- 4C 3E 8A 0795 JMP RESXAF !RETURN TO BASIC 0800 0805 0810 0815 ; GET.LINE inputs the entire line before returning. 0820 ; As each character is entered it is checked to see 0825 ; if it is any of our command characters, and if so 0830 ; the appropriate action is taken. 0835 6054- A0 00 0840 GET.LINE LDY #0 !INITIALIZE BUFFER INDEX 6056- 2C E4 64 0845 BIT FLAG !AUTO NUMBER ENABLED? 6059- 10 28 0850 BPL LP.GET !NO, GO ON 605B- A5 FF 0855 LDA *$FF !GET LINE NUMBER, HIGH 605D- AA 0860 TAX !SAVE IT AWAY 605E- 20 8D 64 0865 JSR H.TO.A !CONVERT TO ASCII & PUT IN BUFFER 6061- A5 FE 0870 LDA *$FE !GET LINE NUMBER, LOW 6063- 20 8D 64 0875 JSR H.TO.A !CONVERT TO ASCII & PUT IN BUFFER 6066- A5 FE 0880 LDA *$FE !GET IT AGAIN 6068- 20 F4 82 0885 JSR OUTXAH !SEND LINE NUMBER TO TERMINAL 606B- 20 42 83 0890 JSR SPACE !SEND A BLANK 606E- A9 20 0895 LDA #$20 !PUT BLANK IN BUFFER 6070- 99 35 01 0900 STA BUFFER,Y 6073- C8 0905 INY !COUNT THE BLANK 6074- 18 0910 CLC 6075- F8 0915 SED 6076- A5 FE 0920 LDA *$FE !ADD INCREMENT 6078- 65 FA 0925 ADC *$FA !TO LINE NUMBER 607A- 85 FE 0930 STA *$FE 607C- A5 FF 0935 LDA *$FF 607E- 65 FB 0940 ADC *$FB 6080- 85 FF 0945 STA *$FF 6082- D8 0950 CLD 0955 6083- 20 05 64 0960 LP.GET JSR INPUT !GET A CHARACTER 6086- F0 FB 0965 BEQ LP.GET 6088- 99 35 01 0970 STA BUFFER,Y 608B- C8 0975 INY !UPDATE BUFFER POINTER 608C- C9 0D 0980 CMP #$D !IS IT A ? 608E- D0 01 0985 BNE ^A.CHECK 6090- 60 0990 RTS !IF SO, RETURN 0995 1000 1005 ; Check for special control characters 1010 6091- C9 01 1015 ^A.CHECK CMP #1 !IS IT A CTRL A? 6093- D0 41 1020 BNE ^H.CHECK !NOPE 6095- C0 06 1025 CPY #6 !ARE WE IN AUTO? 6097- F0 69 1030 BEQ ^C.ENTRY !YES, SO EXIT AUTO 6099- C0 01 1035 CPY #1 !IS THIS A NEW LINE? 609B- D0 39 1040 BNE ^H.CHECK !NO, SO IGNORE THE ^A 609D- A9 41 1045 LDA #'A !OUTPUT THE PROMT 609F- 20 63 A6 1050 JSR OUTVEC 60A2- 20 42 83 1055 JSR SPACE 60A5- 20 86 8B 1060 JSR ACCESS 60A8- 20 20 82 1065 JSR PARM !GET THE PARAMETERS 60AB- F0 05 1070 BEQ NO.ERR !VALID TERMINATION? 60AD- A2 08 1075 LDX #8 !NO, SO SEND ERROR MESSAGE 60AF- 4C 5A C2 1080 JMP ERR.MES 1085 60B2- AC 49 A6 1090 NO.ERR LDY PARNR !GET NO. PARMS ENTERED 60B5- F0 14 1095 BEQ RESUME !IF NONE, RESUME WITH OLD PARMS 60B7- 88 1100 DEY 60B8- D0 0B 1105 BNE MOV.PARM !2 PARMS, SO USE 'EM 60BA- 20 08 82 1110 JSR PSHOVE !PUSH START NO. INTO P2 60BD- A9 10 1115 LDA #$10 !DEFAULT INCREMENT 60BF- 8D 4A A6 1120 STA P3 60C2- 8C 4B A6 1125 STY P3+1 60C5- 20 72 88 1130 MOV.PARM JSR PTRIN !MOVE INCREMENT TO FA,FB 60C8- 20 9C 82 1135 JSR P2SCR !MOVE START NUMBER TO FE,FF 60CB- A9 FF 1140 RESUME LDA #$FF !SET AUTO FLAG 60CD- 8D E4 64 1145 STA FLAG 60D0- 20 4D 83 1150 JSR CRLF 60D3- 4C 54 60 1155 GO.GET JMP GET.LINE 1160 1165 60D6- C9 08 1170 ^H.CHECK CMP #8 !IS IT A CTRL H? 60D8- D0 0A 1175 BNE ^X.CHECK 60DA- 88 1180 DEY !IF SO BACK UP POINTER 60DB- 88 1185 DEY ! FOR CTRL H AND CHAR. 60DC- 30 F5 1190 BMI GO.GET 60DE- 20 FC 63 1195 JSR SP.BS !ERASE CHARACTER 60E1- 4C 83 60 1200 JMP LP.GET !GO GET NEXT CHARACTER 1205 1210 60E4- C9 18 1215 ^X.CHECK CMP #$18 !IS IT A CTRL X? 60E6- D0 09 1220 BNE ^C.CHECK 60E8- 88 1225 CLEAR.LINE DEY !REMOVE LINE FROM SCREEN 60E9- F0 E8 1230 BEQ GO.GET 60EB- 20 F7 63 1235 JSR BS.SP.BS 60EE- 4C E8 60 1240 JMP CLEAR.LINE 1245 1250 60F1- C9 03 1255 ^C.CHECK CMP #3 !IS IT A CTRL C? 60F3- D0 8E 1260 BNE LP.GET !IF NOT, CONTINUE INPUT 1265 DS (INTCHR INVEC+1) 60F5- A9 58 60F7- 8D 61 A6 60FA- A9 8A 60FC- 8D 62 A6 60FF- 20 35 80 1270 JSR USRENT !IF SO, RESET INVEC & TO TO MON 1275 1280 ; Entry point on a G monitor command after a ^C 1285 6102- A9 00 1290 ^C.ENTRY LDA #0 6104- 8D E2 64 1295 STA NUMBER !FLAG CRT BUFFER EMPTY 6107- 20 BA 63 1300 JSR SETUP !FIX VECTORS 610A- 4C 7E C2 1305 JMP BASIC.WARM 1310 1315 1320 1325 1330 1335 ; The following code is the BASIC-FODS linkage. It 1340 ; provides the following features to the user: 1345 1350 ; get a BASIC program from disk .LOAD filename 1355 ; put a BASIC program to disk .ENTER filename 1360 ; execute a FODS disk command .DC commandstring 1365 ; renumber a BASIC program .NUMBER p1,p2,p3,p4 1370 ; execute a true computed GOTO .GT expression 1375 ; append a BASIC program .APPEND filename 1380 ; delete a range of lines .DELETE llll-uuuu 1385 1390 1395 1400 1405 ; BAS.DOS is jumped to from BASIC's CHRGET routine 1410 ; in page 0. All disk commands must be preceded 1415 ; by a "." for them to be recognized. 1420 610D- C9 2E 1425 BAS.DOS CMP #'. !MIGHT THIS BE A DISK COMMAND? 610F- F0 0F 1430 BEQ CHK.STK !MAYBE; WE'LL SEE 6111- 38 1435 BAS.RTN SEC !NOPE, FINISH CHRGET ROUTINE 6112- E9 30 1440 SBC #$30 6114- 4C E0 00 1445 JMP $E0 1450 6117- A9 2E 1455 NO.GO LDA #'. !NOT A DISK COMMAND 6119- D0 F6 1460 BNE BAS.RTN !SO RESUME WITH BASIC 1465 611B- A2 02 1470 DC.ERR LDX #2 611D- 4C 5A C2 1475 JMP ERR.MES 1480 6120- BA 1485 CHK.STK TSX !SEE WHERE 6121- A9 D3 1490 LDA #$D3 !WE CAME FROM 6123- DD 01 01 1495 CMP STACK,X !BY EXAMINING 6126- D0 EF 1500 BNE NO.GO !THE TOP OF 6128- A9 C5 1505 LDA #$C5 !THE STACK 612A- DD 02 01 1510 CMP STACK+1,X 612D- D0 E8 1515 BNE NO.GO 1520 1525 ; At this point we seem to have a valid disk 1530 ; command, so search command table to see. 1535 612F- A0 00 1540 LDY #0 6131- 20 0B 64 1545 JSR OUR.GET !POINT TO 1ST COMMAND CHAR. 6134- AE 61 61 1550 LDX NUM.CMD !GET NO. OF COMMANDSx2-2 6137- A0 00 1555 CMD.CHK LDY #0 6139- B1 D3 1560 LDA (BAS.PTR),Y 613B- DD 62 61 1565 CMP CMD.TBL,X 613E- D0 08 1570 BNE NXT.CMD 6140- C8 1575 INY 6141- B1 D3 1580 LDA (BAS.PTR),Y 6143- DD 63 61 1585 CMP CMD.TBL+1,X 6146- F0 06 1590 BEQ CMD.FND !IT'S A VALID COMMAND 6148- CA 1595 NXT.CMD DEX 6149- CA 1600 DEX 614A- 10 EB 1605 BPL CMD.CHK !KEEP LOOKING 614C- 30 CD 1610 BMI DC.ERR !NOT A VALID COMMAND 1615 614E- 88 1620 CMD.FND DEY 614F- 20 0B 64 1625 FND.BNK JSR OUR.GET !FIND THE NEXT 6152- F0 04 1630 BEQ FND.1 !BLANK BEFORE TAKING 6154- C9 20 1635 CMP #$20 !OFF TO PROCESS 6156- D0 F7 1640 BNE FND.BNK !THE COMMAND 6158- BD 7B 61 1645 FND.1 LDA CMD.ADR+1,X 615B- 48 1650 PHA 615C- BD 7A 61 1655 LDA CMD.ADR,X 615F- 48 1660 PHA 6160- 60 1665 RTS !GO TO COMMAND PROCESSOR 1670 1675 1680 ; The following tables contain the disk command info 1685 ; NUM.CMD= (number of commands)x2 - 2 1690 ; CMD.TBL= list of valid 2 character command strings 1695 ; CMD.ADR= list of associated routine addresses - 1 1700 6161- 12 1705 NUM.CMD .BY 18 6162- 45 4E 4C 1710 CMD.TBL .BY 'EN' 'LO' $93 $20 ;93=LOAD TOKEN 6165- 4F 93 20 6168- 44 43 4E 1715 .BY 'DC' 'NU' 'GT' 616B- 55 47 54 616E- 44 45 41 1720 .BY 'DE' 'AP' 6171- 50 6172- 45 44 4C 1725 .BY 'ED' 'LD' 'XX' 'XX' 6175- 44 58 58 6178- 58 58 1730 617A- C7 61 1735 CMD.ADR .SI ENTER-1 617C- E8 61 1740 .SI LOAD-1 617E- E8 61 1745 .SI LOAD-1 6180- 91 61 1750 .SI DSK.CMD-1 6182- 08 62 1755 .SI RESEQ-1 6184- 1D 62 1760 .SI GOTO-1 6186- 2C 62 1765 .SI DELETE-1 6188- 9E 62 1770 .SI APPEND-1 618A- DA 62 1775 .SI ENT.DATA-1 618C- 3D 63 1780 .SI LOD.DATA-1 618E- 9E 62 1785 .SI APPEND-1 6190- 9E 62 1790 .SI APPEND-1 1795 1800 1805 1810 1815 ; DSK.CMD processes all commands beginning with .DC 1820 ; by simply inserting the command string into FODS' 1825 ; buffer and letting FODS process it. 1830 6192- 20 18 64 1835 DSK.CMD JSR SAV.0 !SAVE PAGE 0 STUFF 6195- E8 1840 INX 6196- 20 CC 00 1845 JSR CHRGET !GET NEXT NON-BLANK CHARACTER 6199- 20 A2 64 1850 DC.2 JSR TOKEN !IF A TOKEN, CONVERT IT TO ASCII 619C- 9D 80 72 1855 DC.5 STA TXBUF,X !PUT IN FODS BUFFER 619F- E8 1860 INX 61A0- 20 0B 64 1865 JSR OUR.GET 61A3- D0 F4 1870 BNE DC.2 1875 61A5- A9 0D 1880 DC.6 LDA #$D !PUT A IN FODS BUFFER 61A7- 9D 80 72 1885 STA TXBUF,X 61AA- 20 B3 79 1890 JSR CMDINT !LET FODS TAKE OVER 1895 1900 1905 ; UBRKVC points here, so we come here whether 1910 ; exit from FODS was by an RTS or BRK. 1915 61AD- A2 0F 1920 BRK.IN LDX #$F !NOW WE CAN 61AF- BD D2 64 1925 BRK.1 LDA Z.BUF,X !RESTORE THE 61B2- 95 A0 1930 STA *$A0,X !PAGE 0 STUFF 61B4- CA 1935 DEX !FOR BASIC 61B5- 10 F8 1940 BPL BRK.1 1945 61B7- A5 D3 1950 LDA *BAS.PTR !DECREMENT BASIC'S POINTER 61B9- D0 02 1955 BNE BRK.2 !SO IT POINTS BACK AT THE 61BB- C6 D4 1960 DEC *BAS.PTR+1 61BD- C6 D3 1965 BRK.2 DEC *BAS.PTR !0 OR : WE FOUND 1970 61BF- 20 23 64 1975 JSR RST.DSK !RESET DRIVES 61C2- A2 FC 1980 LDX #$FC !FIX THE STACK POINT 61C4- 9A 1985 TXS !FOR BASIC AND 61C5- 4C CC 00 1990 JMP CHRGET !JUST KEEP ON GOIN'! 1995 2000 2005 ; ENTER processes the .ENTER command. All BASIC 2010 ; disk files are identified by the preface ".". 2015 61C8- 20 18 64 2020 ENTER JSR SAV.0 !SAVE PAGE 0 STUFF 2025 2030 ; Build command string: ENT $s.adr$e.adr=filename 2035 ; Put it in FODS buffer and let FODS do the work. 2040 61CB- E8 2045 INX 61CC- BD E5 64 2050 EN.1 LDA SAV,X 61CF- F0 06 2055 BEQ EN.2 !ARE WE DONE? 61D1- 9D 80 72 2060 STA TXBUF,X !NO, SO PUT IN FODS BUFFER 61D4- E8 2065 INX 61D5- D0 F5 2070 BNE EN.1 2075 61D7- 20 2C 64 2080 EN.2 JSR BAS.STR !TELL FODS WHERE PROGRAM STARTS 61DA- A9 24 2085 LDA #'$ 61DC- 9D 80 72 2090 STA TXBUF,X 61DF- E8 2095 INX 61E0- 20 37 64 2100 JSR BAS.END !TELL FODS WHERE PROGRAM ENDS 61E3- 20 50 64 2105 JSR NAM.CMD !TELL FODS PROG NAME & DO THE SAVE 61E6- 4C AD 61 2110 JMP BRK.IN 2115 2120 2125 ; LOAD processes the .LOAD command. No check is 2130 ; made to see if the file exceeded the alloted 2135 ; memory space. 2140 61E9- 20 18 64 2145 LOAD JSR SAV.0 !SAVE PAGE 0 STUFF 2150 2155 ; Build command string: LOD $s.adr=.filename 2160 ; Put it in FODS buffer and let FODS do the work. 2165 61EC- E8 2170 INX 61ED- BD EB 64 2175 LO.1 LDA LOD,X 61F0- F0 06 2180 BEQ LO.2 61F2- 9D 80 72 2185 STA TXBUF,X 61F5- E8 2190 INX 61F6- D0 F5 2195 BNE LO.1 2200 61F8- 20 2C 64 2205 LO.2 JSR BAS.STR 61FB- 20 50 64 2210 JSR NAM.CMD 61FE- A5 A8 2215 LDA *EOT !TELL BASIC WHERE FILE ENDS 6200- 85 7D 2220 STA *BAS.EN 6202- A5 A9 2225 LDA *EOT+1 6204- 85 7E 2230 STA *BAS.EN+1 6206- 4C AD 61 2235 JMP BRK.IN 2240 2245 2250 ; RESEQ process the .NUMBER command by building the 2255 ; command string in FODS' buffer and letting FODS 2260 ; process it (as usual). 2265 6209- 20 18 64 2270 RESEQ JSR SAV.0 620C- E8 2275 INX 620D- BD F1 64 2280 RE.1 LDA NUM,X 6210- F0 06 2285 BEQ RE.2 6212- 9D 80 72 2290 STA TXBUF,X 6215- E8 2295 INX 6216- D0 F5 2300 BNE RE.1 2305 6218- 20 B3 79 2310 RE.2 JSR CMDINT 621B- 4C AD 61 2315 JMP BRK.IN 2320 2325 2330 ; GOTO provides a true computed GOTO statement by 2335 ; allowing the value of an expression to specify the 2340 ; number to jump to. 2345 621E- 20 CC 00 2350 GOTO JSR CHRGET 6221- 20 43 CB 2355 JSR $CB43 !EVALUATE ARGUMENT 6224- 20 AD D5 2360 JSR $D5AD !FLOAT TO INTEGER 6227- 20 32 C7 2365 JSR $C732 !FINISH THE GOTO 622A- 4C AD 61 2370 JMP BRK.IN 2375 2380 ; DELETE provides a range delete of lines. The 2385 ; range to delete is specified as with a LIST: 2390 ; llll-uuuu. If llll- is entered, then lines 2395 ; llll on are deleted. The essence here is to 2400 ; locate the 1st and last line to be deleted, 2405 ; block move the remainder so that it follows 2410 ; the first segment and then fix the line links. 2415 622D- 20 CC 00 2420 DELETE JSR CHRGET 6230- 20 F5 C7 2425 JSR INFIX convert 1st one to binary 6233- 20 27 C4 2430 JSR FNDNUM and locate that line 2435 6236- 20 86 8B 2440 JSR ACCESS 6239- A5 AF 2445 LDA *LINNUM put address of 1st line 623B- 8D 4E A6 2450 STA P1 in parm 1 623E- A5 B0 2455 LDA *LINNUM+1 6240- 8D 4F A6 2460 STA P1+1 2465 6243- 20 D2 00 2470 JSR CHRGOT 6246- F0 55 2475 BEQ DELERR error - upper limit missing 6248- C9 A5 2480 CMP #$A5 token for "-" 624A- D0 51 2485 BNE DELERR error - wrong delimiter 2490 624C- A2 FE 2495 LDX #$FE default is delete to EOF 624E- 86 1C 2500 STX *RESULT 6250- E8 2505 INX 6251- 86 1D 2510 STX *RESULT+1 2515 6253- 20 CC 00 2520 JSR CHRGET position to next field 6256- F0 09 2525 BEQ DELRST delete to EOF 6258- 20 F5 C7 2530 JSR INFIX pick up upper limit 625B- E6 1C 2535 INC *RESULT 625D- D0 02 2540 BNE DELRST 625F- E6 1D 2545 INC *RESULT+1 2550 6261- 20 27 C4 2555 DELRST JSR FNDNUM locate last line to delete 6264- A5 AF 2560 LDA *LINNUM 6266- 8D 4C A6 2565 STA P2 6269- A5 B0 2570 LDA *LINNUM+1 626B- 8D 4D A6 2575 STA P2+1 626E- A5 81 2580 LDA *PROGEND 6270- 8D 4A A6 2585 STA P3 6273- A5 82 2590 LDA *PROGEND+1 6275- 8D 4B A6 2595 STA P3+1 6278- 20 40 87 2600 JSR BLKMOV move the remaining lines down 2605 627B- A5 FC 2610 LDA *$FC 627D- D0 02 2615 BNE END.FIX 627F- C6 FD 2620 DEC *$FD 6281- C6 FC 2625 END.FIX DEC *$FC 2630 6283- A5 FC 2635 LDA *$FC fix BASIC's end-of-program pointer 6285- 85 7D 2640 STA *BAS.EN 6287- A5 FD 2645 LDA *$FD 6289- 85 7E 2650 STA *BAS.EN+1 2655 628B- 20 6D C4 2660 FIX.LINKS JSR FXLNK1 fix line links 628E- 20 2C C3 2665 JSR FXLNK2 2670 6291- A2 FE 2675 LDX #$FE clear stack 6293- 9A 2680 TXS 6294- A9 C2 2685 LDA #$C2 6296- 48 2690 PHA 6297- A9 7D 2695 LDA #$7D 6299- 48 2700 PHA 629A- 4C AD 61 2705 JMP BRK.IN 2710 629D- 38 2715 DELERR SEC flag an error 629E- 60 2720 RTS 2725 2730 2735 ; APPEND provides the appending of BASIC programs 2740 ; from disk. This is NOT a merge; lines will not be 2745 ; interwoven by their line number. 2750 629F- 20 18 64 2755 APPEND JSR SAV.0 2760 62A2- E8 2765 INX 62A3- BD EB 64 2770 AP.1 LDA LOD,X put LOD command in buffer 62A6- F0 06 2775 BEQ AP.2 62A8- 9D 80 72 2780 STA TXBUF,X 62AB- E8 2785 INX 62AC- D0 F5 2790 BNE AP.1 2795 62AE- 8E E3 64 2800 AP.2 STX INDEX save X and Y 62B1- 8C E4 64 2805 STY INDEX+1 62B4- A9 FF 2810 LDA #$FF store line number 62B6- 85 1C 2815 STA *RESULT to search for 62B8- 85 1D 2820 STA *RESULT+1 62BA- 20 27 C4 2825 JSR FNDNUM locate end of file 2830 62BD- AE E3 64 2835 LDX INDEX restore X and Y 62C0- AC E4 64 2840 LDY INDEX+1 62C3- A5 B0 2845 AP.3 LDA *LINNUM+1 put EOF address 62C5- 20 78 64 2850 JSR HEX.ASC in FODS buffer 62C8- A5 AF 2855 LDA *LINNUM 62CA- 20 78 64 2860 JSR HEX.ASC 2865 62CD- 20 50 64 2870 JSR NAM.CMD have FODS bring in file 2875 62D0- A5 A8 2880 LDA *EOT fix BASIC's EOF pointer 62D2- 85 7D 2885 STA *BAS.EN 62D4- A5 A9 2890 LDA *EOT+1 62D6- 85 7E 2895 STA *BAS.EN+1 2900 62D8- 4C 8B 62 2905 JMP FIX.LINKS hook it all together 2910 2915 2920 ; ENT.DATA allows the data associated with a program 2925 ; to be saved to disk. The identifier for a BASIC 2930 ; data file is a "!" as the 1st character. 2935 62DB- 20 18 64 2940 ENT.DATA JSR SAV.0 2945 62DE- A0 0B 2950 LDY #$B save BASIC's data pointers 62E0- B9 7D 00 2955 ED.1 LDA $7D,Y just above top of memory 62E3- 91 87 2960 STA (TOPMEM),Y 62E5- 88 2965 DEY 62E6- 10 F8 2970 BPL ED.1 2975 62E8- 20 86 8B 2980 JSR ACCESS prepare for a block move 62EB- A5 81 2985 LDA *PROGEND 62ED- 8D 4E A6 2990 STA P1 62F0- A5 82 2995 LDA *PROGEND+1 62F2- 8D 4F A6 3000 STA P1+1 3005 62F5- 18 3010 CLC 62F6- A5 87 3015 LDA *TOPMEM 62F8- 69 0B 3020 ADC #$B 62FA- 8D 4A A6 3025 STA P3 62FD- A5 88 3030 LDA *TOPMEM+1 62FF- 69 00 3035 ADC #0 6301- 8D 4B A6 3040 STA P3+1 3045 6304- A5 83 3050 LDA *STRPTR 6306- 8D 4C A6 3055 STA P2 6309- A5 84 3060 LDA *STRPTR+1 630B- 8D 4D A6 3065 STA P2+1 3070 630E- 20 40 87 3075 JSR BLKMOV 3080 6311- A2 00 3085 LDX #0 now build up FODS command 6313- BD E5 64 3090 ED.2 LDA SAV,X 6316- F0 06 3095 BEQ ED.3 6318- 9D 80 72 3100 STA TXBUF,X 631B- E8 3105 INX 631C- D0 F5 3110 BNE ED.2 3115 631E- A5 7E 3120 ED.3 LDA *BAS.EN+1 6320- 20 78 64 3125 JSR HEX.ASC 6323- A5 7D 3130 LDA *BAS.EN 6325- 20 78 64 3135 JSR HEX.ASC 6328- A9 24 3140 LDA #'$ 632A- 9D 80 72 3145 STA TXBUF,X 632D- E8 3150 INX 3155 632E- A5 FD 3160 LDA *$FD get address of end 6330- 20 78 64 3165 JSR HEX.ASC of block moved 6333- A5 FC 3170 LDA *$FC and put in buffer 6335- 20 78 64 3175 JSR HEX.ASC 3180 6338- 20 42 64 3185 JSR NAM^CMD 3190 633B- 4C 95 63 3195 JMP RESTORE go put data back in place 3200 3205 3210 ; LOD.DATA allows data saved to be restored. 3215 3220 633E- 20 18 64 3225 LOD.DATA JSR SAV.0 6341- E8 3230 INX 6342- BD EB 64 3235 LD.1 LDA LOD,X start building FODS command 6345- F0 06 3240 BEQ LD.2 6347- 9D 80 72 3245 STA TXBUF,X 634A- E8 3250 INX 634B- D0 F5 3255 BNE LD.1 3260 634D- A5 7E 3265 LD.2 LDA *BAS.EN+1 634F- 20 78 64 3270 JSR HEX.ASC 6352- A5 7D 3275 LDA *BAS.EN 6354- 20 78 64 3280 JSR HEX.ASC 3285 6357- 20 42 64 3290 JSR NAM^CMD bring in the data 3295 635A- 38 3300 SEC unpack and move data 635B- A5 A8 3305 LDA *EOT calculate address of pointers 635D- E9 0C 3310 SBC #$C 635F- 85 FC 3315 STA *$FC 6361- A5 A9 3320 LDA *EOT+1 6363- E9 00 3325 SBC #0 6365- 85 FD 3330 STA *$FD 3335 6367- A9 0A 3340 LDA #$A 6369- A5 87 3345 LDA *$87 636B- 38 3350 SEC 636C- F1 FC 3355 SBC ($FC),Y 636E- 85 FE 3360 STA *$FE 6370- C8 3365 INY 6371- A5 88 3370 LDA *$88 6373- F1 FC 3375 SBC ($FC),Y 6375- 85 FF 3380 STA *$FF 3385 6377- A0 06 3390 LDY #6 6379- B1 FC 3395 LD.4 LDA ($FC),Y 637B- 18 3400 CLC 637C- 65 FE 3405 ADC *$FE 637E- 91 FC 3410 STA ($FC),Y 6380- C8 3415 INY 6381- B1 FC 3420 LDA ($FC),Y 6383- 65 FF 3425 ADC *$FF 6385- 91 FC 3430 STA ($FC),Y 6387- C8 3435 INY 6388- C0 0A 3440 CPY #$A 638A- D0 ED 3445 BNE LD.4 638C- C8 3450 INY 3455 638D- B1 FC 3460 LD.3 LDA ($FC),Y 638F- 99 7D 00 3465 STA $7D,Y 6392- 88 3470 DEY 6393- 10 F8 3475 BPL LD.3 3480 6395- A5 83 3485 RESTORE LDA *STRPTR prepare for block move 6397- 8D 4E A6 3490 STA P1 639A- A5 84 3495 LDA *STRPTR+1 639C- 8D 4F A6 3500 STA P1+1 639F- A5 FC 3505 LDA *$FC 63A1- 8D 4A A6 3510 STA P3 63A4- A5 FD 3515 LDA *$FD 63A6- 8D 4B A6 3520 STA P3+1 63A9- A5 81 3525 LDA *PROGEND 63AB- 8D 4C A6 3530 STA P2 63AE- A5 82 3535 LDA *PROGEND+1 63B0- 8D 4D A6 3540 STA P2+1 63B3- 20 40 87 3545 JSR BLKMOV 3550 63B6- 18 3555 CLC no errors here! 63B7- 4C AD 61 3560 JMP BRK.IN 3565 3570 ; *** SUPPORT SUBROUTINES *** 3575 3580 3585 ; RESET VECTORS, PUT IN PAGE 0 JUMP TO LINK US UP 3590 63BA- 20 23 64 3595 SETUP JSR RST.DSK 63BD- 20 86 8B 3600 JSR ACCESS 63C0- A9 AD 3605 LDA #L,BRK.IN 63C2- A0 61 3610 LDY #H,BRK.IN 63C4- 20 F0 7A 3615 JSR FODBRK 3620 DS (BRK.IN UBRKVC) 63C7- A9 AD 63C9- 8D 76 A6 63CC- A9 61 63CE- 8D 77 A6 3625 DS (BAS.GET INVEC+1) 63D1- A9 31 63D3- 8D 61 A6 63D6- A9 60 63D8- 8D 62 A6 3630 DS (ENTRY TRIG.PATCH) 63DB- A9 9C 63DD- 8D C4 00 63E0- A9 65 63E2- 8D C5 00 3635 63E5- A9 4C 3640 LDA #$4C !SET UP THE LINK 63E7- 85 DD 3645 STA *$DD !BETWEEN BASIC AND FODS 63E9- A9 0D 3650 LDA #L,BAS.DOS 63EB- 85 DE 3655 STA *$DE 63ED- A9 61 3660 LDA #H,BAS.DOS 63EF- 85 DF 3665 STA *$DF 63F1- A9 00 3670 LDA #0 63F3- 8D E4 64 3675 STA FLAG !TURN AUTO OFF 63F6- 60 3680 RTS 3685 3690 63F7- A9 08 3695 BS.SP.BS LDA #8 ;PRINT SPACE,BKSPACE,SPACE 63F9- 20 63 A6 3700 JSR OUTVEC 63FC- 20 42 83 3705 SP.BS JSR SPACE !OUTPUT BACKSPACE, SPACE 63FF- A9 08 3710 LDA #8 6401- 20 63 A6 3715 JSR OUTVEC 6404- 60 3720 RTS 3725 3730 6405- 20 58 8A 3735 INPUT JSR INTCHR ;INPUT A CHARACTER 6408- 29 7F 3740 AND #$7F 640A- 60 3745 RTS 3750 3755 3760 ; GET NEXT CHARACTER, CHECK FOR END OF LINE 3765 640B- E6 D3 3770 OUR.GET INC *BAS.PTR !GET NEXT BYTE IN BASIC 640D- D0 02 3775 BNE OUR.GOT 640F- E6 D4 3780 INC *BAS.PTR+1 6411- B1 D3 3785 OUR.GOT LDA (BAS.PTR),Y 6413- F0 02 3790 BEQ OUR.RTN !Z IS SET ON 6415- C9 3A 3795 CMP #': !RETURN IF BYTE 6417- 60 3800 OUR.RTN RTS !WAS A 0 OR ":" 3805 3810 6418- A2 0F 3815 SAV.0 LDX #$F !WE MUST SAVE THE 641A- B5 A0 3820 SAV.1 LDA *$A0,X !PAGE 0 LOCATIONS 641C- 9D D2 64 3825 STA Z.BUF,X !USED BY FODS 641F- CA 3830 DEX !AND BASIC TO 6420- 10 F8 3835 BPL SAV.1 !PREVENT CONFLICT 6422- 60 3840 RTS 3845 3850 6423- A9 20 3855 RST.DSK LDA #$20 !MAKE SURE THE 6425- 20 5D 76 3860 JSR DSKRW !DRIVES ARE OFF 6428- 20 34 76 3865 JSR SET2 !AND THE DEFAULT IS DRIVE 2 642B- 60 3870 RTS 3875 3880 642C- A5 7C 3885 BAS.STR LDA *BAS.ST+1 642E- 20 78 64 3890 JSR HEX.ASC 6431- A5 7B 3895 LDA *BAS.ST 6433- 20 78 64 3900 JSR HEX.ASC 6436- 60 3905 RTS 3910 3915 6437- A5 7E 3920 BAS.END LDA *BAS.EN+1 6439- 20 78 64 3925 JSR HEX.ASC 643C- A5 7D 3930 LDA *BAS.EN 643E- 20 78 64 3935 JSR HEX.ASC 6441- 60 3940 RTS 3945 3950 6442- A9 3D 3955 NAM^CMD LDA #'= 6444- 9D 80 72 3960 STA TXBUF,X 6447- E8 3965 INX 6448- A9 21 3970 LDA #'! 644A- 9D 80 72 3975 STA TXBUF,X 644D- E8 3980 INX 644E- D0 0C 3985 BNE MOV.NAM 3990 6450- A9 3D 3995 NAM.CMD LDA #'= 6452- 9D 80 72 4000 STA TXBUF,X 6455- E8 4005 INX 6456- A9 2E 4010 LDA #'. 6458- 9D 80 72 4015 STA TXBUF,X 645B- E8 4020 INX 4025 645C- 20 CC 00 4030 MOV.NAM JSR CHRGET 645F- 20 A2 64 4035 MOV.1 JSR TOKEN 6462- 9D 80 72 4040 MOV.3 STA TXBUF,X 6465- E8 4045 INX 6466- 20 0B 64 4050 JSR OUR.GET 6469- F0 04 4055 BEQ MOV.2 646B- C9 20 4060 CMP #$20 646D- D0 F0 4065 BNE MOV.1 646F- A9 0D 4070 MOV.2 LDA #$D 6471- 9D 80 72 4075 STA TXBUF,X 6474- 20 B3 79 4080 JSR CMDINT 6477- 60 4085 RTS 4090 4095 6478- 48 4100 HEX.ASC PHA 6479- 4A 4105 LSR A 647A- 4A 4110 LSR A 647B- 4A 4115 LSR A 647C- 4A 4120 LSR A 647D- 20 09 83 4125 JSR NIBASC 6480- 9D 80 72 4130 STA TXBUF,X 6483- E8 4135 INX 6484- 68 4140 PLA 6485- 20 09 83 4145 JSR NIBASC 6488- 9D 80 72 4150 STA TXBUF,X 648B- E8 4155 INX 648C- 60 4160 RTS 4165 648D- 48 4170 H.TO.A PHA 648E- 4A 4175 LSR A 648F- 4A 4180 LSR A 6490- 4A 4185 LSR A 6491- 4A 4190 LSR A 6492- 20 09 83 4195 JSR NIBASC 6495- 99 35 01 4200 STA BUFFER,Y 6498- C8 4205 INY 6499- 68 4210 PLA 649A- 20 09 83 4215 JSR NIBASC 649D- 99 35 01 4220 STA BUFFER,Y 64A0- C8 4225 INY 64A1- 60 4230 RTS 4235 4240 ; CONVERT TOKENS TO ASCII BY LOOKING THEM UP 4245 64A2- 48 4250 TOKEN PHA 64A3- 68 4255 PLA 64A4- 10 2B 4260 BPL TKN.RTS 64A6- 8E E3 64 4265 STX INDEX 64A9- 8C E4 64 4270 STY FLAG 64AC- 38 4275 SEC 64AD- E9 7F 4280 SBC #$7F 64AF- AA 4285 TAX 64B0- A0 FF 4290 LDY #$FF 64B2- CA 4295 TKN.CNT DEX 64B3- F0 08 4300 BEQ TKN.FND 64B5- C8 4305 CHR.SKP INY 64B6- B9 89 C0 4310 LDA $C089,Y 64B9- 10 FA 4315 BPL CHR.SKP 64BB- 30 F5 4320 BMI TKN.CNT 64BD- AE E3 64 4325 TKN.FND LDX INDEX 64C0- C8 4330 TKN.1 INY 64C1- B9 89 C0 4335 LDA $C089,Y 64C4- 30 06 4340 BMI TKN.2 64C6- 9D 80 72 4345 STA TXBUF,X 64C9- E8 4350 INX 64CA- D0 F4 4355 BNE TKN.1 64CC- 29 7F 4360 TKN.2 AND #$7F 64CE- AC E4 64 4365 LDY FLAG 64D1- 60 4370 TKN.RTS RTS 4375 4380 4385 ; STORAGE AND DATA DECLARATIONS 4390 64D2- 4395 Z.BUF .DS 16 !PAGE 0 COMMON TO BAS & FODS 64E2- 4400 NUMBER .DS 1 ;NO. OF CHARS. IN BUFFER 64E3- 4405 INDEX .DS 1 ;INDEX INTO BUFFER 64E4- 4410 FLAG .DS 1 64E5- 45 4E 54 4415 SAV .BY 'ENT $' 0 64E8- 20 24 00 64EB- 4C 4F 44 4420 LOD .BY 'LOD $' 0 64EE- 20 24 00 64F1- 4E 55 4D 4425 NUM .BY 'NUM ' 0 64F4- 20 00 64F6- 31 36 33 4430 MEMORY .BY '16371' 64F9- 37 31 64FB- 0D 4435 .BY 13 ;CARRIAGE RETURN 4440 4445 4450 ; SYM BASIC TRIGONOMETRIC PACKAGE 4455 4460 ; The patch point is ENTRY. The address of ENTRY 4465 ; is placed in C4,C5 by the FODS-BASIC program. 4470 4475 4480 4485 COM.FLG .DE $16 !COMPARISON EVALUATION FLAG 4490 EXP .DE $B1 !EXPONENT OF ACCUMULATOR 1 4495 SIGN.1 .DE $B6 !SIGN OF ACCUMULATOR 1 4500 SIGN.2 .DE $BE !SIGN OF ACCUMULATOR 2 4505 SIGN.COM .DE $BF !SIGN COMPARISON OF ACC.1 VS ACC.2 4510 4515 ; ARCTAN COEFFICIENTS 4520 64FC- 0B 4525 N1 .BY $0B 64FD- 76 B3 83 4530 .BY $76 $B3 $83 $BD $D3 6500- BD D3 6502- 79 1E F4 4535 .BY $79 $1E $F4 $A6 $F5 6505- A6 F5 6507- 7B 83 FC 4540 .BY $7B $83 $FC $B0 $10 650A- B0 10 650C- 7C 0C 1F 4545 .BY $7C $0C $1F $67 $CA 650F- 67 CA 6511- 7C DE 53 4550 .BY $7C $DE $53 $CB $C1 6514- CB C1 6516- 7D 14 64 4555 .BY $7D $14 $64 $70 $4C 6519- 70 4C 651B- 7D B7 EA 4560 .BY $7D $B7 $EA $51 $7A 651E- 51 7A 6520- 7D 63 30 4565 .BY $7D $63 $30 $88 $7E 6523- 88 7E 6525- 7E 92 44 4570 .BY $7E $92 $44 $99 $3A 6528- 99 3A 652A- 7E 4C CC 4575 .BY $7E $4C $CC $91 $C7 652D- 91 C7 652F- 7F AA AA 4580 .BY $7F $AA $AA $AA $13 6532- AA 13 6534- 81 00 00 4585 N2 .BY $81 $00 $00 $00 $00 6537- 00 00 4590 6539- A5 B6 4595 ATN LDA *SIGN.1 !GET SIGN OF ACCUMULATOR 1 653B- 48 4600 PHA 653C- 10 03 4605 BPL L1 653E- 20 36 DD 4610 JSR $DD36 6541- A5 B1 4615 L1 LDA *EXP !GET EXPONENT OF ACCUMULATOR 1 6543- 48 4620 PHA 6544- C9 81 4625 CMP #$81 !IS NUMBER>1 IN MAGNITUDE? 6546- 90 07 4630 BCC L2 !NO, SO SKIP 6548- A9 72 4635 LDA #$72 654A- A0 D7 4640 LDY #$D7 654C- 20 C5 D8 4645 JSR $D8C5 654F- A9 FC 4650 L2 LDA #L,N1 !PREPARE ADDRESS OF 6551- A0 64 4655 LDY #H,N1 !ATN COEFFICIENTS 6553- 20 C2 DD 4660 JSR $DDC2 !EVALUATE POLYNOMIAL(?) 6556- 68 4665 PLA !EXAMINE EXPONENT AGAIN 6557- C9 81 4670 CMP #$81 6559- 90 07 4675 BCC L3 655B- A9 69 4680 LDA #L,PI/2 !PREPARE ADDRESS OF 655D- A0 65 4685 LDY #H,PI/2 655F- 20 06 D6 4690 JSR $D606 6562- 68 4695 L3 PLA !EXAMINE SIGN AGAIN 6563- 10 03 4700 BPL L4 6565- 4C 36 DD 4705 JMP $DD36 6568- 60 4710 L4 RTS 4715 6569- 81 49 0F 4720 PI/2 .BY $81 $49 $0F $DA $A2 656C- DA A2 656E- 7F 00 00 4725 QUARTER .BY $7F $00 $00 $00 $00 6571- 00 00 6573- 05 4730 N5 .BY $05 6574- 84 E6 1A 4735 .BY $84 $E6 $1A $2D $1B 6577- 2D 1B 6579- 86 28 07 4740 .BY $86 $28 $07 $FB $F8 657C- FB F8 657E- 87 99 68 4745 .BY $87 $99 $68 $89 $01 6581- 89 01 6583- 87 23 35 4750 .BY $87 $23 $35 $DF $E1 6586- DF E1 6588- 86 A5 5D 4755 .BY $86 $A5 $5D $E7 $28 658B- E7 28 658D- 83 49 0F 4760 N6 .BY $83 $49 $0F $DA $A2 6590- DA A2 6592- A1 54 46 4765 .BY $A1 $54 $46 $8F $13 6595- 8F 13 6597- 8F 52 43 4770 .BY $8F $52 $43 $89 $CD 659A- 89 CD 4775 659C- C0 72 4780 ENTRY CPY #$72 !IS IT A SIN? 659E- F0 42 4785 BEQ SIN !YES! 65A0- 90 39 4790 BCC COS !NO, MUST BE A COS 65A2- C0 76 4795 CPY #$76 !IS IT AN ATN? 65A4- F0 93 4800 BEQ ATN !IF SO, BRANCH 65A6- 20 80 D9 4805 TAN JSR $D980 !MUST BE A TAN 65A9- A9 00 4810 LDA #0 65AB- 85 16 4815 STA *COM.FLG 65AD- A9 65 4820 LDA #H,M1 65AF- 48 4825 PHA 65B0- A9 B5 4830 LDA #L,M1-1 65B2- 48 4835 PHA 65B3- 4C E2 65 4840 JMP SIN 4845 65B6- A2 9E 4850 M1 LDX #$9E 65B8- A0 00 4855 LDY #$00 65BA- 20 8A D9 4860 JSR $D98A 65BD- A9 A7 4865 LDA #$A7 65BF- A0 00 4870 LDY #$00 65C1- 20 58 D9 4875 JSR $D958 65C4- A9 00 4880 LDA #$00 65C6- 85 B6 4885 STA *SIGN.1 65C8- A9 65 4890 LDA #H,M2 65CA- 48 4895 PHA 65CB- A9 D3 4900 LDA #L,M2-1 65CD- 48 4905 PHA 65CE- A5 16 4910 LDA *COM.FLG 65D0- 48 4915 PHA 65D1- 4C 14 66 4920 JMP M5 4925 65D4- A9 9E 4930 M2 LDA #$9E 65D6- A0 00 4935 LDY #$00 65D8- 4C C5 D8 4940 JMP $D8C5 4945 65DB- A9 69 4950 COS LDA #L,PI/2 65DD- A0 65 4955 LDY #H,PI/2 65DF- 20 1D D6 4960 JSR $D61D 65E2- 20 C2 D9 4965 SIN JSR $D9C2 65E5- A9 8D 4970 LDA #L,N6 65E7- A0 65 4975 LDY #H,N6 65E9- A6 BE 4980 LDX *SIGN.2 65EB- 20 BD D8 4985 JSR $D8BD 65EE- 20 C2 D9 4990 JSR $D9C2 65F1- 20 82 DA 4995 JSR $DA82 65F4- A9 00 5000 LDA #$00 65F6- 85 BF 5005 STA *SIGN.COM 65F8- 20 09 D6 5010 JSR $D609 65FB- A9 6E 5015 LDA #L,QUARTER 65FD- A0 65 5020 LDY #H,QUARTER 65FF- 20 06 D6 5025 JSR $D606 6602- A5 B6 5030 LDA *SIGN.1 6604- 48 5035 PHA 6605- 10 0D 5040 BPL M5 6607- 20 FF D5 5045 JSR $D5FF 660A- A5 B6 5050 LDA *SIGN.1 660C- 30 09 5055 BMI M6 660E- A5 16 5060 LDA *COM.FLG 6610- 49 FF 5065 EOR #$FF 6612- 85 16 5070 STA *COM.FLG 6614- 20 36 DD 5075 M5 JSR $DD36 6617- A9 6E 5080 M6 LDA #L,QUARTER 6619- A0 65 5085 LDY #H,QUARTER 661B- 20 1D D6 5090 JSR $D61D 661E- 68 5095 PLA 661F- 10 03 5100 BPL M7 6621- 20 36 DD 5105 JSR $DD36 6624- A9 73 5110 M7 LDA #L,N5 6626- A0 65 5115 LDY #H,N5 6628- 4C C2 DD 5120 JMP $DDC2 5125 BAS.START 5130 .EN 0000,662B,662B >