home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / geos / programming / source / rpn128-src.sfx / rpnroutines (.txt) < prev    next >
Encoding:
GEOS ConVerT  |  1990-02-12  |  22.3 KB  |  952 lines

  1. rpnROUTINES
  2. seq FORMATTED geos FILE v1.0
  3. sTAR nx-10
  4. op v2.0 OR HIGHER
  5. ;"rpnCONST
  6. blaster's converter v2.5
  7. GEOSsYM.rpn
  8. GEOSmAC
  9. wRITE iMAGE v2.1
  10. GEOwRITE    v2.0
  11. 0eVENT ROUTINES FOR rpn 64.
  12. D +# K" T
  13. .NOEQIN
  14.  @.INCLUDEGEOSsYM
  15. .INCLUDErpnCONST
  16.  @INCLUDEGEOSmAC
  17. GRAPHICSmODE  ==$003F
  18. CONFIG==$FF00
  19. .EQIN
  20. nUMBER:
  21. ;deal with all numbers
  22. cMPbiinvflg,TRUE
  23. BNE5$
  24. nUMBER:
  25. ;deal with all numbers
  26. cMPbiinvflg,TRUE
  27. BNE5$
  28. JSRiNVERSE;tURN OFF invflg -- iNVERSE HAS NO EFFECT HERE
  29. 5$mOVEbR0l,cURnUMe;NUMBER OF THE ICON PRESSED
  30. cMPbif_entry,TRUE
  31. BEQ10$;iF ALREADY WITHIN AN ENTRY, JUMP OVER INIT. CODE
  32. lOADbf_entry,TRUE;iF NO ENTRY YET, sET THE eNTRY fLAG
  33. lOADbeNTERsTR,' ';pUT SPACE AT START OF eNTERsTR (FOR "-" IF NEEDED)
  34. lOADbeNTERpOS,1;sET eNTERsTR POINTER--- SET OTHER THINGS
  35. lOADbmANdIGITS,$00; START WITH 0 DIGITS IN MANTISSA
  36. STAeXdIGITS; 0 DIGITS IN EXPONENT
  37. lOADbf_fraction,FALSE; NO DECIMAL POINT YET
  38. STAf_expon; NO e YET
  39. STAf_neg; START POSITIVE
  40. STAf_nege; EXPONENT ISN'T NEGATIVE
  41. lOADwtEXTxPOS,$8000+data_left*8+7  ;SET THE tEXT pROMPT
  42. lOADbtEXTyPOS,entry_top*8+4
  43. LDA#$08
  44. JSRiNITtEXTpROMPT
  45. mOVEwtEXTxPOS,STRINGx
  46. mOVEbtEXTyPOS,STRINGy
  47. JSRpROMPToN
  48. aDDvb$08,tEXTyPOS
  49. 10$cMPbif_expon,FALSE;cHECK TO SEE IF ON eXPONENT
  50. BEQ20$
  51. cMPbieXdIGITS,$01;mAKE SURE NOT TOO MANY EXPONENT DIGITS
  52. BEQ15$;iF 1 DIGIT, GO TO 1 DIGIT HANDLING ROUTINE
  53. BCS90$;iF >1 DIGITS, DON'T ADD ANOTHER!
  54. BRA25$;oTHERWISE, PROCESS DIGIT
  55. 15$LDYeNTERpOS;iF ALREADY 1 DIGIT, MAKE SURE ABS(EXP) < 38
  56. LDAeNTERsTR,Y
  57. SUB#$30;cONVERT TO A NUMBER
  58. STATEMP
  59. ASLA
  60. ASLA
  61. ASLA
  62. ADDTEMP
  63. ADCTEMP;A=10*A
  64. ADCcURnUMe;A=eXPONENT
  65. ADCipDIGS;aDD NUMBER OF DIGITS IN INTEGER PART OF mANTISSA
  66. CMP#$28;tOTAL MUST BE LESS THAN 39
  67. BCS90$
  68. BRA25$
  69. 20$cMPbimANdIGITS,$0A;mAKE SURE NOT TOO MANY MANTISSA DIGITS
  70. BCS90$
  71. BEQ90$
  72. 25$LDAcURnUMe;sTICK ascii NUMBER TO eNTERsTR
  73. ADD#$30
  74. LDYeNTERpOS
  75. STAeNTERsTR,Y
  76. INCeNTERpOS
  77. cMPbif_expon,FALSE;iNCREMENT APPROPRIATE LENGTH POINTER
  78. BEQ40$
  79. INCeXdIGITS
  80. BRA50$
  81. 40$INCmANdIGITS
  82. 50$LDAeNTERsTR,Y
  83. JSRpRINTa
  84.  @RTS
  85. dECIMALpOINT:
  86. cMPbiinvflg,TRUE
  87. BNE5$
  88.  @JMPPI_r1
  89. 5$cMPbif_entry,TRUE;iF NOT AN ENTRY YET, DO A 0
  90. BEQ10$
  91. lOADbR0l,$00
  92. JSRnUMBER
  93. BRA20$
  94. 10$cMPbif_fraction,TRUE;iF THERE ALREADY IS A ".", DON'T ADD ANOTHER
  95. BNE15$
  96.  @RTS
  97. 15$cMPbif_expon,TRUE;nO DECIMAL POINTS IN THE EXPONENT!
  98. BNE20$
  99.  @RTS
  100. 20$lOADbf_fraction,TRUE
  101. LDA#'.'
  102. LDYeNTERpOS;STICK A '.' IN THE STRING
  103. STAeNTERsTR,Y
  104. INCeNTERpOS
  105. JSRpRINTa
  106.  @RTS
  107. sCINOT:
  108. ;sCIENTIFIC nOTATION -- HANDLER FOR e ICON
  109. cMPbiinvflg,TRUE
  110. BNE5$
  111. JSRiNVERSE;jUST TURN OFF iNVERSE fLAG
  112. 5$cMPbif_entry,TRUE;iF NOT WORKING ON AN ENTRY, e DOES NOTHING
  113. BEQ10$
  114.  @RTS
  115. 10$cMPbif_expon,TRUE;cHECK IF ALREADY HAVE AN EXPONENT
  116. BNE20$
  117.  @RTS
  118. 20$lOADbf_expon,TRUE
  119. lOADbeXdIGITS,0
  120. LDA#'e'
  121. LDYeNTERpOS;STICK A 'e' IN THE STRING
  122. STAeNTERsTR,Y
  123. INCeNTERpOS
  124. JSRpRINTa
  125. mOVEwtEXTxPOS,eSIGNx;sAVE THIS POSITION FOR PLACING SIGN ON EXPONENT
  126. mOVEbeNTERpOS,ePOS
  127. LDA#' ';AND A SPACE (FOR NEGATIVE)
  128. LDYeNTERpOS
  129. STAeNTERsTR,Y
  130. INCeNTERpOS
  131. JSRpRINTa
  132. LDY#$00
  133. 30$INY
  134. LDAeNTERsTR,Y
  135. CMP#'.'
  136. BEQ40$
  137. CMP#'e'
  138. BEQ40$
  139. BRA30$
  140. 40$STYipDIGS;nUMBER OF DIGITS IN INTEGER PART OF MANTISSA...
  141.  @RTS
  142. aDDnUMS:
  143.  @JSRinvent
  144. ;dEAL WITH invflg AND f_entry
  145. JSRr1_f1;mOVE f.p. rEG #1 TO fac1
  146.  @JSRgetbasic
  147. LDA#<rEG2
  148. LDY#>rEG2
  149. JSRFADD
  150.  @JSRflushbasic
  151. JSRf1_r2;mOVE fac1 TO f
  152. aDDnUMS:
  153.  @JSRinvent
  154. ;dEAL WITH invflg AND f_entry
  155. JSRr1_f1;mOVE f.p. rEG #1 TO fac1
  156.  @JSRgetbasic
  157. LDA#<rEG2
  158. LDY#>rEG2
  159. JSRFADD
  160.  @JSRflushbasic
  161. JSRf1_r2;mOVE fac1 TO f.p. rEG #2
  162. JSRrAISE;mOVE EACH f.p. rEG UP
  163.  @JMPpOSTopRINT
  164. ;pRINT OUT rEGISTERS (pOST-oPERATION)
  165. sUBnUMS:
  166.  @JSRinvent
  167. JSRr1_f1
  168.  @JSRgetbasic
  169. LDA#<rEG2
  170. LDY#>rEG2
  171. JSRFSUB
  172.  @JSRflushbasic
  173. JSRf1_r2
  174. JSRrAISE
  175.  @JMPpOSTopRINT
  176. mULTnUMS:
  177.  @JSRinvent
  178. JSRr1_f1
  179. lOADwA0,rEG2;pOINT TO rEG2
  180.  @JSRdO_mULT
  181. ;dOES THE MULTIPLICATION, CHECKS OVERFLOW
  182. cMPbiTEMP,$00;NON-0 INDICATES OVERFLOW ERROR
  183. BEQ10$
  184.  @JMPoVfLOeRR
  185. 10$JSRf1_r2
  186. JSRrAISE
  187.  @JMPpOSTopRINT
  188. dIVnUMS:
  189.  @JSRinvent
  190. JSRr1_f1
  191.  @JSRgetbasic
  192. JSRFSGNA;cHECK TO MAKE SURE r1<>0
  193. CMP#$00
  194. BNE10$
  195.  @JSRflushbasic
  196. JMPeRRORmESS
  197. 10$LDA#<rEG2
  198. LDY#>rEG2
  199. JSRFDIV
  200.  @JSRflushbasic
  201. JSRf1_r2
  202. JSRrAISE
  203.  @JMPpOSTopRINT
  204. eXPO:
  205. ;r2^r1
  206.  @JSRinvent
  207. JSRr2_f1;cHECK THAT r2 IS POSITIVE
  208.  @JSRgetbasic
  209. JSRFSGNA;fIND SIGN OF fac1
  210. CMP#$01
  211. BEQ10$;cONTINUE IF POSITIV
  212. eXPO:
  213. ;r2^r1
  214.  @JSRinvent
  215. JSRr2_f1;cHECK THAT r2 IS POSITIVE
  216.  @JSRgetbasic
  217. JSRFSGNA;fIND SIGN OF fac1
  218. CMP#$01
  219. BEQ10$;cONTINUE IF POSITIVE
  220.  @JSRflushbasic
  221.  @JMPeRRORmESS
  222. JSRFLOG
  223. lOADwA0,rEG1
  224. JSRdO_mULT;fAC1 = rEG1*LOG(rEG2)   [WILL FLUSH basic FOR US]
  225. cMPbiTEMP,$00
  226. BEQ20$
  227.  @JMPoVfLOeRR
  228. 20$JSRdO_aNTIlOG;fAC1 = eXP(rEG1*LOG(rEG2)) = rEG2 ^ rEG1
  229. cMPbiTEMP,$00
  230. BEQ30$
  231.  @JMPoVfLOeRR
  232. 30$JSRf1_r2
  233. JSRrAISE
  234.  @JMPpOSTopRINT
  235.  hPI_r1:
  236.  @JSRiNVERSE
  237. ;TURN OFF INVERSE
  238. cMPbif_entry,TRUE
  239. BNE5$
  240.  @JSRdO_eNTER
  241. 5$JSRsINK;mOVE 1-7 DOWN
  242.  @JSRgetbasic
  243. LDA#<FPI
  244. LDY#>FPI
  245. JSRMEMFAC1
  246. LDX#<rEG1
  247. LDY#>rEG1
  248. JSRFAC1MEM;cOPY PI TO rEG1
  249.  @JSRflushbasic
  250. JMPpRINTrEGS
  251. ;pRINT ALL REGISTERS
  252.  @invent:
  253. ;rOUTINE THAT CHECKS FOR iNVERSE, DOES NOTHING
  254. ;cHECKS FOR eNTRY, DOES AN "eNTER" IF NECESSARY
  255.  @invent:
  256. ;rOUTINE THAT CHECKS FOR iNVERSE, DOES NOTHING
  257. ;cHECKS FOR eNTRY, DOES AN "eNTER" IF NECESSARY
  258. cMPbiinvflg,TRUE
  259. BNE5$
  260.  @JMPiNVERSE
  261. ;inv/WHATEVER IS NOTHING
  262. 5$cMPbif_entry,TRUE
  263. BNE10$
  264. lOADbOPRINT,FALSE
  265.  @JMPdO_eNTER
  266. 10$lOADbOPRINT,TRUE
  267.  @RTS
  268. pOSTopRINT:
  269. ;sUPPORT ROUTINE, PRINT APPROPRIATE REGS AFTER OPERATION
  270. cMPbiOPRINT,TRUE
  271. BNE10$
  272.  @JMPpRINTrEGS
  273.  @JMPpRINTr1
  274. dELETE:
  275. cMPbiinvflg,TRUE
  276. BNE5$
  277. JSRiNVERSE
  278. 5$cMPbif_entry,TRUE
  279. BNE80$
  280. 10$cMPbif_expon,FALSE
  281. BEQ20$
  282. LDAeXdIGITS;sUBTRACT 1 FROM CURRENT DIGIT COUNTER
  283. BEQ80$;(sKIP IF eXdIGITS=0)
  284. SUB#$01
  285. STAeXdIGITS
  286. BRA30$
  287. 20$LDAmANdIGITS
  288. BEQ80$;(sKIP IF mANdIGITS=0)
  289. SUB#$01
  290. STAmANdIGITS
  291. BRA30$
  292.  @80$JMPEND_dELETE
  293. 30$LDYeNTERpOS;fIRST, BLANK LAST CHARACTER OF STRING, DEC. POINTER
  294. STYeNTERpOS
  295. LDAeNTERsTR,Y
  296. TAX;SAVE IDENTITY OF CHARACTER IN X
  297. CMP#'.';(cHECK FOR DECIMAL POINT)
  298. BNE40$
  299. INCmANdIGITS;iF A DECIMAL POINT, WE AREN'T REMOVING A DIGIT!
  300. lOADbf_fraction,FALSE;wE JUST DELETED THE DECIMAL POINT
  301. 40$LDA#$00
  302. STAeNTERsTR,Y
  303. TXA;bLANK SPACE ON SCREEN- DRAW RECT. OF CHAR'S WIDTH
  304. JSRgETcHARwIDTH
  305. STATEMP
  306. LDA#$00
  307. STATEMP2;hIGH BYTE OF TEMP = 0
  308. JSRsETpATTERN;sET FOR CLEARING
  309. lOADbR2l,entry_top*8+1
  310. lOADbR2h,(entry_top+2)*8-2
  311. mOVEwtEXTxPOS,R4
  312. sUBwTEMP,tEXTxPOS;sUBTRACT THE WIDTH FROM tEXTxPOS
  313. mOVEwtEXTxPOS,R3
  314. JSRrECTANGLE;dO THE CLEAR
  315. mOVEwtEXTxPOS,STRINGx;rESET pROMPT POSITION BACK
  316. LDAtEXTyPOS
  317. SUB#$08
  318. STASTRINGy
  319. JSRpROMPToN
  320.  @END_dELETE: RTS
  321.  @END_dELETE: RTS
  322. nUMBER OF DIGITS IN INTEGER PART OF MANTISSA...
  323. eNTER:
  324. cMPbiinvflg,TRUE
  325. BNE5$
  326. JMPpRINTiNFO
  327. 5$cMPbif_entry,TRUE
  328. BEQ10$
  329.  @JMPdUPLICATE
  330. 10$JSRdO_eNTER
  331. JSRpRINTrEGS;pRINT ALL f.p. rEGISTERS
  332.  @RTS
  333.  @dO_eNTER:
  334. LDYeNTERpOS
  335. LDA#$00;mAKE SURE eNTERsTR IS 0 TERMINATED
  336. STAeNTERsTR,Y
  337. lOADwppdbTXT,BEFsINK
  338. JSRpAUSEpRINT
  339. JSRsINK;mOVE rEGS DOWN
  340. lOADwppdbTXT,AFTsINK
  341. ;JSRpAUSEpRINT
  342. LDX#$09
  343. 10$LDAeNTERsTR,X;mOVE eNTER sTRING TO sYSTEM sTRING
  344. STASYSTRING,X
  345. BPL10$
  346. JSRasciidec;TRANSLATE THE SYSTEM STRING TO FAC1
  347. lOADwppdbTXT,AFTasc
  348. ;JSRpAUSEpRINT
  349. JSRf1_r1;COPY FAC1 TO REG1
  350. lOADwppdbTXT,AFTf1r1
  351. ;JSRpAUSEpRINT
  352. JSRcLReNTRY;cLEAR ENTERLINE, eNTERsTR, eNTERpOS
  353. lOADwppdbTXT,AFTcLRe
  354. ;JSRpAUSEpRINT
  355. lOADbf_entry,FALSE
  356.  @RTS
  357. BEFsINK:.BYTE"bEFORE sINK",0
  358. AFTsINK:.BYTE"aFTER sINK",0
  359. AFTasc:.BYTE"aFTER asciidec",0
  360. ;AFTf1r1:.BYTE"aFTER f1_r1",0
  361. ;AFTcLRe:.BYTE"aFTER cLReNTRY",0
  362. dUPLICATE:
  363. ;enter WHEN NO ENTRY IN PROGRESS IS A dup -- COPY
  364. JSRsINK; rEG1 TO rEG2, MOVE 2-3, 3-4 ETC.
  365. JSRpRINTrEGS
  366.  @RTS
  367. pRINTiNFO:
  368. JSRcLEARdATA;cLEAR THE dATA 
  369. pRINTiNFO:
  370. JSRcLEARdATA;cLEAR THE dATA sCREEN
  371. lOADwLEFTmARGIN,$8000+data_left*8+4
  372. JSRI_pUTsTRING
  373. SCREEN1:.WORD$8000+data_left*8+4
  374. .BYTEdata_top*8+12
  375. .BYTE24,"hINTS:",27,13,13,"inv-swap IS roll"
  376. .BYTE13,"inv-drop IS rolld"
  377. .BYTE13,"inv-mIN IS mr"
  378. .BYTE13,"inv-. IS PI"
  379. .BYTE13,13,"(cLICK TO CONTINUE)",0
  380. 10$cMPbiMOUSEdATA,%10000000;wAIT FOR CLICK
  381. BNE20$
  382. BRA10$
  383. 20$JSRcLEARdATA
  384. lOADwLEFTmARGIN,$8000+data_left*8+4
  385. JSRI_pUTsTRING
  386. SCREEN2:.WORD$8000+data_left*8+4
  387. .BYTEdata_top*8+12
  388. .BYTE24,"kEY sHORTCUTS:",27,13,13
  389. .BYTE"rETURN -- eNTER",13,"F1 -- iNVERSE",13
  390. .BYTE"F3 -- sWAP",13,"F5 -- dROP",13
  391. .BYTE"F7 -- +/-",13,"M -- mEM. iN.",13,"Q -- QUIT",13,13
  392. .BYTE"(cLICK TO cONTINUE)",0
  393. 30$cMPbiMOUSEdATA,%10000000;wAIT FOR CLICK
  394. BNE40$
  395. BRA30$
  396. 40$JSRcLEARdATA
  397. lOADwLEFTmARGIN,$8000+data_left*8+4
  398. JSRI_pUTsTRING
  399. SCREEN3:.WORD$8000+data_left*8+4
  400. .BYTEdata_top*8+12
  401. .BYTE24,"kEY sHORTCUTS:",27,13,13
  402. .BYTE"S -- SIN",13,"C -- COS",13,"T -- TAN",13
  403. .BYTE"V -- sQR. rOOT",13,"R -- 1/X",13
  404. .BYTE"L -- LN",13,13
  405. .BYTE"(cLICK TO CONTINUE)",0
  406. 42$cMPbiMOUSEdATA,%10000000;wAIT FOR CLICK
  407. BNE47$
  408. BRA42$
  409. 47$JSRcLEARdATA
  410. lOADwLEFTmARGIN,$8000+data_left*8+4
  411. JSRI_pUTsTRING
  412. SCREEN4:.WORD$8000+data_left*8+4
  413. .BYTEdata_top*8+12
  414. .BYTE13,13,"tHE mASKED nERD",13,"wAS hERE!",0
  415. 50$cMPbiMOUSEdATA,%10000000
  416. BNE60$
  417. BRA50$
  418. 60$lOADwLEFTmARGIN,#$00
  419. JSRcLEARdATA
  420. JSRpRINTrEGS
  421.  @JMPiNVERSE
  422. ;jUMP TO iNVERSE TO TURN OFF THE iNVERSE fLAG
  423. sIGNcHANGE:
  424. cMPbiinvflg,TRUE
  425. BNE5$
  426. JSRiNVERSE
  427. 5$cMPbif_entry,TR
  428. sIGNcHANGE:
  429. cMPbiinvflg,TRUE
  430. BNE5$
  431. JSRiNVERSE
  432. 5$cMPbif_entry,TRUE
  433. BEQ10$;iF NO ENTRY, CHANGE SIGN OF rEG. 1
  434.  @JMPSCREG1
  435. ;rEST OF THIS ROUTINE DEALS WITH eNTER sTRING
  436. 10$cMPbif_expon,TRUE;cHECK TO SEE IF WE CHANGE SIGN OF EXPONENT
  437. BEQ30$
  438. cMPbif_neg,TRUE
  439. BEQ15$
  440. lOADbf_neg,TRUE
  441. LDA#'-'
  442. BRA20$
  443. 15$lOADbf_neg,FALSE
  444. LDA#' '
  445. 20$mOVEwtEXTxPOS,TMPBLK;sAVE CURSOR POSITION
  446. lOADwtEXTxPOS,$8000+data_left*8+4
  447. PLA;cHARACTER OF SIGN WAS PUSHED ON STACK
  448. STAeNTERsTR
  449. JSRpRINTa
  450. mOVEwTMPBLK,tEXTxPOS;rESTORE CURSOR POSITION
  451.  @RTS
  452. 30$cMPbif_nege,TRUE
  453. BEQ40$
  454. lOADbf_nege,TRUE
  455. LDA#'-'
  456. BRA50$
  457. 40$lOADbf_nege,FALSE
  458. LDA#' '
  459. 50$mOVEwtEXTxPOS,TMPBLK
  460. mOVEweSIGNx,tEXTxPOS
  461. LDYePOS
  462. STAeNTERsTR,Y
  463. JSRpRINTa
  464. mOVEwTMPBLK,tEXTxPOS
  465.  @RTS
  466.  @SCREG1:
  467. ;sIGN cHANGE ON rEGISTER 1
  468. LDArEG1+1
  469. EOR#%10000000;fLIP SIGN BIT
  470. STArEG1+1;sAVE MAULED TOP BYTE OF M
  471.  @SCREG1:
  472. ;sIGN cHANGE ON rEGISTER 1
  473. LDArEG1+1
  474. EOR#%10000000;fLIP SIGN BIT
  475. STArEG1+1;sAVE MAULED TOP BYTE OF MANTISSA
  476. JSRpRINTr1;pRINT OUT MAULED REGISTER
  477.  @RTS
  478.  @;end of signchange
  479. cMPbiinvflg,TRUE;cHECK INVERSE- IF SET, JUMP TO INVERSE OF FUNCTION
  480. BNE10$
  481.  @JMPaRCsIN
  482.  @JSRpREfUNC
  483. ;dO GENERAL pRE-fUNCTION SETUP SUBROUTINE
  484. JSRr1_f1
  485.  @JSRgetbasic
  486. JSRFSIN
  487.  @JSRflushbasic
  488. JSRf1_r1
  489.  @JMPpOSTopRINT
  490. ;pOST-OPERATION PRINT-f.p. rEGS ROUTINE
  491. cMPbiinvflg,TRUE
  492. BNE10$
  493.  @JMPaRCcOS
  494.  @JSRpREfUNC
  495. JSRr1_f1
  496.  @JSRgetbasic
  497. JSRFCOS
  498.  @JSRflushbasic
  499. JSRf1_r1
  500.  @JMPpOSTopRINT
  501. 5$cMPbif_entry,TRUE
  502. BNE10BYTE$80+padleft+7
  503. .BYTE(da_top+7)*8
  504. .BYTE$80+iAKEYTABLE,Y;PUT ROUTINE VECTOR @ TEMP (LB) & TEMP2 (HB)
  505. STATEMP
  506. LDAKEYTABLE,Y
  507. 8!8%9
  508. cMPbiinvflg,TRUE
  509. BNE10$
  510.  @JMPaRCtAN
  511.  @JSRpREfUNC
  512.  @JSRgetbasic
  513. LDA#<FPI
  514. LDY#>FPI
  515. JSRMEMFAC1
  516. LDA#<FHALF
  517. LDY#>FHALF
  518. JSRFMULT
  519. LDA#<rEG1
  520. LDY#>rEG1
  521. JSRFSUB;fAC1 = rEG1 - PI/2
  522. LSRFACSGN;fAC1 = {$7c}rEG1 - PI/2{$7c}   (CLEAR BIT 7)
  523. LDX#<FVAR
  524. LDY#>FVAR
  525. JSRFAC1MEM
  526. LDA#<FPI
  527. LDY#>FPI
  528. JSRMEMFAC1
  529. LDA#<FVAR
  530. LDY#>FVAR
  531. JSRFDIV;dIVIDE {$7c}rEG1-PI/2{$7c}/PI
  532. LDX#<FVAR
  533. LDY#>FVAR
  534. JSRFAC1MEM
  535. JSRFINT
  536. LDA#<FVAR
  537. LDY#>FVAR
  538. JSRFCOMPARE;cHECK TO SEE IF FAC1 = INT(FAC1)
  539. CMP#$00;A=0 INDICATES FAC1 IS AN INTEGER... THUS ERROR!
  540. BNE20$
  541.  @JSRflushbasic
  542. JMPeRRORmESS
  543. 20$LDA#<rEG1
  544. LDY#>rEG1
  545. JSRMEMFAC1
  546. JSRFTAN
  547.  @JSRflushbasic
  548. JSRf1_r1
  549.  @JMPpOSTopRINT
  550. sQRT:
  551. cMPbiinvflg,TRUE
  552. BNE10$
  553.  @JMPsQUARE
  554.  @JSRpREfUNC
  555. JSRr1_f1
  556.  @JSRgetbasic
  557. JSRFSGNA;cHECK SIGN OF r1
  558. CMP#$FF
  559. BNE20$;cONTINUE IF NOT NEGATIVE
  560.  @JSRflushbasic
  561. JMPeRRORmESS
  562. 20$JSRFSQRT
  563.  @JSRflushbasic
  564. JSRf1_r1
  565.  @JMPpOSTopRINT
  566. rECIP:
  567. ;1/X
  568. cMPbiinvflg,TRUE
  569. BNE10$
  570.  @JSRiNVERSE
  571. ;jUST TURN OFF iNVERSE
  572. rECIP:
  573. ;1/X
  574. cMPbiinvflg,TRUE
  575. BNE10$
  576.  @JSRiNVERSE
  577. ;jUST TURN OFF iNVERSE
  578.  @JSRpREfUNC
  579. JSRr1_f1
  580. cMPbiSTOFAC1,#$00;basic IS OUT, SO LOOK AT EXPONENT OF 
  581. STOFAC1
  582. BNE20$;iF FACEXP IS 0, THIS IS AN ERROR (1/0)
  583.  @JMPeRRORmESS
  584.  @JSRgetbasic
  585. LDA#<FONE
  586. LDY#>FONE
  587. JSRFDIV
  588.  @JSRflushbasic
  589. JSRf1_r1
  590.  @JSRpOSTopRINT
  591. cMPbiinvflg,TRUE
  592. BNE10$
  593.  @JMPaNTIlOG
  594.  @JSRpREfUNC
  595. JSRr1_f1
  596.  @JSRgetbasic
  597. JSRFSGNA;cHECK THAT r1>0
  598. CMP#$01
  599. BEQ20$;IF r1>0, OK TO CONTINUE
  600.  @JSRflushbasic
  601. JMPeRRORmESS
  602. 20$JSRFLOG
  603.  @JSRflushbasic
  604. JSRf1_r1
  605.  @JMPpOSTopRINT
  606. aRCsIN:
  607. ;asin(x)=atn(x/sqrt(-x*x+1))
  608.  @JSRiNVERSE
  609. JSRpREfUNC
  610. JSRfUNKYaTAN;cALCULATES THE asin
  611. cMPbiTEMP,#$00;TEMP HAS ERROR RETURN STATUS
  612. BEQ10$
  613.  @JMPeRRORmESS
  614.  @JMPpOSTopRINT
  615. aRCcOS:
  616. ;acos(x)=-atn(x/sqr(-x*x+1))+pi/2 = -asin(x)+pi/2
  617.  @JSRiNVERSE
  618. JSRpREfUNC
  619. JSRfUNKYaTAN
  620. cMPbiTEMP,#$00;TEMP HAS ERROR RETURN STATUS
  621. BEQ10$
  622.  @JMPeRRORmESS
  623. 10$LDArEG1+1
  624. EOR#%10000000
  625. STArEG1+1
  626. lOADwR5,rEG1
  627. lOADwR6,FVAR
  628. LDX#R5
  629. LDY#R6
  630. LDA#$05
  631. JSRcOPYfsTRING;cOPY rEG1 TO TMPBLK
  632.  @JSRgetbasic
  633. LDA#<FPI
  634. LDY#>FPI
  635. JSRMEMFAC1
  636. LDA#<FHALF
  637. LDY#>FHALF
  638. JSRFMULT;fACI = 0.5*PI
  639. LDA#<FVAR
  640. LDY#>FVAR
  641. JSRFADD
  642.  @JSRflushbasic
  643. JSRf1_r1
  644.  @JMPpOSTopRINT
  645. aRCtAN:
  646.  @JSRiNVERSE
  647. ;TURN OFF iNVERSE
  648.  @JSRpREfUNC
  649. JSRr1_f1
  650.  @JSRgetbasic
  651. JSRFATAN
  652.  @JSRflushbasic
  653. JSRf1_r1
  654.  @JMPpOSTopRINT
  655.  @fUNKYaTAN:
  656.  @fUNKYaTAN:
  657. ;cALCULATES THE atn USED IN BOTH asin AND acos
  658. JSRr1_f1
  659.  @JSRgetbasic
  660. LSRFACSGN;tAKE ABSOULUTE VALUE OF fac1
  661. LDA#<FONE
  662. LDY#>FONE
  663. JSRFCOMPARE;cOMPARE 1 TO FAC1 ( {$7c}r1{$7c} )
  664. CMP#$FF;$FF INDICATES 1 > FAC1
  665. BEQ10$;iF {$7c}r1{$7c}>1, ARCSIN OR ARCCOS WON'T WORK!
  666.  @JSRflushbasic
  667. lOADbTEMP,$FF;$FF IN TEMP iNDICATES AN ERROR
  668.  @RTS
  669. 10$lOADbTEMP,$00;NO ERROR IF WE ARE CONTINUING
  670. LDA#<rEG1
  671. LDY#>rEG1
  672. JSRMEMFAC1
  673. LDA#<rEG1
  674. LDY#>rEG1
  675. JSRFMULT;r1*r1
  676. LDAFACSGN
  677. EOR#$FF;fLIP THE SIGN BIT
  678. STAFACSGN
  679. LDA#<FONE
  680. LDY#>FONE
  681. JSRFADD;ADD 1
  682. JSRFSQRT
  683. LDA#<rEG1
  684. LDY#>rEG1
  685. JSRFDIV;x/fAC1 = x/sqrt(-x*x+1)
  686. JSRFATAN
  687.  @JSRflushbasic
  688. JSRf1_r1
  689.  @RTS
  690.  @pREfUNC:
  691. ;pRE-FUNCTION GENERAL SETUP ROUTINE
  692. cMPbif_entry,TRUE
  693. BNE10$
  694. lOADbOPRINT,TRUE
  695.  @JMPdO_eNTER
  696. 10$lOADbOPRINT,FALSE
  697.  @RTS
  698. sQUARE:
  699. JSRiNVERSE;TURN OFF INVERSE FLAG
  700.  @JSRpREfUNC
  701. sQUARE:
  702. JSRiNVERSE;TURN OFF INVERSE FLAG
  703.  @JSRpREfUNC
  704. JSRr1_f1
  705. lOADwA0,rEG1
  706. JSRdO_mULT;dOES THE MULTIPLICATION AND CHECKS FOR OVERFLOW
  707. LDATEMP
  708. BEQ10$
  709.  @JMPoVfLOeRR
  710. 10$JSRf1_r1
  711.  @JMPpOSTopRINT
  712. aNTIlOG:
  713. JSRiNVERSE;TURN OFF INVERSE FLAG
  714.  @JSRpREfUNC
  715. JSRr1_f1
  716. JSRdO_aNTIlOG
  717. LDATEMP
  718. BEQ10$
  719.  @JMPoVfLOeRR
  720. 10$JSRf1_r1
  721.  @JMPpOSTopRINT
  722. LDY#>rEG1
  723. JSRMEMFAC1
  724. LDA#<rEG1
  725. LDY
  726.  @dO_mULT:
  727. ;mULTIPLIES fac1 * (A0) ; RETURNS $FF IN TEMP
  728. ; IF OVERFLOW
  729.  @JSRgetbasic
  730. LDY#$00
  731. LDA(A0),Y
  732. ADDFACEXP
  733. BCC50$;iF CARRY IS CLEAR, NO OVERFLOW
  734. AND#%10000000
  735. CMP#$00
  736. BEQ50$;iF CARRY SET, HIGH BIT CLEAR, NO OVERFLOW
  737. lOADbTEMP,$FF
  738. BRA60$
  739. 50$lOADbTEMP,$00
  740. LDAA0l
  741. LDYA0h
  742. JSRFMULT
  743.  @JSRflushbasic
  744. dO_aNTIlOG:
  745. JSRgetbasic
  746. LDX#<FVAR
  747. LDY#>FVAR
  748. JSRFAC1MEM
  749. LDA#$00
  750. LDY#$58;$58=88; EXP(88) IS THE HIGHEST POSSIBLE
  751. JSRGIVAYF;(ACTUALLY 88.03, BUT 88 IS CLOSE ENOUGH)
  752. LDA#<FVAR
  753. LDY#>FVAR
  754. JSRFCOMPARE
  755. CMP#$FF;$FF INDICATES FVAR>88
  756. BNE10$
  757. lOADbTEMP,$FF
  758. BRA20$
  759. 10$lOADbTEMP,$00
  760. LDA#<FVAR
  761. LDY#>FVAR
  762. JSRMEMFAC1
  763. JSRFE_TO
  764.  @JSRflushbasic
  765. cMPbiinvflg,TRUE
  766. BNE5$
  767.  @JMPrOLL
  768. ;inv-sWAP IS rOLL 8
  769. 5$cMPbif_entry,TRUE
  770. BNE10$
  771.  @JSRdO_eNTER
  772. 10$lOADwR5,rEG1;rEG1 -> FVAR
  773. lOADwR6,FVAR
  774. LDX#R5
  775. LDY#R6
  776. LDA#$05
  777. cMPbiinvflg,TRUE
  778. BNE5$
  779.  @JMPrOLL
  780. ;inv-sWAP IS rOLL 8
  781. 5$cMPbif_entry,TRUE
  782. BNE10$
  783.  @JSRdO_eNTER
  784. 10$LDX#$04;cOPY 5 BYTES
  785. 15$LDArEG1,X;rEG1->TEMPORORAY
  786. STAR0l
  787. LDArEG2,X;rEG2->rEG1
  788. STArEG1,X
  789. LDAR0l;TEMPORARY->rEG2
  790. STArEG2,X
  791. BPL15$
  792. ;lOADwR5,rEG1;rEG1 -> FVAR
  793. ;lOADwR6,FVAR
  794. ;LDX#R5
  795. ;LDY#R6
  796. ;LDA#$05
  797. ;JSRcOPYfsTRING
  798. ;lOADwR5,rEG2;rEG2 -> rEG1
  799. ;lOADwR6,rEG1
  800. ;LDX#R5
  801. ;LDY#R6
  802. ;LDA#$05
  803. ;JSRcOPYfsTRING
  804. ;lOADwR5,FVAR;FVAR -> rEG2
  805. ;lOADwR6,rEG2
  806. ;LDX#R5
  807. ;LDY#R6
  808. ;LDA#$05
  809. ;JSRcOPYfsTRING
  810. JSRpRINTrEGS;pRINT OUT ALL REGISTERS
  811.  @RTS
  812. dROP:
  813. cMPbiinvflg,TRUE
  814. BNE5$
  815.  @JMPrOLLdOWN
  816. ;inv-dROP IS rOLLdOWN 8
  817. 5$cMPbif_entry,TRUE
  818. BNE10$
  819. JSRcLReNTRY
  820. lOADbf_entry,FALSE
  821.  @RTS
  822. 10$JSRrAISE
  823. JSRpRINTrEGS
  824.  @RTS
  825. dO_eNTER
  826. 10$lOADbOPRINT,FALSE
  827.  @RTS
  828. Rflushbasic
  829. JSRf1_r1
  830.  @JMPpOSTopRINT
  831.  @JSRflushbasic
  832. JMPeRRORmESS
  833. 20$JS
  834. rOLL:
  835. JSRiNVERSE;TURN OFF INVERSE
  836. cMPbif_entry,TRUE
  837. BNE10$
  838.  @JSRdO_eNTER
  839. 10$lOADwR5,rEG8;rEG8 -> FVAR
  840. lOADwR6,FVAR
  841. LDX#R5
  842. LDY#R6
  843. LDA#$05
  844. JSRcOPYfsTRING
  845. JSRsINK;mOVE rEGS DOWN
  846. lOADwR5,FVAR;FVAR -> rEG1
  847. lOADwR6,rEG1
  848. LDX#R5
  849. LDY#R6
  850. LDA#$05
  851. JSRcOPYfsTRING
  852. JSRpRINTrEGS
  853.  @RTS
  854. rOLLdOWN:
  855. JSRiNVERSE;TURN OFF INVERSE
  856. cMPbif_entry,TRUE
  857. BNE10$
  858.  @JSRdO_eNTER
  859. 10$lOADwR5,rEG1;rEG1 -> FVAR
  860. lOADwR6,FVAR
  861. LDX#R5
  862. LDY#R6
  863. LDA#$05
  864. JSRcOPYfsTRING
  865. JSRrAISE;mOVE rEGS UP
  866. lOADwR5,FVAR;FVAR -> rEG8
  867. lOADwR6,rEG8
  868. LDX#R5
  869. LDY#R6
  870. LDA#$05
  871. JSRcOPYfsTRING
  872. JSRpRINTrEGS
  873.  @RTS
  874. mEMIN:
  875. cMPbiinvflg,TRUE
  876. BNE
  877. mEMIN:
  878. cMPbiinvflg,TRUE
  879. BNE10$
  880.  @JMPmEMrEC
  881. 10$cMPbif_entry,TRUE
  882. BNE20$
  883.  @JSReNTER
  884. ;dO A FULL-BLOWN eNTER
  885. 20$lOADwR5,rEG1
  886. lOADwR6,rEGmEM
  887. LDX#R5
  888. LDY#R6
  889. LDA#$05
  890. JSRcOPYfsTRING
  891.  @RTS
  892. mEMrEC:
  893. cMPbif_entry,TRUE
  894. BNE10$
  895. JSRdO_eNTER
  896. 10$JSRsINK
  897. lOADwR5,rEGmEM
  898. lOADwR6,rEG1
  899. LDX#R5
  900. LDY#R6
  901. LDA#$05
  902. JSRcOPYfsTRING
  903. JSRpRINTrEGS
  904.  @JMPiNVERSE
  905. iNVERSE:
  906. cMPbiinvflg
  907. iNVERSE:
  908. cMPbiinvflg,TRUE
  909. BEQ10$
  910. lOADbinvflg,TRUE
  911. JSRI_bITMAPuP;dRAW INDICATOR
  912. .WORDinvPIC
  913. .BYTE$80+l_inv_ind
  914. .BYTEt_inv_ind*8
  915. .BYTE$80+2
  916. .BYTE8
  917.  @RTS
  918. 10$lOADbinvflg,FALSE
  919. LDA#$00
  920. JSRsETpATTERN;sET PATTERN TO WHITE
  921. JSRI_rECTANGLE;CLEAR INDICATOR
  922. .BYTEt_inv_ind*8
  923. .BYTE(t_inv_ind+1)*8-1
  924. .WORD$8000+l_inv_ind*8
  925. .WORD$8000+(l_inv_ind+2)*8   ;(tHIS CLEARS ONE EXTRA PIXEL- SO WHAT?)
  926.  @RTS
  927. invPIC:
  928.  hqUITrpn:
  929. JSRI_mOVEdATA;rESTORE APPLICATIONS'S ZERO PAGE SPACE
  930. .WORDAPPZPAGE
  931. .WORD$0061
  932. .WORD$009E
  933.  @JMPrSTRaPPL
  934. ;RETURN TO APPLICATION!
  935.  @;nOUS AVONS FINI !!!!
  936. @JMPrSTRaPPL
  937. ;RETURN TO APPLICATION!
  938.  @;nOUS AVONS FINI !!!!
  939. $cMPbif_e
  940. cMPbiTEMP,#$00;TEMP HAS ERROR RETURN STATUS
  941. BEQ10$
  942.  @JMPeRRORmESS
  943.  @JMPpOSTopRINT
  944. aRCcOS:
  945. ;acos
  946. cMPbiTEMP,#$00;TEMP HAS ERROR RETURN STATUS
  947. BEQ10$
  948.  @JMPeRRORmESS
  949.  @JMPpOSTopRINT
  950. aRCcOS:
  951. ;acos(x)=-atn(x/sqr(-x*x+1))+pi/2 = -
  952.