Advertisement
Guest User

Untitled

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