home *** CD-ROM | disk | FTP | other *** search
/ UpTime Volume 2 #9 / utv2n9s2.d64 / calc64.src < prev    next >
Text File  |  2022-08-28  |  11KB  |  805 lines

  1. ;******************
  2. ;*                *
  3. ;*    resident    *
  4. ;*   calculator   *
  5. ;*                *
  6. ;*  commodore 64  *
  7. ;*                *
  8. ;******************
  9. ;
  10. ;  (c)  ian adam
  11. ;  vancouver  bc
  12. ;  january  1988
  13. ;
  14. r6510  = $0001
  15. lstx   = $00c5
  16. ndx    = $00c6
  17. keyd   = $0277
  18. shflag = $028d
  19. keylog = $028f
  20. ierror = $0300
  21. val    = $b7b5
  22. subf1m = $b850
  23. addf1m = $b867
  24. mltf1m = $ba28
  25. ayfac2 = $ba8c
  26. div10  = $bafe
  27. divf1m = $bb0f
  28. ayfac1 = $bba2
  29. fac1xy = $bbd4
  30. facout = $bddd
  31. sqr    = $bf71
  32. exp    = $bf7b
  33. screen = $d018
  34. bgcol  = $d021
  35. colram = $d800
  36. clrchn = $ffcc
  37. chrout = $ffd2
  38. getin  = $ffe4
  39. ;
  40. ; storage
  41. ;
  42. input  = $2b ;i$ in basic
  43. * = $00d1
  44. stflag * = *+1 ;stack pointer
  45. kf   * = *+1
  46. b    * = *+1
  47. f1   * = *+1
  48. perc * = *+1
  49. l    * = *+1
  50. cf   * = *+1
  51. ef   * = *+1
  52. row  * = *+1 ;a in basic
  53. l1   * = *+5
  54. l2   * = *+5
  55. k    * = *+5
  56. m    * = *+5
  57. box    = $0409
  58. colbuf = $b000
  59. frtbuf = $b400
  60. ;
  61. .opt     nogen
  62. *      = $c000
  63. ;
  64. ; ********************
  65. ; *                  *
  66. ; *  enable routine  *
  67. ; *                  *
  68. ; ********************
  69. ;
  70.  sei
  71.  lda #<calcst ;intercept keys
  72.  sta keylog
  73.  lda #>calcst
  74.  sta keylog+1
  75.  cli
  76. ;
  77.  ldx #$39
  78. stloop lda startm-1,x
  79.  jsr chrout
  80.  dex
  81.  bne stloop
  82.  stx runflg
  83.  rts
  84. ;
  85. startm .byt $0d,'1f-lrtc sserp'
  86.  .byt $0d,$0d,'8891 mada nai yb'
  87.  .byt $0d,'evitca si 46 rotaluclac',$0d
  88. ;
  89. ; ******************
  90. ; *                *
  91. ; *  vector entry  *
  92. ; *  for keypress  *
  93. ; *                *
  94. ; ******************
  95. ;
  96. calcst ldy $cb ;current key
  97.  cpy #$04 ;check f1 key
  98.  bne noprss
  99.  cpy shflag ;check for control
  100.  beq start
  101.  dey
  102. noprss sty lstkey ;avoid chatter
  103. contin jmp $eb48 ;normal keylog
  104. ;
  105. start cpy lstkey ;ctrl-f1 detected
  106.  beq contin ;no key on repeat
  107. ;
  108. ; choose routine here
  109. ;
  110.  sty lstkey ;avoid chatter
  111. start2 lda runflg ;status
  112.  eor #$80
  113.  sta runflg
  114.  bmi realst
  115. ;
  116. ; graceful exit
  117. ;
  118.  sei
  119.  ldx stflag ;stack pointer
  120.  txs
  121.  jsr scrni ;get scrn, rts below
  122. ;
  123. siloop lda zpbuf,x ;zp
  124.  sta $00,x
  125.  dex
  126.  bne siloop
  127. ;
  128.  pla
  129.  sta bgcol
  130.  pla
  131.  sta screen ;screen back
  132.  ldy #$40
  133.  sty lstx
  134.  stx lstkey ;x=0
  135. exloop stx $dc00 ;check keybd
  136.  ldy $dc01
  137.  iny
  138.  beq contin
  139.  bne exloop
  140. ;
  141. ; real start
  142. ;
  143. realst lda screen
  144.  pha
  145.  lda bgcol
  146.  pha
  147.  jsr scrno ;cursor off, save all
  148.  bit runflg ;scrni rts here
  149.  bpl siloop
  150. ;
  151.  tsx
  152.  stx stflag
  153.  jsr finish ;& draw calc
  154. .pag
  155. ; ****************************
  156. ; *                          *
  157. ; *  calculator starts here  *
  158. ; *                          *
  159. ; ****************************
  160. ;
  161. ; first input
  162. ;
  163. firsti jsr c2 ;line 170
  164.  jsr c3
  165.  lda #1 ;line 180
  166.  jsr action ;user line 1
  167.  lda l ;line 190
  168.  beq l200
  169.  ldx #<l1 ;result is in fac1
  170.  ldy #>l1
  171.  jsr fac1xy ;put in l1
  172. ;
  173. l200 lda b ;line 200
  174.  cmp #6
  175.  bne second
  176. ;
  177.  ldx #4 ;line 210- do k
  178. l211 lda l1,x
  179.  sta l2,x ;l2=l1
  180.  lda k,x
  181.  sta l1,x ;l1=k
  182.  dex
  183.  bpl l211
  184. ;
  185.  lda kf
  186.  sta f1 ;f1=kf
  187.  lda #11 ;k for constant
  188.  sta box+42
  189. ;
  190.  jsr l1prn ;? l1 on line 1
  191.  jmp l340
  192. ;
  193. ; second input
  194. ;
  195. second jsr l1prn ;line 250
  196. ;
  197. l260 lda b ;line 260
  198.  sta f1
  199.  lda #2
  200.  jsr action ;user line 2
  201. ;
  202.  lda l ;line 270
  203.  beq l280
  204.  ldx #<l2 ;result in fac1
  205.  ldy #>l2
  206.  jsr fac1xy ;put in l2
  207.  jmp result
  208. ;
  209. l280 lda b ;line 280
  210.  cmp #6
  211.  bne l260
  212. ;
  213.  ldx #4 ;line 290
  214. l291 lda l1,x
  215.  sta l2,x ;l2=l1
  216.  dex
  217.  bpl l291
  218. ;
  219. ; calculate result
  220. ;
  221. result ldx #4 ;line 330
  222. l331 lda l1,x
  223.  sta k,x ;k=l1
  224.  dex
  225.  bpl l331
  226. ;
  227. l340 ldy f1 ;line 340
  228.  sty kf
  229.  lda comnds-1,y
  230.  and #$3f
  231.  sta box+82
  232.  lda #<l2
  233.  ldy #>l2
  234.  ldx #92
  235.  jsr valprn ;? l2 on line 2
  236. ;
  237.  lda perc ;line 350
  238.  beq l360
  239.  lda #'%'
  240.  sta box+100
  241.  lda #<l2 ;get l2
  242.  ldy #>l2
  243.  sty perc ;y=0
  244.  jsr ayfac1
  245.  jsr div10
  246.  jsr div10 ;& divide by 100
  247. ;
  248.  lda f1 ;if * / then
  249.  cmp #3
  250.  bcs savel2
  251. ;
  252.  lda #<l1 ;multiply by l1
  253.  ldy #>l1
  254.  jsr mltf1m
  255. ;
  256. savel2 ldx #<l2 ;result in l2
  257.  ldy #>l2
  258.  jsr fac1xy
  259. ;
  260. l360 lda #<l2 ;line 360
  261.  ldy #>l2
  262.  jsr ayfac1 ;put l2 in fac1
  263.  lda #<l1 ;address of l1
  264.  ldy #>l1
  265.  ldx f1
  266. ;
  267. ; ******************
  268. ; *                *
  269. ; *  calculations  *
  270. ; *                *
  271. ; ******************  
  272. ;
  273. ; l2 in fac1
  274. ; l1 in a,y
  275. ; x=opern #
  276. ;
  277.  dex
  278.  bne l460
  279.  jsr addf1m ;line 450
  280.  jmp calcex
  281. ;
  282. l460 dex
  283.  bne l470
  284.  jsr subf1m ;line 460
  285.  jmp calcex
  286. ;
  287. l470 dex
  288.  bne l480
  289.  jsr mltf1m ;line 470
  290.  jmp calcex
  291. ;
  292. l480 dex
  293.  bne l500
  294.  jsr divf1m ;line 480
  295.  jmp calcex
  296. ;
  297. l500 jsr ayfac2 ;l1 in fac2
  298.  jsr exp
  299. ;
  300. calcex ldx #<l1
  301.  ldy #>l1
  302.  jsr fac1xy ;save result
  303. ;
  304.  lda #'=' ;line 370
  305.  sta box+122
  306.  ldx #132
  307.  jsr l1prn2 ;? l1 line 3
  308. ;
  309. l380 lda ndx ;line 380
  310.  beq l380
  311. ;
  312.  lda keyd ;line 390
  313.  cmp #'m'
  314.  bne l400
  315.  dec ndx
  316. ;
  317.  ldx #4 ;m=l1
  318. l391 lda l1,x
  319.  sta m,x
  320.  dex
  321.  bpl l391
  322. ;
  323.  jsr l890
  324.  jmp l380
  325. ;
  326. l400 lda b ;line 400
  327.  cmp #6
  328.  bne l401
  329.  jmp firsti
  330. l401 jsr c3
  331.  jmp second
  332. ;
  333. ; *******************
  334. ; *                 *
  335. ; *    standard     *
  336. ; *  input routine  *
  337. ; *                 *
  338. ; *******************
  339. ;
  340. action sta row ;line #
  341.  jsr l640 ;a=char
  342. ;
  343. l560 ldx cf
  344.  bne l710
  345. ;
  346.  cmp #'e' ;line 570
  347.  bne l580
  348.  ldx l
  349.  cpx #$0c
  350.  bpl l580
  351.  sta ef
  352.  bmi l610
  353. ;
  354. l580 ldx ef ;line 580
  355.  beq l590
  356.  ldx #0
  357.  stx ef
  358.  cmp #'-'
  359.  beq l610
  360.  cmp #'+'
  361.  beq l610
  362. ;
  363. l590 cmp #'.' ;line 590
  364.  beq l600
  365.  cmp #'0' ;look for ascii #
  366.  bcc l710
  367.  cmp #':'
  368.  bcs l710
  369. ;
  370. l600 ldx #$0e ;line 600
  371.  cpx l
  372.  bcs l610
  373.  stx l
  374. ;
  375. l610 ldx l ;line 610
  376.  sta input,x
  377.  inc l
  378.  jsr inprnt
  379. ;
  380. l620 jsr l670 ;line 620
  381.  bne l560
  382. ;
  383. l640 lda #0 ;line 640
  384.  sta l
  385.  sta cf
  386.  sta ef
  387.  ldx row
  388.  dex
  389.  bne l641
  390.  jsr c1
  391.  bne l670
  392. l641 jsr c2
  393.  ldy f1 ;line 650
  394.  lda comnds-1,y
  395.  and #$3f
  396.  sta box+82
  397.  lda #$30
  398.  sta box+99 ;line 660
  399. ;
  400. l670 jsr getin ;line 670
  401.  beq l670
  402.  rts
  403. .pag
  404. ; ***************
  405. ; *             *
  406. ; *  deal with  *
  407. ; *  operators  *
  408. ; *             *
  409. ; ***************
  410. ;
  411. l710 ldy #$11 ;line 710
  412.  cmp comnds-1,y ;conduct search
  413.  beq l730
  414.  dey
  415.  bne l710+2
  416.  cmp #3 ;stop key
  417.  bne l620 ;line 760
  418. stop jmp start2 ;exit
  419. ;
  420. l729 ldy #6 ;convert cr to =
  421. l730 cpy #$0f ;y=command
  422.  bmi l770
  423.  beq l729
  424.  ldy #$03 ;convert x to *
  425. ;
  426. l770 sty b ;line 770
  427.  cpy #7
  428.  bpl l780
  429. ;
  430. inpval ldx #<input ;evaluate i$
  431.  stx $22
  432.  ldx #>input
  433.  stx $23
  434.  lda l
  435.  beq l710-1
  436.  jmp val ;to fac1 & rts
  437. ;
  438. ; handle input c
  439. ;
  440. l780 bne l850 ;line 780
  441.  jsr l640
  442.  cmp #'c'
  443.  beq l781
  444.  jmp l560
  445. l781 ldx stflag ;rerun
  446.  txs
  447.  ldx #22
  448.  jsr setup+2
  449.  jsr l890
  450.  jmp firsti
  451. ;
  452. ; quit program
  453. ;
  454. l850 cpy #9
  455.  bmi stop
  456.  bne l910
  457. ;
  458. ; data to memory
  459. ;
  460.  ldx cf ;line 870
  461.  bne l880
  462.  lda #'m'
  463.  sta keyd
  464.  inx
  465.  stx ndx
  466.  bne l729
  467. ;
  468. l880 jsr inpval ;evaluate to fac1
  469.  ldx #<m
  470.  ldy #>m
  471.  jsr fac1xy ;put in m
  472.  jsr l890
  473.  jmp l620
  474. ;
  475. ; print memory
  476. ;
  477. l890 ldx #212
  478.  lda #<m ;find memory
  479.  ldy #>m
  480.  jsr valprn ;? memory
  481.  lda #13 ;'m'
  482.  sta $04d3
  483.  rts
  484. ;
  485. ; recall memory
  486. ;
  487. l910 cpy #11
  488.  beq l930
  489.  bpl l960
  490.  lda #<m ;memory in fac1
  491.  ldy #>m
  492.  sty cf ;y=0
  493.  jsr ayfac1
  494.  jmp l941
  495. ;
  496. ; square root
  497. ;
  498. l930 sty cf
  499.  ldy l
  500.  beq l931
  501.  jsr inpval ;input to fac1
  502.  jmp l940
  503. l931 lda #<l1 ;put l1 in facc
  504.  jsr ayfac1 ;y=0 already
  505. ;
  506. l940 jsr sqr ;on facc
  507. l941 jsr facout ;string in $0100
  508.  ldx #$ff ;length?
  509. l942 inx
  510.  lda $0100,x
  511.  sta input,x
  512.  bne l942
  513.  stx l
  514.  jmp l1010
  515. ;
  516. ; percent
  517. ;
  518. l960 lda l
  519.  beq tol620
  520.  cpy #12
  521.  bne l990
  522. ;
  523.  sty perc
  524.  jmp l729 ;set b, eval, rts
  525. ;
  526. ; backspace
  527. ;
  528. l990 lda cf
  529.  bne tol620
  530. ;
  531.  dec l ;line 1000 delete
  532. l1010 jsr inprnt ;? input
  533. tol620 jmp l620
  534. .pag
  535. ; *****************
  536. ; *               *
  537. ; *  subroutines  *
  538. ; *               *
  539. ; *****************
  540. ;
  541. ; turn off cursor
  542. ;
  543. scrno sei
  544.  lda $cc ;cursor on?
  545.  bne scrno1
  546.  lda $cf ;last blink?
  547.  beq scrno1
  548.  lda $ce ;character
  549.  ldx $0287 ;colour
  550.  ldy #$00
  551.  sty $cf
  552.  jsr $ea13 ;restore
  553. ;
  554. ; save screen etc.
  555. ;
  556. scrno1 ldx #$0
  557. soloop lda $00,x ;save zp
  558.  sta zpbuf,x
  559.  dex
  560.  bne soloop
  561. ;
  562.  lda #>colram ;save colour ram
  563.  ldy #>colbuf
  564.  jsr xfer
  565.  sty $c6 ;clear buffer
  566.  sty bgcol
  567. ;
  568.  lda #1 ;front end & screen
  569.  ldy #>frtbuf
  570.  ldx #7
  571.  bne xfer+2
  572. ;
  573. xfer ldx #4 ;# pages to save
  574.  sta $fc ;source
  575.  sty $fe ;destination
  576.  lda r6510 ;4 pages, x to y
  577.  pha
  578.  and #$fe ;bank out basic
  579.  sta r6510
  580. ;
  581.  ldy #0
  582.  sty $fb
  583.  sty $fd
  584. xfer1 lda ($fb),y
  585.  sta ($fd),y
  586.  dey
  587.  bne xfer1
  588.  inc $fc
  589.  inc $fe
  590.  dex
  591.  bne xfer1 ;loop
  592. ;
  593.  pla ;retrieve basic
  594.  sta r6510
  595.  rts
  596. ;
  597. ; restore machine
  598. ;
  599. scrni lda #>colbuf ;get colram
  600.  ldy #>colram
  601.  jsr xfer
  602. ;
  603.  lda #>frtbuf ;get screen
  604.  iny ;y=1
  605.  ldx #$07
  606.  bne xfer+2
  607. ;
  608. ; finish entry
  609. ;
  610. finish lda #$15
  611.  sta screen
  612.  sta $cc ;no cursor
  613.  lda #<error
  614.  sta ierror
  615.  lda #>error
  616.  sta ierror+1
  617.  sta $0291 ;hold character set
  618. ;
  619. ; set up calculator
  620. ;
  621. setup ldx #27
  622.  lda #0 ;enter with x set
  623. calc5 sta kf