Advertisement
Artychenal

Untitled

Apr 28th, 2025
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
6502 TASM/64TASS 18.15 KB | Source Code | 0 0
  1. DATA SEGMENT
  2.     messtr       DB 0Dh, 0Ah, "Hello! Let`s solve piecewise function with your values", 0Dh, 0Ah, "$"
  3.     funct        DB " { x-1, if x < 10", 0Dh, 0Ah, "Z= { (3x^2+4)/(x-2), if x = 10", 0Dh, 0Ah, " { (7x^2-56)/(2x-5), if x > 10", 0Dh, 0Ah, "$"
  4.     xreadmes     DB "Input value of x (range -32767...32767,but correct result for -32767 ... 68) -> $"
  5.     xinmes       DB 7,?, 7 DUP (" ")
  6.     menuhold     DB 2,?, 2 DUP (" ")
  7.     xvalue       DW ?
  8.     out_msg      DB "Result: $"
  9.     newline      DB 0Dh,0Ah,"$"
  10.     err_msg      DB 0Dh, 0Ah, "Invalid input!", 0Dh, 0Ah, "$"
  11.     range_err    DB "Number out of range!", 0Dh, 0Ah, "$"
  12.     overflow_err DB "Calculation overflow occurred!", 0Dh, 0Ah, "$"
  13.     reminder_msg DB " reminder $"
  14.     end_msg      DB "Do you want to continue? (y/n): $"
  15.     result       DW ?
  16.     remainder    DW ?
  17.     numerator    DW ?
  18.     denominator  DW ?
  19.     sign_flag    DB 0
  20.     temp_reg     DW ?
  21. DATA ENDS
  22. STSEG SEGMENT PARA STACK "STACK"
  23.           DB 64 DUP ( "STACK" )
  24. STSEG ENDS
  25. CODE SEGMENT
  26.                          ASSUME CS:CODE, DS:DATA, SS:STSEG
  27.     START:              
  28.                          MOV    AX, DATA
  29.                          MOV    DS, AX
  30.                          CALL   WELC_PROC
  31.                          CALL   FUNC
  32.                          CALL   PRINTING
  33.                          CALL   END_PROGRAM
  34.                          MOV    AH, 10
  35.                          INT    21h
  36. WELC_PROC PROC
  37.                          MOV    DX, OFFSET messtr
  38.                          MOV    AH, 9
  39.                          INT    21h
  40.                          MOV    DX, OFFSET funct
  41.                          MOV    AH, 9
  42.                          INT    21h
  43.                          MOV    DX, OFFSET xreadmes
  44.                          MOV    AH, 9
  45.                          INT    21h
  46.                          MOV    DX, OFFSET xinmes
  47.                          MOV    AH, 10
  48.                          INT    21h
  49.                          CALL   CHECK_INPUT
  50.                          MOV    SI, OFFSET xinmes
  51.                          ADD    SI, 2
  52.                          CALL   CONVERT
  53.                          MOV    xvalue, BX
  54.                          MOV    sign_flag, 0
  55.                          RET
  56. WELC_PROC ENDP
  57. CHECK_INPUT PROC
  58.                          MOV    SI, DX
  59.                          MOV    CL, [SI+1]
  60.                          MOV    BL, 0
  61.                          ADD    SI, 2
  62.                          MOV    AL, [SI]
  63.                          CMP    AL, '-'
  64.                          JNE    CHECK_DIGITS
  65.                          MOV    sign_flag, 1
  66.                          INC    SI
  67.                          DEC    CX
  68.                          JZ     INVALID_INPUT
  69.     CHECK_DIGITS:        
  70.                          MOV    AL, [SI]
  71.                          CMP    CX, 0
  72.                          JZ     END_CHECK
  73.     CHECK_LOOP:          
  74.                          MOV    AL, [SI]
  75.                          CMP    AL, '0'
  76.                          JB     INVALID_INPUT
  77.                          CMP    AL, '9'
  78.                          JA     INVALID_INPUT
  79.                          INC    BL
  80.                          INC    SI
  81.                          DEC    CX
  82.                          JNZ    CHECK_LOOP
  83.                          CMP    BL, 0
  84.                          JZ     INVALID_INPUT
  85.                          JMP    END_CHECK
  86.     INVALID_INPUT:      
  87.                          MOV    DX, OFFSET err_msg
  88.                          MOV    AH, 9
  89.                          INT    21h
  90.                          JMP    END_ERROR
  91.     END_ERROR:          
  92.                          JMP    START
  93.     END_CHECK:          
  94.                          RET
  95. CHECK_INPUT ENDP
  96. CHECK_RANGE PROC
  97.                          CMP    sign_flag, 0
  98.                          JE     CHECK_NEGATIVE
  99.                          NEG    AX
  100.                          CMP    remainder, 0
  101.                          JNE    CHECK_NEGATIVE
  102.                          CMP    DX, 0
  103.                          JNE    RANGE_ERROR
  104.     CHECK_NEGATIVE:      
  105.                          CMP    AX, 32767
  106.                          JA     RANGE_ERROR
  107.                          CMP    sign_flag, 0
  108.                          JNE    NEG_N
  109.                          RET
  110.     RANGE_ERROR:        
  111.                          MOV    DX, OFFSET newline
  112.                          MOV    AH, 9
  113.                          INT    21h
  114.                          MOV    DX, OFFSET range_err
  115.                          MOV    AH, 9
  116.                          INT    21h
  117.                          CALL   END_PROGRAM
  118.     NEG_N:              
  119.                          NEG    AX
  120.                          RET
  121. CHECK_RANGE ENDP
  122. CHECK_RANGE_RESULT PROC
  123.                          MOV    AX, result
  124.                          CMP    AX, -32768
  125.                          JA     RANGE_ERROR_RES
  126.                          CMP    AX, 32752
  127.                          JG     RANGE_ERROR_RES
  128.                          RET
  129.     RANGE_ERROR_RES:    
  130.                          MOV    DX, OFFSET newline
  131.                          MOV    AH, 9
  132.                          INT    21h
  133.                          MOV    DX, OFFSET range_err
  134.                          MOV    AH, 9
  135.                          INT    21h
  136.                          JMP    START
  137. CHECK_RANGE_RESULT ENDP
  138. CONVERT PROC
  139.                          XOR    AX, AX
  140.                          XOR    BX, BX
  141.                          PUSH   AX
  142.                          PUSH   BX
  143.                          PUSH   CX
  144.                          PUSH   DX
  145.                          MOV    BX, 0
  146.                          CMP    sign_flag, 1
  147.                          JNE    CONVERT_LOOP
  148.                          INC    SI
  149.                          DEC    CX
  150.     CONVERT_LOOP:        
  151.                          MOV    AL, [SI]
  152.                          CMP    AL, '0'
  153.                          JB     CONVERT_END
  154.                          CMP    AL, '9'
  155.                          JA     CONVERT_END
  156.                          SUB    AL, '0'
  157.                          MOV    AH, 0
  158.                          PUSH   AX
  159.                          MOV    AX, BX
  160.                          MOV    CX, 10
  161.                          MUL    CX
  162.                          CMP    DX, 0
  163.                          JNE    OVERFLOW_ERROR
  164.                          MOV    BX, AX
  165.                          POP    AX
  166.                          ADD    BX, AX
  167.                          INC    SI
  168.                          JMP    CONVERT_LOOP
  169.     OVERFLOW_ERROR:      
  170.                          MOV    DX, OFFSET newline
  171.                          MOV    AH, 9
  172.                          INT    21h
  173.                          MOV    DX, OFFSET range_err
  174.                          MOV    AH, 9
  175.                          INT    21h
  176.                          JMP    START
  177.     CONVERT_END:        
  178.                          CMP    sign_flag, 1
  179.                          JNE    CONVERT_FINISH
  180.                          NEG    BX
  181.     CONVERT_FINISH:      
  182.                          MOV    AX, BX
  183.                          CALL   CHECK_RANGE
  184.                          POP    DX
  185.                          POP    CX
  186.                          POP    BX
  187.                          MOV    BX, AX
  188.                          POP    AX
  189.                          RET
  190. CONVERT ENDP
  191. RET_PROC PROC
  192.                          CALL   START
  193. RET_PROC ENDP
  194. FUNC PROC
  195.                          XOR    AX, AX
  196.                          MOV    AX, xvalue
  197.  
  198.                          CMP    AX, 10
  199.                          JL     CASE_LESS_THAN_10
  200.                          JE     CASE_EQUAL_10
  201.                          JG     CASE_GREATER_THAN_10
  202.  
  203.     CASE_LESS_THAN_10:  
  204.     ; Calculate Z = x - 1
  205.                          MOV    AX, xvalue
  206.                          SUB    AX, 1
  207.                          MOV    result, AX
  208.                          MOV    remainder, 0
  209.                          JMP    END_FUNC
  210.  
  211.     CASE_EQUAL_10:      
  212.     ; Calculate Z = (3x^2 + 4) / (x - 2)
  213.     ; First calculate x^2
  214.                          MOV    AX, xvalue
  215.                          MUL    xvalue                        ; DX:AX = x^2
  216.    
  217.     ; Calculate 3x^2
  218.                          MOV    BX, 3
  219.                          MUL    BX                            ; DX:AX = 3x^2
  220.    
  221.     ; Add 4: AX = 3x^2 + 4
  222.                          ADD    AX, 4
  223.    
  224.                          MOV    numerator, AX
  225.    
  226.     ; Calculate denominator: (x-2)
  227.                          MOV    BX, xvalue
  228.                          SUB    BX, 2
  229.                          MOV    denominator, BX
  230.    
  231.     ; Perform division
  232.                          MOV    AX, numerator
  233.                          CWD                                  ; Convert word to double word for division
  234.                          DIV    denominator
  235.                          MOV    result, AX
  236.                          MOV    remainder, DX
  237.                          JMP    END_FUNC
  238.  
  239.     CASE_GREATER_THAN_10:
  240.     ; Calculate Z = (7x^2 - 56) / (2x - 5)
  241.                          MOV    AX, xvalue
  242.                          MOV    temp_reg, AX                  ; Store x in temp_reg
  243.    
  244.                          MOV    AX, xvalue
  245.                          MUL    xvalue                        ; DX:AX = x^2
  246.    
  247.                          CMP    DX, 0
  248.                          JNE    CALC_OVERFLOW
  249.  
  250.                          CMP    AX, 4681                      ; 4681 = floor(32767 / 7)
  251.                          JG     CALC_OVERFLOW
  252.     ; Calculate 7x^2
  253.                          MOV    BX, 7
  254.                          MUL    BX                            ; DX:AX = 7x^2
  255.  
  256.     ; Check for overflow
  257.                          CMP    DX, 0
  258.                          JNE    CALC_OVERFLOW
  259.    
  260.     ; Subtract 56: AX = 7x^2 - 56
  261.                          SUB    AX, 56
  262.                          MOV    numerator, AX
  263.    
  264.     ; Calculate denominator: (2x-5)
  265.                          MOV    AX, temp_reg                  ; Retrieve x from temp_reg
  266.                          MOV    BX, 2
  267.                          MUL    BX                            ; AX = 2x
  268.                          SUB    AX, 5                         ; AX = 2x - 5
  269.                          MOV    denominator, AX
  270.    
  271.     ; Check if denominator is 0
  272.                          CMP    AX, 0
  273.                          JE     RANGE_ERROR_FUNC
  274.    
  275.     ; Perform division - ensure signs are handled correctly
  276.                          MOV    AX, numerator
  277.                          MOV    BX, denominator
  278.    
  279.     ; Check if numerator is negative
  280.                          CMP    AX, 0
  281.                          JGE    CHECK_DENOM_SIGN
  282.    
  283.     ; Numerator is negative
  284.                          NEG    AX
  285.                          XOR    SI, SI                        ; SI=0 means positive result initially
  286.                          INC    SI                            ; SI=1 means need to negate result
  287.                          JMP    PERFORM_DIV
  288.    
  289.     CHECK_DENOM_SIGN:    
  290.                          XOR    SI, SI                        ; SI=0 means positive result
  291.    
  292.     ; Check if denominator is negative
  293.                          CMP    BX, 0
  294.                          JGE    PERFORM_DIV
  295.    
  296.     ; Denominator is negative
  297.                          NEG    BX
  298.                          INC    SI                            ; Toggle result sign
  299.    
  300.     PERFORM_DIV:        
  301.                          MOV    numerator, AX                 ; Update with absolute values
  302.                          MOV    denominator, BX
  303.    
  304.     ; Perform division with absolute values
  305.                          CWD                                  ; Convert word to double word for division
  306.                          DIV    BX
  307.                          MOV    result, AX
  308.                          MOV    remainder, DX
  309.    
  310.     ; Apply sign if needed
  311.                          CMP    SI, 0
  312.                          JE     END_FUNC
  313.                          NEG    result                        ; Negate result if signs were different
  314.                          NEG    remainder                     ; Negate remainder too when result is negative
  315.    
  316.                          JMP    END_FUNC
  317.  
  318.     CALC_OVERFLOW:      
  319.                          MOV    DX, OFFSET newline
  320.                          MOV    AH, 9
  321.                          INT    21h
  322.                          MOV    DX, OFFSET overflow_err
  323.                          MOV    AH, 9
  324.                          INT    21h
  325.                          JMP    START
  326.  
  327.     END_FUNC:            
  328.                          RET
  329.  
  330.     RANGE_ERROR_FUNC:    
  331.                          MOV    DX, OFFSET newline
  332.                          MOV    AH, 9
  333.                          INT    21h
  334.                          MOV    DX, OFFSET range_err
  335.                          MOV    AH, 9
  336.                          INT    21h
  337.                          JMP    START
  338. FUNC ENDP
  339. PRINTING PROC
  340.                          MOV    DX, OFFSET newline
  341.                          MOV    AH, 9
  342.                          INT    21h
  343.                          MOV    DX, OFFSET out_msg
  344.                          MOV    AH, 9
  345.                          INT    21h
  346.                          MOV    AX, remainder
  347.                          CMP    AX, 0
  348.                          JNE    PRINT_FRACTION
  349.                          MOV    AX, result
  350.                          CMP    AX, 0
  351.                          JGE    PRINT_MAIN_NUMBER
  352.                          MOV    DL, '-'
  353.                          MOV    AH, 2
  354.                          INT    21h
  355.                          MOV    AX, result
  356.                          NEG    AX
  357.     PRINT_MAIN_NUMBER:  
  358.                          CALL   PRINT_NUM
  359.                          JMP    END_PRINTING
  360.     PRINT_FRACTION:      
  361.                          MOV    AX, numerator
  362.                          CMP    AX, 0
  363.                          JGE    PRINT_NUMERATOR
  364.                          MOV    DL, '-'
  365.                          MOV    AH, 2
  366.                          INT    21h
  367.                          MOV    AX, numerator
  368.                          NEG    AX
  369.     PRINT_NUMERATOR:    
  370.                          CALL   PRINT_NUM
  371.                          MOV    DL, '/'
  372.                          MOV    AH, 2
  373.                          INT    21h
  374.                          MOV    AX, denominator
  375.                          CMP    AX, 0
  376.                          JGE    PRINT_DENOMINATOR
  377.                          MOV    DL, '-'
  378.                          MOV    AH, 2
  379.                          INT    21h
  380.                          MOV    AX, denominator
  381.                          NEG    AX
  382.     PRINT_DENOMINATOR:  
  383.                          CALL   PRINT_NUM
  384.                          MOV    DL, ' '
  385.                          MOV    AH, 2
  386.                          INT    21h
  387.                          MOV    DL, '='
  388.                          INT    21h
  389.                          MOV    DL, ' '
  390.                          INT    21h
  391.                          MOV    AX, result
  392.                          CMP    AX, 0
  393.                          JGE    PRINT_RES_NUMBER
  394.                          MOV    DL, '-'
  395.                          MOV    AH, 2
  396.                          INT    21h
  397.                          MOV    AX, result
  398.                          NEG    AX
  399.     PRINT_RES_NUMBER:    
  400.                          CALL   PRINT_NUM
  401.                          MOV    DX, OFFSET reminder_msg
  402.                          MOV    AH, 9
  403.                          INT    21h
  404.                          MOV    AX, remainder
  405.                          CMP    AX, 0
  406.                          JL     NEG_REM
  407.                          CALL   PRINT_NUM
  408.                          JMP    END_PRINTING
  409.     NEG_REM:            
  410.                          MOV    DL, '-'
  411.                          MOV    AH, 2
  412.                          INT    21h
  413.                          MOV    AX, remainder
  414.                          NEG    AX
  415.                          CALL   PRINT_NUM
  416.     END_PRINTING:        
  417.                          RET
  418. PRINTING ENDP
  419. PRINT_NUM PROC
  420.                          PUSH   result
  421.                          PUSH   CX
  422.                          PUSH   DX
  423.                          XOR    CX, CX
  424.                          MOV    BX, 10
  425.     CONVERT_TO_STR:      
  426.                          XOR    DX, DX
  427.                          DIV    BX
  428.                          ADD    DL, '0'
  429.                          PUSH   DX
  430.                          INC    CX
  431.                          TEST   AX, AX
  432.                          JNZ    CONVERT_TO_STR
  433.     PRINT_LOOP:          
  434.                          POP    DX
  435.                          MOV    AH, 2
  436.                          INT    21h
  437.                          LOOP   PRINT_LOOP
  438.                          POP    DX
  439.                          POP    CX
  440.                          POP    result
  441.                          RET
  442. PRINT_NUM ENDP
  443. END_PROGRAM PROC
  444.                          MOV    DX, OFFSET newline
  445.                          MOV    AH, 9
  446.                          INT    21h
  447.                          MOV    DX, OFFSET end_msg
  448.                          MOV    AH, 9
  449.                          INT    21h
  450.                          MOV    DX, OFFSET menuhold
  451.                          MOV    AH, 0Ah
  452.                          INT    21h
  453.                          MOV    AL, menuhold+2
  454.                          CMP    AL, 'y'
  455.                          JE     RETURN
  456.                          CMP    AL, 'n'
  457.                          JE     EXIT_PROGRAM
  458.                          MOV    DX, OFFSET err_msg
  459.                          MOV    AH, 9
  460.                          INT    21h
  461.                          JMP    END_PROGRAM
  462.     EXIT_PROGRAM:        
  463.                          MOV    AH, 4Ch
  464.                          INT    21h
  465.     RETURN:              
  466.                          XOR    AX, AX
  467.                          XOR    BX, BX
  468.                          XOR    CX, CX
  469.                          XOR    DX, DX
  470.                          XOR    SI, SI
  471.                          MOV    result, 0
  472.                          MOV    remainder, 0
  473.                          MOV    numerator, 0
  474.                          MOV    denominator, 0
  475.                          MOV    sign_flag, 0
  476.                          CALL   RET_PROC
  477. END_PROGRAM ENDP
  478. CODE ENDS
  479. END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement