Advertisement
Artychenal

Untitled

Apr 17th, 2025
296
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
6502 TASM/64TASS 18.38 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 (in range -32767...32767) -> $"
  5.     xinmes       DB 7,?, 7 DUP (" ")
  6.     menuhold     DB 2,?, 2 DUP (" ")
  7.     xvalue       DW ?
  8.     outmes       DB "Result: $"
  9.     newline      DB 0Dh,0Ah,"$"
  10.     errmsg       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.     ostacha_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 ?                                                                                                                             ; Added temporary register to handle larger calculations
  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 errmsg
  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.     ; Compare x with 10
  199.                          CMP    AX, 10
  200.                          JL     CASE_LESS_THAN_10             ; If x < 10
  201.                          JE     CASE_EQUAL_10                 ; If x = 10
  202.                          JG     CASE_GREATER_THAN_10          ; If x > 10
  203.  
  204.     CASE_LESS_THAN_10:  
  205.     ; Calculate Z = x - 1
  206.                          MOV    AX, xvalue
  207.                          SUB    AX, 1
  208.                          MOV    result, AX
  209.                          MOV    remainder, 0
  210.                          JMP    END_FUNC
  211.  
  212.     CASE_EQUAL_10:      
  213.     ; Calculate Z = (3x^2 + 4) / (x - 2)
  214.     ; First calculate x^2
  215.                          MOV    AX, xvalue
  216.                          IMUL   xvalue                        ; DX:AX = x^2
  217.    
  218.     ; Calculate 3x^2
  219.                          MOV    BX, 3
  220.                          IMUL   BX                            ; DX:AX = 3x^2
  221.    
  222.     ; Add 4: AX = 3x^2 + 4
  223.                          ADD    AX, 4
  224.    
  225.                          MOV    numerator, AX
  226.    
  227.     ; Calculate denominator: (x-2)
  228.                          MOV    BX, xvalue
  229.                          SUB    BX, 2
  230.                          MOV    denominator, BX
  231.    
  232.     ; Perform division
  233.                          MOV    AX, numerator
  234.                          CWD                                  ; Convert word to double word for division
  235.                          IDIV   denominator
  236.                          MOV    result, AX
  237.                          MOV    remainder, DX
  238.                          JMP    END_FUNC
  239.  
  240.     CASE_GREATER_THAN_10:
  241.     ; Calculate Z = (7x^2 - 56) / (2x - 5)
  242.                          MOV    AX, xvalue
  243.                          MOV    temp_reg, AX                  ; Store x in temp_reg
  244.    
  245.     ; Calculate x^2 carefully using a loop for large values
  246.                          MOV    AX, xvalue
  247.                          IMUL   xvalue                        ; DX:AX = x^2
  248.    
  249.     ; If overflow occurred, use manual multiplication
  250.                          CMP    DX, 0
  251.                          JNE    CALC_OVERFLOW
  252.    
  253.     ; Calculate 7x^2
  254.                          MOV    BX, 7
  255.                          MUL    BX                            ; DX:AX = 7x^2
  256.    
  257.     ; Check for overflow
  258.                          CMP    DX, 0
  259.                          JNE    CALC_OVERFLOW
  260.    
  261.     ; Subtract 56: AX = 7x^2 - 56
  262.                          SUB    AX, 56
  263.                          MOV    numerator, AX
  264.    
  265.     ; Calculate denominator: (2x-5)
  266.                          MOV    AX, temp_reg                  ; Retrieve x from temp_reg
  267.                          MOV    BX, 2
  268.                          IMUL   BX                            ; AX = 2x
  269.                          SUB    AX, 5                         ; AX = 2x - 5
  270.                          MOV    denominator, AX
  271.    
  272.     ; Check if denominator is 0
  273.                          CMP    AX, 0
  274.                          JE     RANGE_ERROR_FUNC
  275.    
  276.     ; Perform division - ensure signs are handled correctly
  277.                          MOV    AX, numerator
  278.                          MOV    BX, denominator
  279.    
  280.     ; Check if numerator is negative
  281.                          CMP    AX, 0
  282.                          JGE    CHECK_DENOM_SIGN
  283.    
  284.     ; Numerator is negative
  285.                          NEG    AX
  286.                          XOR    SI, SI                        ; SI=0 means positive result initially
  287.                          INC    SI                            ; SI=1 means need to negate result
  288.                          JMP    PERFORM_DIV
  289.    
  290.     CHECK_DENOM_SIGN:    
  291.                          XOR    SI, SI                        ; SI=0 means positive result
  292.    
  293.     ; Check if denominator is negative
  294.                          CMP    BX, 0
  295.                          JGE    PERFORM_DIV
  296.    
  297.     ; Denominator is negative
  298.                          NEG    BX
  299.                          INC    SI                            ; Toggle result sign
  300.    
  301.     PERFORM_DIV:        
  302.                          MOV    numerator, AX                 ; Update with absolute values
  303.                          MOV    denominator, BX
  304.    
  305.     ; Perform division with absolute values
  306.                          CWD                                  ; Convert word to double word for division
  307.                          IDIV   BX
  308.                          MOV    result, AX
  309.                          MOV    remainder, DX
  310.    
  311.     ; Apply sign if needed
  312.                          CMP    SI, 0
  313.                          JE     END_FUNC
  314.                          NEG    result                        ; Negate result if signs were different
  315.                          NEG    remainder                     ; Negate remainder too when result is negative
  316.    
  317.                          JMP    END_FUNC
  318.  
  319.     CALC_OVERFLOW:      
  320.                          MOV    DX, OFFSET newline
  321.                          MOV    AH, 9
  322.                          INT    21h
  323.                          MOV    DX, OFFSET overflow_err
  324.                          MOV    AH, 9
  325.                          INT    21h
  326.                          JMP    START
  327.  
  328.     END_FUNC:            
  329.                          RET
  330.  
  331.     RANGE_ERROR_FUNC:    
  332.                          MOV    DX, OFFSET newline
  333.                          MOV    AH, 9
  334.                          INT    21h
  335.                          MOV    DX, OFFSET range_err
  336.                          MOV    AH, 9
  337.                          INT    21h
  338.                          JMP    START
  339. FUNC ENDP
  340. PRINTING PROC
  341.                          MOV    DX, OFFSET newline
  342.                          MOV    AH, 9
  343.                          INT    21h
  344.                          MOV    DX, OFFSET outmes
  345.                          MOV    AH, 9
  346.                          INT    21h
  347.                          MOV    AX, remainder
  348.                          CMP    AX, 0
  349.                          JNE    PRINT_FRACTION
  350.                          MOV    AX, result
  351.                          CMP    AX, 0
  352.                          JGE    PRINT_MAIN_NUMBER
  353.                          MOV    DL, '-'
  354.                          MOV    AH, 2
  355.                          INT    21h
  356.                          MOV    AX, result
  357.                          NEG    AX
  358.     PRINT_MAIN_NUMBER:  
  359.                          CALL   PRINT_NUM
  360.                          JMP    END_PRINTING
  361.     PRINT_FRACTION:      
  362.                          MOV    AX, numerator
  363.                          CMP    AX, 0
  364.                          JGE    PRINT_NUMERATOR
  365.                          MOV    DL, '-'
  366.                          MOV    AH, 2
  367.                          INT    21h
  368.                          MOV    AX, numerator
  369.                          NEG    AX
  370.     PRINT_NUMERATOR:    
  371.                          CALL   PRINT_NUM
  372.                          MOV    DL, '/'
  373.                          MOV    AH, 2
  374.                          INT    21h
  375.                          MOV    AX, denominator
  376.                          CMP    AX, 0
  377.                          JGE    PRINT_DENOMINATOR
  378.                          MOV    DL, '-'
  379.                          MOV    AH, 2
  380.                          INT    21h
  381.                          MOV    AX, denominator
  382.                          NEG    AX
  383.     PRINT_DENOMINATOR:  
  384.                          CALL   PRINT_NUM
  385.                          MOV    DL, ' '
  386.                          MOV    AH, 2
  387.                          INT    21h
  388.                          MOV    DL, '='
  389.                          INT    21h
  390.                          MOV    DL, ' '
  391.                          INT    21h
  392.                          MOV    AX, result
  393.                          CMP    AX, 0
  394.                          JGE    PRINT_RES_NUMBER
  395.                          MOV    DL, '-'
  396.                          MOV    AH, 2
  397.                          INT    21h
  398.                          MOV    AX, result
  399.                          NEG    AX
  400.     PRINT_RES_NUMBER:    
  401.                          CALL   PRINT_NUM
  402.                          MOV    DX, OFFSET ostacha_msg
  403.                          MOV    AH, 9
  404.                          INT    21h
  405.                          MOV    AX, remainder
  406.                          CMP    AX, 0
  407.                          JL     NEG_REM
  408.                          CALL   PRINT_NUM
  409.                          JMP    END_PRINTING
  410.     NEG_REM:            
  411.                          MOV    DL, '-'
  412.                          MOV    AH, 2
  413.                          INT    21h
  414.                          MOV    AX, remainder
  415.                          NEG    AX
  416.                          CALL   PRINT_NUM
  417.     END_PRINTING:        
  418.                          RET
  419. PRINTING ENDP
  420. PRINT_NUM PROC
  421.                          PUSH   result
  422.                          PUSH   CX
  423.                          PUSH   DX
  424.                          XOR    CX, CX
  425.                          MOV    BX, 10
  426.     CONVERT_TO_STR:      
  427.                          XOR    DX, DX
  428.                          DIV    BX
  429.                          ADD    DL, '0'
  430.                          PUSH   DX
  431.                          INC    CX
  432.                          TEST   AX, AX
  433.                          JNZ    CONVERT_TO_STR
  434.     PRINT_LOOP:          
  435.                          POP    DX
  436.                          MOV    AH, 2
  437.                          INT    21h
  438.                          LOOP   PRINT_LOOP
  439.                          POP    DX
  440.                          POP    CX
  441.                          POP    result
  442.                          RET
  443. PRINT_NUM ENDP
  444. END_PROGRAM PROC
  445.                          MOV    DX, OFFSET newline
  446.                          MOV    AH, 9
  447.                          INT    21h
  448.                          MOV    DX, OFFSET end_msg
  449.                          MOV    AH, 9
  450.                          INT    21h
  451.                          MOV    DX, OFFSET menuhold
  452.                          MOV    AH, 0Ah
  453.                          INT    21h
  454.                          MOV    AL, menuhold+2
  455.                          CMP    AL, 'y'
  456.                          JE     RETURN
  457.                          CMP    AL, 'n'
  458.                          JE     EXIT_PROGRAM
  459.                          MOV    DX, OFFSET errmsg
  460.                          MOV    AH, 9
  461.                          INT    21h
  462.                          JMP    END_PROGRAM
  463.     EXIT_PROGRAM:        
  464.                          MOV    AH, 4Ch
  465.                          INT    21h
  466.     RETURN:              
  467.                          XOR    AX, AX
  468.                          XOR    BX, BX
  469.                          XOR    CX, CX
  470.                          XOR    DX, DX
  471.                          XOR    SI, SI
  472.                          MOV    result, 0
  473.                          MOV    remainder, 0
  474.                          MOV    numerator, 0
  475.                          MOV    denominator, 0
  476.                          MOV    sign_flag, 0
  477.                          CALL   RET_PROC
  478. END_PROGRAM ENDP
  479. CODE ENDS
  480. END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement