home *** CD-ROM | disk | FTP | other *** search
- {
- > 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.
- }