MOV BH,DPAGE ;load old cursor
MOV DX,CURSOR
MOV AH,2
INT 10H
POP BP
POP SI
POP DX
POP CX
POP BX
POP AX
POP ES
POP DS
JMP DWORD PTR CS:OLD1CH ;replace iret
;================================================
;Get Time for Real Time Clock
;================================================
GET_T PROC
MOV AH,2 ;get time information
INT 1AH
MOV AL,CH ;transfer hour to ascii
CALL TTASC
MOV WORD PTR Hour,AX ;save
MOV AL,CL ;transfer minitue to ascii
CALL TTASC
MOV WORD PTR Minute,AX ;save
MOV BX,AX ;save minute
MOV AL,DH ;transfer second to ascii
CALL TTASC
MOV WORD PTR Second,AX ;save
MOV DX,AX ;save second
RET
GET_T ENDP
;================================================
;Get Day for Real Time Clock
;================================================
GET_D PROC
MOV AH,4 ;get time information
INT 1AH
MOV AL,CH
CALL TTASC
MOV WORD PTR CENTURY,AX
MOV AL,Cl ;transfer year to ascii
CALL TTASC
MOV WORD PTR Year,AX ;save
MOV AL,DH ;transfer Month to ascii
CALL TTASC
MOV WORD PTR Month,AX ;save
MOV BX,AX ;save minute
MOV AL,DL ;transfer Day to ascii
CALL TTASC
MOV WORD PTR Day,AX ;save
MOV DX,AX ;save second
RET
GET_D ENDP
;================================================
;Input: al=BCD
;Output:ax=the ASCII of al
;================================================
TTASC PROC
MOV AH,AL ;save high BCD code
AND AL,0FH
SHR AH,1
SHR AH,1
SHR AH,1
SHR AH,1
ADD AX,3030H ;get Ascii code
XCHG AH,AL
RET
TTASC ENDP
;================================================
;
;================================================
;(CX)= Coutnt of 15.08us
WAITF PROC
PUSH AX
WAITF1 :
IN AL,61H
AND AL,10H ;Check PB4
CMP AL,AH ;did it just change
JE WAITF1 ;wait for change
MOV AH,AL ;save the new PB4 status
LOOP WAITF1 ;continue until CX becomes 0
POP AX
RET
WAITF ENDP
;================================================
;
;================================================
GENSOUND PROC
PUSH AX ;save registers
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV BX,08H ;set clock alert time
MOV AL,0B6H ;write timer mode reg
OUT 43H,AL
MOV DX,12H ;timer divistor
MOV AX,348CH ;1193100Hz / freq
DIV DI ;value of freq
OUT 42H,AL ;write timer2 count low byte
MOV AL,AH
OUT 42H,AL ;write timer2 cout high byte
IN AL,61H ;get current port setting
MOV AH,AL ;and save it in ah
OR AL,3 ;turn speaker on
OUT 61H,AL
WAIT1:
MOV CX,663 ;wait for specified interval,663*15.08us=10ms
CALL WAITF
DELAY:
LOOP DELAY
DEC BX
JNZ WAIT1
MOV AL,AH ;recover value of port
OUT 61H,AL
POP DI ;recover the register
POP DX
POP CX
POP BX
POP AX
RET ;exit
GENSOUND ENDP
;================================================
;
;================================================
; Initialize
START :
PUSH CS
POP DS
MOV AX,351CH ;get interrupt 1ch
INT 21H
MOV WORD PTR OLD1CH,BX
MOV WORD PTR OLD1CH + 2,ES
MOV DX,OFFSET NEW1CH
MOV AX,251CH ;set interrupt 1ch
INT 21H
; mov word ptr[set_time],3030h
; mov ax,3
; int 10h
; mov ah,4ch
; int 21h
MOV DX,OFFSET START ;want to stay in memory's code and data bytes
ADD DX,15 ;if bytes can't div 16
MOV CL,4
SHR DX,CL ;transfer to byte
ADD DX,10H ;add psp's length
MOV AH,31H ;over and stay
INT 21H
CSEG ENDS
END START
;================================================