📄 gpsfuncs.asm
字号:
.386p
.387
ifndef ??version
?debug macro
endm
publicdll macro name
public name
endm
$comm macro name,dist,size,count
comm dist name:BYTE:count*size
endm
else
$comm macro name,dist,size,count
comm dist name[size]:BYTE:count
endm
endif
?debug V 301h
?debug S "gpsfuncs.cpp"
?debug C E9639F2A330C67707366756E63732E637070
?debug C E940287922135C4243355C494E434C5544455C54494D452E48
?debug C E940287922145C4243355C494E434C5544455C5F646566732E68
?debug C E940287922145C4243355C494E434C5544455C535444494F2E48
?debug C E940287922155C4243355C494E434C5544455C5F6E66696C652E68
?debug C E940287922145C4243355C494E434C5544455C5F6E756C6C2E68
?debug C E940287922155C4243355C494E434C5544455C5354444C49422E48
?debug C E940287922145C4243355C494E434C5544455C434F4E494F2E48
?debug C E940287922135C4243355C494E434C5544455C4D4154482E48
?debug C E940287922155C4243355C494E434C5544455C7374646465662E68
?debug C E940287922155C4243355C494E434C5544455C535452494E472E48
?debug C E940287922115C4243355C494E434C5544455C494F2E48
?debug C E940287922125C4243355C494E434C5544455C444F532E48
?debug C E9D28BE22E0A434D4154524958332E48
?debug C E940287922145C4243355C494E434C5544455C737464696F2E68
?debug C E940287922155C4243355C494E434C5544455C7374646C69622E68
?debug C E940287922175C4243355C494E434C5544455C696F73747265616D+
?debug C 2E68
?debug C E940287922165C4243355C494E434C5544455C6673747265616D2E+
?debug C 68
?debug C E940287922165C4243355C494E434C5544455C696F6D616E69702E+
?debug C 68
?debug C E940287922155C4243355C494E434C5544455C737472696E672E68
?debug C E940287922135C4243355C494E434C5544455C6D6174682E68
?debug C E940287922155C4243355C494E434C5544455C6D616C6C6F632E68
?debug C E940287922145C4243355C494E434C5544455C616C6C6F632E68
?debug C E9A161942F084750323032312E48
?debug C E93CA0263108434F4E5354532E48
GPSFUNCS_TEXT segment byte public use16 'CODE'
GPSFUNCS_TEXT ends
DGROUP group _DATA,_BSS
assume cs:GPSFUNCS_TEXT,ds:DGROUP
_DATA segment word public use16 'DATA'
d@ label byte
d@w label word
_DATA ends
_BSS segment word public use16 'BSS'
b@ label byte
b@w label word
_BSS ends
_DATA segment word public use16 'DATA'
_pi label qword
db 40
db 45
db 68
db 84
db 251
db 33
db 9
db 64
_r_to_d label qword
db 248
db 193
db 99
db 26
db 220
db 165
db 76
db 64
_c label qword
db 0
db 0
db 0
db 74
db 120
db 222
db 177
db 65
_omegae label qword
db 91
db 141
db 203
db 215
db 167
db 29
db 19
db 63
_lambda label qword
db 153
db 230
db 167
db 6
db 139
db 91
db 200
db 63
?debug C E91C8A473109535452554354532E48
?debug C E98D961A3309474C4F42414C532E48
?debug C E96397E3320A47505346554E43532E48
_c_2p12 label qword
db 0
db 0
db 0
db 0
db 0
db 0
db 176
db 64
_c_2p4 label qword
db 0
db 0
db 0
db 0
db 0
db 0
db 48
db 64
_c_2m5 label qword
db 0
db 0
db 0
db 0
db 0
db 0
db 160
db 63
_c_2m11 label qword
db 0
db 0
db 0
db 0
db 0
db 0
db 64
db 63
_c_2m19 label qword
db 0
db 0
db 0
db 0
db 0
db 0
db 192
db 62
_c_2m20 label qword
db 0
db 0
db 0
db 0
db 0
db 0
db 176
db 62
_c_2m21 label qword
db 0
db 0
db 0
db 0
db 0
db 0
db 160
db 62
_c_2m23 label qword
db 237
db 255
db 255
db 255
db 255
db 255
db 127
db 62
_c_2m24 label qword
db 252
db 255
db 255
db 255
db 255
db 255
db 111
db 62
_c_2m27 label qword
db 2
db 0
db 0
db 0
db 0
db 0
db 64
db 62
_c_2m29 label qword
db 8
db 0
db 0
db 0
db 0
db 0
db 32
db 62
_c_2m30 label qword
db 2
db 0
db 0
db 0
db 0
db 0
db 16
db 62
_c_2m31 label qword
db 251
db 255
db 255
db 255
db 255
db 255
db 255
db 61
_c_2m33 label qword
db 7
db 0
db 0
db 0
db 0
db 0
db 224
db 61
_c_2m38 label qword
db 248
db 255
db 255
db 255
db 255
db 255
db 143
db 61
_c_2m43 label qword
db 254
db 255
db 255
db 255
db 255
db 255
db 63
db 61
_c_2m50 label qword
db 9
db 251
db 255
db 255
db 255
db 255
db 207
db 60
_c_2m55 label qword
db 252
db 255
db 255
db 255
db 255
db 255
db 127
db 60
_a label qword
db 0
db 0
db 0
db 64
db 166
db 84
db 88
db 65
_b label qword
db 117
db 147
db 24
db 20
db 196
db 63
db 88
db 65
_DATA ends
GPSFUNCS_TEXT segment byte public use16 'CODE'
assume cs:GPSFUNCS_TEXT,ds:DGROUP
@satfind$qc proc far
;
; satvis satfind(char i)
;
?debug L 456
?debug B
push bp
mov bp,sp
sub sp,254
push si
push di
?debug C E60169020A0A000000
?debug B
cmp word ptr __stklen,sp
ja short @1@3
call far ptr F_OVERFLOW@
@1@3:
;
; {
; float tdot,az;
; float satang,alm_time,almanac_date;
; double range1,range2,xls,yls,zls,xaz,yaz;
; long jd_yr;
; ecef gpspos1,gpspos2,north,east,up;
; satvis result;
; int jd_m;
; struct tm *gmt;
; double time_s;
; /*
; INITIALIZE ALL THE CONSTANTS
; */
; // gotoxy(1,24);
; // printf("->satfind");
; putenv(tzstr);
;
?debug L 472
push seg _tzstr
push offset _tzstr
call far ptr _putenv
add sp,4
;
; tzset();
;
?debug L 473
call far ptr _tzset
;
; // thetime=time(NULL);
; gmt=gmtime(&thetime);
;
?debug L 475
push seg _thetime
push offset _thetime
call far ptr _gmtime
add sp,4
mov word ptr [bp-82],dx
mov word ptr [bp-84],ax
;
; // set up the correct time
; if (gmt->tm_mon <= 1)
;
?debug L 477
les bx,dword ptr [bp-84]
cmp word ptr es:[bx+8],1
jg short @1@5
;
; {
; jd_yr =365.25*(gmt->tm_year-1.+1900.);
;
?debug L 479
mov ax,word ptr es:[bx+10]
mov word ptr [bp-96],ax
fild word ptr [bp-96]
fld1
fsub
fadd dword ptr DGROUP:s@
fmul dword ptr DGROUP:s@+4
call far ptr F_FTOL@
shl eax,16
shrd eax,edx,16
mov dword ptr [bp-80],eax
;
; jd_m =30.6001*(gmt->tm_mon+14.);
;
?debug L 480
les bx,dword ptr [bp-84]
mov ax,word ptr es:[bx+8]
mov word ptr [bp-96],ax
fild word ptr [bp-96]
fadd dword ptr DGROUP:s@+8
jmp short @1@6
@1@5:
;
; }
; else
; {
; jd_yr=365.25*(gmt->tm_year+1900.);
;
?debug L 484
les bx,dword ptr [bp-84]
mov ax,word ptr es:[bx+10]
mov word ptr [bp-96],ax
fild word ptr [bp-96]
fadd dword ptr DGROUP:s@
fmul dword ptr DGROUP:s@+4
call far ptr F_FTOL@
shl eax,16
shrd eax,edx,16
mov dword ptr [bp-80],eax
;
; jd_m =30.6001*(gmt->tm_mon+2.);
;
?debug L 485
les bx,dword ptr [bp-84]
mov ax,word ptr es:[bx+8]
mov word ptr [bp-96],ax
fild word ptr [bp-96]
fadd dword ptr DGROUP:s@+20
@1@6:
fmul qword ptr DGROUP:s@+12
call far ptr F_FTOL@
mov dx,ax
;
; }
; time_s=gmt->tm_min/1440.+gmt->tm_sec/86400.+1720981.5+gmt->tm_hour/24.
;
?debug L 487
;
; +jd_yr+jd_m+gmt->tm_mday;
;
?debug L 488
les bx,dword ptr [bp-84]
mov ax,word ptr es:[bx+2]
mov word ptr [bp-96],ax
fild word ptr [bp-96]
fdiv dword ptr DGROUP:s@+24
mov ax,word ptr es:[bx]
mov word ptr [bp-96],ax
fild word ptr [bp-96]
fdiv dword ptr DGROUP:s@+28
fadd
fadd dword ptr DGROUP:s@+32
mov ax,word ptr es:[bx+4]
mov word ptr [bp-96],ax
fild word ptr [bp-96]
fdiv dword ptr DGROUP:s@+36
fadd
mov eax,dword ptr [bp-80]
mov dword ptr [bp-96],eax
fild dword ptr [bp-96]
fadd
mov word ptr [bp-96],dx
fild word ptr [bp-96]
fadd
mov ax,word ptr es:[bx+6]
mov word ptr [bp-96],ax
fild word ptr [bp-96]
fadd
fstp qword ptr [bp-92]
;
; gps_week=int((time_s-2444244.5)/7.);
;
?debug L 489
fld qword ptr [bp-92]
fsub dword ptr DGROUP:s@+40
fdiv dword ptr DGROUP:s@+44
call far ptr F_FTOL@
mov dx,seg _gps_week
mov es,dx
mov word ptr es:_gps_week,ax
;
; almanac_date=gps_alm[i].week*7.0+2444244.5;
;
?debug L 490
mov al,byte ptr [bp+10]
cbw
imul ax,ax,74
mov dx,seg _gps_alm
mov bx,ax
mov es,dx
mov ax,word ptr es:_gps_alm[bx+70]
mov word ptr [bp-96],ax
fild word ptr [bp-96]
fmul dword ptr DGROUP:s@+44
fadd dword ptr DGROUP:s@+40
fstp dword ptr [bp-20]
;
; if (gps_week-gps_alm[i].week>512) almanac_date+=1024*7.0;
;
?debug L 491
fwait
mov al,byte ptr [bp+10]
cbw
imul ax,ax,74
mov dx,seg _gps_alm
mov bx,seg _gps_week
mov es,bx
mov bx,word ptr es:_gps_week
mov word ptr [bp-100],bx
mov es,dx
xchg bx,ax
sub ax,word ptr es:_gps_alm[bx+70]
cmp ax,512
jle short @1@9
fld dword ptr [bp-20]
fadd dword ptr DGROUP:s@+48
fstp dword ptr [bp-20]
fwait
@1@9:
;
; alm_time=(time_s-almanac_date)*86400.;
;
?debug L 492
fld dword ptr [bp-20]
fsubr qword ptr [bp-92]
fmul dword ptr DGROUP:s@+28
fstp dword ptr [bp-16]
;
; clock_tow=(time_s-gps_week*7.-2444244.5)*86400.;
;
?debug L 493
fwait
mov ax,word ptr [bp-100]
mov word ptr [bp-96],ax
fild word ptr [bp-96]
fmul dword ptr DGROUP:s@+44
fsubr qword ptr [bp-92]
fsub dword ptr DGROUP:s@+40
fmul dword ptr DGROUP:s@+28
call far ptr F_FTOL@
shl eax,16
shrd eax,edx,16
mov dx,seg _clock_tow
mov es,dx
mov dword ptr es:_clock_tow,eax
;
; /*
; CALCULATE THE POSITION OF THE SATELLITES
; */
; if (gps_alm[i].inc > 0.0 && i>0)
;
?debug L 497
mov al,byte ptr [bp+10]
cbw
mov word ptr [bp-98],ax
imul ax,ax,74
mov dx,seg _gps_alm
mov bx,ax
mov es,dx
fld dword ptr es:_gps_alm[bx+8]
fldz
fcompp
fstsw ax
sahf
jae @1@22
cmp word ptr [bp-98],0
jle @1@22
;
; {
; gpspos1=satpos_almanac(alm_time,i);
;
?debug L 499
mov al,byte ptr [bp+10]
push ax
push dword ptr [bp-16]
push ss
lea ax,word ptr [bp-134]
push ax
call far ptr @satpos_almanac$qfc
add sp,10
;
; gpspos2=satpos_almanac(alm_time+1.0,i);
;
?debug L 500
mov al,byte ptr [bp+10]
push ax
fld dword ptr [bp-16]
fld1
fadd
sub sp,4
fstp dword ptr [bp-264]
push ss
fwait
lea ax,word ptr [bp-158]
push ax
call far ptr @satpos_almanac$qfc
add sp,10
;
; /*
; CALCULATE THE POSITION OF THE RECEIVER
; */
; rec_pos_xyz=llh_to_ecef(current_loc);
;
?debug L 504
mov ax,offset _current_loc
mov dx,seg _current_loc
mov cx,24
call far ptr F_SPUSH@
push seg _rec_pos_xyz
push offset _rec_pos_xyz
call far ptr @llh_to_ecef$q3llh
add sp,28
;
; north.x=-cos(current_loc.lon)*sin(current_loc.lat);
;
?debug L 505
mov ax,seg _current_loc
mov es,ax
fld qword ptr es:_current_loc+8
sub sp,8
fstp qword ptr [bp-266]
fwait
call far ptr _cos
add sp,8
fchs
fstp tbyte ptr [bp-110]
mov ax,seg _current_loc
mov es,ax
fld qword ptr es:_current_loc
sub sp,8
fstp qword ptr [bp-266]
fwait
call far ptr _sin
add sp,8
fld tbyte ptr [bp-110]
fmul
fstp qword ptr [bp-182]
;
; north.y=-sin(current_loc.lon)*sin(current_loc.lat);
;
?debug L 506
mov ax,seg _current_loc
mov es,ax
fld qword ptr es:_current_loc+8
sub sp,8
fstp qword ptr [bp-266]
fwait
call far ptr _sin
add sp,8
fchs
fstp tbyte ptr [bp-110]
mov ax,seg _current_loc
mov es,ax
fld qword ptr es:_current_loc
sub sp,8
fstp qword ptr [bp-266]
fwait
call far ptr _sin
add sp,8
fld tbyte ptr [bp-110]
fmul
fstp qword ptr [bp-174]
;
; north.z= cos(current_loc.lat);
;
?debug L 507
mov ax,seg _current_loc
mov es,ax
fld qword ptr es:_current_loc
sub sp,8
fstp qword ptr [bp-266]
fwait
call far ptr _cos
add sp,8
fstp qword ptr [bp-166]
;
; east.x=-sin(current_loc.lon);
;
?debug L 508
mov ax,seg _current_loc
mov es,ax
fld qword ptr es:_current_loc+8
sub sp,8
fstp qword ptr [bp-266]
fwait
call far ptr _sin
add sp,8
fchs
fstp qword ptr [bp-206]
;
; east.y= cos(current_loc.lon);
;
?debug L 509
mov ax,seg _current_loc
mov es,ax
fld qword ptr es:_current_loc+8
sub sp,8
fstp qword ptr [bp-266]
fwait
call far ptr _cos
add sp,8
fstp qword ptr [bp-198]
;
; // east.z=0.0;
; up.x=cos(current_loc.lon)*cos(current_loc.lat);
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -