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

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