954,479 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

bootable usb and task switch

I want to do task switching using two tasks while i have booted from usb drive. The first switch takes place but the second one does not happen. Any ideas why? the code is below. The routine which does the task switching is at label sched.

org 100h

jmp start
STACKSIZE dw 256
timer: dd 0
active1: db 1
active2: db 1
vidmem_start equ 0x0b800
default_color equ 7 ;default_color
scrw equ 80*25 ;25=lines 80=chars per line
eom equ 0
stat1 dw 0
stat2 dw 0
stasys dw 0
temp dw ?
oldIntOff: dw 0 ; old timer interrupt offset
oldIntSeg: dw 0

stacksys: rb STACKSIZE
stacksysend:
stacktask1: rb STACKSIZE
stack1end:
stacktask2: rb STACKSIZE
stack2end:


start: mov sp,stack2end
pushf
push cs
push task2
pusha
mov ax,sp
mov [stat2],ax
mov sp,stack1end
pushf
push cs
push task1
pusha
mov [stat1],sp


mov sp,stacksysend
push word [stat2]
mov bp,sp
mov [stasys],sp
mov sp,[stat1]



mov ax,0
mov gs,ax
mov ax,[gs:0x1c*4]
mov [oldIntOff],ax
mov ax,[gs:0x1c*4+2]
mov [oldIntSeg],ax
; Critical Section Start: Hook the new ISR for 0x1c
cli
mov ax,cs
mov [gs:0x1c*4+2],ax
mov ax,timer_isr
mov [gs:0x1c*4],ax
; Critical Section End: ISR is hooked
sti



main:
task1:
mov bx,vidmem_start
mov ax,0
mov ds,bx
mov di,0
mov ah,6
mov al,2
a1:
mov [ds:di],ax
inc di
mov cx,0FFh
loop $
cmp di,4000
jnz a1
mov [active1],byte 0
task1end: jmp task1end

task2: mov bx,vidmem_start
mov ax,0
mov ds,bx
mov di,3998
mov ah,6
mov al,3
a2:
mov [ds:di],ax
dec di
mov cx,0fFh
loop $
CMP di,4000
jnz a2
mov [active2],byte 0
task2end: jmp task2end



timer_isr: cmp [active1],byte 0
jnz sch
cmp [active2],byte 0
jnz sch
jmp end1

sch: push ax
mov ax,cs
mov ds,ax
inc dword [timer]
mov al,0x20
out 0x20, al
pop ax







; the task switch takes place here

pusha

mov [temp],sp


mov sp,[stasys]

push word [temp]

mov [stasys],sp

mov sp,[bp]

sub bp,2



popa
;pushf
;call FAR [oldIntOff]
iret













end1 : cli
mov ax,[oldIntOff] ;epistrefoume to int hook ekei pou itan
mov [gs:0x1c*4],ax
mov ax,[oldIntSeg]
mov [gs:0x1c*4+2],ax
sti
mov ax,0x4C00 ;dosbox use only
int 0x21 ;

andr.dimitris
Newbie Poster
1 post since Feb 2012
Reputation Points: 10
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You