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

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