📄 irqstack.lst
字号:
Turbo Assembler Version 3.1 04/11/13 12:54:48 Page 1
irqstack.asm
1 ; File:
2 ; irqstack.asm
3 ; Description:
4 ; Assembly support routines for hardware stack support
5 ;
6 ; Copyright (c) 1997
7 ; Svante Frey
8 ; All Rights Reserved
9 ;
10 ; This file is part of DOS-C.
11 ;
12 ; DOS-C is free software; you can redistribute it and/or
13 ; modify it under the terms of the GNU General Public License
14 ; as published by the Free Software Foundation; either version
15 ; 2, or (at your option) any later version.
16 ;
17 ; DOS-C is distributed in the hope that it will be useful, but
18 ; WITHOUT ANY WARRANTY; without even the implied warranty of
19 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
20 ; the GNU General Public License for more details.
21 ;
22 ; You should have received a copy of the GNU General Public
23 ; License along with DOS-C; see the file COPYING. If not,
24 ; write to the Free Software Foundation, 675 Mass Ave,
25 ; Cambridge, MA 02139, USA.
26 ;
27 ; $Logfile: C:/dos-c/src/kernel/irqstack.asv $
28 ;
29 ; $Header: C:/dos-c/src/kernel/irqstack.asv 1.1 22 Jan 1997 13:15:34 patv $
30 ;
31 ; $Log: C:/dos-c/src/kernel/irqstack.asv $
32 ;
33 ; Rev 1.1 22 Jan 1997 13:15:34 patv
34 ; pre-0.92 Svante Frey bug fixes
35 ;
36 ; Rev 1.0 16 Jan 1997 21:43:44 patv
37 ; Initial revision.
38 ;
39
40
41 ; Code for stack switching during hardware interrupts.
42
43 0000 _TEXT segment WORD PUBLIC 'CODE'
44 assume cs:_TEXT
45
46 0000 10*(????????) old_vectors dd 16 dup(?)
47 0040 ???? stack_size dw ?
48 0042 ???? stack_top dw ?
49 0044 ???? stack_offs dw ?
50 0046 ???? stack_seg dw ?
51
52 0048 53 irq_0: push bx
53 0049 BB 0000 mov bx, 0 * 4
54 004C EB 58 jmp short general_irq_service
55
Turbo Assembler Version 3.1 04/11/13 12:54:48 Page 2
irqstack.asm
56 004E 53 irq_1: push bx
57 004F BB 0004 mov bx, 1 * 4
58 0052 EB 52 jmp short general_irq_service
59
60 0054 53 irq_2: push bx
61 0055 BB 0008 mov bx, 2 * 4
62 0058 EB 4C jmp short general_irq_service
63
64 005A 53 irq_3: push bx
65 005B BB 000C mov bx, 3 * 4
66 005E EB 46 jmp short general_irq_service
67
68 0060 53 irq_4: push bx
69 0061 BB 0010 mov bx, 4 * 4
70 0064 EB 40 jmp short general_irq_service
71
72 0066 53 irq_5: push bx
73 0067 BB 0014 mov bx, 5 * 4
74 006A EB 3A jmp short general_irq_service
75
76 006C 53 irq_6: push bx
77 006D BB 0018 mov bx, 6 * 4
78 0070 EB 34 jmp short general_irq_service
79
80 0072 53 irq_7: push bx
81 0073 BB 001C mov bx, 7 * 4
82 0076 EB 2E jmp short general_irq_service
83
84 0078 53 irq_08: push bx
85 0079 BB 0020 mov bx, 8 * 4
86 007C EB 28 jmp short general_irq_service
87
88 007E 53 irq_09: push bx
89 007F BB 0024 mov bx, 9 * 4
90 0082 EB 22 jmp short general_irq_service
91
92 0084 53 irq_0a: push bx
93 0085 BB 0028 mov bx, 0ah * 4
94 0088 EB 1C jmp short general_irq_service
95
96 008A 53 irq_0b: push bx
97 008B BB 002C mov bx, 0bh * 4
98 008E EB 16 jmp short general_irq_service
99
100 0090 53 irq_0c: push bx
101 0091 BB 0030 mov bx, 0ch * 4
102 0094 EB 10 jmp short general_irq_service
103
104 0096 53 irq_0d: push bx
105 0097 BB 0034 mov bx, 0dh * 4
106 009A EB 0A jmp short general_irq_service
107
108 009C 53 irq_0e: push bx
109 009D BB 0038 mov bx, 0eh * 4
110 00A0 EB 04 jmp short general_irq_service
Turbo Assembler Version 3.1 04/11/13 12:54:48 Page 3
irqstack.asm
111
112 00A2 53 irq_0f: push bx
113 00A3 BB 003C mov bx, 0fh * 4
114 ; jmp short general_irq_service
115
116 00A6 General_irq_service:
117 00A6 52 push dx
118 00A7 50 push ax
119 00A8 1E push ds
120
121 00A9 8C C8 mov ax, cs
122 00AB 8E D8 mov ds, ax
123
124 00AD 2E: A1 0042r mov ax, stack_top
125 00B1 2E: 3B 06 0044r cmp ax, stack_offs
126 00B6 76 30 jbe dont_switch
127
128 00B8 8C D2 mov dx, ss
129 00BA 8B C4 mov ax, sp
130
131 00BC 2E: 8E 16 0046r mov ss, stack_seg
132 00C1 2E: 8B 26 0042r mov sp, stack_top
133
134 00C6 52 push dx ; save old SS:SP on new stack
135 00C7 50 push ax
136
137 00C8 2E: A1 0040r mov ax, stack_size
138 00CC 2E: 29 06 0042r sub stack_top, ax
139
140 00D1 9C pushf
141 00D2 2E: FF 9F 0000r call old_vectors[bx]
142
143 00D7 FA cli
144 00D8 2E: 01 06 0042r add stack_top, ax
145
146 00DD 58 pop ax ; get stored SS:SP
147 00DE 5A pop dx
148
149 00DF 8E D2 mov ss, dx ; switch back to old stack
150 00E1 8B E0 mov sp, ax
151
152 00E3 1F pop ds ; restore registers and return
153 00E4 58 pop ax
154 00E5 5A pop dx
155 00E6 5B pop bx
156 00E7 CF iret
157
158 00E8 9C dont_switch: pushf
159 00E9 2E: FF 9F 0000r call dword ptr old_vectors[bx]
160 00EE 1F pop ds
161 00EF 58 pop ax
162 00F0 5A pop dx
163 00F1 5B pop bx
164 00F2 CF iret
165
Turbo Assembler Version 3.1 04/11/13 12:54:48 Page 4
irqstack.asm
166 public _init_stacks
167 ; VOID init_stacks(VOID FAR *stack_base, COUNT nStacks, WORD stackSize);
168
169 00F3 _init_stacks proc near
170 00F3 55 push bp
171 00F4 8B EC mov bp, sp
172 00F6 1E push ds
173 00F7 57 push di
174 00F8 56 push si
175
176
177 00F9 0E push cs
178 00FA 1F pop ds
179
180 00FB 8B 5E 04 mov bx, [bp+4]
181 00FE 8B 56 06 mov dx, [bp+6]
182 0101 8B 46 08 mov ax, [bp+8]
183 0104 8B 4E 0A mov cx, [bp+0ah]
184
185 0107 2E: 89 0E 0040r mov stack_size, cx
186 010C 2E: 89 1E 0044r mov stack_offs, bx
187 0111 2E: 89 16 0046r mov stack_seg, dx
188
189 0116 F7 E1 mul cx
190 0118 03 C3 add ax, bx
191 011A 2E: A3 0042r mov stack_top, ax
192
193 011E 33 C0 xor ax, ax
194 0120 8E D8 mov ds, ax
195
196 0122 0E push cs
197 0123 07 pop es
198
199 0124 BF 0000r mov di, offset old_vectors
200 0127 BE 0020 mov si, 8 * 4
201 012A B9 0010 mov cx, 10h
202 012D F3> A5 rep movsw
203
204 012F BE 01C0 mov si, 70h * 4
205 0132 B9 0010 mov cx, 10h
206 0135 F3> A5 rep movsw
207
208 0137 1E push ds
209 0138 07 pop es
210
211 0139 BF 0020 mov di, 8 * 4
212 013C BA 0048r mov dx, offset irq_0
213 013F E8 000B call set_vect
214
215 0142 BF 01C0 mov di, 70h * 4
216 0145 E8 0005 call set_vect
217
218 0148 5E pop si
219 0149 5F pop di
220 014A 1F pop ds
Turbo Assembler Version 3.1 04/11/13 12:54:48 Page 5
irqstack.asm
221 014B 5D pop bp
222 014C C3 ret
223 014D _init_stacks endp
224
225 014D set_vect proc
226 014D B9 0008 mov cx, 8
227
228 0150 8B C2 set_next: mov ax, dx
229 0152 FA cli
230 0153 AB stosw
231 0154 8C C8 mov ax, cs
232 0156 AB stosw
233 0157 FB sti
234 0158 83 C2 06 add dx, offset irq_1 - offset irq_0
235 015B E2 F3 loop set_next
236
237 015D C3 ret
238 015E set_vect endp
239
240 015E _TEXT ENDS
241
242 end
Turbo Assembler Version 3.1 04/11/13 12:54:48 Page 6
Symbol Table
Symbol Name Type Value
??DATE Text "04/11/13"
??FILENAME Text "irqstack"
??TIME Text "12:54:48"
??VERSION Number 030A
@CPU Text 0101H
@CURSEG Text _TEXT
@FILENAME Text IRQSTACK
@WORDSIZE Text 2
DONT_SWITCH Near _TEXT:00E8
GENERAL_IRQ_SERVICE Near _TEXT:00A6
IRQ_0 Near _TEXT:0048
IRQ_08 Near _TEXT:0078
IRQ_09 Near _TEXT:007E
IRQ_0A Near _TEXT:0084
IRQ_0B Near _TEXT:008A
IRQ_0C Near _TEXT:0090
IRQ_0D Near _TEXT:0096
IRQ_0E Near _TEXT:009C
IRQ_0F Near _TEXT:00A2
IRQ_1 Near _TEXT:004E
IRQ_2 Near _TEXT:0054
IRQ_3 Near _TEXT:005A
IRQ_4 Near _TEXT:0060
IRQ_5 Near _TEXT:0066
IRQ_6 Near _TEXT:006C
IRQ_7 Near _TEXT:0072
OLD_VECTORS Dword _TEXT:0000
SET_NEXT Near _TEXT:0150
SET_VECT Near _TEXT:014D
STACK_OFFS Word _TEXT:0044
STACK_SEG Word _TEXT:0046
STACK_SIZE Word _TEXT:0040
STACK_TOP Word _TEXT:0042
STANDALONE Text 1
_INIT_STACKS (_init_stacks) Near _TEXT:00F3
Groups & Segments Bit Size Align Combine Class
_TEXT 16 015E Word Public CODE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -