[Back to MISC SWAG index] [Back to Main SWAG index] [Original]
{
> Does anyone know how to create a popup window and have a program
> running in the background? I've seen this done in such bbs programs
Multitasking. /[:) I suppose you guessed that part, though. Here's the
assembly portion of a _working_ multi-tasker I did in 2nd year:
NAME ProcSwitch
; Written by Dave Jarvis
DOSSEG
.MODEL SMALL
.CODE
PUBLIC _new_clock
EXTRN _new_process : NEAR
NUM_TICKS EQU 45 ; 45 clock ticks = 2.5 seconds
_new_clock PROC NEAR
CMP _tick_count, NUM_TICKS
JE GetNewProc ; Get a new process
INC _tick_count ; Resume counting interrupts
JMP DoneInt ; End of interrupt.
GetNewProc: MOV _tick_count, 0 ; Reset the interrupt counter
PUSH DS ; Save all registers on "stack"
PUSH ES
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH BP
MOV AX, SS ; Point _S_ss and _S_sp to current
MOV _S_ss, AX ; SS and SP values.
MOV AX, SP
MOV _S_sp, AX
CALL _new_process ; Get new process' stack registers
MOV AX, _S_ss ; Point SS:SP to process stack segment
MOV SS, AX ; registers found in call to _new_process
MOV AX, _S_sp
MOV SP, AX
POP BP ; Restore interrupted process' registers
POP DI ; from "stack"
POP SI
POP DX
POP CX
POP BX
POP AX
POP ES
POP DS
DoneInt: PUSH AX
MOV AL, 20h ; Load EOI into AL
OUT 20h, AL ; Send PIC chip EOI signal
POP AX
IRET ; Return to interrupted process
_new_clock ENDP
.DATA?
EXTRN _tick_count:WORD
EXTRN _S_ss:WORD, _S_sp:WORD
END
{
You take over the $1C interrupt, count the ticks, and restore the state
of all the registers when the ticks hits a certain value.
What you have to do is set up a procedure (called New_Process) which
changes the stack pointer to an array in memory which contains the values
of the registers (all listed + IP, CS, & FLAGS) prior to the process
being interrupted.
}
[Back to MISC SWAG index] [Back to Main SWAG index] [Original]