-
Notifications
You must be signed in to change notification settings - Fork 16
/
cvtypcon.asm
2942 lines (2094 loc) · 42.6 KB
/
cvtypcon.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
TITLE CVTYPCON - Copyright (C) SLR Systems 1994
INCLUDE MACROS
if fg_cvpack
INCLUDE CVTYPES
PUBLIC CONVERT_CV_LTYPE_GTYPE_A,CIRC_HELP,NEW_DERIV_BLK_INIT,FLUSH_DERIVATIVES,FIRST_DERIV_BLK
.DATA
EXTERNDEF DEBUG_TYPES_SELECTED:BYTE,TYPE_COLLISION_TID:BYTE
EXTERNDEF CV_GTYPE_HASH:DWORD,CV_GTYPE_HASH_LOG:DWORD,TYPE_COLLISION_COUNT:DWORD,TYPE_COLLISION_MAX:DWORD
EXTERNDEF CV_LTYPE_GARRAY:STD_PTR_S,CV_GTYPE_GARRAY:STD_PTR_S
EXTERNDEF CASE_STRING_COMPARE:DWORD
.CODE CVPACK_TEXT
EXTERNDEF WARN_RET:PROC,ERR_RET:PROC,_err_abort:proc,CV_GTYPE_POOL_GET:PROC,_get_omf_name_length_routine:proc
EXTERNDEF CV_LTYPE_POOL_GET:PROC,GET_NEW_LOG_BLK:PROC,SKIP_LEAF_SICXAX:PROC,ERR_HEX_ABORT:PROC
EXTERNDEF OPTI_HASH32:PROC,OPTI_HASH32_CASE:PROC,ERR_HEX_RET:PROC
EXTERNDEF TYPE_PUNT_ERR:ABS,MEMBER_PUNT_ERR:ABS,CLASS_PUNT_ERR:ABS,TYPE_PUNT_SUCCESS_ERR:ABS
EXTERNDEF CLASS_ZERO_ERR:ABS,FIXED_SPEC_ERR:ABS,CANNOT_FIX_SPEC_ERR:ABS,BAD_TYPEINDEX_ERR:ABS
EXTERNDEF CVP_CIRC_NO_CSUE_ERR:ABS,CVP_GTYPES_64K_ERR:ABS
CONVERT_CV_LTYPE_GTYPE_A PROC NEAR
;
;EAX IS LOCAL TYPE INDEX
;
;RETURN EAX IS GLOBAL TYPE INDEX
;
;NOT CALLED UNLESS A NON-PRIMITIVE TYPE
;
;NEXT, ITS PROBABLY ALREADY DEFINED
;
MOV ECX,CV_LTYPE_GARRAY._STD_LIMIT
SUB EAX,1000H-1
CMP ECX,EAX
JB L12$
CONVERT EDX,EAX,CV_LTYPE_GARRAY
ASSUME EDX:PTR CV_LTYPE_STRUCT
MOV ECX,EAX
MOV AL,[EDX]._CV_LTYPE_FLAGS
TEST AL,MASK CV_LTYPE_INSTALLED
JZ L2$
MOV EAX,[EDX]._CV_LTYPE_GTYPE
OR EDX,EDX
RET
L12$:
BITT CV_TYPES_VALID
JZ L13$
LEA ECX,[EAX+1000H-1]
MOV AX,BAD_TYPEINDEX_ERR
CALL ERR_HEX_RET
L13$:
XOR EAX,EAX
RET
L15$:
;
;WE HAVE A CIRCULAR SITUATION
;
;UPDATE CIRCULAR_BASE AND CIRCULAR_INDEX IF NECESSARY
;
TEST AL,MASK CV_LTYPE_CSUE
JZ L16$
MOV CIRCULAR_CSUE,ECX
L16$:
MOV EAX,[EDX]._CV_LTYPE_GTYPE
TEST EAX,EAX
JZ L165$
CONVERT EDX,EAX,CV_LTYPE_GARRAY
MOV ECX,EAX
JMP L16$
L165$:
MOV EAX,[EDX]._CV_LTYPE_NEST_LEVEL ;NEST LEVEL FOR THIS TYPE
MOV EDX,CIRCULAR_BASE
CMP EDX,EAX
JBE L17$
MOV CIRCULAR_BASE,EAX ;WON'T DO CIRC_HELP UNTIL I RETURN TO
MOV CIRCULAR_INDEX,ECX ;THIS MATCHING BASE AND INDEX
L17$:
SUB EAX,-1 ;FLAG CIRCULAR REFERENCE
RET
L2$:
;
;IF IT IS ALREADY BEING DEFINED, WE'VE GOT A CIRCULAR PROBLEM...
;
TEST AL,MASK CV_LTYPE_DEFINING
JNZ L15$
;
;OK, CONVERT ANY TYPES I REFERENCE
;
PUSH ESI
MOV ESI,EDX
ASSUME ESI:PTR CV_LTYPE_STRUCT
PUSH EBX
MOV EBX,ECX
; MOV DX,[ESI]._CV_LTYPE_ILEAF ;INTERNAL LEAF ID
MOV EDX,DPTR [ESI]._CV_LTYPE_LENGTH
OR AL,MASK CV_LTYPE_DEFINING
ASSUME EDX:NOTHING
SHR EDX,16
MOV [ESI]._CV_LTYPE_FLAGS,AL
;
;SET UP BASIS FOR A NON-CIRCULAR SEARCH
;
MOV EAX,CIRCULAR_BASE ;SAVE OLD BASE(NEST_LEVEL) AND INDEX
MOV ECX,CIRCULAR_INDEX
PUSHM EAX,ECX
MOV ECX,CIRCULAR_CSUE ;SAVE OLD CSUE
XOR EAX,EAX
MOV [ESI]._CV_LTYPE_GTYPE,EAX
MOV CIRCULAR_INDEX,EAX
MOV CIRCULAR_CSUE,EAX
DEC EAX
MOV CIRCULAR_BASE,EAX
MOV EAX,CONVERT_NEST_LEVEL
PUSH ECX
INC EAX
MOV CONVERT_NEST_LEVEL,EAX
MOV [ESI]._CV_LTYPE_NEST_LEVEL,EAX ;NEST LEVEL I FIRST TOUCHED THIS GUY
;
;
;
CALL LTYPE_DEFINES[EDX*4] ;CONVERT ANY TYPES I TOUCH
MOV EAX,CIRCULAR_BASE
MOV ECX,CONVERT_NEST_LEVEL
OR EAX,EAX
JNS L7$ ;NO-SIGN MEANS WE HAVE A CIRCULAR PROBLEM
;
;HOPEFULLY MOST ARE THIS KIND...
;
DEC ECX
POP EAX
MOV CONVERT_NEST_LEVEL,ECX
MOV CIRCULAR_CSUE,EAX ;RESTORE OLD CSUE
POP ECX
MOV AL,[ESI]._CV_LTYPE_FLAGS
MOV CIRCULAR_INDEX,ECX ;RESTORE OLD INDEX
AND AL,NOT MASK CV_LTYPE_DEFINING
POP ECX
OR AL,MASK CV_LTYPE_INSTALLED
MOV CIRCULAR_BASE,ECX ;RESTORE OLD BASE
MOV [ESI]._CV_LTYPE_FLAGS,AL
TEST AL,MASK CV_LTYPE_CSUE
JNZ L3$
MOV EAX,DPTR [ESI]._CV_LTYPE_LENGTH ;EXCLUDING LENGTH FIELD ITSELF
LEA ECX,[ESI]._CV_LTYPE_LENGTH
AND EAX,0FFFFH
ADD EAX,2
CALL OPTI_HASH32_CASE ;RETURNS HASH IN EAX
MOV [ESI]._CV_LTYPE_HASH,EAX
CALL INSTALL_LTYPE_GTYPE ;DO NORMAL INSTALL
POP EBX
MOV [ESI]._CV_LTYPE_GTYPE,EAX
POP ESI
OR EAX,EAX
RET
L3$:
MOV EAX,[ESI]._CV_LTYPE_HASH
CALL INSTALL_CSUE_GTYPE
POP EBX
MOV [ESI]._CV_LTYPE_GTYPE,EAX
POP ESI
OR EAX,EAX
RET
L7$:
;
;CIRCULAR IN PROGRESS...
;
CMP ECX,EAX ;ECX IS CONVERT_NEST_LEVEL
JNZ L71$ ;EAX IS CIRCULAR_BASE
CMP CIRCULAR_INDEX,EBX ;AM I THE INDEX BEING WAITED ON?
JZ L8$
L71$:
;
;NO, NOT REALLY DONE WITH THIS CIRCULAR MESS.
;
POP EDX ;OLD CSUE
MOV AL,[ESI]._CV_LTYPE_FLAGS
;
;MAKE SURE CSUE IS DEFINED IF POSSIBLE
;
TEST EDX,EDX ;KEEP OLD IF THERE
JNZ L72$
TEST AL,MASK CV_LTYPE_CSUE ;OTHERWISE, USE ME IF I'M ONE
JZ L73$
MOV CIRCULAR_CSUE,EBX
JMP L73$
L72$:
MOV CIRCULAR_CSUE,EDX
L73$:
POP EDX
DEC ECX
POP EAX
MOV CONVERT_NEST_LEVEL,ECX
CMP CIRCULAR_BASE,EAX ;RESTORE OLD BASE AND INDEX IF OLD BASE IS LOWER OR EQUAL
JB L74$ ;(KEEP NEW BASE & INDEX IF NEW BASE IS LOWER)
MOV CIRCULAR_BASE,EAX
MOV CIRCULAR_INDEX,EDX
SUB ECX,-1
L74$:
MOV EAX,CIRCULAR_BASE
MOV EDX,CIRCULAR_INDEX
POP EBX
MOV [ESI]._CV_LTYPE_GTYPE,EDX
MOV [ESI]._CV_LTYPE_NEST_LEVEL,EAX ;LOWEST NEST LEVEL ASSOCIATED WITH ME...
POP ESI
RET ;CARRY SET!
L8$:
;
;OK, I AM CIRCULAR BASE...
;
;TBD...
;
MOV EDX,((NOT MASK CV_LTYPE_DEFINING)SHL 8)+ MASK CV_LTYPE_DEFINING2
CALL CIRC_HELP ;DEFINE THESE GUYS SOME OTHER WAY...
;
;OK, THIS GUY IS DEFINED...
;
POP EAX
MOV ECX,CONVERT_NEST_LEVEL
POP EDX
DEC ECX
MOV CIRCULAR_CSUE,EAX
MOV CONVERT_NEST_LEVEL,ECX
POP EAX
MOV CIRCULAR_INDEX,EDX
MOV CIRCULAR_BASE,EAX
MOV EAX,[ESI]._CV_LTYPE_GTYPE
POPM EBX,ESI
OR EAX,EAX ;CLEAR CARRY
RET
CONVERT_CV_LTYPE_GTYPE_A ENDP
INSTALL_LTYPE_GTYPE PROC NEAR
;
;ESI (EBX) IS LTYPE_STRUCTURE, RETURN EQUIVALENT GLOBAL TYPE IN EAX
;EAX IS HASH
;
PUSH EDI
XOR EDX,EDX
MOV ECX,CV_GTYPE_HASH_LOG
HASHDIV CV_GTYPE_HASH
LEA EDI,[ECX+EDX*4-CV_GTYPE_STRUCT._CV_GTYPE_NEXT_HASH]
MOV EDX,[ECX+EDX*4]
L2$:
TEST EDX,EDX
JZ L4$
CONVERT EDI,EDX,CV_GTYPE_GARRAY
ASSUME EDI:PTR CV_GTYPE_STRUCT
MOV EAX,[ESI]._CV_LTYPE_HASH
MOV ECX,[EDI]._CV_GTYPE_HASH
CMP EAX,ECX
JNZ L3$
MOV ECX,DPTR [ESI]._CV_LTYPE_LENGTH
MOV EAX,ESI
AND ECX,0FFFFH
LEA ESI,[ESI]._CV_LTYPE_LENGTH
ADD ECX,5
PUSH EDI
SHR ECX,2
LEA EDI,[EDI]._CV_GTYPE_LENGTH
REPE CMPSD
POP EDI
JZ L5$
MOV ESI,EAX
L3$:
MOV EDX,[EDI]._CV_GTYPE_NEXT_HASH
JMP L2$
L4$:
;
;INSTALL NEW COPY
;
;EDI IS PLACE TO STORE INDEX # OF NEW TYPE
;
;HOW MUCH SPACE DO I NEED TO ALLOCATE?
;
MOV EAX,DPTR [ESI]._CV_LTYPE_LENGTH
AND EAX,0FFFFH
ADD EAX,CV_GTYPE_STRUCT._CV_GTYPE_ILEAF
CALL CV_GTYPE_POOL_GET
MOV ECX,EAX
INSTALL_POINTER_GINDEX CV_GTYPE_GARRAY
MOV [EDI]._CV_GTYPE_NEXT_HASH,EAX
MOV EDI,ECX
MOV EDX,EAX
XOR EAX,EAX
MOV ECX,CV_GTYPE_STRUCT._CV_GTYPE_HASH/4
REP STOSD
MOV ECX,DPTR [ESI]._CV_LTYPE_LENGTH
MOV EAX,ESI
AND ECX,0FFFFH
LEA ESI,[ESI]._CV_LTYPE_HASH
ADD ECX,9 ;HASH, LENGTH, MOVING DWORDS...
SHR ECX,2
REP MOVSD
L5$:
POP EDI
MOV ESI,EAX
LEA EAX,[EDX+1000H-1]
RET ;RETURNS ESI IS ORIGINAL TYPE
ASSUME EDI:NOTHING
INSTALL_LTYPE_GTYPE ENDP
INSTALL_CSUE_GTYPE PROC NEAR
;
;ESI (EBX) IS LTYPE_STRUCTURE, RETURN EQUIVALENT GLOBAL TYPE IN EAX
;EAX IS HASH
;
PUSH EDI
XOR EDX,EDX
MOV ECX,CV_GTYPE_HASH_LOG
HASHDIV CV_GTYPE_HASH
LEA EDI,[ECX+EDX*4-CV_GTYPE_STRUCT._CV_GTYPE_NEXT_HASH]
MOV EDX,[ECX+EDX*4]
L2$:
TEST EDX,EDX
JZ L30$
CONVERT EDI,EDX,CV_GTYPE_GARRAY
ASSUME EDI:PTR CV_GTYPE_STRUCT
MOV EAX,[ESI]._CV_LTYPE_HASH
MOV ECX,[EDI]._CV_GTYPE_HASH
CMP EAX,ECX
JNZ L3$
MOV AL,BPTR [ESI]._CV_LTYPE_ILEAF
MOV CL,BPTR [EDI]._CV_GTYPE_ILEAF
CMP CL,AL
JNZ L3$
MOV AL,[ESI]._CV_LTYPE_FLAGS
MOV CL,[EDI]._CV_GTYPE_FLAGS
XOR AL,CL
PUSH EDI
TEST AL,MASK CV_LTYPE_FWDREF
JNZ L5$
MOV ECX,DPTR [ESI]._CV_LTYPE_LENGTH
AND ECX,0FFFFH
MOV EAX,ESI
ADD ECX,5
LEA EDI,[EDI]._CV_GTYPE_LENGTH
SHR ECX,2
LEA ESI,[ESI]._CV_LTYPE_LENGTH
REPE CMPSD
POP EDI
MOV ESI,EAX
JZ L4$
L3$:
MOV EDX,[EDI]._CV_GTYPE_NEXT_HASH
JMP L2$
L30$:
;
;INSTALL NEW COPY
;
;EDI IS PLACE TO STORE INDEX # OF NEW TYPE
;
;HOW MUCH SPACE DO I NEED TO ALLOCATE?
;
MOV CL,[ESI]._CV_LTYPE_FLAGS
MOV EAX,DPTR [ESI]._CV_LTYPE_LENGTH
AND CL,MASK CV_LTYPE_FWDREF
JZ L31$
ADD EAX,4 ;FWDREF LENGTH MAY AFFECT
L31$:
ADD EAX,CV_GTYPE_STRUCT._CV_GTYPE_ILEAF+12 ;PLUS DERIVATION STUFF
PUSH EBX
AND EAX,0FFFFH
CALL CV_GTYPE_POOL_GET
MOV EBX,EAX
INSTALL_POINTER_GINDEX CV_GTYPE_GARRAY
MOV [EDI]._CV_GTYPE_NEXT_HASH,EAX
MOV EDI,EBX
MOV EDX,EAX
XOR EAX,EAX
MOV ECX,CV_GTYPE_STRUCT._CV_GTYPE_HASH/4
REP STOSD
ASSUME EDI:NOTHING
MOV EAX,DPTR [ESI]._CV_LTYPE_NAMEOFF
MOV ECX,DPTR [ESI]._CV_LTYPE_LENGTH
SUB AL,CV_LTYPE_STRUCT._CV_LTYPE_LENGTH-CV_GTYPE_STRUCT._CV_GTYPE_LENGTH
ADD ECX,9 ;HASH + LENGTH + 3
MOV DPTR [EBX].CV_GTYPE_STRUCT._CV_GTYPE_NAMEOFF,EAX
AND ECX,0FFFFH
POP EBX
MOV EAX,ESI
SHR ECX,2
LEA ESI,[ESI]._CV_LTYPE_HASH
REP MOVSD
MOV [EDI],ECX ;DERIVATION SUTFF
MOV [EDI+4],ECX
MOV [EDI+8],ECX
MOV ESI,EAX
MOV AL,[EAX].CV_LTYPE_STRUCT._CV_LTYPE_FLAGS
TEST AL,MASK CV_LTYPE_FWDREF
JNZ L4$
;
;STORE DERIVATION LIST STUFF
;
CALL STORE_DERIVATION_LIST
L4$:
LEA EAX,[EDX+1000H-1]
POP EDI
RET ;RETURNS ESI IS ORIGINAL TYPE
ASSUME EDI:PTR CV_GTYPE_STRUCT
L5$:
;
;JUST ONE OF THESE GUYS IF FWDREF
;
XOR ECX,ECX
MOV CL,[ESI]._CV_LTYPE_NAMEOFF
PUSH ESI
ADD ESI,ECX
MOV CL,[EDI]._CV_GTYPE_NAMEOFF
ADD EDI,ECX
GET_OMF_NAME_LENGTH
MOV ECX,EAX
push ECX
push EDX
push EDI
mov EAX,ESP
push EAX
call _get_omf_name_length_routine
add ESP,4
pop EDI
pop EDX
pop ECX
; CALL GET_OMF_NAME_LENGTH_EDI
CMP ECX,EAX
JNZ L6$
REPE CMPSB
L6$:
POPM ESI,EDI
JNZ L3$
MOV AL,[ESI]._CV_LTYPE_FLAGS
MOV ECX,DPTR [ESI]._CV_LTYPE_LENGTH
TEST AL,MASK CV_LTYPE_FWDREF
JNZ L7$
PUSH ESI
AND ECX,0FFFFH
MOV EAX,DPTR [ESI]._CV_LTYPE_NAMEOFF
ADD ECX,5
SHR ECX,2
SUB AL,CV_LTYPE_STRUCT._CV_LTYPE_LENGTH-CV_GTYPE_STRUCT._CV_GTYPE_LENGTH
LEA ESI,[ESI]._CV_LTYPE_LENGTH
MOV DPTR [EDI]._CV_GTYPE_NAMEOFF,EAX
LEA EDI,[EDI]._CV_GTYPE_LENGTH
ASSUME EDI:NOTHING
REP MOVSD
MOV [EDI],ECX ;DERIVATION STUFF
MOV [EDI+4],ECX
POP ESI
MOV [EDI+8],ECX
CALL STORE_DERIVATION_LIST
L7$:
POP EDI
LEA EAX,[EDX+1000H-1]
RET
ASSUME EDI:NOTHING
INSTALL_CSUE_GTYPE ENDP
STORE_DERIVATION_LIST PROC NEAR
;
;ESI IS LTYPE, EDX IS GTYPE
;STORE INFO LIKE XREF INFO FOR NOW
;
MOV CL,BPTR [ESI]._CV_LTYPE_ILEAF
MOV EAX,DPTR [ESI]._CV_LTYPE_WORD1 ;GTYPE OF FIELDLIST IN HIGH WORD
CMP CL,I_LF_UNION ;NOT FOR UNION OR ENUM
JAE L9$
SHR EAX,16 ;NOT IF FIELDLIST UNDEFINED
JZ L9$
MOV XR_GTYPE_GINDEX,EDX
SUB EAX,1000H-1
PUSHM ESI,EDX
CONVERT ESI,EAX,CV_GTYPE_GARRAY
ASSUME ESI:PTR CV_GTYPE_STRUCT
MOV EDX,DPTR [ESI]._CV_GTYPE_LENGTH
MOV ECX,CV_GTYPE_STRUCT._CV_GTYPE_WORD1 ;POINT TO FIRST SUBTYPE
MOV EAX,EDX
AND EDX,0FFFFH
SHR EAX,16
SUB EDX,2
PUSH EDI
JBE L8$
CMP AL,I_LF_FIELDLIST ;HAS TO BE...
JNZ L8$
LEA EDI,[EDX+ECX] ;END OF RECORD
ASSUME ESI:NOTHING
L1$:
;
;GO TILL A NON-BASE-CLASS
;
MOV AL,BPTR [ESI+ECX] ;LOAD LEAF ID
CMP AL,0
JZ L3$
CMP AL,1
JZ L2$
CMP AL,2
JNZ L8$
L2$:
MOV AX,WPTR [ESI+ECX+2]
CALL STORE_BASE
MOV AH,BPTR [ESI+ECX+9]
ADD ECX,10
OR AH,AH
JNS L22$
MOV AL,BPTR [ESI+ECX-2]
CALL SKIP_LEAF_SICXAX
L22$:
MOV AH,[ESI+ECX]
ADD ECX,2
OR AH,AH
JNS L7$
JMP L35$
L3$:
MOV AX,2[ESI+ECX]
CALL STORE_BASE
MOV AH,6[ESI+ECX+1]
ADD ECX,8
OR AH,AH
JNS L7$
L35$:
MOV AL,[ESI+ECX-2]
CALL SKIP_LEAF_SICXAX
L7$:
CMP EDI,ECX
JBE L8$
;
;MAY NEED TO ADJUST FOR ALIGNMENT
;
MOV AL,[ESI+ECX]
CMP AL,0F0H
JBE L1$
AND EAX,0FH
ADD ECX,EAX
CMP EDI,ECX
JA L1$
L8$:
POPM EDI,EDX,ESI
L9$:
RET
STORE_DERIVATION_LIST ENDP
FLUSH_DERIVATIVES PROC
XOR EAX,EAX
MOV XR_GTYPE_GINDEX,EAX
; CALL STORE_BASE
; RET
FLUSH_DERIVATIVES ENDP
STORE_BASE PROC NEAR
;
;EAX IS SOMETHING...
;PRESERVE ECX
;
PUSH ESI
MOV ESI,DERIV_PTR
SHL EAX,16
MOV EDX,XR_GTYPE_GINDEX
OR EAX,EDX
MOV EDX,DERIV_PTR_LIMIT
MOV [ESI],EAX
ADD ESI,4
MOV DERIV_PTR,ESI
CMP ESI,EDX
POP ESI
JAE NEW_DERIV_BLK
RET
STORE_BASE ENDP
NEW_DERIV_BLK PROC
;
;ALLOCATE ANOTHER 16K BLOCK FOR STORING XREF INFORMATION
;
; DD NEXT_ENTRY
; DW LOGICAL_BLOCK
;
NEW_DERIV_BLK_INIT LABEL PROC
MOV EDX,DERIV_PTR
CALL GET_NEW_LOG_BLK ;GET LOGICAL BLOCK
TEST EDX,EDX
JZ L5$
MOV [EDX],EAX
L51$:
MOV DERIV_PTR,EAX
ADD EAX,PAGE_SIZE-4
MOV DERIV_PTR_LIMIT,EAX
RET
L5$:
MOV FIRST_DERIV_BLK,EAX
JMP L51$
NEW_DERIV_BLK ENDP
CIRC_HELP PROC NEAR
;
;ESI (EBX) IS CIRCULAR BASE
;DH IS MASK, DL IS DEFINING FLAG
;
;WE TRY INSTALLING A CSUE.
; 1. WE MAY END UP COMPARING AND MATCHING THE WHOLE MESS
; 2. WE MAY END UP DOING MORE INSTALLS FROM NEW COMPLETIONS OF FWDREFS
;
PUSHM EDI,ESI
MOV EAX,CIRCULAR_CSUE
PUSH EBX
TEST EAX,EAX
JZ L99$
PUSH EDX
CONVERT ESI,EAX,CV_LTYPE_GARRAY
ASSUME ESI:PTR CV_LTYPE_STRUCT
MOV ECX,EAX
MOV EDI,CV_GTYPE_HASH_LOG
;
;OK, TRY INSTALLING THIS THING...
;
MOV EAX,[ESI]._CV_LTYPE_HASH
XOR EDX,EDX
HASHDIV CV_GTYPE_HASH
MOV EAX,[EDI+EDX*4]
LEA EDI,[EDI+EDX*4 - CV_GTYPE_STRUCT._CV_GTYPE_NEXT_HASH]
ASSUME EDI:PTR CV_GTYPE_STRUCT
TEST EAX,EAX
JNZ L11$
JMP L3$
L99$:
MOV ECX,EBX
MOV AX,CVP_CIRC_NO_CSUE_ERR
CALL ERR_HEX_ABORT
L12$:
PUSHM EBX,EDX
L1$:
MOV EAX,[EDI]._CV_GTYPE_NEXT_HASH
TEST EAX,EAX
JZ L3$
L11$:
CONVERT EDI,EAX,CV_GTYPE_GARRAY
ASSUME EDI:PTR CV_GTYPE_STRUCT
MOV EDX,EAX
MOV EAX,[ESI]._CV_LTYPE_HASH
MOV ECX,[EDI]._CV_GTYPE_HASH
CMP EAX,ECX
JNZ L1$
MOV AL,BPTR [ESI]._CV_LTYPE_ILEAF
MOV CL,BPTR [EDI]._CV_GTYPE_ILEAF
CMP AL,CL
JNZ L1$
;
;GO AHEAD AND COMPARE NAME
;
XOR EAX,EAX
XOR ECX,ECX
MOV AL,[ESI]._CV_LTYPE_NAMEOFF
MOV CL,[EDI]._CV_GTYPE_NAMEOFF
PUSH ESI
ADD ESI,EAX
PUSH EDI
ADD EDI,ECX
GET_OMF_NAME_LENGTH
MOV ECX,EAX
push ECX
push EDX
push EDI
mov EAX,ESP
push EAX
call _get_omf_name_length_routine
add ESP,4
pop EDI
pop EDX
pop ECX
; CALL GET_OMF_NAME_LENGTH_EDI
CMP ECX,EAX
JNZ L15$
REPE CMPSB
L15$:
POPM EDI,ESI
JNZ L1$
;
;NAME MATCHES
;
;IF GLOBAL GUY IS FORWARD, WE ARE DONE
;
MOV AL,[EDI]._CV_GTYPE_FLAGS
MOV ECX,EDX
TEST AL,MASK CV_LTYPE_FWDREF
JNZ L2$ ;GO COPY CONTENTS
;
;NEED TO SET UP DEEP COMPARE
;
POP EDX
CALL DO_DEEP_COMPARE
POP EBX
JNZ L12$
POPM ESI,EDI
RET
L2$:
LEA EAX,[EDX+1000H-1]
POP EDX
MOV [ESI]._CV_LTYPE_GTYPE,EAX
OR [ESI]._CV_LTYPE_FLAGS,MASK CV_LTYPE_INSTALLED
JMP L32$
L3$:
;
;INSTALL NEW COPY
;
;EDI IS PLACE TO STORE INDEX # OF NEW TYPE
;
;HOW MUCH SPACE DO I NEED TO ALLOCATE?
;
MOV EAX,DPTR [ESI]._CV_LTYPE_LENGTH
ADD EAX,CV_GTYPE_STRUCT._CV_GTYPE_ILEAF+12 ;PLUS DERIVATION STUFF ;CANNOT BE FWDREF
AND EAX,0FFFFH
CALL CV_GTYPE_POOL_GET
MOV EBX,EAX
INSTALL_POINTER_GINDEX CV_GTYPE_GARRAY
MOV [EDI]._CV_GTYPE_NEXT_HASH,EAX
ADD EAX,1000H-1
L31$:
POP EDX
MOV CL,[ESI]._CV_LTYPE_FLAGS
MOV [ESI]._CV_LTYPE_GTYPE,EAX
OR CL,MASK CV_LTYPE_INSTALLED
XOR EAX,EAX
MOV [ESI]._CV_LTYPE_FLAGS,CL
;
;DEFINE IT AS FWDREF FIRST...
;
MOV EDI,EBX
MOV ECX,CV_GTYPE_STRUCT._CV_GTYPE_HASH/4
REP STOSD
ASSUME EDI:NOTHING
MOV EAX,DPTR [ESI]._CV_LTYPE_NAMEOFF ;AND FLAGS
MOV ECX,DPTR [ESI]._CV_LTYPE_LENGTH