loading...
مرجع مهندسی نرم افزار
آخرین ارسال های انجمن
حامد شیرزاد بازدید : 835 شنبه 28 آبان 1390 نظرات (0)
Circle
 
cseg segment
        assume cs:cseg, ds:cseg, ss:cseg
        org 100h
        .386
start: 
        
        mov ax, 13h
        int 10h
 
        mov dx, 3c8h
        xor al, al
        out dx, al
        inc dx
        mov cx, 256
        xor al, al
lopp:   out dx, al
        out dx, al
        out dx, al
        inc al
        dec cx
         jnz lopp
 
        mov ax, 0a000h
        mov es, ax
 
 
        fild y_rad
        fild x_rad
 
loopdr:
        fild angle
        fsincos
 
        fmul st, st(2)
        fistp x_co
 
        fmul st, st(2)
        fistp y_co
 
        add x_co, 160
        add y_co, 100
 
        xor di, di
        mov ax, y_co
        shl ax, 6
        add di, ax
        shl ax, 2
        add di, ax
        add di, x_co
 
        mov byte ptr es:[di], cl
        inc cl
 
        fadd yvel
        fxch st(1)
        fadd xvel
        fxch st(1)
        
        inc angle
         jnz loopdr
 
        xor ax, ax
        int 16h
 
        mov ax, 3
        int 10h
 
        int 20h
 
x_co    dw      0
y_co    dw      0
 
x_rad   dw      10
y_rad   dw      10
 
xvel    dq      0.001
yvel    dq      0.001
 
angle   dw      0
 
 
cseg ends
        end start
حامد شیرزاد بازدید : 573 شنبه 28 آبان 1390 نظرات (0)
Clock
 
CGROUP     GROUP VECTOR,CODESEG
VECTOR     SEGMENT AT 0H
     DB    6CH DUP(?)        ;FILLER
TIME_LO  DW    ?            ;DOS TIME
TIME_HI  DW    ?            ;DOS TIME
VEC_IP     DW                ;CLOCK UPDATE VECTOR IP
VEC_CS     DW                ;CLOCK UPDATE VECTOR CS
VECTOR     ENDS
 
CODESEG  SEGMENT PARA
     ASSUME CS:CODESEG,DS:CGROUP
     ORG   100H
CLK     PROC  FAR
     JMP   SETUP            ;ATTACH TO DOS
INTRPT     LABEL DWORD
INT_IP     DW    0            ;OLD UPDATE VECTOR IP
INT_CS     DW    0            ;OLD UPDATE VECROR CS
TICKS     DW    0            ;TICK COUNTER
SCR_OFF  DB    0,0            ;SCREEN OFFSET IN BUFFER
CRT_PORT DW    0            ;SCREEN STATUS PORT
flag     db    0
TIME     DB    8 DUP(':',0BH)       ;TIME SAVE AREA
CLK_INT  LABEL NEAR
     PUSH  AX            ;SAVE REGISTERS
     PUSH  CX
     PUSH  DI
     PUSH  SI
     PUSH  DS
     PUSH  ES
     PUSHF                ; AND FLAGS
     CALL  CS:[INTRPT]        ;DO OLD UPDATE INTERRUPT
     MOV   CX,0040H         ;GET SEGMENT OF DOS TABLE
     MOV   DS,CX            ;PUT IN DS
     MOV   CX,CS:TICKS        ;GET TICK COUNT
     INC   CX            ;INCREMENT IT
     CMP   CX,20        ;01F4H           ;HAS A MINUTE GONE BY?
     JB    NO_MINUTE        ;NO, MOVE ON
     CALL  UPDATE            ;YES, UPDATE CLOCK AND
     MOV   CX,0            ; RESET TICK COUNTER
NO_MINUTE:
     MOV   CS:TICKS,CX        ;SAVE UPDATED TICK COUNT
     MOV   CX,0B000H        ;GET VIDEO SEGMENT
     MOV   ES,CX            ;PUT IN ES
     MOV   DX,CS:CRT_PORT        ;GET CRT STATUS PORT ADDR
     MOV   DI,WORD PTR CS:SCR_OFF  ;GET SCREEN BUFFER OFFSET
     LEA   SI,CS:TIME        ;GET DOS TIME
     MOV   CX,16            ;SET UP TO MOVE 10 BYTES
     CLI                ;DISABLE OTHER INTERRUPTS
WAIT1:     IN    AL,DX            ;READ CRT STATUS
     TEST  AL,1            ;CHECK FOR VERTICAL RETRACE
     JNZ   WAIT1            ;WAIT FOR RETRACE LOW
     MOV   AH,CS:[SI]        ;GET FIRST BYTE TO MOVE
WAIT2:     IN    AL,DX            ;GET CRT STATUS
     TEST  AL,1            ;CHECK FOR VERTICAL RETRACE
     JZ    WAIT2            ;WAIT FOR RETRACE HIGH
     MOV   ES:[DI],AH        ;MOVE BYTE TO SCREEN
     INC   DI            ;INCREMENT INDEX
     INC   SI
     LOOP  WAIT1            ;MOVE NEXT BYTE
     STI                ;ENABLE INTERRUPTS
     POP   ES            ;RESTORE REGISTERS
     POP   DS
     POP   SI
     POP   DI
     POP   CX
     POP   AX
     IRET                ;RETURN FROM INTERRUPT
CLK     ENDP
UPDATE     PROC  NEAR
     PUSH  AX            ;SAVE REGISTERS
     PUSH  BX
     PUSH  CX
     PUSH  DX
     PUSH  DS
     MOV   AX,0040H         ;GET ADDRESS OF DOS TABLE
     MOV   DS,AX            ;PUT IN DS
     MOV   AX,TIME_HI        ;GET HIGH BYTE OF DOS TIME
     mov   flag,0            ;am flag
HOUR:     CMP   AX,0CH            ;CONVERT TO HOURS
     JLE   H1
     mov   flag,1            ;set to pm
     SUB   AX,0CH
     JMP   HOUR
H1:     AAM                ;CONVERT TO ASCII
     ADD   AX,3030H
     LEA   BX,CS:TIME        ;GET ADDRESS OF TIME AREA
     MOV   CS:[BX],AH        ;SAVE HOURS FIRST DIGIT
     MOV   CS:[BX+2],AL        ;SAVE HOURS SECOND DIGIT
     MOV   AX,TIME_LO        ;GET DOS TIME LOW BYTE
     MOV   CX,8H            ;CONVERT TO MINUTES
     SHR   AX,CL
     MOV   DX,3CH
     MUL   DL
     SHR   AX,CL
     AAM                ;CONVERT TO ASCII
     ADD   AX,3030H
     MOV   CS:[BX+6],AH        ;SAVE MINUTES FIRST DIGIT
     MOV   CS:[BX+8],AL        ;SAVE MINUTES SECOND DIGIT
     mov   byte ptr cs:[bx+12],'a'
     cmp   flag,0            ;is it am?
     jz    goahead
     mov   byte ptr cs:[bx+12],'p'
goahead:
     mov   byte ptr cs:[bx+14],'m'
     POP   DS            ;RESTORE REGISTERS
     POP   DX
     POP   CX
     POP   BX
     POP   AX
     RET
UPDATE     ENDP
SETUP:     MOV   AX,0            ;GET ADDRESS OF VECTOR TABLE
     MOV   DS,AX            ;PUT IN DS
     CLI                ;DISABLE FURTHER INTERRUPTS
     MOV   AX,[VEC_IP]        ;GET ADDRESS OF OLD UPDATE IP
     MOV   CS:[INT_IP],AX        ;SAVE IT
     MOV   AX,[VEC_CS]        ;GET ADDRESS OF OLD UPDATE CS
     MOV   CS:[INT_CS],AX        ;SAVE IT
     MOV   VEC_IP,OFFSET CLK_INT ;PUT ADDRESS OF CLK IN VECTOR IP
     MOV   VEC_CS,CS        ;PUT CS OF CLK IN VECTOR CS
     STI                ;ENABLE INTERRUPTS
     MOV   AH,0FH            ;READ VIDEO STATUS
     INT   10H
     SUB   AH,8            ;SUBTRACT 8 CHAR TIME FROM NCOLS
     SHL   AH,1            ;MULTIPLY BY 2 FOR ATTRIBUTE
     MOV   CS:SCR_OFF,AH        ;SAVE SCREEN TIME LOCATION
     MOV   WORD PTR CS:CRT_PORT,03BAH  ;SAVE MONO STATUS PORT ADDR
     TEST  AL,4            ;CHECK FOR COLOR MONITOR
     JNZ   MONO            ;IF MONO, MOVE ON
     ADD   WORD PTR CS:SCR_OFF,8000H   ;ADD COLOR OFFSET TO TIME OFFSET
     MOV   WORD PTR CS:CRT_PORT,03DAH  ;SAVE COLOR STATUS PORT ADDR
MONO:     CALL  UPDATE            ;DO FIRST UPDATE & PRINT TIME
     MOV   DX,OFFSET SETUP        ;GET END ADDRESS OF NEW INTERRUPT
     INT   27H            ;TERMINATE AND REMAIN RESIDENT
     DB    117 DUP(0)        ;FILLER
CODESEG  ENDS
     END   CLK
حامد شیرزاد بازدید : 384 شنبه 28 آبان 1390 نظرات (0)
Calculator
 
           PAGE    ,132
           TITLE   CALC
CGROUP           GROUP   CODESEG
CODESEG        SEGMENT PARA PUBLIC 'CODE'
           ASSUME  CS:CGROUP,DS:CGROUP,ES:CGROUP
           PUBLIC  CALC
 
           ORG     100H
 
CALC           PROC    FAR
           JMP     START
 
;---------------------------------------------------------------------;
;                                      ;
;                 DATA AREA                      ;
;                                      ;
;---------------------------------------------------------------------;
 
           DB      'INTERRUPT NUMBER ='
INT_NUMBER     DB      61h
 
SCREEN_HANDLE  DW      0001h
 
MESSAGE        DB      'PEMATH is not resident',13,10
MESSAGE_LEN    EQU     $-MESSAGE
 
TAG           DB      'PEMATH'
TAG_LEN        EQU     $-TAG
 
;---------------------------------------------------------------------;
;                                      ;
;                 CODE AREA                      ;
;                                      ;
;---------------------------------------------------------------------;
 
START:
;---------------------------------------------------------------------;
;    TEST FOR PRESENCE OF CALCULATOR                      ;
;---------------------------------------------------------------------;
           SUB     AX,AX
           MOV     ES,AX
           SUB     BH,BH
           MOV     BL,INT_NUMBER
           SHL     BX,1
           SHL     BX,1
           MOV     DI,ES:[BX]
           MOV     ES,ES:[BX+2]
           ADD     DI,4
           LEA     SI,TAG
           MOV     CX,TAG_LEN
     REPE  CMPSB
           JE      CALL_CALC
           MOV     BX,SCREEN_HANDLE
           MOV     CX,MESSAGE_LEN
           LEA     DX,MESSAGE
           MOV     AH,40h
           INT     21h
           JMP     SHORT CALC_EXIT
;---------------------------------------------------------------------;
;    CALL CALCULATOR                              ;
;---------------------------------------------------------------------;
CALL_CALC:
           MOV     AL,INT_NUMBER
           MOV     BYTE PTR INT_CODE,AL
           DB      0CDh      ; INT
INT_CODE:
           DB      00h
           NOP
           NOP
 
CALC_EXIT:
           INT     20h
 
CALC           ENDP
 
CODESEG        ENDS
           END     CALC
درباره ما
به نام آنکه جان را فکرت آموخت در این وبلاگ سعی می شود به صورت تخصصی به مباحث مربوط به مهندسی نرم افزار به خصوص برنامه نویسی کامپیوتری پرداخته شود. مدیر وبلاگ : حامد شیرزاد
اطلاعات کاربری
  • فراموشی رمز عبور؟
  • آمار سایت
  • کل مطالب : 431
  • کل نظرات : 9
  • افراد آنلاین : 1
  • تعداد اعضا : 109
  • آی پی امروز : 15
  • آی پی دیروز : 46
  • بازدید امروز : 77
  • باردید دیروز : 99
  • گوگل امروز : 0
  • گوگل دیروز : 1
  • بازدید هفته : 1,491
  • بازدید ماه : 5,415
  • بازدید سال : 33,435
  • بازدید کلی : 698,610
  • کدهای اختصاصی

    قالب وبلاگ