Advertisement
Guest User

Untitled

a guest
Feb 18th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .model small
  2. .stack 100h
  3. .386                                ;für "groessere" jumps
  4.  
  5.  
  6. ;--------------------------------------------------------------------;
  7. ; Daten & Variablen
  8. ;--------------------------------------------------------------------;
  9. .data
  10.     esc_code = 1Bh
  11.     videospeicher = 0B800h
  12.     adressanfang = 0F000h
  13.     adressende = 0FA6Eh
  14.  
  15.     MSG_FIRST_NUM DB                         "Zahl 1:   "   ;10 gesamtänge
  16.     MSG_SECOND_NUM DB                        "Zahl 2:   " ;10 Länge
  17.     MSG_OPERATION DB                         "[+ - *]:   " ; 11 Länge
  18.     RESULT_LINE DB                           "____________" ;17
  19.     PLACE_HOLDER_ADD DB 0, 13, 10, 13,10,13,   "                       $"
  20.     PLACE_HOLDER_ADD_M DB 0, 13, 10, 13,10,13, "                      $"
  21.  
  22.     MSG_FAIL_NUM DB "Keine gueltige Zahl!"  ;20
  23.     MSG_FAIL_OP DB "Keine gueltige Operation!"  ;25
  24.     MSG_START_LINE db 03h
  25.  
  26.     MSG_START_TITLE db 0bh,"DER CALCULATOR",0ah ;14
  27.     MSG_START_SUBTITLE db "Addition, Subtraktion und Multiplikation" ;40
  28.     MSG_START_SUBSUBTITLE db "Zahlen von 00 - 99" ;18
  29.  
  30.     MSG_MAN_TITLE DB "Anleitung:"
  31.     MSG_MAN_FIRST DB "1. Zahl eingeben"
  32.     MSG_MAN_SECOND DB "2. Operation eingeben"
  33.     MSG_MAN_THIRD DB "3. Zahl eingeben"
  34.  
  35.  
  36.     MSG_START_PRESENTED db "Proudly presented to you by Kevin & Florian!"
  37.     MSG_EXIT_RESTART db "Noch eine Runde? (j/n)"  ;22 Länge
  38.  
  39.     charOne DB ?
  40.     charTwo DB ?
  41.     ergebnis dw ?
  42.     operator DB ?
  43.  
  44.     temp DB ?
  45.  
  46.     num1_1 db ?
  47.     num1_2 db ?
  48.     num2_1 db ?
  49.     num2_2 db ?
  50.  
  51.     ten db 10
  52.  
  53.     colorNums     dw 0Ah
  54.     colorTitle    dw 09h
  55.     colorSubTitle dw 07h
  56.     colorPresent  dw 085h
  57.     colorLine     dw 0Bh
  58.     colorRestart  dw 0Eh
  59.     colorFail     dw 0Ah
  60.  
  61.     resultE DB ?, "$"
  62.     resultT DB ?, "$"
  63.     resultH DB ?, "$"
  64.     resultX DB ?, "$"
  65.  
  66. ;--------------------------------------------------------------------;
  67. ;   Code
  68. ;--------------------------------------------------------------------;
  69. .code
  70.         jmp start
  71.  
  72. ;--------------------------------------------------------------------;
  73. ;   FEHLER
  74. ;--------------------------------------------------------------------;
  75.  
  76.     fehler:                                   ;Fehlermeldung für ungueltigen Input
  77.         mov ax, 1300h
  78.         mov bx, colorFail
  79.         mov dh, 19                              ;ROW
  80.         mov dl, 10
  81.         mov cx, 20
  82.         mov bp, offset MSG_FAIL_NUM
  83.         int 10h
  84.  
  85.         mov cx, 900
  86.         call delayLoop
  87.         jmp start
  88.  
  89.     fehlerOp:
  90.         mov ax, 1300h
  91.         mov bx, colorFail
  92.         mov dh, 19 ;row
  93.         mov dl, 7
  94.         mov cx, 25
  95.         mov bp, offset MSG_FAIL_OP
  96.         int 10h
  97.  
  98.         mov cx, 900
  99.         call delayLoop
  100.         jmp start
  101.  
  102.     delayLoop:
  103.         mov ax, 60000
  104.         loopx:
  105.             dec ax
  106.             jnz loopx
  107.         dec cx
  108.         jnz delayLoop
  109.         ret
  110.  
  111. ;--------------------------------------------------------------------;
  112. ; Programmstart
  113. ;--------------------------------------------------------------------;
  114.    start:
  115.         ; init ds
  116.         mov ax, @data
  117.         mov ds, ax
  118.         mov es, ax
  119.  
  120.         mov ax, 3
  121.         int 10h
  122.  
  123.         call buildUi
  124.  
  125.         mov resultE, 0
  126.         mov resultT, 0
  127.         mov resultH, 0
  128.         mov resultX, 0
  129.  
  130.         ;Eingabe der ersten Zahl
  131.         ;Interrupt Systemfunktion, 09 = Zeichenkette darstellen
  132.         mov ax, 1301h
  133.         mov bx, colorNums
  134.         mov dh, 9 ;row
  135.         mov dl, 34
  136.         mov cx, 10  ;+2
  137.         mov bp, offset MSG_FIRST_NUM
  138.         int 10h
  139.  
  140.         ;Interrupt Systemfunktion, 01 = Eingabe Lesen (mit Echo)
  141.         ;1. Stelle
  142.         mov ah,01h
  143.         int 21h
  144.         mov num1_1 ,al
  145.  
  146.         ;Falsche Eingabe 1. Stelle abfangen
  147.         cmp num1_1, esc_code
  148.         je shutdown
  149.         cmp num1_1 , "0"
  150.         jl fehler
  151.         cmp num1_1 , "9"
  152.         jg fehler
  153.  
  154.         sub al, 48
  155.         mov num1_1 ,al
  156.  
  157.         ;2. Stelle
  158.         mov ah,01h
  159.         int 21h
  160.         mov num1_2,al
  161.  
  162.         ;Falsche Eingabe 2. Stelle abfangen
  163.         cmp num1_2, esc_code
  164.         je shutdown
  165.         cmp num1_2, "0"
  166.         jl fehler
  167.         cmp num1_2, "9"
  168.         jg fehler
  169.  
  170.         sub al, 48
  171.         mov num1_2,al
  172.  
  173.         ;Zahl zusammenfügen
  174.         mov al,num1_1
  175.         mul ten
  176.         add al,num1_2
  177.         mov charOne, al
  178.  
  179.  
  180.         ;Eingabe der Operation
  181.         mov ax, 1301h
  182.         mov bx, colorNums
  183.         mov dh, 11 ;row
  184.         mov dl, 34
  185.         mov cx, 11  ;+1
  186.         mov bp, offset MSG_OPERATION
  187.         int 10h
  188.  
  189.  
  190.         ;Operator in Variable speichern
  191.         mov ah, 01
  192.         int 21h
  193.         mov operator, al
  194.  
  195.         ;Addition
  196.         cmp operator, "+"
  197.         je addition
  198.  
  199.         ;Subtraction
  200.         cmp operator, "-"
  201.         je subtraction
  202.  
  203.         ;Multiplication
  204.         cmp operator, "*"
  205.         je multiplication
  206.  
  207.         ;Exit
  208.         cmp operator, esc_code
  209.         je shutdown
  210.  
  211.         ;Failure
  212.         jmp fehlerOp
  213.  
  214. ;--------------------------------------------------------------------;
  215. ;   BUILD USER INTERFACE
  216. ;--------------------------------------------------------------------;
  217.    buildUi PROC
  218.             mov temp, 1
  219.             poop:
  220.                 mov ax, 1300h
  221.                 mov bx, colorLine
  222.                 mov dh, 1;row
  223.                 mov dl, temp
  224.                 mov cx, 1
  225.                 mov bp, offset MSG_START_LINE
  226.                 int 10h
  227.  
  228.                 mov ax, 1300h
  229.                 mov bx, colorLine
  230.                 mov dh, 23;row
  231.                 mov dl, temp
  232.                 mov cx, 1
  233.                 mov bp, offset MSG_START_LINE
  234.                 int 10h
  235.                 inc temp
  236.                 cmp temp, 79
  237.                 jne poop
  238.  
  239.             mov temp, 2
  240.             noop:
  241.                 mov ax, 1300h
  242.                 mov bx, colorLine
  243.                 mov dh, temp;row
  244.                 mov dl, 1
  245.                 mov cx, 1
  246.                 mov bp, offset MSG_START_LINE
  247.                 int 10h
  248.  
  249.                 mov ax, 1300h
  250.                 mov bx, colorLine
  251.                 mov dh, temp;row
  252.                 mov dl, 78
  253.                 mov cx, 1
  254.                 mov bp, offset MSG_START_LINE
  255.                 int 10h
  256.  
  257.                 inc temp
  258.                 cmp temp, 23
  259.                 jne noop
  260.  
  261.  
  262.             mov ax, 1300h
  263.             mov bx, colorTitle
  264.             mov dh, 2 ;row
  265.             mov dl, 32
  266.             mov cx, 16
  267.             mov bp, offset MSG_START_TITLE
  268.             int 10h
  269.  
  270.             mov ax, 1300h
  271.             mov bx, colorSubTitle
  272.             mov dh, 4 ;row
  273.             mov dl, 20 ; column
  274.             mov cx, 40
  275.             mov bp, offset MSG_START_SUBTITLE
  276.             int 10h
  277.  
  278.             mov ax, 1300h
  279.             mov bx, colorSubTitle
  280.             mov dh, 6 ;row
  281.             mov dl, 31 ; column
  282.             mov cx, 18
  283.             mov bp, offset MSG_START_SUBSUBTITLE
  284.             int 10h
  285.  
  286.             mov ax, 1300h
  287.             mov bx, colorPresent
  288.             mov dh, 21 ;row
  289.             mov dl, 18 ; column
  290.             mov cx, 44
  291.             mov bp, offset MSG_START_PRESENTED
  292.             int 10h
  293.             ret
  294.     buildUi ENDP
  295.  
  296. ;--------------------------------------------------------------------;
  297. ;   FUNC: READ SECOND NUM
  298. ;--------------------------------------------------------------------;
  299.     readSecondNum PROC
  300.         ;Eingabe der zweiten Zahl
  301.         ;Interrupt Systemfunktion, 09 = Zeichenkette darstellen
  302.         mov ax, 1301h
  303.         mov bx, colorNums
  304.         mov dh, 13 ;row
  305.         mov dl, 34
  306.         mov cx, 10
  307.         mov bp, offset MSG_SECOND_NUM
  308.         int 10h
  309.  
  310.         ;Interrupt Systemfunktion, 01 = Eingabe Lesen (mit Echo)
  311.         ;1. Stelle
  312.         mov ah,01h
  313.         int 21h
  314.         mov num2_1, al
  315.  
  316.         ;Falsche Eingabe 1. Stelle abfangen
  317.         cmp num2_1, esc_code
  318.         je shutdown
  319.         cmp num2_1, "0"
  320.         jl fehler
  321.         cmp num2_1, "9"
  322.         jg fehler
  323.         sub al, 48
  324.         mov num2_1, al
  325.  
  326.         ;2. Stelle
  327.         mov ah,01h
  328.         int 21h
  329.         mov num2_2,al
  330.  
  331.         ;Falsche Eingabe 2. Stelle abfangen
  332.         cmp num2_2, esc_code
  333.         je shutdown
  334.         cmp num2_2, "0"
  335.         jl fehler
  336.         cmp num2_2, "9"
  337.         jg fehler
  338.         sub al, 48
  339.         mov num2_2,al
  340.  
  341.         ;Zahl zusammenfügen
  342.         mov al,num2_1
  343.         mul ten
  344.         add al,num2_2
  345.         mov charTwo, al
  346.  
  347.         mov ax, 1301h
  348.         mov bx, colorTitle
  349.         mov dh, 14 ;row
  350.         mov dl, 34
  351.         mov cx, 12
  352.         mov bp, offset RESULT_LINE
  353.         int 10h
  354.         ret
  355.     readSecondNum ENDP
  356.  
  357. ;--------------------------------------------------------------------;
  358. ;   ADDITION
  359. ;--------------------------------------------------------------------;
  360.     addition:
  361.         call readSecondNum
  362.              ;Erste Zahl in AH und zweite dazu addieren
  363.  
  364.             mov al, num1_2
  365.             add al, num2_2
  366.             mov ah, 0
  367.             aaa
  368.  
  369.  
  370.             add ah, 48
  371.             add al, 48
  372.  
  373.             add resultE, al
  374.             add resultT, ah
  375.  
  376.             mov al, num1_1
  377.             add al, resultT
  378.             add al, num2_1
  379.             mov ah, 0
  380.             aaa
  381.  
  382.             add ah, 48
  383.             add al, 48
  384.  
  385.             mov resultT, al
  386.             add resultH, ah
  387.  
  388.             ;Resultmessage
  389.             mov ah, 02h
  390.             mov bh, 0
  391.             mov dh, 16
  392.             mov dl, 43
  393.             int 10h
  394.  
  395.             mov ah, 2
  396.             mov dl, resultH
  397.             int 21h
  398.  
  399.             mov ah, 2
  400.             mov dl, resultT
  401.             int 21h
  402.  
  403.             mov ah, 2
  404.             mov dl, resultE
  405.             int 21h
  406.  
  407.         ;Calc finished
  408.             jmp exit
  409.  
  410. ;--------------------------------------------------------------------;
  411. ;   MULTIPLICATION
  412. ;--------------------------------------------------------------------;
  413.     multiplication:
  414.         call readSecondNum                        ;Read second number
  415.  
  416.         ;Calc Ones
  417.         mov al, num1_2
  418.         mov bl, num2_2
  419.         mul bl
  420.         aam                                       ;AH = Tens, AL, Ones
  421.  
  422.         add al, 48
  423.         mov resultE, al                           ;AL = Ones
  424.         mov cl, ah                                ;CL = Overflow for Tens
  425.  
  426.         ;Calc Tens
  427.         xor ax, ax
  428.         mov al, num1_2
  429.         mov bl, num2_1
  430.         mul bl
  431.         aam                                       ;AH = Hundrets, AL = Tens
  432.  
  433.         add cl, al                                ;CL = Tens
  434.         mov ch, ah                                ;CH = Overflow for Hundrets
  435.  
  436.         xor ax, ax
  437.         mov al, num1_1
  438.         mov bl, num2_2
  439.         mul bl
  440.         aam                                       ;AH, Hundrets, AL = Tens
  441.  
  442.         add al, cl                                ;CL = Tens
  443.         add al, 48
  444.         mov resultT, al
  445.         add ch, ah                                ;CH = Hundrets
  446.  
  447.         ;Calc Hundrets & Thousands
  448.         xor ax, ax
  449.         mov al, num1_1
  450.         mov bl, num2_1
  451.         mul bl
  452.         aam                                       ;AL = Thousands, AH = Hundrets
  453.  
  454.         add ah, 48
  455.         mov resultX, ah
  456.         add ch, al                                ;CH = Hundrets
  457.  
  458.         add ch, 48
  459.         mov resultH, ch
  460.  
  461.         ;Calc overflow
  462.         cmp resultT, "9"
  463.         jng tensNotGreater9
  464.         sub resultT, 10
  465.         add resultH, 1
  466.         tensNotGreater9:
  467.  
  468.         cmp resultH, "9"
  469.         jng hundertsNotGreater9
  470.         sub resultH, 10
  471.         add resultX, 1
  472.         hundertsNotGreater9:
  473.  
  474.         ;Resultmessage
  475.         mov ah, 02h
  476.         mov bh, 0
  477.         mov dh, 15
  478.         mov dl, 42
  479.         int 10h
  480.  
  481.         mov ah, 2
  482.         mov dl, resultX
  483.         int 21h
  484.  
  485.         mov ah, 2
  486.         mov dl, resultH
  487.         int 21h
  488.  
  489.         mov ah, 2
  490.         mov dl, resultT
  491.         int 21h
  492.  
  493.         mov ah, 2
  494.         mov dl, resultE
  495.         int 21h
  496.  
  497.         jmp exit
  498.  
  499. ;--------------------------------------------------------------------;
  500. ;   SUBTRACTION
  501. ;--------------------------------------------------------------------;
  502. subtraction:
  503.         call readSecondNum
  504.  
  505.         ;Cursor für das Ergebnis ausrichten
  506.         mov ah, 02h
  507.         mov bh, 0
  508.         mov dh, 15
  509.         mov dl, 43
  510.         int 10h
  511.  
  512.         ;prüfen ob num1_1 kleiner als num2_1, dann negativ
  513.         mov al, num1_1
  514.         cmp al, num2_1
  515.         jl negativesErgebnis
  516.         jg positivesErgebnis
  517.         je zehnerZahlGleich
  518.         zehnerZahlGleich:
  519.             ;prüfen, ob num1_2 kleiner als num2_2, dann negativ
  520.             mov al, num1_2
  521.             cmp al, num2_2
  522.             jl negativesErgebnis
  523.             jg positivesErgebnis
  524.             je zahlenGleich
  525.  
  526.         zahlenGleich:
  527.             ;Ergebnisnachricht
  528.  
  529.             mov ah, 2
  530.             mov dl, '0'
  531.             int 21h
  532.  
  533.             mov ah, 2
  534.             mov dl, '0'
  535.             int 21h
  536.  
  537.             jmp exit
  538.  
  539.         positivesErgebnis:
  540.             mov al, num1_2
  541.             cmp al, num2_2
  542.             jge groesser
  543.             jl kleiner
  544.  
  545.         groesser:
  546.             mov al, num1_2
  547.             sub al, num2_2
  548.  
  549.             add al, 48
  550.             mov bl, al
  551.             xor al, al
  552.  
  553.             mov al, num1_1
  554.             sub al, num2_1
  555.  
  556.             add al, 48
  557.  
  558.             ;Ergebnisnachricht
  559.             mov ah, 2
  560.             mov dl, al
  561.             int 21h
  562.  
  563.             mov ah, 2
  564.             mov dl, bl
  565.             int 21h
  566.  
  567.  
  568.             jmp exit
  569.  
  570.         kleiner:
  571.             mov al, num1_2
  572.             add al, 10
  573.             sub al, num2_2
  574.  
  575.             add al, 48
  576.             mov bl, al
  577.             xor al, al
  578.  
  579.             mov al, num1_1
  580.             sub al, 1
  581.             sub al, num2_1
  582.  
  583.             add al, 48
  584.  
  585.             ;Ergebnisnachricht
  586.             mov ah, 2
  587.             mov dl, al
  588.             int 21h
  589.  
  590.             mov ah, 2
  591.             mov dl, bl
  592.             int 21h
  593.  
  594.             jmp exit
  595.  
  596.         negativesErgebnis:
  597.             mov al, num2_2
  598.             cmp al, num1_2
  599.             jge groesserNegativ
  600.             jl kleinerNegativ
  601.  
  602.         groesserNegativ:
  603.             mov al, num2_2
  604.             sub al, num1_2
  605.  
  606.             add al, 48
  607.             mov bl, al
  608.             xor al, al
  609.  
  610.             mov al, num2_1
  611.             sub al, num1_1
  612.  
  613.             add al, 48
  614.             mov cl, al
  615.  
  616.             ;Ergebnisnachricht
  617.             ;Vorzeichen ausgeben (-)
  618.             mov ah, 02
  619.             mov dl, 45
  620.             int 21h
  621.  
  622.             mov ah, 2
  623.             mov dl, cl
  624.             int 21h
  625.  
  626.             mov ah, 2
  627.             mov dl, bl
  628.             int 21h
  629.  
  630.             jmp exit
  631.  
  632.         kleinerNegativ:
  633.             mov al, num2_2
  634.             add al, 10
  635.             sub al, num1_2
  636.  
  637.             add al, 48
  638.  
  639.             mov bl, al
  640.  
  641.             xor al, al
  642.  
  643.             mov al, num2_1
  644.             sub al, 1
  645.             sub al, num1_1
  646.  
  647.             add al, 48
  648.  
  649.             mov cl, al
  650.  
  651.             ;Ergebnisnachricht
  652.             ;Vorzeichen ausgeben (-)
  653.             mov ah, 02
  654.             mov dl, 45
  655.             int 21h
  656.  
  657.             mov ah, 2
  658.             mov dl, cl
  659.             int 21h
  660.  
  661.             mov ah, 2
  662.             mov dl, bl
  663.             int 21h
  664.  
  665.             jmp exit
  666.  
  667.  
  668.  
  669. ;--------------------------------------------------------------------;
  670. ;   EXIT
  671. ;--------------------------------------------------------------------;
  672.     exit:
  673.         xor ax, ax
  674.  
  675.         mov ax, 1301h
  676.         mov bx, colorRestart
  677.         mov dh, 18 ;row
  678.         mov dl, 29
  679.         mov cx, 22
  680.         mov bp, offset MSG_EXIT_RESTART
  681.         int 10h
  682.  
  683.         loopm:
  684.           mov ah, 01
  685.           int 21h
  686.           mov bl, al
  687.  
  688.           cmp al, 'j'                       ;Check if "j" is clicked -> restart
  689.           je start
  690.  
  691.           cmp al, 'J'                       ;Check if "J" is clicked -> restart
  692.           je start
  693.  
  694.           jmp shutdown                      ;Else shutdown
  695.  
  696.     shutdown:
  697.             mov ax,3
  698.             int 10h
  699.             mov ax, 4c00h
  700.             int 21h
  701. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement