diff options
Diffstat (limited to 'v4.0/src/SELECT/ASM2C.ASM')
| -rw-r--r-- | v4.0/src/SELECT/ASM2C.ASM | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/v4.0/src/SELECT/ASM2C.ASM b/v4.0/src/SELECT/ASM2C.ASM new file mode 100644 index 0000000..f74da98 --- /dev/null +++ b/v4.0/src/SELECT/ASM2C.ASM | |||
| @@ -0,0 +1,191 @@ | |||
| 1 | page 60,132 ;AN000; | ||
| 2 | name asm2c ;AN000; | ||
| 3 | title Limited assembler to C interface;AN000; | ||
| 4 | ;------------------------------------------------------------------- | ||
| 5 | ; | ||
| 6 | ; MODULE: asm2c | ||
| 7 | ; | ||
| 8 | ; PURPOSE: | ||
| 9 | ; This routine is used as to map the assembly language | ||
| 10 | ; call made by xxx to a C language call. | ||
| 11 | ; | ||
| 12 | ; INPUT: | ||
| 13 | ; | ||
| 14 | ; ES:DI points to the buffer area where the table data | ||
| 15 | ; will be copied | ||
| 16 | ; | ||
| 17 | ; CALLING FORMAT: | ||
| 18 | ; | ||
| 19 | ; DATE: 7-16-87 | ||
| 20 | ; | ||
| 21 | ;------------------------------------------------------------------- | ||
| 22 | |||
| 23 | |||
| 24 | public gget_status ;AN000; | ||
| 25 | public asm2cInRegs ;AN000; | ||
| 26 | public asm2coutregs ;AN000; | ||
| 27 | public asm2csegregs ;AN000; | ||
| 28 | |||
| 29 | _TEXT segment byte public 'CODE' ;AN000; | ||
| 30 | _TEXT ends ;AN000; | ||
| 31 | _DATA segment word public 'DATA' ;AN000; | ||
| 32 | _DATA ends ;AN000; | ||
| 33 | CONST segment word public 'CONST' ;AN000; | ||
| 34 | CONST ends ;AN000; | ||
| 35 | _BSS segment word public 'BSS' ;AN000; | ||
| 36 | _BSS ends ;AN000; | ||
| 37 | DGROUP GROUP CONST, _BSS, _DATA ;AN000; | ||
| 38 | |||
| 39 | _DATA segment word public 'DATA' ;AN000; | ||
| 40 | |||
| 41 | ;------------------------------------------------------------------- | ||
| 42 | ; define an assembly language version of the C regs structure | ||
| 43 | ;------------------------------------------------------------------- | ||
| 44 | |||
| 45 | asm2cInRegs equ $ ;AN000; | ||
| 46 | |||
| 47 | i_ax dw 0 ;AN000; | ||
| 48 | i_bx dw 0 ;AN000; | ||
| 49 | i_cx dw 0 ;AN000; | ||
| 50 | i_dx dw 0 ;AN000; | ||
| 51 | i_si dw 0 ;AN000; | ||
| 52 | i_di dw 0 ;AN000; | ||
| 53 | i_cflag dw 0 ;AN000; | ||
| 54 | |||
| 55 | Asm2cOutRegs equ $ ;AN000; | ||
| 56 | |||
| 57 | o_ax dw 0 ;AN000; | ||
| 58 | o_bx dw 0 ;AN000; | ||
| 59 | o_cx dw 0 ;AN000; | ||
| 60 | o_dx dw 0 ;AN000; | ||
| 61 | o_si dw 0 ;AN000; | ||
| 62 | o_di dw 0 ;AN000; | ||
| 63 | o_cflag dw 0 ;AN000; | ||
| 64 | |||
| 65 | |||
| 66 | Asm2cSegRegs equ $ ;AN000; | ||
| 67 | s_es dw 0 ;AN000; | ||
| 68 | s_cs dw 0 ;AN000; | ||
| 69 | s_ss dw 0 ;AN000; | ||
| 70 | s_ds dw 0 ;AN000; | ||
| 71 | |||
| 72 | extrn _end:far ;AN000; | ||
| 73 | |||
| 74 | _DATA ends ;AN000; | ||
| 75 | |||
| 76 | _TEXT segment byte public 'CODE' ;AN000; | ||
| 77 | |||
| 78 | extrn _get_status:near ;AN000; | ||
| 79 | |||
| 80 | ASSUME CS: _TEXT ;AN000; | ||
| 81 | assume ds: nothing ;AN000; | ||
| 82 | assume es: nothing ;AN000; | ||
| 83 | ;------------------------------------------------------------------- | ||
| 84 | ;------------------------------------------------------------------- | ||
| 85 | page ;AN000; | ||
| 86 | ;------------------------------------------------------------------- | ||
| 87 | ; ggetstatus | ||
| 88 | ; | ||
| 89 | ; This routine will reside in the C code segment | ||
| 90 | ; | ||
| 91 | ;------------------------------------------------------------------- | ||
| 92 | |||
| 93 | segment_of_dgroup dw seg dgroup;AN000; | ||
| 94 | |||
| 95 | SAVE_STACK LABEL DWORD ;AN000; | ||
| 96 | SAVE_SP DW 0 ;AN000; | ||
| 97 | SAVE_SS DW 0 ;AN000; | ||
| 98 | |||
| 99 | SAVE_DS DW 0 ;AN000; | ||
| 100 | SAVE_ES DW 0 ;AN000; | ||
| 101 | |||
| 102 | gget_status proc far ;AN000; | ||
| 103 | |||
| 104 | MOV SAVE_DS,DS ;AN000; | ||
| 105 | MOV SAVE_ES,ES ;AN000; | ||
| 106 | |||
| 107 | MOV SAVE_SS,SS ;AN000; | ||
| 108 | MOV SAVE_SP,SP ;AN000; | ||
| 109 | |||
| 110 | mov ss,segment_of_dgroup ;AN000; | ||
| 111 | add sp,offset DGROUP:_end ;AN000; | ||
| 112 | ASSUME SS: DGROUP ;AN000; | ||
| 113 | |||
| 114 | MOV DS,segment_of_dgroup ;AN000; | ||
| 115 | ASSUME DS: DGROUP ;AN000; | ||
| 116 | |||
| 117 | ;------------------------------------------------------------------- | ||
| 118 | ; set up InRegs | ||
| 119 | ;------------------------------------------------------------------- | ||
| 120 | |||
| 121 | mov i_ax,ax ;AN000; make InRegs look like real registers | ||
| 122 | mov i_bx,bx ;AN000; | ||
| 123 | mov i_cx,cx ;AN000; | ||
| 124 | mov i_dx,dx ;AN000; | ||
| 125 | mov i_si,si ;AN000; | ||
| 126 | mov i_di,di ;AN000; | ||
| 127 | |||
| 128 | ;------------------------------------------------------------------- | ||
| 129 | ; set up SegRegs | ||
| 130 | ;------------------------------------------------------------------- | ||
| 131 | |||
| 132 | IRP XX,<ES,SS,DS> ;AN000; | ||
| 133 | MOV AX,SAVE_&XX ;AN000; | ||
| 134 | MOV S_&XX,AX ;AN000; | ||
| 135 | ENDM ;AN000; | ||
| 136 | |||
| 137 | mov s_cs,cs ;AN000; | ||
| 138 | |||
| 139 | ;------------------------------------------------------------------- | ||
| 140 | ; put far pointers on stack | ||
| 141 | ;------------------------------------------------------------------- | ||
| 142 | |||
| 143 | ; push ds ; push far pointer to SegRegs | ||
| 144 | lea ax,DGROUP:Asm2cSegRegs;AN000; | ||
| 145 | push ax ;AN000; | ||
| 146 | |||
| 147 | ; push ds ; push far pointer to OutRegs | ||
| 148 | lea ax,DGROUP:Asm2cOutRegs;AN000; | ||
| 149 | push ax ;AN000; | ||
| 150 | |||
| 151 | ; push ds ; push far pointer to InRegs | ||
| 152 | lea ax,DGROUP:Asm2cInRegs;AN000; | ||
| 153 | push ax ;AN000; | ||
| 154 | |||
| 155 | ;------------------------------------------------------------------- | ||
| 156 | call _get_status ;AN000; | ||
| 157 | ;------------------------------------------------------------------- | ||
| 158 | add sp,6 ;AN000; | ||
| 159 | ;------------------------------------------------------------------- | ||
| 160 | ; set up real registers | ||
| 161 | ;------------------------------------------------------------------- | ||
| 162 | |||
| 163 | mov ax,o_ax ;AN000; make real registers look like OutRegs | ||
| 164 | mov bx,o_bx ;AN000; | ||
| 165 | mov cx,o_cx ;AN000; | ||
| 166 | mov dx,o_dx ;AN000; | ||
| 167 | mov si,o_si ;AN000; | ||
| 168 | mov di,o_di ;AN000; | ||
| 169 | |||
| 170 | ;------------------------------------------------------------------- | ||
| 171 | ; must remove the things we put on the stack | ||
| 172 | ;------------------------------------------------------------------- | ||
| 173 | |||
| 174 | MOV DS,SAVE_DS ;AN000; | ||
| 175 | MOV ES,SAVE_ES ;AN000; | ||
| 176 | MOV SS,SAVE_SS ;AN000; | ||
| 177 | MOV SP,SAVE_SP ;AN000; | ||
| 178 | |||
| 179 | ret ;AN000; | ||
| 180 | |||
| 181 | |||
| 182 | gget_status endp ;AN000; | ||
| 183 | |||
| 184 | _TEXT ends ;AN000; end code segment | ||
| 185 | |||
| 186 | ;------------------------------------------------------------------- | ||
| 187 | ;------------------------------------------------------------------- | ||
| 188 | |||
| 189 | |||
| 190 | end ;AN000; | ||
| 191 | |||