⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rxdosmac.asm

📁 dos source
💻 ASM
📖 第 1 页 / 共 3 页
字号:
        endif
   ifnb <reg6>
        push ss
        pop reg6
        endif
   ifnb <reg7>
        push ss
        pop reg7
        endif
   ifnb <reg8>
        push ss
        pop reg8
        endif
   ifnb <reg9>
        push ss
        pop reg9
        endif
   ifnb <reg0>
        push ss
        pop reg0
        endif
        endm

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Standard Save                                                ;
        ;...............................................................;

saveStandard    macro  reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9, reg0
        push ds
        push es
        push si
        push di

   ifnb <reg1>
        tpush reg1
        endif
   ifnb <reg2>
        tpush reg2
        endif
   ifnb <reg3>
        tpush reg3
        endif
   ifnb <reg4>
        tpush reg4
        endif
   ifnb <reg5>
        tpush reg5
        endif
   ifnb <reg6>
        tpush reg6
        endif
   ifnb <reg7>
        tpush reg7
        endif
   ifnb <reg8>
        tpush reg8
        endif
   ifnb <reg9>
        tpush reg9
        endif
   ifnb <reg0>
        tpush reg0
        endif
        endm

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Standard Restore                                             ;
        ;...............................................................;

restoreStandard macro  reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9, reg0

   ifnb <reg1>
        tpop reg1
        endif
   ifnb <reg2>
        tpop reg2
        endif
   ifnb <reg3>
        tpop reg3
        endif
   ifnb <reg4>
        tpop reg4
        endif
   ifnb <reg5>
        tpop reg5
        endif
   ifnb <reg6>
        tpop reg6
        endif
   ifnb <reg7>
        tpop reg7
        endif
   ifnb <reg8>
        tpop reg8
        endif
   ifnb <reg9>
        tpop reg9
        endif
   ifnb <reg0>
        tpop reg0
        endif

        pop di
        pop si
        pop es
        pop ds
        endm

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Set Seg Register                                             ;
        ;...............................................................;

setSeg  macro seg, reg

    segcopied = no

    irp treg, <es, ds, cs, ss>
      ifidn <reg>, <treg>
        segcopied = yes
        push reg
        pop seg
        endif
        endm

    ife (segcopied NE no)
        mov seg, reg
        endif

        endm

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Set DS                                                       ;
        ;...............................................................;

setDS   macro reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9, reg0

   ifnb <reg1>
        setSeg ds, reg1
        endif
   ifnb <reg2>
        setSeg ds, reg2
        endif
   ifnb <reg3>
        setSeg ds, reg3
        endif
   ifnb <reg4>
        setSeg ds, reg4
        endif
   ifnb <reg5>
        setSeg ds, reg5
        endif
   ifnb <reg6>
        setSeg ds, reg6
        endif
   ifnb <reg7>
        setSeg ds, reg7
        endif
   ifnb <reg8>
        setSeg ds, reg8
        endif
   ifnb <reg9>
        setSeg ds, reg9
        endif
   ifnb <reg0>
        setSeg ds, reg0
        endif
        endm

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Set ES                                                       ;
        ;...............................................................;

setES   macro reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9, reg0

   ifnb <reg1>
        setSeg es, reg1
        endif
   ifnb <reg2>
        setSeg es, reg2
        endif
   ifnb <reg3>
        setSeg es, reg3
        endif
   ifnb <reg4>
        setSeg es, reg4
        endif
   ifnb <reg5>
        setSeg es, reg5
        endif
   ifnb <reg6>
        setSeg es, reg6
        endif
   ifnb <reg7>
        setSeg es, reg7
        endif
   ifnb <reg8>
        setSeg es, reg8
        endif
   ifnb <reg9>
        setSeg es, reg9
        endif
   ifnb <reg0>
        setSeg es, reg0
        endif
        endm

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Set SS                                                       ;
        ;...............................................................;

setSS   macro reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9, reg0

   ifnb <reg1>
        setSeg ss, reg1
        endif
   ifnb <reg2>
        setSeg ss, reg2
        endif
   ifnb <reg3>
        setSeg ss, reg3
        endif
   ifnb <reg4>
        setSeg ss, reg4
        endif
   ifnb <reg5>
        setSeg ss, reg5
        endif
   ifnb <reg6>
        setSeg ss, reg6
        endif
   ifnb <reg7>
        setSeg ss, reg7
        endif
   ifnb <reg8>
        setSeg ss, reg8
        endif
   ifnb <reg9>
        setSeg ss, reg9
        endif
   ifnb <reg0>
        setSeg ss, reg0
        endif
        endm

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Adds an offset to a seg register pair                        ;
        ;...............................................................;

offsetAddr macro seg, reg, offs
        local no_ovf
        segspecial = no
        add reg, offs
        jnc no_ovf

     irp treg, <es, ds, cs, ss>
      ifidn <seg>, <treg>
        segspecial = yes
        mov ax, seg
        add ax, 1000h                           ; account for carry
        mov seg, ax
        endif
        endm

     ife segspecial-no                          ; if seg register not special
        add seg, 1000h                          ; account for carry
        endif

no_ovf:
        endm

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Defines a standard subr entry point                          ;
        ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
        ;                                                               ;
        ;  saves bp and sets bp to value of sp at entry.                ;
        ;  Must use Return macro to exit.                               ;
        ;                                                               ;
        ;...............................................................;

Entry   macro __args                            ; # word entries

        push bp                                 ; save bp
        mov bp,sp                               ; set bp to point to stack

        _defEntry = 0
        _maxArgs  = 0

    ifnb <__args>
        _retEntry = __args
        _maxArgs  = 2 * __args
        _argEntry = 2 * __args + 4              ; assumes NEAR
    else    
        _retEntry = 0
        _argEntry = 4                           ; assumes NEAR
        endif
        endm

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Defines a standard subr far entry point                      ;
        ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
        ;                                                               ;
        ;  saves bp and sets bp to value of sp at entry.                ;
        ;  Must use Return macro to exit.                               ;
        ;                                                               ;
        ;...............................................................;

FarEntry        macro __args                    ; word entries

        push bp                                 ; save bp
        mov bp,sp                               ; set bp to point to stack

        _defEntry = 0
        _maxArgs  = 0

    ifnb <__args>
        _retEntry = __args
        _maxArgs  = 2 * __args
        _argEntry = 2 * __args + 6              ; assumes FAR
    else    
        _retEntry = 0
        _argEntry = 6                           ; assumes FAR
        endif
        endm

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Special Entry does not alter registers                       ;
        ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
        ;                                                               ;
        ;  ...but sets argument parameters.                             ;
        ;  Must use Return macro to exit.                               ;
        ;                                                               ;
        ;...............................................................;

SpecialEntry  macro __args                      ; word entries

        _defEntry  = 0
        _maxArgs   = 0

    ifnb <__args>
        _retEntry = __args
        _maxArgs  = 2 * __args
        _argEntry = 2 * __args + 4              ; (no bp pushed )
    else    
        _retEntry = 0
        _argEntry = 4                           ; assumes FAR (no bp pushed)
        endif
        endm

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Defines a word call parameter argument                       ;
        ;...............................................................;

Arg     macro arg_name

    if ( _maxArgs LT 2 )
        error 'Arg definition does not match Entry'
        endif

    ifb <arg_name>
        error 'Arg must have an arg_name parameter.'
        endif

        _argEntry = _argEntry - 2
        arg_name  = _argEntry
        chklabel arg_name        
        endm

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Defines a double word call parameter argument                ;
        ;...............................................................;

DArg    macro arg_name

    if ( _maxArgs LT 4 )
        error 'Arg definition does not match Entry'
        endif

    ifb <arg_name>
        error 'Arg must have an arg_name parameter.'
        endif

        _argEntry = _argEntry - 4
        arg_name  = _argEntry
        chklabel arg_name        
        endm

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Arg References (Args pushed after call, but before entry)    ;
        ;...............................................................;

rArg    macro arg_name, arg_ref

    ifb <arg_name>
        error 'Arg must have an arg_name parameter.'
        endif

    ifb <arg_ref>
        error 'rArg: 2nd argument must exist.'
        endif

        arg_name  = arg_ref
        chklabel arg_name        
        endm

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Arg References (Args pushed after call, but before entry)    ;
        ;...............................................................;

rDArg   macro arg_name, arg_ref

    ifb <arg_name>
        error 'Arg must have an arg_name parameter.'
        endif

    ifb <arg_ref>
        error 'rArg: 2nd argument must exist.'
        endif

        arg_name  = arg_ref
        chklabel arg_name        
        endm

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Defines a word argument on stack                             ;
        ;...............................................................;

Def     macro arg_name, reg

    ifb <arg_name>
        error 'Def must have an arg_name parameter.'
        endif

        _defEntry = _defEntry - 2
        arg_name  = _defEntry

pushedreg = no

    ifb <reg>
        push ax
        pushedreg = yes
        endif

    ifnb <reg>
     irp treg,<ax,bx,cx,dx,bp,si,di,es,ds,ss,cs,f>
      ifidn <reg>,<treg>
        tpush reg
        pushedreg = yes
        endif
        endm
        endif

     ife pushedreg-no                           ; if not pushed
        push ax
        mov word ptr arg_name [bp],reg          ; really a value.
        endif
        chklabel arg_name
        endm

        ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
        ;  Defines a double word argument on stack                      ;
        ;...............................................................;

DDef    macro arg_name, seg, reg

    ifb <arg_name>
        error 'Def must have an arg_name parameter.'
        endif

_defEntry       = _defEntry - 4
arg_name        = _defEntry

pushedreg       = no
pushedseg       = no

    ifb <seg>
        push ax
        push ax
        pushedseg = yes
        pushedreg = yes
        endif

    ifnb <seg>
     irp tseg,<ax,bx,cx,dx,bp,si,di,es,ds,ss,cs,f>
      ifidn <seg>,<tseg>
        tpush seg
        pushedseg = yes
        endif
        endm
        endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -