mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 18:04:07 +00:00
Upload
Digital Research
This commit is contained in:
89
MPM OPERATING SYSTEMS/MPM-86/MPM-86 2.0 SOURCES/02/FLAG.RTM
Normal file
89
MPM OPERATING SYSTEMS/MPM-86/MPM-86 2.0 SOURCES/02/FLAG.RTM
Normal file
@@ -0,0 +1,89 @@
|
||||
|
||||
;*****************************************************
|
||||
;*
|
||||
;* Flag Management
|
||||
;*
|
||||
;* FLAGS-flag table offset NFLAGS-number of flags
|
||||
;*
|
||||
;* Format of Flag Table Entry:
|
||||
;* +-------------+------+
|
||||
;* | flag |ignore|
|
||||
;* +-------------+------+
|
||||
;* flag - 0ffffh, flag is off
|
||||
;* 0fffeh, flag is set
|
||||
;* 0xxxxh, PD that is waiting
|
||||
;* ignore- 0ffh, normal case
|
||||
;* 0xxh, number of flags to ignore-1
|
||||
;*
|
||||
;* GENSYS initializes the flag table with 0ffh's.
|
||||
;*
|
||||
;*****************************************************
|
||||
|
||||
;============== ==========================
|
||||
flag_set_entry: ; Set Logical Interrupt Flag
|
||||
;============== ==========================
|
||||
; NOTE: the flagset routine can be called from outside
|
||||
; the operating system through an interrupt
|
||||
; routine. UDA variables cannot be used. This
|
||||
; is the only function an interrupt routine can
|
||||
; call.
|
||||
;
|
||||
; input: DL = flag number
|
||||
; output: BX = 0 if okay,0ffffh if Error
|
||||
; CX = Error Code:0,e_flag_ovrrun
|
||||
|
||||
call flag_valid
|
||||
cmp flg_ignore[si],flag_zig ! je fs_set
|
||||
dec flg_ignore[si] ! jmp flag_exit
|
||||
fs_set: cmp bx,flag_on ! jne fs_non
|
||||
mov cx,e_flag_ovrrun ! jmp flag_bexit
|
||||
fs_non: cmp bx,flag_off ! jne fs_noff
|
||||
mov flg_pd[si],flag_on
|
||||
jmp flag_exit
|
||||
fs_noff:mov ax,drl ! mov p_link[bx],ax
|
||||
mov drl,bx ! mov p_stat[bx],ps_run
|
||||
mov flg_pd[si],flag_off
|
||||
jmp flag_exit
|
||||
|
||||
;=============== ===============================
|
||||
flag_wait_entry: ; Wait for Logical Interrupt Flag
|
||||
;=============== ===============================
|
||||
; input: DL = flag number
|
||||
; output: BX = 0 if everything okay
|
||||
; BX = 0ffffh if Error
|
||||
; CX = Error Code:0,e_flag_underrun
|
||||
|
||||
call flag_valid
|
||||
cmp bx,flag_on ! jne fw_non
|
||||
mov flg_pd[si],flag_off
|
||||
jmp flag_exit
|
||||
fw_non: cmp bx,flag_off ! jne fw_noff
|
||||
mov bx,rlr
|
||||
mov p_stat[bx],ps_flagwait
|
||||
mov u_dparam,si
|
||||
call dsptch ! jmp flag_exit
|
||||
fw_noff:mov cx,e_flag_underrun ! jmp flag_bexit
|
||||
|
||||
flag_valid: ; Check validity of flag number
|
||||
;---------- -----------------------------
|
||||
; output: SI = ptr to flag entry
|
||||
; BX = contents of flag entry
|
||||
; clear interrupt flag - Flags on stack
|
||||
|
||||
pop ax ! pushf
|
||||
cmp dl,nflags ! jb flag_good
|
||||
mov cx,e_ill_flag ! jmp flag_bexit
|
||||
flag_good:
|
||||
mov dh,0 ! push ax ! cli
|
||||
mov ax,dx ! mov bx,flglen ! mul bx
|
||||
mov si,flags ! add si,ax
|
||||
mov bx,[si] ! ret
|
||||
|
||||
flag_exit: ; Successful Exit
|
||||
;--------- ---------------
|
||||
sub bx,bx ! mov cx,bx ! popf ! ret
|
||||
|
||||
flag_bexit: ; Exit with Error
|
||||
;---------- ---------------
|
||||
mov bx,0ffffh ! popf ! ret
|
||||
|
||||
Reference in New Issue
Block a user