home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / develop / as65 / demo / s / calculate.asm next >
Assembly Source File  |  1995-02-27  |  9KB  |  449 lines

  1. ;**************************************************************************
  2. ;
  3. ; Filename : CALCULATE.ASM
  4. ; ------------------------
  5. ;
  6. ; (c) 1991 by Thomas Lehmann
  7. ;
  8. ;
  9. ; Jackophone V5.00
  10. ;
  11. ;
  12. ; verschiedene Urechnungs Routinen
  13. ;
  14. ;
  15. ;**************************************************************************
  16.  
  17. MODUL_START    set    *    ; Größe des Moduls berechnen
  18.  
  19.  
  20.  
  21. ; =========================================================================
  22. ;
  23. ; Funktion    : 1 Byte erzeugen
  24. ;
  25. ; Eingang    : high Byte im Accu
  26. ;    : low Byte in Y-Reg.
  27. ;
  28. ; Ausgang    : merged Byte im Accu
  29. ;
  30. ; Register    : Accu
  31. ;
  32. ; (c) by Thomas Lehmann Feb. 1990
  33. ;
  34. ; =========================================================================
  35.  
  36. merge_val    asl        ; high Byte ins obere Nibble schieben
  37.     asl
  38.     asl
  39.     asl
  40.     sty hlp_reg    ; low Byte merken
  41.     ora hlp_reg    ; low Byte ins untere Nibble
  42.     rts
  43.  
  44.  
  45.  
  46. ; =========================================================================
  47. ;
  48. ; Funktion    : dezimal Wert in Hex wandeln
  49. ;
  50. ; Eingang    : dezimaler Wert im Accu
  51. ;
  52. ; Ausgang    : hex Byte im Accu
  53. ;
  54. ; Register    : Accu
  55. ;
  56. ; (c) by Thomas Lehmann Feb. 1990
  57. ;
  58. ; =========================================================================
  59.  
  60. deztohex
  61.     block
  62.     stz hlp_reg    ; Hilfsregister
  63.  
  64. loop    cmp #16        ; Wert ok ?
  65.     bcc end        ; ja, Hex dazu
  66.  
  67.     sec
  68.     sbc #16        ; Hex abziehen
  69.     pha
  70.     lda hlp_reg    ; Dezimalwert laden
  71.     clc
  72.     adc #10        ; Hexwert erzeugen
  73.     sta hlp_reg    ; und wieder ablegen
  74.     pla
  75.     bra loop    ; neuer Durchlauf
  76.  
  77. end    clc
  78.     adc hlp_reg    ; errechneten Hexwert zum Rest addieren
  79.     rts
  80.     bend
  81.  
  82.  
  83.  
  84.  
  85. ; =========================================================================
  86. ;
  87. ; Funktion    : BIT erzeugen
  88. ;
  89. ; Eingang    : BIT Nr. im ACCU
  90. ;
  91. ; Ausgang    : BIT im ACCU nach BIT Nr. gesetzt
  92. ;
  93. ; Register    : Accu
  94. ;
  95. ; (c) by Thomas Lehmann Feb. 1990
  96. ;
  97. ; =========================================================================
  98.  
  99. mk_bit
  100.     block
  101.     phy        ; Y-Reg. retten
  102.     tay        ; BIT Nr. nach Y
  103.  
  104.     lda #00
  105.     sec        ; BIT 0 einstellen
  106. loop    rol a        ; BIT in Position schieben
  107.     dey        ; BIT Nr. gefunden ?
  108.     bpl loop    ; nein, weiter schieben
  109.  
  110.     ply        ; Y-Reg zurück
  111.     rts        ; BIT im ACCU
  112.     bend
  113.  
  114.  
  115. ; =========================================================================
  116. ;
  117. ; Funktion    : BIT setzen, löschen und testen
  118. ;
  119. ; Eingang    : Zero-Page Adr. für BIT SET/CLR/TST in X-Reg.
  120. ;      BIT Nr. im ACCU (0-7)
  121. ;
  122. ; Ausgang    : SEC/CLC bei TST_BIT
  123. ;
  124. ; Register    : --------
  125. ;
  126. ; (c) by Thomas Lehmann Feb. 1990
  127. ;
  128. ; =========================================================================
  129.  
  130. set_bit    pha        ; BIT Nr. retten
  131.     stx ind_adr    ; Adr. für BIT set
  132.     stz ind_adr+1
  133.     jsr mk_bit    ; BIT erzeugen
  134.     ora (ind_adr)    ; bereits gesetzte BIT`s dazugeben
  135.     sta (ind_adr)    ; BIT in angegebener Adr. setzen
  136.     pla
  137.     rts
  138.  
  139. clr_bit    pha        ; BIT Nr. retten
  140.     stx ind_adr    ; Adr. für BIT clr
  141.     stz ind_adr+1
  142.     jsr mk_bit    ; BIT erzeugen
  143.     eor #$ff    ; BIT`s drehen
  144.     and (ind_adr)    ; andere BIT`s beibehalten
  145.     sta (ind_adr)    ; BIT in angegebener Adr. löschen
  146.     pla
  147.     rts
  148.  
  149.  
  150. tst_bit
  151.     block
  152.     pha        ; BIT Nr. retten
  153.     stx ind_adr    ; Adr. für BIT Test
  154.     stz ind_adr+1
  155.     jsr mk_bit    ; BIT erzeugen
  156.     and (ind_adr)    ; BIT in angegebener Adr. testen
  157.     sec
  158.     bne end        ; BIT ist gesetzt
  159.  
  160.     clc        ; BIT gelöscht
  161. end    pla
  162.     rts
  163.     bend
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170. ; =========================================================================
  171. ;
  172. ; Funktion    : Addition
  173. ;
  174. ; Eingang    : 8 BIT + 8 BIT
  175. ;      LSB ACCU + LSB Y
  176. ;      Resultat: MSB Accu, LSB Y
  177. ;
  178. ;      16 BIT + 8 BIT
  179. ;      ( MSB ACCU, LSB X ) + LSB Y
  180. ;      Resultat: MSB Accu, LSB Y
  181. ;
  182. ;      16 BIT + 16 BIT
  183. ;      ( MSB Accu, LSB X ) + ( MSB hlp_reg, LSB Y )
  184. ;      Resultat: MSB Accu, LSB Y
  185. ;
  186. ; Ausgang    : Resulat MSB im ACCU
  187. ;          LSB in X
  188. ;
  189. ; Register    : ACCU, X
  190. ;
  191. ; (c) by Thomas Lehmann Oktober 1991
  192. ;
  193. ; =========================================================================
  194.  
  195.  
  196.     ; 8 BIT + 8 BIT Addition, Accu + Y
  197.     ; --------------------------------
  198. add8_8    ldx #$00    ; MSB Source add Wert
  199.     phx        ; MSB add Wert
  200.     stz calc_reg+1    ; MSB
  201.     bra add        ; Addition durchführen
  202.  
  203.  
  204.     ; 16 BIT + 8 BIT Addition, (ACCU und X) + Y
  205.     ; -----------------------------------------
  206. add16_8    pha        ; MSB Source Wert
  207.     stz calc_reg+1    ; MSB
  208.     txa        ; LSB Source Wert
  209.     bra add        ; Addition durchführen
  210.  
  211.  
  212.     ; 16 BIT + 16 BIT Addition, (ACCU und X) + hlp_reg und Y
  213.     ; ------------------------------------------------------
  214. add16_16    pha        ; MSB Source Wert
  215.     lda hlp_reg    ; MSB add Wert
  216.     sta calc_reg+1
  217.     txa        ; LSB Source Wert
  218.  
  219.  
  220.  
  221.  
  222.     ; 16 BIT Addition
  223.     ; ===============
  224. add
  225.     block
  226.     sty calc_reg    ; aufzuaddierender Wert, low
  227.  
  228.     ; low Byte addieren
  229.     ; -----------------
  230.     clc
  231.     adc calc_reg    ; low Byte des Werts + aufzuaddierender Wert
  232.     tax
  233.  
  234.     ; high Byte addieren
  235.     ; ------------------
  236.     pla        ; high Source Wert
  237.     adc calc_reg+1    ; Resultat high
  238.     rts
  239.     bend
  240.  
  241.  
  242.  
  243. ; =========================================================================
  244. ;
  245. ; Funktion    : Multiplikation:
  246. ;
  247. ; Eingang    : 8 BIT * 8 BIT
  248. ;      ACCU * Y
  249. ;
  250. ;      16 BIT * 8 BIT
  251. ;      ( MSB ACCU, LSB X ) * Y
  252. ;
  253. ;      16 BIT * 16 BIT, nicht implementiert !!!
  254. ;      ( MSB ACCU, LSB X ) * ( MSB hlp_reg, LSB Y )
  255. ;
  256. ;
  257. ; Ausgang    : Resulat MSB im ACCU
  258. ;          LSB in X-Reg.
  259. ;
  260. ; Register    : ACCU, X
  261. ;
  262. ; (c) by Thomas Lehmann August 1991
  263. ;
  264. ; =========================================================================
  265.  
  266. ; Offset auf "calc_reg"
  267. ; --------------------
  268.     org    0
  269. EXP1    sdo    2    ; Multiplikant
  270. EXP2    sdo    2    ; Multiplikator
  271. SCRATCH    sdo    2    ; internes Hilfsregister
  272.  
  273.  
  274.     ; 8 BIT * 8 BIT Multiplikation, ACCU * Y
  275.     ; --------------------------------------
  276. mul8_8    stz calc_reg+EXP1+1    ; Multiplikant, MSB
  277.     sta calc_reg+EXP1    ; LSB
  278.     stz calc_reg+EXP2+1    ; Multiplikator, MSB
  279.     sty calc_reg+EXP2    ; LSB
  280.     bra mult    ; Multiplikation durchführen
  281.  
  282.  
  283.     ; 16 BIT * 8 BIT Multiplikation, (ACCU und X) * Y
  284.     ; -----------------------------------------------
  285. mul16_8    sta calc_reg+EXP1+1    ; Multiplikant, MSB
  286.     stx calc_reg+EXP1    ; LSB
  287.     stz calc_reg+EXP2+1    ; Multiplikator MSB
  288.     sty calc_reg+EXP2    ; LSB
  289.  
  290.  
  291.  
  292.  
  293.     ; 16 BIT Multiplikation
  294.     ; =====================
  295. mult
  296.     block
  297.     phy
  298.     stz calc_reg+SCRATCH    ; MUL internes Hilfsregister
  299.     stz calc_reg+SCRATCH+1
  300.     ldy #16        ; Anzahl der BIT`s
  301.     bra mul_2
  302.     
  303. mul_1    clc
  304.     lda calc_reg+SCRATCH
  305.     adc calc_reg+EXP2
  306.     sta calc_reg+SCRATCH
  307.     lda calc_reg+SCRATCH+1
  308.     adc calc_reg+EXP2+1
  309.     sta calc_reg+SCRATCH+1
  310.  
  311. mul_2    lsr calc_reg+SCRATCH+1
  312.     ror calc_reg+SCRATCH
  313.     ror calc_reg+EXP1+1
  314.     ror calc_reg+EXP1
  315.     dey
  316.     bmi mul_end    ; alle BIT`s multipliziert, Ende
  317.     bcc mul_2    ; kein Überlauf
  318.     bcs mul_1
  319.  
  320. mul_end    lda calc_reg+EXP1+1    ; MSB des Resultats
  321.     ldx calc_reg+EXP1    ; LSB des Resultats
  322.     ply
  323.     rts
  324.     bend
  325.  
  326.  
  327.  
  328. ; =========================================================================
  329. ;
  330. ; Funktion    : Division: 8BIT * 8BIT, 16BIT * 8BIT, 16BIT * 16BIT
  331. ;
  332. ; Eingang    : 8 BIT * 8 BIT
  333. ;      ACCU / Y
  334. ;
  335. ;      16 BIT / 8 BIT
  336. ;      ( MSB ACCU, LSB X) / Y
  337. ;
  338. ;      16 BIT / 16 BIT, nicht implementiert !!!
  339. ;      ( MSB ACCU, LSB X) / ( MSB hlp_reg, LSB Y )
  340. ;
  341. ;
  342. ; Ausgang    : Resulat MSB im ACCU
  343. ;          LSB in X
  344. ;          Rest in Y
  345. ;
  346. ; Register    : ACCU, X, Y
  347. ;
  348. ; (c) by Thomas Lehmann Oktober 1991
  349. ;
  350. ; =========================================================================
  351.  
  352. ; Offset auf "calc_reg"
  353. ; --------------------
  354.     org    0
  355. EXP1    sdo    2    ; Wert
  356. EXP2    sdo    2    ; Divisor
  357. REMAIN    sdo    2    ; internes Hilfsregister
  358.  
  359.  
  360.     ; 8 BIT / 8 BIT Divison, ACCU / Y
  361.     ; -------------------------------
  362. div8_8    stz calc_reg+EXP1+1    ; Divident, MSB
  363.     sta calc_reg+EXP1        ; LSB
  364.     stz calc_reg+EXP2+1    ; Divisor, MSB
  365.     sty calc_reg+EXP2        ; LSB
  366.     bra div            ; Division durchführen
  367.  
  368.  
  369.     ; 16 BIT / 8 BIT Division, (ACCU und X) / Y
  370.     ; -----------------------------------------
  371. div16_8    sta calc_reg+EXP1+1    ; Divident, MSB
  372.     stx calc_reg+EXP1        ; LSB
  373.     stz calc_reg+EXP2+1    ; Divisor, MSB
  374.     sty calc_reg+EXP2        ; LSB
  375.  
  376.  
  377.  
  378.  
  379.     ; 16 BIT Division
  380.     ; ---------------
  381. div
  382.     block
  383.     stz calc_reg+REMAIN    ; DIV internes Hilfsregister
  384.     stz calc_reg+REMAIN+1
  385.     ldy #16            ; Anzahl der BIT`s
  386.  
  387. div_1    asl calc_reg+EXP1
  388.     rol calc_reg+EXP1+1
  389.     rol calc_reg+REMAIN
  390.     rol calc_reg+REMAIN+1
  391.  
  392.     sec
  393.     lda calc_reg+REMAIN
  394.     sbc calc_reg+EXP2
  395.     tax    
  396.     lda calc_reg+REMAIN+1
  397.     sbc calc_reg+EXP2+1
  398.     bcc div_2        ; kein Überlauf
  399.  
  400.     stx calc_reg+REMAIN
  401.     sta calc_reg+REMAIN+1
  402.     inc calc_reg+EXP1
  403.  
  404. div_2    dey
  405.     bne div_1
  406.  
  407.     lda calc_reg+EXP1+1    ; MSB des Resultats
  408.     ldx calc_reg+EXP1        ; LSB des Resultats
  409.     ldy calc_reg+REMAIN    ; low Rest der Division
  410.     rts
  411.     bend
  412.  
  413.  
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  
  420. ; =========================================================================
  421. ;
  422. ; Funktion    : Multiplikation: 8BIT * 8BIT + 16BIT Addition
  423. ;
  424. ; Eingang    : ( Accu * Y ) + ( MSB hlp_reg, LSB X )
  425. ;
  426. ; Ausgang    : Resulat MSB im ACCU
  427. ;          LSB in X-Reg.
  428. ;
  429. ; Register    : ACCU, X, Y
  430. ;
  431. ; (c) by Thomas Lehmann August 1991
  432. ;
  433. ; =========================================================================
  434.  
  435. mul_add    phx        ; LSB add Wert
  436.     jsr mul8_8    ; Accu * Y == Accu, X
  437.     ply
  438.     jmp add16_16    ; (ACCU, X) + (hlp_reg, Y) == (Accu, X)
  439.  
  440.  
  441.  
  442.  
  443.  
  444. ; --------------------------------------------------------------------------
  445.  
  446. HLP    set    *
  447. _CALCULATE    equ    HLP-MODUL_START        ; Größe des Moduls
  448.  
  449.