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 + -
显示快捷键?