home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / oct93 / develop / math68hc11.lha / Math68hc11 / GMATH.ASM < prev    next >
Assembly Source File  |  1991-06-29  |  10KB  |  398 lines

  1.  
  2. *             GMATH.ASM
  3. *
  4. *               Copyright 1988
  5. *                 by
  6. *               James C. Shultz
  7. *
  8. * The source code for this General Math package for the 
  9. * MC68HC11 may be freely distributed under the rules of
  10. * public domain.
  11. *
  12. * If there are any questions or comments about this General
  13. * Math package please feel free to contact me.
  14. *
  15. *               James C. Shultz
  16. *               J & J Electronic Industries, Inc.
  17. *               526 North Main Street
  18. *               Glen Ellyn, IL  60137
  19. *               (312) 858-2999
  20. *
  21. *
  22. *        REVISION HISTORY:
  23. *    1.0    12-30-88    Release to public domain of a 
  24. *                general math package including
  25. *                the following:
  26. *                HEXBIN - ASCII hex to binary
  27. *                     convertion
  28. *                UPCASE - Convert Lower case
  29. *                     to Upper case
  30. *                BTOA - Binary to ASCII
  31. *                BTOD - Binary to Decimal
  32. *                DTOB - Decimal to Binary
  33. *                WMUL - 24 bit by 16 bit multiply
  34. *                       with a 40 bit result
  35. *                XMUL - 16 bit by 16 bit multiply
  36. *                       with a 32 bit result
  37. *                ZMUL - 24 bit by 8 bit multiply
  38. *                       with a 32 bit result
  39. *    1.1    MM-DD-YY
  40. *
  41.  
  42.  
  43. *    EQUATES
  44. RAMBS    EQU    $0000        ;START OF RAM
  45. PAREA    EQU    $E000        ;START OF PROGRAM AREA
  46.  
  47. *    VARIABLES
  48.     ORG    RAMBS
  49. SHFTRGH    RMB    1    ;INPUT SHIFT REGISTER HIGH
  50. SHFTRG    RMB    2        ;INPUT SHIFT REGISTER
  51. TMP1    RMB    1        ;USED BY HEXBIN
  52. TEMP    RMB    1        ;USED BY BTOD
  53. TEMP0    RMB    1        ;USED BY DTOB
  54. TEMP1    RMB    1        ;USED BY DTOB
  55. TEMP2    RMB    1        ;USED BY DTOB
  56. TEMP3    RMB    1        ;USED BY DTOB
  57. VALUE    RMB    8        ;SPI DISPLAY VALUE
  58. PROD0    RMB    1        ;WMUL PRODUCT
  59. PROD1    RMB    1        ;XMUL PRODUCT
  60. PROD2    RMB    1        ;XMUL PRODUCT
  61. PROD3    RMB    1        ;XMUL PRODUCT
  62. PROD4    RMB    1        ;XMUL PRODUCT
  63. FACTA    RMB    2        ;XMUL FACTOR
  64. FACTB    RMB    2        ;XMUL FACTOR
  65.  
  66. * Note: Set program area
  67.     ORG    PAREA        ;set up program area
  68.  
  69. ***************************************************************
  70. *                     INIT & MAIN PROGRAM
  71. ***************************************************************
  72. START:
  73. * .    .    .        ;......
  74. *    .    .        ;......
  75. *    .    .        ;......
  76. *etc. etc
  77.  
  78. MAIN:
  79. * .    .    .        ;......
  80. *    .    .        ;......
  81. *    .    .        ;......
  82. *etc. etc
  83.     JMP    MAIN        ;AND ANOTHER LOOP
  84.  
  85. ***************************************************************
  86. *                     SUBROUTINES
  87. ***************************************************************
  88.  
  89. *********
  90. * Start  MATH related subroutines
  91. *********
  92. *********
  93. * HEXBIN(A) - CONVERT THE ASCII CHAR IN (ACCA) TO BINARY
  94. *          Place result in ACCA & SHFTRG+1 (lo-byte)
  95. *          Increments TMP1 if ACCA does not have a valid
  96. *          hex character
  97. *********
  98. HEXBIN    PSHA
  99.     PSHB
  100.     PSHX
  101.     JSR    UPCASE        ;CONVERT TO UPPER CASE
  102.     CMPA    #'0'
  103.     BLT    HEXNOT        ;JUMP IF A < $30
  104.     CMPA    #'9'
  105.     BLE    HEXNMB        ;JUMP IF 0-9
  106.     CMPA    #'A'
  107.     BLT    HEXNOT        ;JUMP ID $39 > A < $41
  108.     CMPA    #'F'
  109.     BGT    HEXNOT        ;JUMP IF A > $46
  110.     ADDA    #$9        ;CONVERT $A-$F
  111. HEXNMB    ANDA    #$0F        ;CONVERT TO BINARY
  112.     LDX    #SHFTRGH
  113.     LDAB    #4
  114. HEXSHFT    ASL    2,X        ;3 BYTE SHIFT THROUGH
  115.     ROL    1,X        ; CARRY BIT
  116.     ROL    0,X        ; CARRY BIT
  117.     DECB
  118.     BGT    HEXSHFT        ;SHIFT 4 TIMES
  119.     ORAA    2,X        ;GET HIGH 4 BITS
  120.     STAA    2,X        ;WRITE NEW LOW BYTE
  121.     BRA    HEXRTS
  122. HEXNOT    INC    TMP1        ;INDICATE NOT HEX
  123. HEXRTS    PULX
  124.     PULB
  125.     PULA
  126.     RTS
  127. *********
  128. * UPCASE() - RETURNS ACCA CONVERTED TO UPPERCASE
  129. *********
  130. UPCASE    CMPA    #'a'
  131.     BLT    UPCASE1        ;JUMP IF < a
  132.     CMPA    #'z'
  133.     BGT    UPCASE1        ;JUMP IF > z
  134.     SUBA    #$20        ;CONVERT
  135. UPCASE1    RTS
  136. *********
  137. * BTOA(A) - CONVERT THE BINARY CHAR IN ACCA TO ASCII 
  138. *        Place result at Index X (upper 4 bits) and
  139. *        X+1 (lower 4 bits)
  140. *********
  141. BTOA:    PSHA            ;SAVE ACCA
  142.     PSHA
  143.     JSR    BTOAL        ;CONVERT UPPER 4 BITS
  144.     STAA    0,X        ;STORE IT AT X
  145.     PULA            ;RESTORE ACCA
  146.     JSR    BTOAR        ;CONVERT LOWER 4 BITS
  147.     STAA    1,X        ;STORE IT AT X+1
  148.     PULA            ;RESTORE ACCA
  149.     RTS
  150. *********
  151. * BTOAL(A) - CONVERT THE LEFT 4 BITS IN A TO ASCII HEX
  152. *********
  153. BTOAL:    LSRA            ;SHIFT RIGHT 4 TIMES
  154.     LSRA
  155.     LSRA
  156.     LSRA
  157. *********
  158. * BTOAR(A) - CONVERT THE RIGHT 4 BITS IN A TO ASCII HEX
  159. *********
  160. BTOAR:    ANDA    #$0F        ;MASK FOR LOWER 4 BITS
  161.     ADDA    #$30        ;CONVERT TO ASCII
  162.     CMPA    #$39        ;CHECK IF A-F
  163.     BLE    BTR1        ;SKIP IF NOT
  164.     ADDA    #$07        ;CONVERT TO A-F
  165. BTR1:    RTS
  166. *********
  167. * BTOD() - BINARY TO DECIMAL CONVERTER 
  168. *       Input value is in SHFTRGH (hi-byte), 
  169. *       SHFTRG (middle-byte), and SHFTRG+1 (lo-byte)
  170. *       The result is in VALUE thru VALUE+8
  171. *********
  172. BTOD:    PSHA            ;SAVE ACCA
  173.     PSHB            ;SAVE ACCB
  174.     PSHX            ;SAVE X
  175.     PSHY            ;SAVE Y
  176.     LDX    #PWRTBL        ;INIT POWER TABLE PTR
  177.     LDY    #VALUE        ;RESULT AREA
  178.     LDD    #$0000        ;GET ZERO
  179.     STD    0,Y        ;CLEAR DIGIT
  180.     STD    2,Y        ;CLEAR DIGIT
  181.     STD    4,Y        ;CLEAR DIGIT
  182.     STD    6,Y        ;CLEAR DIGIT
  183. BTA:    LDAA    SHFTRG+1    ;GET LO BYTE
  184.     SUBA    2,X        ;SUB LO BYTE OF 10
  185.     STAA    TEMP        ;SAVE NEW LO BYTE
  186.     LDD    SHFTRGH        ;LOAD HI BYTE
  187.     BCC    BTB        ;CK IF BORROW
  188.     SUBD    #$0001        ;GET FROM HI BYTE
  189.     BCS    BTNEXT        ;NO BORROW GOTO NEXT
  190. BTB:    SUBD    0,X        ;SUB HI BYTE OF 10
  191.     BCS    BTNEXT        ;IF FAIL GOTO NEXT
  192.     INC    0,Y        ;ELSE ADD ONE TO DISP
  193.     STD    SHFTRGH        ;SAVE UPDATED HIBYTE
  194.     LDAA    TEMP        ;GET UPDATED LO BYTE
  195.     STAA    SHFTRG+1    ;SAVE UPDATED LO BYTE
  196.     BRA    BTA        ;DO IT AGAIN
  197. BTNEXT:    INX            ;NEXT LOWER PWR OF 10
  198.     INX            ;NEXT LOWER PWR OF 10
  199.     INX            ;NEXT LOWER PWR OF 10
  200.     INY            ;NEXT LOWER DIGIT
  201.     CPX    #PWREND        ;CHECK FOR END OF TABLE
  202.     BLO    BTA        ;BR IF NOT DONE
  203.     LDAA    SHFTRG+1    ;GET REMAINDER
  204.     STA    0,Y        ;PUT IN LAST DISPLAY DIGIT
  205.     PULY            ;RESTORE Y
  206.     PULX            ;RESTORE X
  207.     PULB            ;RESTORE ACCB
  208.     PULA            ;RESTORE ACCA
  209.     RTS
  210. *********
  211. * DTOB() - DECIMAL TO BINARY CONVERTER 
  212. *       Index X points to Decimal string
  213. *       Results will be in SHFTRGH (hi-byte), 
  214. *       SHFTRG (middle-byte), and SHFTRG+1 (lo-byte)
  215. *********
  216. DTOB:    PSHA            ;SAVE ACCA
  217.     PSHB            ;SAVE ACCB
  218.     LDD    #$0000        ;CLEAR ACCUMULATOR
  219.     STAA    TEMP        ;CLEAR TEMP
  220.     STAA    TEMP0        ;CLEAR TEMP0
  221.     STAA    TEMP2        ;CLEAR TEMP2
  222.     STAA    SHFTRGH        ;CLEAR BINARY HIGH BYTE
  223.     STD    SHFTRG        ;CLEAR BINARY LOW WORD
  224. DTNEXT:    LDAA    0,X        ;LOAD COMPARE VALUE
  225.     SUBA    #$30        ;SUB ASCII OFFSET
  226.     CMPA    #$09        ;CHECK IF 0 - 9
  227.     BHI    DTEND        ;END IF NOT 0 - 9
  228.     STAA    TEMP1        ;SAVE IT
  229.     LDD    SHFTRG        ;GET LOW WORD
  230.     LSLD            ;MULTIPLY BYTE BY 2
  231.     ROL    TEMP2        ;MULTIPLY HI BYTE BY 2
  232.     LSLD            ;MULTIPLY BYTE BY 2
  233.     ROL    TEMP2        ;MULTIPLY HI BYTE BY 2
  234.     ADDD    SHFTRG        ;ADD
  235.     BCC    DT20        ;CHECK FOR CARRY
  236.     INC    TEMP2        ;DO CARRY
  237. DT20:    STAA    TEMP3        ;SAVE ACCA
  238.     LDAA    TEMP2        ;GET HIGH
  239.     ADDA    SHFTRGH        ;ADD
  240.     STAA    TEMP2        ;SAVE HIGH
  241.     LDAA    TEMP3        ;RESTORE ACCA
  242.     LSLD            ;MULTIPLY BYTE BY 2
  243.     ROL    TEMP2        ;MULTIPLY HI BYTE BY 2
  244.     ADDD    TEMP0        ;ADD TEMP
  245.     BCC    DT30        ;CHECK FOR CARRY
  246.     INC    TEMP2        ;DO CARRY
  247. DT30:    STD    SHFTRG        ;SAVE
  248.     LDAA    TEMP2        ;GET HIGH
  249.     STAA    SHFTRGH        ;SAVE
  250.     INX            ;NEXT
  251.     BRA    DTNEXT        ;DO NEXT
  252. DTEND:    PULB            ;RESTORE ACCB
  253.     PULA            ;RESTORE ACCA
  254.     RTS            ;RETURN
  255. *********
  256. * WMUL() - 24 BIT BY 16 BIT MULTIPLY, PRODUCT = 40 BITS
  257. *       Input - the 16 bits are in FACTA (hi-byte) & 
  258. *       FACTA+1 (lo-byte),with the 24 bits being pointed 
  259. *       to by Index X with the low byte being X+2
  260. *       The result is in PROD0 thru PROD4 with the low
  261. *       byte being in PROD4
  262. *********
  263. WMUL:    PSHA            ;SAVE ACCA
  264.     PSHB            ;SAVE ACCB
  265.     LDD    #$0000        ;GET ZERO
  266.     STAA    PROD0        ;CLEAR
  267.     STD    PROD1        ;CLEAR PRODUCT
  268.     LDAA    FACTA+1        ;GET LOW BYTE
  269.     LDAB    2,X        ;GET LOW BYTE
  270.     MUL            ;MULTIPLY
  271.     STD    PROD3        ;SAVE
  272.     LDAA    FACTA+1        ;GET LOW BYTE
  273.     LDAB    1,X        ;GET HIGH BYTE
  274.     MUL            ;MULTIPLY
  275.     ADDD    PROD2        ;SUM INTO PRODUCT
  276.     STD    PROD2        ;SAVE
  277.     BCC    WMU10        ;CHECK FOR CARRY
  278.     INC    PROD1        ;DO CARRY
  279. WMU10:    LDAA    FACTA        ;GET HIGH BYTE
  280.     LDAB    2,X        ;GET LOW BYTE
  281.     MUL            ;MULTIPLY
  282.     ADDD    PROD2        ;SUM INTO PRODUCT
  283.     STD    PROD2        ;SAVE
  284.     BCC    WMU20        ;CHECK FOR CARRY
  285.     INC    PROD1        ;DO CARRY
  286. WMU20:    LDAA    FACTA        ;GET HIGH BYTE
  287.     LDAB    1,X        ;GET HIGH BYTE
  288.     MUL            ;MULTIPLY
  289.     ADDD    PROD1        ;SUM INTO PRODUCT
  290.     STD    PROD1        ;SAVE
  291.     LDAA    FACTA+1        ;GET HIGH BYTE
  292.     LDAB    0,X        ;GET LOW BYTE
  293.     MUL            ;MULTIPLY
  294.     ADDD    PROD1        ;SUM INTO PRODUCT
  295.     STD    PROD1        ;SAVE
  296.     BCC    WMU30        ;CHECK FOR CARRY
  297.     INC    PROD0        ;DO CARRY
  298. WMU30:    LDAA    FACTA        ;GET HIGH BYTE
  299.     LDAB    0,X        ;GET HIGH BYTE
  300.     MUL            ;MULTIPLY
  301.     ADDD    PROD0        ;SUM INTO PRODUCT
  302.     STD    PROD0        ;SAVE
  303. WMU50:    PULB            ;RESTORE ACCB
  304.     PULA            ;RESTORE ACCA
  305.     RTS
  306. *********
  307. * XMUL() - 16 BIT BY 16 BIT MULTIPLY, PRODUCT = 32 BITS
  308. *       Input -  16 bits are in FACTA (hi-byte) & 
  309. *       FACTA+1 (lo-byte),with the other 16 bits in 
  310. *       FACTB (hi-byte) & FACTB+1 (lo-byte)
  311. *       The result is in PROD1 thru PROD4 with the low
  312. *       byte being in PROD4
  313. *********
  314. XMUL:    PSHA            ;SAVE ACCA
  315.     PSHB            ;SAVE ACCB
  316.     LDD    #$0000        ;GET ZERO
  317.     STD    PROD1        ;CLEAR PRODUCT
  318.     LDAA    FACTA+1        ;GET LOW BYTE
  319.     LDAB    FACTB+1        ;GET LOW BYTE
  320.     MUL            ;MULTIPLY
  321.     STD    PROD3        ;SAVE
  322.     LDAA    FACTA+1        ;GET LOW BYTE
  323.     LDAB    FACTB        ;GET HIGH BYTE
  324.     MUL            ;MULTIPLY
  325.     ADDD    PROD2        ;SUM INTO PRODUCT
  326.     STD    PROD2        ;SAVE
  327.     BCC    XMU10        ;CHECK FOR CARRY
  328.     INC    PROD1        ;DO CARRY
  329. XMU10:    LDAA    FACTA        ;GET HIGH BYTE
  330.     LDAB    FACTB+1        ;GET LOW BYTE
  331.     MUL            ;MULTIPLY
  332.     ADDD    PROD2        ;SUM INTO PRODUCT
  333.     STD    PROD2        ;SAVE
  334.     BCC    XMU20        ;CHECK FOR CARRY
  335.     INC    PROD1        ;DO CARRY
  336. XMU20:    LDAA    FACTA        ;GET HIGH BYTE
  337.     LDAB    FACTB        ;GET HIGH BYTE
  338.     MUL            ;MULTIPLY
  339.     ADDD    PROD1        ;SUM INTO PRODUCT
  340.     STD    PROD1        ;SAVE
  341. XMU50:    PULB            ;RESTORE ACCB
  342.     PULA            ;RESTORE ACCA
  343.     RTS
  344.  
  345. *********
  346. * ZMUL() - 24 BIT BY 8 BIT MULTIPLY, PRODUCT = 32 BITS
  347. *       Input - the 8 bits are in FACTA and the 24 
  348. *       bits are being pointed to by Index X with the 
  349. *       low byte being X+2
  350. *       The result is in PROD1 thru PROD4 with the low
  351. *       byte being in PROD4
  352. *********
  353. ZMUL:    PSHA            ;SAVE ACCA
  354.     PSHB            ;SAVE ACCB
  355.     LDD    #$0000        ;GET ZERO
  356.     STD    PROD1        ;CLEAR PRODUCT
  357.     LDAA    FACTA        ;GET LOW BYTE
  358.     LDAB    2,X        ;GET LOW BYTE
  359.     MUL            ;MULTIPLY
  360.     STD    PROD3        ;SAVE
  361.     LDAA    FACTA        ;GET LOW BYTE
  362.     LDAB    1,X        ;GET MIDDLE BYTE
  363.     MUL            ;MULTIPLY
  364.     ADDD    PROD2        ;SUM INTO PRODUCT
  365.     STD    PROD2        ;SAVE
  366.     BCC    ZMU10        ;CHECK FOR CARRY
  367.     INC    PROD1        ;DO CARRY
  368. ZMU10:    LDAA    FACTA        ;GET HIGH BYTE
  369.     LDAB    0,X        ;GET HI BYTE
  370.     MUL            ;MULTIPLY
  371.     ADDD    PROD1        ;SUM INTO PRODUCT
  372.     STD    PROD1        ;SAVE
  373.     PULB            ;RESTORE ACCB
  374.     PULA            ;RESTORE ACCA
  375.     RTS
  376. *********
  377. * End MATH related subroutines
  378. *********
  379.  
  380. PWRTBL:    FDB    $9896        ;10,000,000
  381.     FCB    $80
  382.     FDB    $0F42        ;1,000,000
  383.     FCB    $40
  384.     FDB    $0186        ;100,000
  385.     FCB    $A0
  386.     FDB    $0027        ;10,000
  387.     FCB    $10
  388.     FDB    $0003        ;1,000
  389.     FCB    $E8
  390.     FDB    $0000        ;100
  391.     FCB    $64
  392.     FDB    $0000        ;10
  393.     FCB    $0A
  394.     FDB    $0000        ;1
  395.     FCB    $01
  396. PWREND:
  397.     ENDWR OF 10
  398.