-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinter.asm
236 lines (190 loc) · 3.46 KB
/
inter.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
;*******************************************************************************
; TIMER INTERRUPTION
; AUTHOR: MANUEL PABLO GONZALEZ CALZON
; AH=01 FOR ENABLE TIMER, ANYTHING ELSE FOR DISABLE
;*******************************************************************************
CODE SEGMENT
ASSUME CS:CODE
ORG 256
START: JMP CHECK
TIME DB 33H,30H ;TIME IN TENS AND THEN UNITS IN ASCII CODE
SECOND DB 0; HAS A SECOND PASSED
ENABLED DB 0; IS THE TIMER ENABLED
DIR_ANT_INT DW ?,? ; OLD 1CH INTERRUPTION DIRECTION TO REPLACE IT WHEN UNINSTALLING
ISR PROC FAR
STI ;ALLOW STACKING OF OTHER ROUTINES
PUSH DX DS
PUSH ES BX
;CHECK AX FOR ENABLE OR DISABLE
CMP AH,01H
JE ENABLE
;DISABLE
MOV [ENABLED],0
JMP ENDRUTINE
ENABLE:
;GET MAX TIME
MOV BH,[TIME]
MOV BL,[TIME+1]
;STORE IT ON MEMORY
MOV DS:[SI+1],BL
MOV DS:[SI],BH
;ENABLE
MOV [ENABLED],1
;CHANGE VIEW FOR THE FIRST TIME
MOV DI,DS:[SI]
CALL CHANGEVIEW
;END RUTINE
ENDRUTINE:
POP BX ES
POP DS DX
IRET
ISR ENDP
TICKS DB 0 ; TICKS FROM THE LAST SECOND
TIMER PROC FAR
PUSH AX DX DS
PUSH ES BX
STI
CMP [ENABLED],0 ;CHECK IF TIMER IS ENABLED
JE NOSEG
INC [TICKS];A NEW TICK HAS PASSED
NORES:
CMP [TICKS],18 ; TICKS == 18 ? A SECOND HAS PASSED (APROX, IN REAL IT WOULD BE 18,2)
JNZ NOSEG
;SET SECONDS AND RESTART TICKS
INC [SECOND] ; SECOND = 1
AND [TICKS],0 ; TICKS = 0
;CHANGE VALUES IN MEMORY AND ON SCREEN
MOV BX,DS:[SI]
CMP BH,30H
JE DECDEC ;IF TENS DIGIT IS EQUAL TO 0 DECREASE THE TENS AND SET UNITS TO 0
;IF NOT JUST DECREASE THE UNITS
DEC BH
MOV DS:[SI],BX
JMP NXT
DECDEC:
MOV BH,39H
DEC BL
MOV DS:[SI],BX
;RESTART SECONDS AND PRINT THE NEW VALUE ON SCREEN
NXT:
MOV [SECOND],0
MOV DI,DS:[SI]
CALL CHANGEVIEW
;IF THE TIMER REACHES 0 DISABLE IT
CMP BX,3030H
JNE NOSEG
MOV [ENABLED],0
;END RUTINE
NOSEG:
POP BX ES
POP DS DX AX
IRET
TIMER ENDP
CHANGEVIEW PROC NEAR
PUSH AX DX SI BX CX
;GET CURSOR
MOV BH,0
MOV AH,03H
INT 10H
;STORE PREVIOUS CURSOR IN SI
MOV SI,DX
;SET CURSOR
MOV DL,41
MOV AH,02H
INT 10H
;PRINT FIRST VALUE
MOV CX,DI
MOV BX,DI
MOV AL, CL
MOV CX,1
MOV BH,0
MOV BL,4 ;SET COLOR TO RED
MOV AH,09H
INT 10H
;INCREASE CURSOR VALUE
MOV DL,42
MOV AH,02H
INT 10H
;PRINT SECOND VALUE
MOV CX,DI
MOV BX,DI
MOV AL, CH
MOV CX,1
MOV BH,0
MOV BL,4 ;SET COLOR TO RED
MOV AH,09H
INT 10H
;REESTORE CURSOR PREVIOUS POSITION
MOV DX,SI
MOV AH,02H
INT 10H
POP CX BX SI DX AX
RET
CHANGEVIEW ENDP
CHECK:
MOV AH, DS:[80H]
CMP AH, 0
JE END1
;IF ARGUMENT IS /I INSTALL
MOV AX, DS:[82H]
CMP AX, "I/"
JNZ UNINST
CALL INSTALL
;IF ARGUMENT IS /I UNINSTALL
UNINST:
CMP AX, "U/"
JNZ END1
CALL UNINSTALL
END1:
MOV AX, 4C00H
INT 21H
INSTALL PROC
MOV AX, 0
MOV DS, AX
MOV AX, OFFSET ISR
MOV CX, CS
CLI
;SET INTERRUPTION 30H TO ISR RUTINE
MOV DS:[30H*4], AX
MOV DS:[30H*4 + 2], CX
MOV AX, DS:[1CH*4] ; GET 1CH ORIGINAL INTERRUPTION
MOV DX, DS:[1CH*4 + 2] ; GET 1CH ORIGINAL INTERRUPTION OFFSET
;STORE INFO
MOV [DIR_ANT_INT],AX
MOV [DIR_ANT_INT+2],DX
;SET 1CH TO TIMER INTERRUPTION
MOV AX, OFFSET TIMER
MOV DS:[1CH*4],AX
MOV DS:[1CH*4 + 2],CX
STI
MOV DX, OFFSET CHECK
INT 27H
INSTALL ENDP
UNINSTALL PROC
PUSH AX BX CX DX DS ES
MOV CX, 0
MOV DS, CX
MOV ES, DS:[30H*4 +2]
MOV BX, DS:[2CH]
MOV AX, OFFSET ISR
MOV CX, CS
CLI
;UNINSTALL 30H RUTINE
MOV WORD PTR DS:[30H*4], CX
MOV WORD PTR DS:[30H*4 + 2], CX
; RESTORE PREVIOUS INTERRUPTION VECTOR
MOV AX, ES:[DIR_ANT_INT]
MOV CX, ES:[DIR_ANT_INT+2]
MOV WORD PTR DS:[1CH*4],AX
MOV WORD PTR DS:[1CH*4 + 2],CX
STI
;RELEASE MEMORY
MOV AH, 49H
INT 21H
MOV ES, BX
INT 21H
POP ES DS DX CX BX AX
RET
UNINSTALL ENDP
CODE ENDS
END START