cortns.asm
来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 437 行 · 第 1/2 页
ASM
437 行
mov AX,-2[BP] ; ... (original ES if on the stack)
mov ES:SaveSeg+2,AX ; ...
mov AX,6[BP] ; save return address
mov ES:RetAddr,AX ; ...
mov AX,8[BP] ; ...
mov ES:RetAddr+2,AX ; ...
pop ES ; restore ES
pop BP ; restore BP
add SP,4 ; remove address of i/o routine
ifdef __WINDOWS__
mov BPLink,BP ; set up Windows BP-chain
inc BP ; ...
push BP ; ...
mov BP,SP ; ...
else
push BP ; save CG registers
endif
push BX ; ...
push CX ; ...
push DX ; ...
push DI ; ...
push SI ; ...
push DS ; ...
push ES ; ...
mov BX,DGROUP ; get segment address of DGROUP
mov ES,BX ; ...
mov ES:SaveSP,SP ; save stack pointer of executing code
mov ES:SaveSS,SS ; ...
mov AX,ES:_STACKLOW ; point to new stack
add AX,ES:CoStack ; ...
add AX,1 ; ...
and AX,0FFFEh ; ...
mov SS,BX ; ...
mov SP,AX ; ...
call dword ptr ES:IORtn ; start i/o operation
test AX,AX ; check if i/o error
je ExitCoRtns ; return to generated code
mov BX,DGROUP ; get segment address of DGROUP
mov ES,BX ; ...
mov BX,ES:SaveSS ; switch stacks
mov ES:SaveSS,SS ; ...
mov SS,BX ; ...
xchg ES:SaveSP,SP ; ...
add SP,FRAME_SIZE ; discard previous registers
mov BX,ES:SaveReg ; restore state
mov CX,ES:SaveReg+2 ; (in case ERR= or END=)
mov DX,ES:SaveReg+4 ; ...
mov DI,ES:SaveReg+6 ; ...
mov SI,ES:SaveReg+8 ; ...
mov BP,ES:SaveReg+10 ; ...
mov DS,ES:SaveSeg ; ...
push ES:RetAddr+2 ; get return address
push ES:RetAddr ; get return address
mov ES,ES:SaveSeg+2 ; ...
ret ; return
endproc RdWrCommon
defp ExitCoRtns ; switch back to generated code
mov BX,DGROUP ; get segment address of DGROUP
mov ES,BX ; ...
mov BX,ES:SaveSS ; switch stacks
mov ES:SaveSS,SS ; ...
mov SS,BX ; ...
xchg ES:SaveSP,SP ; ...
pop ES ; restore previous registers
pop DS ; ...
pop SI ; ...
pop DI ; ...
pop DX ; ...
pop CX ; ...
pop BX ; ...
ifdef __WINDOWS__
pop BP ; ...
dec BP ; ...
else
pop BP ; ...
endif
ret ; return to generated code
endproc ExitCoRtns
xdefp "C",IOType
defp IOType
sub AX,AX ; indicate i/o operation succeeded
jmp Switch ; return to generated code
endproc IOType
xdefp IOChar
defn IOChar ; i/o for CHARACTER*n value
if _MODEL and _BIG_DATA
push DS ; save DS
mov DS,DX ; set DS to segment of SCB
endif
push SI ; save SI
mov SI,AX ; set SI to address of SCB
push ES ; save ES
mov AX,DGROUP ; get segment address of DGROUP
mov ES,AX ; ...
lodsw ; put SCB in IORslt
mov ES:IORslt,AX ; ...
lodsw ; ...
mov ES:IORslt+2,AX ; ...
if _MODEL and _BIG_DATA
lodsw ; ...
mov ES:IORslt+4,AX ; ...
endif
mov AX,PT_CHAR ; return CHARACTER*n type
pop ES ; restore ES
pop SI ; restore SI
if _MODEL and _BIG_DATA
pop DS ; restore DS
endif
jmp IOSwitch ; return to caller of IOType()
endproc IOChar
xdefp IOStr
defn IOStr ; i/o for CHARACTER*n value
push DI ; save DI
push ES ; save ES
mov DI,DGROUP ; get segment address of DGROUP
mov ES,DI ; ...
mov ES:IORslt,AX ; put SCB in IORslt
if _MODEL and _BIG_DATA
mov ES:IORslt+2,DX ; ...
mov ES:IORslt+4,BX ; ...
else
mov ES:IORslt+2,DX ; ...
endif
mov AX,PT_CHAR ; return CHARACTER*n type
pop ES ; restore ES
pop DI ; restore DI
jmp IOSwitch ; return to caller of IOType()
endproc IOStr
xdefp IOArr
defn IOArr ; put array descriptor in IORslt
push DI ; save DI
push ES ; save ES
mov DI,DGROUP ; get segment address of DGROUP
mov ES,DI ; ...
; put array descriptor in IORslt
mov ES:IORslt,AX ; ... data pointer
if _MODEL and _BIG_DATA
mov ES:IORslt+2,DX ; ...
mov ES:IORslt+4,BX ; ... number of elements
mov ES:IORslt+6,CX ; ...
mov DI,SP ; ... type of array
mov DL,SS:8[DI] ; ...
mov AX,SS:6[DI] ; get rid of stacked argument by
mov SS:8[DI],AX ; ... moving the return address up
mov AX,SS:4[DI] ; ... the stack
mov SS:6[DI],AX ; ...
mov byte ptr ES:IORslt+10,DL; ...
else
mov ES:IORslt+2,BX ; ... number of elements
mov ES:IORslt+4,CX ; ...
mov byte ptr ES:IORslt+8,DL ; ...
endif
pop ES ; restore ES
pop DI ; restore DI
if _MODEL and _BIG_DATA
add SP,2 ; adjust stack for stacked argument
endif
mov AX,PT_ARRAY ; return ARRAY type
jmp IOSwitch ; return to caller of IOType()
endproc IOArr
xdefp IOChArr
defn IOChArr ; put array descriptor in IORslt
push DI ; save DI
push ES ; save ES
mov DI,DGROUP ; get segment address of DGROUP
mov ES,DI ; ...
; put array descriptor in IORslt
mov ES:IORslt,AX ; ... data pointer
if _MODEL and _BIG_DATA
mov ES:IORslt+2,DX ; ...
mov ES:IORslt+4,BX ; ... number of elements
mov ES:IORslt+6,CX ; ...
mov DI,SP ; ... element size
mov DX,SS:8[DI] ; ...
mov ES:IORslt+8,DX ; ...
mov AL,PT_CHAR ; ... type of array
mov byte ptr ES:IORslt+10,AL;...
mov AX,SS:6[DI] ; get rid of stacked argument by
mov SS:8[DI],AX ; ... moving the return address up
mov AX,SS:4[DI] ; ... the stack
mov SS:6[DI],AX ; ...
else
mov ES:IORslt+2,BX ; ... number of elements
mov ES:IORslt+4,CX ; ...
mov ES:IORslt+6,DX ; ... element size
mov AL,PT_CHAR ; ... type of array
mov byte ptr ES:IORslt+8,AL ; ...
endif
mov AX,PT_ARRAY ; return ARRAY type
pop ES ; restore ES
pop DI ; restore DI
if _MODEL and _BIG_DATA
add SP,2 ; adjust stack for stacked argument
endif
jmp IOSwitch ; return to caller of IOType()
endproc IOChArr
xdefp RT@EndIO
defp RT@EndIO
mov AX,PT_NOTYPE ; return "no i/o items remaining"
jmp IOSwitch ; return to caller of IOType()
endproc RT@EndIO
endmod
end
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?