敬业的IT人 >> 编程开发 >> 其他语言 >> 汇编源码--alarm

汇编源码--alarm

敬业的IT人 互联网 佚名 2008-2-19 13:57:07
    ·汇编源码--BRK
    ·汇编源码--CLOCK
    ·汇编源码--BURNOUT
    ·汇编源码--DOSSYM
    ·汇编源码--circle
    ·汇编源码--DEV
    ·汇编源码--getspace
    ·汇编源码--CLEAR
    ·汇编源码--col
    ·汇编源码--gameport
csegsegment para public 'code' org100h alarmproc far ; Memory-resident program to intercept the timer interrupt and display the ; system time in the upper right-hand corner of the display. ; This program is run as 'ALARM hh:mm x', where hh:mm is the alarm time and ; x is '-' to turn the display off. Any other value of x or no value will ; turn the clock on intaddr equ 1ch*4; interrupt address segaddr equ 62h*4; segment address of first copy mfactor equ 17478; minute conversion factor * 16 whozatequ 1234h; signature colorequ 14h ; color attribute assume cs:cseg,ds:cseg,ss:nothing,es:nothing jmp p150; start-up code jumpval dd 0; address of prior interrupt signature dw whozat; program signature statedb 0; '-' = off, all else = on waitdw 18; wait time - 1 second or 18 ticks hourdw 0; hour of the day atimedw 0ffffh; minutes past midnite for alarm acountdw 0; alarm beep counter - number of seconds (5) atonedb 5; alarm tone - may be from 1 to 255 - the ; higher the number, the lower the frequency alengdw 8080h; alarm length (loop count) may be from 1-FFFF dhoursdw 0; display hours db ':' dminsdw 0; display minutes db ':' dsecsdw 0; display seconds db '-' ampmdb 0; 'A' or 'P' for am or pm db 'm' tstackdb 16 dup('stack ') ; temporary stack estackdb 0; end of stack holdspdw 0; original sp holdssdw 0; original ss p000:; interrupt code push ax ; save registers push ds pushf push cs pop ds; make ds=cs mov ax,wait; check wait time dec ax; zero? jz p010 ; yes - 1 second has elapsed mov wait,ax; not this time jmp p080; return p010:cli; disable interrupts mov ax,ss; save stack mov holdss,ax mov holdsp,sp mov ax,ds mov ss,ax; point to internal stack mov sp,offset estack sti; allow interrupts push bx ; save other registers push cx push dx push es push si push di push bp mov ax,18; reset wait time mov wait,ax mov al,state; are we disabled? cmp al,'-' jnz p015; no jmp p070 p015:mov ah,0; read time int 1ah ; get time of day mov ax,dx; low part mov dx,cx; high part mov cl,4 shl dx,cl; multiply by 16 mov bx,ax mov cl,12 shr bx,cl; isolate top 4 bits of ax add dx,bx; now in upper mov cl,4 shl ax,cl; multiply by 16 mov bx,mfactor; compute minutes div bx; minutes in ax, remainder in dx cmp ax,atime; time to sound the alarm? jnz p020; no call p100; yes - beep the speaker twice push ax mov ax,acount; get beep count dec ax; down by 1 mov acount,ax; save beep count cmp ax,0; is it zero? jnz p018; no - keep alarm on mov ax,0ffffh; turn off alarm mov atime,ax p018:pop ax p020:mov dsecs,dx; save remainder mov bx,60; compute hours xor dx,dx; zero it div bx; hours in ax, minutes in dx mov dmins,dx; save minutes cmp ax,0; midnight? jnz p030; no mov ax,12; yes jmp p040a; set am p030:cmp ax,12; before noon? jb p040a; yes - set am jz p040p; noon - set pm sub ax,12; convert the rest p040p:mov bl,'p' jmp p040x p040a:mov bl,'a' p040x:mov ampm,bl aam; fix up hour cmp ax,hour; top of the hour? jz p060 ; no mov hour,ax call p120; beep the speaker once p060:add ax,3030h; convert hours to ascii xchg ah,al mov dhours,ax mov ax,dmins; get minutes aam add ax,3030h; convert to ascii xchg ah,al mov dmins,ax mov ax,dsecs; get seconds (remainder) xor dx,dx mov bx,60 mul bx mov bx,mfactor div bx; seconds in ax aam add ax,3030h xchg ah,al mov dsecs,ax xor ax,ax; check monitor type mov es,ax mov ax,es:[410h]; get config byte and al,30h; isolate monitor type cmp al,30h; color? mov ax,0b000h; assume mono jz p061 ; its mono mov ax,0b800h; color screen address p061:mov dx,es:[463h]; point to 6845 base port add dx,6; point to status port mov es,ax; point to monitor mov bh,color; color in bh mov si,offset dhours; point to time mov di,138; row 1, col 69 cld mov cx,11; loop count p062:mov bl,[si]; get next character p063:in al,dx; get crt status test al,1; is it low? jnz p063; no - wait cli; no interrupts p064:in al,dx; get crt status test al,1; is it high? jz p064 ; no - wait mov ax,bx; move color & character stosw; move color & character again sti; interrupts back on inc si; point to next character loop p062; done? p070:pop bp; restore registers pop di pop si pop es pop dx pop cx pop bx cli; no interrupts mov ax,holdss mov ss,ax mov sp,holdsp sti; allow interrupts p080:popf pop ds pop ax jmp cs:[jumpval] p100proc near; beep the speaker twice call p120 push cx mov cx,20000 p105:loop p105; wait around pop cx call p120 push cx mov cx,20000 p106:loop p106; wait around pop cx call p120 ret p100endp p120proc near; beep the speaker once push ax push cx mov al,182 out 43h,al; setup for sound mov al,0 out 42h,al; low part mov al,atone; get alarm tone out 42h,al; high part in al,61h push ax ; save port value or al,3 out 61h,al; turn speaker on mov cx,aleng; get loop count p125:loop p125; wait around pop ax; restore original port value out 61h,al; turn speaker off pop cx pop ax ret p120endp p150:; start of transient code mov dx,offset copyr call p220; print copyright mov ax,0 mov es,ax; segment 0 mov di,segaddr+2; this program's prior location mov ax,es:[di]; get prior code segment mov es,ax; point to prior program segment mov di,offset signature mov cx,es:[di]; is it this program? cmp cx,whozat jnz p160; no - install it call p200; set state & alarm int 20h ; terminate p160:mov di,segaddr+2; point to int 62h mov ax,0 mov es,ax; segment 0 mov ax,ds; get current ds mov es:[di],ax; set int 62h mov si,offset jumpval mov di,intaddr; point to timer interrupt mov bx,es:[di]; get timer ip mov ax,es:[di+2]; and cs mov [si],bx; save prior ip mov [si+2],ax; and cs mov bx,offset p000 mov ax,ds cli; clear interrupts mov es:[di],bx; set new timer interrupt mov es:[di+2],ax sti; set interrupts push ds pop es call p200; set state & alarm mov dx,offset p150; last byte of resident portion inc dx int 27h ; terminate p200proc near; set state & alarm mov si,80h; point to command line mov ax,0 mov di,0ffffh; init hours mov bh,0 mov ch,0 mov dh,0; : counter mov es:[state],bh; turn clock on mov cl,[si]; get length jcxz p210; it's zero p203:inc si; point to next char mov bl,[si]; get it cmp bl,'-' ; is it a minus? jnz p204; no mov es:[state],bl; turn clock off push dx mov dx,offset msg3; print msg call p220 pop dx jmp p206 p204:cmp dh,2; seen 2nd colon? jz p206 ; yes - ignore seconds cmp bl,':' ; colon? jnz p205; no inc dh cmp dh,2; second colon? jz p206 ; yes - ignore seconds push cx push dx mov cx,60 mul cx; multiply current ax by 60 pop dx pop cx mov di,ax; save hours mov ax,0 jmp p206 p205:cmp bl,'0' jb p206 ; too low cmp bl,'9' ja p206 ; too high - can be a problem sub bl,'0' ; convert it to binary push cx push dx mov cx,10 mul cx; multiply current value by 10 add ax,bx; and add latest digit pop dx pop cx p206:loop p203; done yet? cmp di,0ffffh; any time to set? jz p210 ; no add ax,di; add hours cmp ax,24*60 jb p209 ; ok mov dx,offset msg1; print error message call p220 jmp p210 p209:mov es:[atime],ax; save minutes past midnight mov ax,5 mov es:[acount],ax; set alarm count mov dx,offset msg2; print set msg call p220 p210:ret p200endp p220proc near; print message push ax mov ah,9 int 21h pop ax ret p220endp copyrdb 'Alarm - Clock',10,13,'$' msg1db 'Invalid time - must be from 00:00 to 23:59',10,13,'$' msg2db 'Resetting alarm time',10,13,'$' msg3db 'Turning clock display off',10,13,'$' alarmendp csegends endalarm 进入讨论组讨论。
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com