
NAME openrtn
openrtn SEGMENT PARA
    ASSUME CS: openrtn, DS: openrtn
own DW rtne00
 DW rtne01
 DW rtne02
 DW rtne03
 DW rtne04
 DW rtne05
 DW rtne06
 DW rtne07
 DW rtne07
 DW rtne08
 DW rtne09
 DW rtne10
 DW rtne11
 DW rtne12
 DW rtne13
 DW rtne14
 DW rtne15
 DW rtne16
 DW rtne17
 DW rtne18
 DW rtne19
 DW rtne20
 DW rtne21
 DW rtne21
 DW rtne22
 DW rtne23
 DW rtne24
 DW rtne25
 DW rtne26
 DW rtne27
 DW rtne28
 DW rtne29
 DW rtne30
 DW rtne31
 DW rtne32
 DW rtne33
 DW rtne34
 DW rtne35
 DW rtne36
 DW rtne37
 DW rtne38
 DW rtne39
 DW rtne40
 DW rtne41
 DW rtne42
 DW rtne43
 DW rtne44
 DW rtne45
 DW rtne46
 DW rtne47
 DW rtne48
 DW rtne49
 DW rtne50
 DW rtne51
 DW rtne52
 DW rtne53
 DW rtne54
 DW rtne54
 DW rtne55
 DW rtne56
 DW rtne57
 DW rtne58
 DW rtne59
 DW rtne60
 DW rtne61
 DW rtne62
 DW rtne63
 DW rtne64
 DW rtne65
 DW rtne66
 DW rtne67
 DW rtne68


$ save nolist
$ include(pi3.dcl)
$ restore

%set(xvarno,0)

%*define(beginopen(rtn))(
rtne%rtn DW size%rtn
x%eval(%xvarno) DW y%eval(%xvarno)
)

%*define(endopen(rtn))(
size%rtn EQU $-rtne%rtn
y%eval(%xvarno) EQU $-x%eval(%xvarno)-2
%set(xvarno,%xvarno+1)
)

%*define(extcall(routine))(
y%eval(%xvarno) EQU $-x%eval(%xvarno)-2
       DB 1                 ; external call
       DW %routine
%set(xvarno,%xvarno+1)
x%eval(%xvarno) DW y%eval(%xvarno)
)

F_RANGE              EQU 52

routine_fault        EQU 1
routine_resume       EQU 2
routine_allocpool    EQU 3

CodeMacro PUSH src:Db(-128,127)
DB 6AH
DB src
endM


%*define(fault(fcode))(
	PUSH %fcode
        %extcall(routine_fault)          
)

%*define(get_buf_seg) local nonfault
        (POP    SI                          ;ES:SI:=ptr_reference
        POP     ES
        CMP     ES:[SI].LOCKED,0;
        JGE     %NONFAULT
         %fault(F_NIL)
;        MOV     AL,F_NIL                    ;reference=NIL
;        INT     31
%NONFAULT:
        MOV     ES,ES:[SI].TOPBUF           ;ES:=buffer-frame)


%beginopen(00)
 ;   1
        POP     AX        ;AX:=abs(topword)
        CMP     AX,0
        JGE     ABS_EXIT
        NEG     AX
        INTO
ABS_EXIT:
%endopen(00)
%beginopen(01)
 ;   1
	XOR	AX,AX
	PUSH	AX
	%extcall(routine_allocpool)
%endopen(01)
%beginopen(02)
 ;   0
        %GET_BUF_SEG
        MOV     AX,ES:BUFCOUNT
%endopen(02)
%beginopen(03)
 ;   0
        %GET_BUF_SEG
        MOV     AX,ES:DATASIZE
%endopen(03)
%beginopen(04)
 ;   0
        %get_buf_seg
        MOV AX,ES: bytecount
%endopen(04)
%beginopen(05)
 ;   0
        POP SI
        POP ES
        MOV AX,ES:[SI].c_length
%endopen(05)
%beginopen(06)
 ;   0
        POP     AX
        XOR     AH,AH
%endopen(06)
%beginopen(07)
 ;   0
        POP     AX
%endopen(07)
%beginopen(08)
 ;   0
        %get_buf_seg
        MOV AL,ES:creditcount
%endopen(08)
%beginopen(09)
 ;   0
        POP SI
        POP ES
        DEC ES:BYTE ptr[SI]
%endopen(09)
%beginopen(10)
 ;   0
        POP SI
        POP ES
        DEC ES:WORD ptr[SI]
%endopen(10)
%beginopen(11)
 ;   0
        %get_buf_seg
        MOV AL,ES: eventkind
%endopen(11)
%beginopen(12)
 ;   0
        POP BX                   ; BX:=pool.offset   
        POP AX                   ; AX:=pool.segment   
        %get_buf_seg             ; ES:=buffer frame
        CMP BX,ES:WORD PTR home  ; ZF:=(home.offs=pool.offs)
        JNE hometest_1           ; if ZF then
        SUB AX,ES:WORD PTR home+2;   ZF:=(home.base=pool.base)
        JE  hometest_2           ; if ZF then AL:=FF else AL:=0
hometest_1:
        MOV AL,0FFH
hometest_2:
        INC AL
%endopen(12)
%beginopen(13)
 ;   0
        POP SI
        POP ES
        INC ES:BYTE PTR[SI]
%endopen(13)
%beginopen(14)
 ;   0
        POP SI
        POP ES
        INC ES:WORD PTR[SI]
%endopen(14)
%beginopen(15)
 ;   0
        %get_buf_seg
        MOV AL,ES:index
%endopen(15)
%beginopen(16)
 ;   0
        POP SI
        POP ES
        SUB AX,AX
        CMP AX,ES:[SI].s
        JLE loced_1
        INC AX
loced_1:
%endopen(16)
%beginopen(17)
 ;   0
        POP SI
        POP ES
        SUB AX,AX
        CMP ES:WORD PTR [SI]+2,0
        JNE nil_1
        INC AX
nil_1:
%endopen(17)
%beginopen(18)
 ;   0
        POP SI
        POP ES
        SUB AX,AX
        CMP ES:WORD PTR [SI]+2,0FFFFH
        JNE nil_2
        INC AX
nil_2:
%endopen(18)
%beginopen(19)
 ;   0
        POP SI
        POP ES
        SUB AX,AX
        CMP AX,ES:WORD PTR [SI]
        JNE nil_3
        INC AL
nil_3:
%endopen(19)
%beginopen(20)
 ;   0
        %get_buf_seg
        MOV AX,ES:dataoffset
%endopen(20)
%beginopen(21)
 ;   0
        POP SI
        POP ES
        SUB AX,AX
        CMP AX,ES:[SI].s
        JGE open_1
        INC AX
open_1:
%endopen(21)
%beginopen(22)
 ;   0
        POP SI
        POP ES
        SUB AX,AX
        CMP AX,ES:[SI].s
        JNE passive_1
        INC AX
passive_1:
%endopen(22)
%beginopen(23)
 ;   0
        POP BX
        POP AX
        CMP AL,BL
        JNE  pred_1
        %fault(F_RANGE)
pred_1:
        DEC AL
%endopen(23)
%beginopen(24)
 ;   0
        POP BX
        POP AX
        CMP AX,BX
        JNE  pred_2
        %fault(F_RANGE)
pred_2:
        DEC AX
%endopen(24)
%beginopen(25)
 ;   0
        %get_buf_seg
        MOV AL,ES:reason
%endopen(25)
%beginopen(26)
 ;   0
        %get_buf_seg
        MOV ES:eventkind,not_event
%endopen(26)
%beginopen(27)
 ;   0
        pop BX
        %get_buf_seg
        MOV ES:bytecount,BX
%endopen(27)
%beginopen(28)
 ;   0
        pop BX
        %get_buf_seg
        cmp BX,ES:datasize
        jle setoff_1
        %fault(F_RANGE)
;       int 29      
setoff_1:
        MOV ES:dataoffset,BX
%endopen(28)
%beginopen(29)
 ;   0
        pop BX
        %get_buf_seg
        cmp BX,ES:datasize
        jle settop_1
	%fault(F_RANGE)
;       int 29      
settop_1:
        MOV ES:top,BX
%endopen(29)
%beginopen(30)
 ;   0
        pop BX
        %get_buf_seg
        MOV ES:u1,BL
%endopen(30)
%beginopen(31)
 ;   0
        pop BX
        %get_buf_seg
        MOV ES:u2,BL
%endopen(31)
%beginopen(32)
 ;   0
        pop BX
        %get_buf_seg
        MOV ES:u3,BL
%endopen(32)
%beginopen(33)
 ;   0
        pop BX
        %get_buf_seg
        MOV ES:u4,BL
%endopen(33)
%beginopen(34)
 ;   0
        %get_buf_seg
        MOV AX,ES:depth
%endopen(34)
%beginopen(35)
 ;   0
        pop     ax
        cli 
        test    DS: byte ptr own.p_state, 1
        JNZ     start_1
        mov     DS: byte ptr own.priority, al
start_1:
        sti
        %extcall(routine_resume)
%endopen(35)
%beginopen(36)
 ;   0
        POP     BX
        POP     AX
        CMP     AL,BL
        JNE     SUCC_1
        %fault(F_RANGE)
succ_1:
        INC     AL
%endopen(36)
%beginopen(37)
 ;   0
        POP     BX
        POP     AX
        CMP     AX,BX
        JNE     SUCC_2
        %fault(F_RANGE)
succ_2:
        INC     AX
%endopen(37)
%beginopen(38)
 ;   0
        %get_buf_seg
        MOV     AX,ES:top
%endopen(38)
%beginopen(39)
 ;   0
        %get_buf_seg
        MOV     AL,ES:u1
%endopen(39)
%beginopen(40)
 ;   0
        %get_buf_seg
        MOV     AL,ES:u2
%endopen(40)
%beginopen(41)
 ;   0
        %get_buf_seg
        MOV     AL,ES:u3
%endopen(41)
%beginopen(42)
 ;   0
        %get_buf_seg
        MOV     AL,ES:u4
%endopen(42)
%beginopen(43)
 ;   1
        POP     AX
        XCHG    AL,AH
%endopen(43)
%beginopen(44)
 ;   4
        INT 3
%endopen(44)
%beginopen(45)
 ;   0
        %get_buf_seg
        MOV AX,ES:datapart
%endopen(45)
%beginopen(46)
 ;   0
        CLI
%endopen(46)
%beginopen(47)
 ;   0
        STI
%endopen(47)
%beginopen(48)
 ;   0
        %GET_BUF_SEG
        MOV     AX,ES: WORD PTR HOME
        MOV     BX,ES: WORD PTR HOME+2
        %GET_BUF_SEG
        SUB     AX,ES: WORD PTR HOME
        JNE     EQUALHOME_1
        SUB     BX,ES: WORD PTR HOME+2
        JE      EQUALHOME_2
EQUALHOME_1:
        MOV     AL,0FFH
EQUALHOME_2:
        INC     AL
%endopen(48)
%beginopen(49)
 ;   0
        %get_buf_seg
        MOV AX,ES:dataoffset
%endopen(49)
%beginopen(50)
 ;   0
        pop     dx
        in      al,dx
%endopen(50)
%beginopen(51)
 ;   0
        pop     dx
        in      ax,dx
%endopen(51)
%beginopen(52)
 ;   0
        %get_buf_seg
        MOV     AX,ES:top
        DEC     AX
%endopen(52)
%beginopen(53)
 ;   0
        %get_buf_seg
        MOV AX,ES: bytecount
        ADD AX,ES: dataoffset
%endopen(53)
%beginopen(54)
 ;   0
        POP SI
        POP ES
        MOV AX,ES:[SI].s
%endopen(54)
%beginopen(55)
 ;   0
        pop     ax
        pop     dx
        out     dx,al
%endopen(55)
%beginopen(56)
 ;   0
        pop     ax
        pop     dx
        out     dx,ax
%endopen(56)
%beginopen(57)
 ;   0
        mov     ax, word ptr own.stackbound
%endopen(57)
%beginopen(58)
 ;   0
        mov     ax, word ptr own.stacksize
%endopen(58)
%beginopen(59)
 ;   0
        mov     al, DS: byte ptr own.priority
%endopen(59)
%beginopen(60)
 ;   0
        pop     di
        pop     es
        mov     ax, es: [di].procvar
        cmp     ax,0
        jnz     priority_1
        %fault(F_NIL)
;       mov     al, f_nil
;       int     31
priority_1:
        mov     es, ax
        mov     al, es: priority
%endopen(60)
%beginopen(61)
 ;  
	POP BX
	POP ES
%endopen(61)
%beginopen(62)
 ;   0
        mov     ax, word ptr own.timer
%endopen(62)
%beginopen(63)
 ;   0
        pop BX
        %get_buf_seg
        cmp BX,ES:datasize
        jle setfir_1
	%fault(F_RANGE)
;       int 29      
setfir_1:
        MOV CX,ES:dataoffset
        SUB CX,BX
        MOV ES:dataoffset,BX
        ADD ES:bytecount,CX
        CMP ES:depth,1
        JBE setfir_2
        MOV AX,ES:bufcount
        MOV ES,ES:stack
        CMP ES:bufcount,AX
        JZ  setfir_1
setfir_2:
%endopen(63)
%beginopen(64)
 ;   0
        pop BX
        inc BX
        %get_buf_seg
        cmp BX,ES:datasize
        jle setlas_1
	%fault(F_RANGE)
;       int 29      
setlas_1:
        MOV ES:top,BX
        CMP ES:depth,1
        JBE setlas_2
        MOV AX,ES:bufcount
        MOV ES,ES:stack
        CMP ES:bufcount,AX
        JZ  setlas_1
setlas_2:
%endopen(64)
%beginopen(65)
 ;   0
        pop BX
        %get_buf_seg
setnex_1:      
        MOV CX,BX
        SUB CX,ES:dataoffset
        MOV ES:bytecount,CX
        CMP ES:depth,1
        JBE setnex_2
        MOV AX,ES:bufcount
        MOV ES,ES:stack
        CMP ES:bufcount,AX
        JZ  setnex_1
setnex_2:
%endopen(65)
%beginopen(66)
 ;   0
        pop     ax
        cli 
        test    DS: byte ptr own.p_state, 1
        JNZ     set_priority_1
        mov     DS: byte ptr own.priority, al
set_priority_1:
        sti
%endopen(66)
%beginopen(67)
 ;   0
        pop     di
        pop     es
        mov     ax, es: [di].procvar
        cmp     ax,0
        jnz     stackbound_1
	%fault(F_NIL)
;       mov     al, f_nil
;       int     31
stackbound_1:
        mov     es, ax
        mov     al, es: priority
%endopen(67)
%beginopen(68)
 ;   0
        pop     di
        pop     es
        mov     ax, es: [di].procvar
        cmp     ax,0
        jnz     stacksize_1
	%fault(F_NIL)
;       mov     al, f_nil
;       int     31
stacksize_1:
        mov     es, ax
        mov     ax, es: stacksize
%endopen(68)
openrtn ends
end
