-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHistory.txt
1788 lines (1706 loc) · 95 KB
/
History.txt
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
Changelog
09/07/2012, v2.08a:
- result of a macro function was expanded further even if the final result
was to be enclosed in <> (see regression test expans36.asm).
- expansion of EXITM argument wasn't handled fully Masm-compatible in v2.08
if it contained one or more '!' (see regression test expans37.asm).
08/29/2012, v2.08:
Bugfixes:
- forward references of structures in an expression may have failed
( regression test assume7.aso ).
- if C-style expressions in runtime conditional directives were too
complicated, the generated code may have caused 'symbol not defined'
errors ( regression tests rtcond3.asm, rtcond4.asm ).
- if the argument of the ASSUME directive was a segment register,
the accepted variants of expressions behind the colon was more
restricted than Masm's.
- expansion operator % at position 0 in a line with a macro procedure
call caused a syntax error if nothing was expanded.
- absolute externals were rejected if they were used to initialize a
1-byte variable ( regression test extern8.asz ).
- identifiers inside quoted strings were expanded if the expansion
operator % was at position 0.
- OMF, MZ format: if an assembly-time variable that contained an address
was used in code or data, and the variable's content was later changed
to a number, the assembler emitted either error "missing segment ..."
(OMF) or created wrong code (MZ).
- a text macro as label for INSTR was rejected.
- if a conditional assembly directive occured after expansion only, it
wasn't detected.
- another "corrupted listing"-bug fixed.
- macro parameters and locals weren't detected in quoted strings of macro
lines if the substitution operator & was located AFTER the name only.
- code labels in front of macro procedure invokations were parsed after
the macro arguments were evaluated.
- syntax [<reg|const>+<reg>.<type>].<member> wasn't accepted.
- FASTCALL (MS VC style): if the size of an argument to be stored in a
register didn't fit, an error occured.
- JWASMR.EXE: stack size was too small to handle deeply nested macros;
stack increased from 20 to 33 kB.
- OPTION EPILOGUE: a RET within a user-defined epilogue macro wasn't
translated to RETF if the procedure was FAR.
- JWASMR.EXE, INCBIN directive: optional arguments <offset> and <size> were
limited to 16-bit.
- -nm option: this option to set the "module name" did instead set the
name in the OMF THEADR record. Now it sets the true module name, while
the OMF THEADR record will contain the filename.
- in .IF blocks, multiple .ELSE branches weren't rejected.
- SIZEOF and LENGTHOF did return 0 for data items created with the LABEL
directive.
- values for equates were generally rejected if their magnitude exceeded
32-bits. Now the value is rejected only if it's a plain number,
values of expressions may be 64-bit wide.
- a PURGEd macro may have emitted warnings or errors about missing or too
many arguments.
- a scale factor of 1 allowed the register to be used as base register if
needed. However, any scale factor must enforce the register to be used
as index register.
- 64-bit: default type of parameters and locals was QWORD, but Masm (ML64)
uses DWORD.
- AVX: a few instructions didn't accept an unsized memory operand,
although the size should have been guessed; and a few instructions did
accept an unsized memory operand, although the size couldn't be guessed.
- regression in v2.07: option -Fd=file didn't write all necessary entries
in this version.
Other changes:
- GccWin64.mak added; makes a 64-bit JWasm Windows binary with MinGW-w64.
- IntelC32.mak, IntelC64.mak added; create 32/64-bit JWasm Windows binary
with the Intel compiler.
- optional support for assembly code generated by Intel C++ compiler.
- samples Bin2Inc.asm, Win32_6w.asm, Win32Drv.asm and Win32DrvA.asm added.
- compatibility of -Zm cmdline option ( and OPTION M510 ) improved: the
precedence of [] and () will change from 1 to 9, similar to Masm.
- %OUT directive supported.
- @CatStr 20-argument-limit removed.
- OPTION WIN64 got a new switch ( called: INVOKE Stack Space Reservation )
to autodetect stack space required by INVOKEs within a procedure.
- INVOKE of a FASTCALL (MS VC style) proc: optimization implemented to
avoid to load a register with itself (mov ax,ax).
- extended option -Zg: register are swapped in indirect addressing.
For details see option -Zg in the documentation.
07/21/2012, v2.07a:
- regression in v2.07: for absolute externals, a magnitude was assumed
that may have been too large, resulting in error 'Initializer magnitude
too large'.
- check for multiple overrides in expressions was too rigid in v2.07.
07/02/2012, v2.07:
Bugfixes:
- ELF format: size of .bss segment wasn't set.
- ELF format: segments of class "CONST" weren't marked as read-only
in the ELF module.
- segment attribute INFO wasn't handled for ELF.
- Win64: in v2.05-v2.06, VARARG didn't work for the - first 4 - register
arguments.
- when a procedure's prologue and epilogue code was generated, it was
assumed that radix was 10.
- if the size of a byte array in a structure was defined by the length
of a quoted string initializer, it wasn't marked internally as array
and hence the initialization of data items of this type may have been
wrong.
- it wasn't checked if a string initializer for a simple byte field
in a struct was too long.
- if a struct contains fields with negative offset, the struct's size
was calculated incorrectly.
- JWASMR.EXE: in a few circumstances, negative constants were rejected.
- in v2.04-2.06, it wasn't detected if a group contained an undefined
segment.
- INVOKE: if the argument for a VARARG parameter was a structure, it
was rejected in some cases.
- a line that contained both a comment and a directive which triggered
source line generation (INVOKE, hll directives, ... ) messed up the
listing.
- EQU/= directive: optional type coercions weren't stored, just the
value of the constant.
- FLAT, USE32 and USE64 segment attributes were always accepted, no
check for compatible cpu was done.
- fixups for assembly time variables wasn't correct if the variable
had type "far".
- output format MZ: there was no warning when a 16-bit group's size
exceeded 64 kB.
- OMF output format: many publics in a module may have corrupted
the object module.
- if a struct member was operand for the SEG operator, the member's
offset within the struct was used as addend for the segment fixup.
- calling convention FASTCALL for 16-bit MS C was implemented faulty.
Registers aren't CX and DX, but AX, DX and BX.
- if -Zi was set and a segment had size 0 and a label (empty proc),
the resulting coff object module had errors.
- Win64: .pdata information may have been incorrect if multiple code
sections with SEH data were defined.
- handling of standard register ASSUMEs in the expression evaluator
were not compatible with Masm.
- Win64: in v2.06, the space for local variables was calculated
incorrectly if OPTION FRAME:AUTO was set, an odd number of GPRs &
no XMM registers were included in the USES list.
Other changes:
- IF[N]DEF and .ERR[N]DEF directives: argument may be a structure and
member name, separated by a dot.
- cmdline option -Fd: filename argument for this option is no longer
mandatory for COFF output format.
- FADDP, FMULP, FDIV[R]P and FSUB[R]P variants with no arguments added.
- COFF/ELF: missing support for segment attribute ALIAS added.
- for better Masm compatibility, memory operands with size
1 (PADD[S|US]B), 2 (PADD[S|US]W), 4 (PADDD) and 8 (PADDQ) are accepted.
07/22/2011, v2.06e:
Bugfixes:
- ELF64 format: in v2.05-v2.06d, addends weren't handled correctly.
07/02/2011, v2.06d:
Bugfixes:
- 64-bit: in v2.05-v2.06c, a relocatable constant was often assumed
to have a magnitude of 32, thus accepting operands which are invalid
( "mov m64, offset label" or "push offset label" ).
06/29/2011, v2.06c:
Bugfixes:
- v2.06-v2.06b, directives DB, DW: if the result of a subtraction of
2 labels ( dw label1 - label2 ) was negative, it was rejected.
06/28/2011, v2.06b:
Bugfixes:
- struct fields that were forward referenced may have caused warnings
or errors in v2.06-v2.06a.
- in v2.04-v2.06a, if a pointer to a struct was redefined and the
redefinition used a type alias, the redefinition failed (see
regression test types5.asm)
06/26/2011, v2.06a:
Bugfixes:
- in v2.06 was a regression for IMUL with 3 operands: if the third
operand's value was 127 < x < 256, the instruction was encoded
incorrectly.
06/26/2011, v2.06:
Bugfixes:
- relative pathes for filenames containing '/' may have caused
problems in non-Unix versions.
- register "assumes" on the right side of the binary '+' operator
were ignored.
- 64-bit: in v2.05, "MOV <reg>,offset <label>" was created with a
32-bit immediate (and fixup).
- JWASMR.EXE: struct sizes > 32767 caused problems.
- for RECORD types used in an expression, the default value must be the
record's mask, not the record's size in bytes.
- offset of a struct member may have been calculated wrongly if the base
was just a type (not a variable) AND the first member also had a
struct type ("mov eax, <struct_type>.<mbr>.<mbr>").
- inside struct declarations, a '?' was accepted as initializer of struct
members.
- segment combine type COMMON was displayed as '?' in listing.
- in v2.00-v2.05, PUSH/POP of a 64-bit memory operand wasn't rejected
in 16/32-bit code.
- in v2.05, quoted filenames in the cmdline didn't work.
- division operator '/' did interpret operands as unsigned values.
- instructions BT, BTC, BTR and BTS did accept memory byte operands.
- instruction PALIGNR wasn't encoded correctly.
- OPTION RENAMEKEYWORD: restoring of the keywords failed.
- instructions INSx and OUTSx weren't encoded correctly if arguments
were given.
- INVOKE, 64-bit: float constants may have caused a GPF.
- INVOKE: size check for constants was missing.
- in v2.05, indirect addressing may have failed with 'structure field
expected' if address was in format [reg].<member>[reg].
- an erroneous redefinition of a RECORD type may have caused a GPF.
- if multiple files were assembled with different output formats,
some combinations didn't work as expected due to unwanted side
effects.
- LABEL directive: code labels (NEAR, FAR, PROC) cannot be defined
anymore if CS is assumed ERROR. Previously this check was done only
when the label was defined through a trailing colon.
- operator THIS was accepted in expressions outside segments.
- XLAT, XLATB: memory operand of any size was accepted.
- IMUL: syntax check was sloppy.
- CMOVcc: byte registers were accepted as first operand.
- if an instruction has just a memory operand, but with multiple
possible sizes, no error was emitted if size of current argument
was unspecified.
- in IF blocks, multiple ELSE branches weren't rejected.
- size of fixup for absolute externals may have been wrong in a few
cases ( i.e. second operand of BT[c|r|s] instructions ).
- check for REAL4 initializer limits was missing.
- arrays in unions weren't taken into account with their full size.
- it wasn't checked if names of fields of anonymous struct members were
already used in a struct.
- magnitude test of numbers wasn't strict enough.
- in v2.05, if the argument of EQU was a number with a
magnitude > 32 bits, the equate wasn't created as a text macro.
- operator DUP: if initial value was a quoted string and size of the
data item was > 1, every second repetition was incorrect.
- 64-bit: max. width of RECORD was 32 - changed to 64.
- 64-bit: if OPTION FRAME:AUTO was set and a XMM register was added
in the USES list or a PROC, the offsets of local variables wasn't
calculated correctly and the generated epilogue may have used a wrong
value to restore RSP.
- if a text macro, defined via cmdline option -D, was also defined in
the source and the value of both definitions was an empty string,
a GPF did occur.
- HADDPD, HADDPS, HSUBPD, HSUBPS: variant with m128 as second operand
was rejected.
- 64-bit: PEXTRQ/PINSRQ were encoded incorrectly if a m64 operand
was destination or source.
- syntax 'INVOKE <struct_name>.<mbr>[reg]' caused a GPF in v2.05 (and
didn't work in v1.96-v2.04).
- expansion of macro arguments changed so text macros are expanded
earlier ( needed in cases when a macro argument was a text macro
and the value of the text macro was a macro function call - see
macparm.asm regression test ).
Other changes:
- cmdline option -Sf added.
- OPTION RENAMEKEYWORD, OPTION MZ: syntax changed. Both options used
comma-separated values, which made it impossible to use them in a
"multiple-option" line.
- operators LOW32/HIGH32 supported.
- INVOKE: 64-bit constants (integer and floating-point) supported as
parameters.
- Value of predefined text macro @Version changed from <615> to <800>.
- OC.mak added to support the Orange C compiler (LadSoft).
- result of SHL operator is now 64-bit, same as with Masm v8+.
- OPTION DLLIMPORT added.
- cmdline option -Fd added.
- cmdline option -Fr (set error file name) changed to -Fw, since
option name -Fr is already used by Masm (limited browser info).
- instructions XSAVE, XRSTOR, XGETBV, XSETBV, XSAVEOPT supported.
- AVX instruction set supported.
03/02/2011, v2.05:
Bugfixes:
- PROC directive: it wasn't checked that VARARG parameter was last
parameter.
- ASSUME directive: using an arbitrary pointer type as argument
didn't work as expected.
- CVTSI2SD, CVTSI2SS: memory operand could be of any size. Also, if
it was m64 in 64-bit, no REX-W prefix was generated.
- MOVD: 64-bit memory operand wasn't accepted in 64-bit mode.
- PINSRW: memory operands of any size were accepted.
- in v2.04, a macro name which was located behind a '::' wasn't
expanded, which usually resulted in a syntax error.
- "undefined" types may have caused a GPF if -Zi was set.
- some errors fixed in INVOKE support of Open Watcom fastcall register
calling convention.
- most conditional error directives did emit their errors in pass one,
which was too early.
- there was a risk that macro functions in an EQU argument were
expanded (if the macro invocation was hidden in a text macro).
- check for conflicting parameter types for PROC/PROTO wasn't as
rigid as Masm's.
- EXTERN and EXTERNDEF didn't accept prototype type symbols.
- prologue code generation was triggered slightly differently compared
to Masm.
- syntax check of macro "local" lines was too sloppy.
- when searching macro parameter and local names in macro lines, the
search was always case-sensitive, ignoring current case-mapping
setting.
- ELF64 format: relocations were stored in sections of type SHT_REL.
Changed to SHT_RELA.
- in v2.04, SIZE operator might have returned wrong results for
structured variables (SIZEOF had no problems).
- in v1.93-v2.04, initialization of an array of structures may have
given a wrong result if both DUP and comma operators were used.
- check if a data definition directive was preceded by a code label
- which isn't allowed without -Zm option - wasn't fool-proved.
- the tokenizer did scan numbers not exactly like Masm does, which
caused problems if a number was immediately followed by an identifier.
- MZ format: segment fixups for a segment in a group were wrong if both
the group and the segment weren't located at 0.
- INVOKE, 16-bit code, VARARG parameter: in v2.04, if argument was a
32-bit register, register SP was adjusted wrongly after the call.
- it wasn't checked if GOTO labels inside macros were reserved words.
- INVOKE, 64-bit Windows: in v2.04, it wasn't possible to call functions
which had a VARARG parameter.
- PURGE directive: directive arguments weren't expanded.
- preprocessor directives [ELSE]IF[E] weren't always able to detect
undefined symbols in their argument.
- EXITM: syntax check of the directive's argument wasn't too strict.
- SIZESTR: the directive's label wasn't expanded.
- GOTO: a macro label placed just before the ENDM line wasn't found.
- PUSH/POP: there was no error msg when the argument was a structured
variable with an unsuitable size.
- expression evaluator was unable to handle floating-point constants.
Unary operators +, -, OPATTR and .TYPE are supposed to accept those.
- JWasm's dot operator (.) accepted arguments that Masm does only if
OPTION OLDSTRUCTS is active.
- in a few cases the end of "undelimited" strings wasn't detected.
This mostly applies to string macros (@CatStr) used as arguments
for other macros.
- "assumed" predefined types were ignored by the TYPE operator.
- in v2.03-2.04, an "empty" argument in a macro VARARG parameter list
did reset the list.
- if the expansion operator (%) was used to convert a numeric expression
to text. it was always handled. This was an error, because it is
supposed to be accepted for arguments of preprocessor directives or
macros only.
- line concatenation triggered by a comma as last token wasn't fully
Masm-compatible: if the line is an instruction, a comma should NOT
trigger the concatenation. OTOH, if the comma is a result of a
(text) macro expansion, it should trigger concatenation.
- if a source file argument wasn't the first and the file couldn't
be found, a GPF occured.
- INC/DEC: in v1.94-2.04, "unsized" memory operands were accepted.
- SHLD/SHRD: syntax check was too sloppy.
Other changes:
- cmdline option -eq added.
- cmdline option -zld added.
- INVOKE support for Open Watcom register calling convention enabled.
- OWWinDll.mak and MsvcDll.mak added to create JWasm as a Win32 dll.
- source code in listing file now starts at column 32.
10/17/2010, v2.04c:
Bugfixes:
- in v2.04-2.04b, a type coercion of NEAR or FAR for a memory operand
(sometimes used for indirect calls or jumps ) didn't work correctly.
10/08/2010, v2.04b:
Bugfixes:
- in v2.04 + v2.04a, if IMUL's second argument was a forward reference
and a third argument was also given, then error 'invalid instruction
operands' was emitted.
- an empty PROC located outside of a segment block didn't emit error
'Must be inside segment block' - and in v2.04 additionally an access
violation did occur.
- using ALIAS names in expressions was rejected in v2.04. Previously,
this wasn't rejected, but fixups were wrong, which wasn't better.
10/05/2010, v2.04a:
Bugfixes:
- in v2.04, if operator OFFSET was used in an indirect addressing
expression ( mov ax,[bx+offset var] ), the variable's type information
wasn't removed.
- in v2.04, value of assembly time variables were evaluated wrong if they
were forward referenced.
- in v2.04, error 'symbol type conflict' did occur if a type was defined
twice, first as an arbitrary type, second as a scalar type, and the
arbitrary type was just an alias of the scalar type. Example:
type1 typedef ptr
type2 typedef type1
type2 typedef ptr
- operator SEG didn't enforce the argument to have size WORD.
10/04/2010, v2.04:
Bugfixes:
- ELF fixups for 16-bit relative offsets (GNU extension) were wrong.
- PUSHCONTEXT|POPCONTEXT didn't accept multiple arguments.
- a code segment defined with simplified segment directive .CODE,
with a name argument and which was added to a group BEFORE the
definition, was created with default attributes.
- MZ format: segment fixups in the MZ header weren't always calculated
correctly.
- ALIGN, EVEN: "filler" bytes were emitted unless the segment was
"absolute" or "bss". Now this is done only when data or code was
emitted just before the directive.
- COFF format: JWasm expected to use the ".drectve" section exclusively.
If it was defined within the source, an error occured.
- COFF format: option -SAFESEH didn't emit a "@feat.00" absolute
symbol in the object module, as requested by the MS COFF specification.
- JWASMR.EXE: v2.03 often fell into an endless loop due to an error in
fixup management for backpatching.
- in v2.03, constants with -65536 < value < -32768 were not accepted
for 16-bit targets in MOVs.
- a label was accepted even when there already existed a proto with the
same name.
- operator TYPE ignored a possible coercion for a type argument.
- a duplicate RECORD definition was rejected, even if both definitions
were identical.
- an absolute external used as a byte immediate may have caused invalid
code to be generated ( extern x:abs - or al,xx ). MOV and PUSH were
not affected, though.
- in v2.00-2.03, PROTOs were listed in the "Symbols" section, not in
the "Procedures" section.
- for COMMunal variables, there was no check if the symbol was defined
with a different kind already.
- if .STARTUP or .EXIT occured before any code or data definition
lines, the code generated by those directives might have get
truncated.
- INVOKE: a FWORD parameter caused an error if the argument to be
pushed was a constant.
- LOCAL and INVOKE: a local or a parameter of size 0 confused the
assembler.
- MOVD didn't accept a REAL4 memory operand as second argument.
- EXTERN directive: altname was ignored if external was a prototype.
- EXTERN directive: altname symbol was rejected if it was external.
- OMF output format: no WKEXT comment records were written for
EXTERNal items with an alternate name.
- if floating-point emulation fixups were to be generated, there was
no NOP inserted before FWAIT if current CPU was 80386 or better.
- INVOKE, VARARG parameter: if cpu was < 80386 and a constant value
which didn't fit into a word was to be pushed, JWasm complained.
- INVOKE, VARARG parameter: the calculation of the stack adjustment
value was wrong in the following cases:
a) when a byte register was pushed
b) when the argument consisted of 2 registers ('ds::bx')
- JWASMR.EXE: freeing a PROC's local items was done with the wrong
linked list. This often resulted in an abnormal termination.
- in v2.03, if Win64 output format was selected, a GPF did occur if
a stack variable was used as an argument for INVOKE.
- SHR and SHL operator didn't reject negative shift counts. Also,
shift counts >= 64 returned compiler-dependant results.
- if a text literal defined with SUBSTR was referenced before definition,
the definition failed.
- INVOKE for Win64 didn't work for VARARG parameters.
- syntax ASSUME <reg>: ERROR|NOTHING rejected 8-bit registers.
- directive ASSUME: argument types for segment register assumes
weren't restricted to segment, groups or segment registers.
- codeview debugging info: in v2.02-2.03, type info for structures and
unions wasn't written. Without this info, it wasn't possible to examine
the contents of structure members in a debugger.
- text macros used to initialize an byte array within a struct did cause
error 'invalid symbol type in expression' it the macro wasn't enclosed
in angle brackets.
- in v2.01-v2.03, it was possible to redefine a numeric equate if it
was calculated as the difference of two labels.
- on certain conditions the expression evaluator skipped type information,
and emitted a warning then. Example: mov [eax-<n>](<type>.<member>),0
- JWASMR.EXE: setting radix to 16 made the assembler accept no numbers
anymore.
- 64-bit: LAR and LSL weren't implemented ML64-compatible, they accepted
DWORD/QWORD memory operands.
- in a few cases (where JWasm assumed forward references to be labels,
which later turned out to be numbers) there was a risk that a short
destination for a jump wasn't detected and hence not the smallest
possible code was generated.
- comparisons of TYPE expressions may have failed for expressions with
type coercion.
- in v2.03, false conditionals were always listed (.LISTIF).
- in v2.00-v2.03, a code label in front of conditional directives gave
syntax errors.
- directive TYPEDEF: type conflicts of some pointer types were undetected.
Other changes:
- OPTION NOSIGNEXTEND supported.
- OPTION WIN64 added.
- new cmdline switch -Zv8.
- INVOKE generates smaller code for constant arguments with 8086 cpu.
- INVOKE for Win64 watches if register parameter values are destroyed.
- INVOKE for Win64: type checking of arguments is now more strict.
- to increase Masm-compatibility, floating-point initialization with
"real-number designator" (R) supported. Example: "var REAL4 3f800000r".
- INVOKE support for Open Watcom fastcall register convention
implemented ( disabled by default ).
- Djgpp variant of COFF supported ( disabled by default ).
- JWASMR.EXE: stack size increased from 16 kB to 20 kB.
08/03/2010, v2.03:
Bugfixes:
- invalid cmdline option behind source filename caused a GPF.
- expressions in a data field initializer were evaluated when the
structure was instanced. This gave incorrect results or assembly
errors if the expression contained an assembly time variable
( including $ ).
- INVOKE directive: if register EAX|RAX was used for indirect addressing
of a parameter, there was no check if the content of the register has
been overwritten previously due to an ADDR operator.
- INVOKE directive, 64-bit: if a parameter beyond the first four was an
address which had to be loaded into register RAX to store it onto the
stack, the generated source was either invalid or a GPF occured.
- TYPEDEF directive: pointer definitions did use the default size for
data pointers, which isn't correct if the pointer is defined as a
function pointer and memory model is COMPACT or MEDIUM.
- 64-bit: assembly time variables or immediate operands with a value
magnitude > 32 bits were rejected.
- macro expansion: expansion operator at the start of a line and more
than one macro function call within this line might have resulted
in garbage.
- DUP operator: count (first operand) was rejected if it was a string.
- float initializer in BSS segments wasn't rejected.
- OMF format: when a listing was to be written (-Fl) and a large array
was defined, a GPF might have occured.
- error 'Symbol redefinition' occured if an equate's expression contained
another equate which was the result of a subtraction of 2 labels AND
a phase error caused this difference to change.
- comments weren't displayed in listing.
- in v1.96-2.02, if cmdline option -mf was set, the cpu wasn't
automatically set to a 386 as it was done before.
- format COFF: symbols defined as weak externals were created as normal
externals if the EXTERN directive was used for the definition.
- 64-bit: opcodes MOVSXD and CQO (both 64-bit) were missing.
- 64-bit: opcode CDQE was encoded without the REX prefix, thus it was
a CWDE in fact.
- 64-bit: QWORD type coercion for an immediate operand didn't force the
operand's size to 64-bit.
- 64-bit: MOVs with a segment register as operand didn't accept 64-bit
registers as the other operand ("mov ds, rax").
- 64-bit: SLDT, SMSW and STR didn't accept 32- and 64-bit registers as
operand.
- a displacement which didn't fit into 32-bits caused error 'Constant
value too large' in versions 2.00 - 2.02. This has been changed to a
warning (level 3) in 16- and 32-bit. In 64-bit code, it is still an
error.
- In expressions, types combined with the open (square) bracket operator
( "mov eax, DWORD [ebx] ) weren't rejected.
- comparisons of TYPE expressions did compare the type's size only.
- Name of a macro proc used as a macro argument caused a syntax error.
- for indirect calls/jumps, a struct field used as displacement didn't
qualify the type of the call/jump, resulting in an error msg.
- A .MODEL directive which occured AFTER code definition lines may
have confused JWasm.
- in JWasm v2.00-2.02, when a RECORD variable had to be initialized,
there was a risk that an erroneous padding byte was added.
- initialization of DWORD/QWORD items with constants in string format
may have been incorrect due to wrong little-endian conversion.
- empty lines - or lines containing just a comment - in macros weren't
counted, thus a wrong line number might have been displayed if an
error occured inside a macro.
- name arguments for .DATA? and .CONST were always accepted, but
ignored. Now they are accepted only if -Zne isn't set and the name
is NOT ignored then.
- 64-bit: for -win64, default for GS register assumption was "ERROR".
Assumption changed to NOTHING.
- 64-bit: JWasm always used RIP-relative direct addressing mode, even
if there was a segment override with a segment register which wasn't
assumed to be FLAT.
- 64-bit: encoding of indirect addressing with base registers R12/R13
and no index registers wasn't correct.
- 64-bit: encoding of indirect addressing with base registers
RBP/R13/R13D + index register and no displacement wasn't correct.
- 64-bit: register R12D was rejected as base for indirect addressing.
- PURGE made macros "invalid" (it should just delete the macro content).
- listing of macro invokations started with a "non-existing" empty line.
- TEXTEQU: if the % operator was to evaluate a numeric argument which
contained other text equates, the equates were expanded incorrectly.
- TEXTEQU: the % operator returned a signed value for numeric arguments.
For strict Masm compatibility, it has to be an unsigned value.
- OPTION DOTNAME: in v2.0-v2.02, this option may have caused macro
parameters not being recognized in macro source lines if the parameter
was preceded by a dot.
- in v2.0-v2.02, the % operator didn't work reliably for VARARG macro
arguments.
- a text macro which contained a macro function call and extra chars
might not have been expanded correctly if it was used as an argument
in one of the string directives.
- a GOTO to an undefined macro label didn't display an error.
- macro locals used as macro labels didn't work.
- in v2.00-2.02, there was a risk that JWasm generated a near jump
( or an "extended" conditional jump if cpu is < 80386 ) when a short
(conditional) jump would have been ok.
- ALIGN directive without argument inside struct definitions created
bad offsets.
- left part of equates in listing sometimes got copied to the next line.
- no warnings were emitted on warning level 3+ if procedure arguments
or locals weren't referenced.
Other changes:
- OW v1.9 used to create the JWasm binaries.
- opcode RDTSCP supported.
- option -nc wasn't documented.
- the (average) number of passes needed to assemble a source has been
reduced. This should also have a positive impact on assembly time.
01/19/2010, v2.02:
Bugfixes:
- in v2.00-v2.01, option -Zg disabled alignment padding for structures.
- in v1.96-v2.01, if argument of a PUSH immediate was a segment or
group value, the short 'byte' form of the PUSH opcode was generated,
which - in conjunction with the fixup for this value - resulted in
bad code.
- literal-character operator (!) was ignored within arguments of
directives IFIDN[I] and IFDIF[I].
- literal-character operator (!) wasn't handled in literals of .ERRxx
directives.
- FOR/IRP/FORC/IRPC: parameter placeholder names beginning with a '.'
were always rejected.
- FORC/IRPC: additional items after the literal argument weren't
rejected.
- in v2.01, arithmetic instructions with a forward memory reference
as first operand and an immediate value as second operand were
rejected if cpu was < .386.
- for formats other than OMF, the buffer which hold the contents of a
segment might have been allocated too small if the segment was a
code segment and contained forward references but no labels.
- OMF format: there was a risk that WLink refused the object module
generated by JWasm because size of code sections did shrink in
assembly passes > 2 but file size wasn't adjusted accordingly.
- CMPSx string instruction: if first operand had a DS prefix, it was
generated, although it's superfluous.
- XCHG with 2 register operands: encoding of registers differed from
Masm's (unless one operand was AX/EAX).
- in v1.95-v2.01, MMX/SSE instructions did emit prefix byte (0x66) in
16-bit code if one operand was a 32bit standard register.
- opcodes CALL/JMP in 64-bit code: rex prefix wasn't emitted if operand
was a register, which caused "call r8" to be encoded like "call rax".
- 64-bit indirect addressing: if memory operand was second argument and
address used both base+index register, the REX_X bit wasn't set.
- in 64-bit code segments, the filler bytes created by ALIGN/EVEN
directives weren't valid NOPs in all cases.
- there was no check whether type coercions for registers ( DWORD PTR
EAX ) were consistent.
- for all formats besides OMF, there was no message if a 16-bit segment
exceeded 64 kB.
- runtime conditionals: the 'logical NOT' operator ! did not invert
logical operators && and ||.
- INVOKE directive: for models with default far data pointers ( COMPACT,
LARGE, HUGE ), the ADDR operator didn't make the segment part to be
pushed if parameter had the VARARG attribute.
- OMF format: in v2.00-v2.01, there was a risk that a fixup record might
have contained a fixup for the NEXT ledata record, which is invalid.
- OMF format: COMMunal variables with size > 128 caused object module
corruption.
- OMF format: if an array of far COMMunal variables exceeded 128 items,
a fatal error ("internal error in omf.c") occured.
- 16-bit floating-point fixups: generated fixup frame specifier differed
from Masm's ( F4 [FRAME_LOC] vs F5 [FRAME_TARG] ).
12/12/2009, v2.01:
Bugfixes:
- shift and rotate opcodes accepted any 8-bit register as second
argument. If it wasn't CL, wrong code was generated.
- IN/OUT opcodes accepted any 16-bit register as source/target, not
just DX. If it wasn't DX, wrong code was generated.
- an unnecessary DS prefix for OUTS string instruction wasn't removed.
- 16-bit indirect addressing-mode with a scale > 1 wasn't rejected and
invalid code was generated.
- if errors occured JWasm still returned error code 0.
- indirect CALL/JMP needed a size, even if -Zm was set.
- with -Zm, the offset of a struct member wasn't correct if the struct
was nested and the member was referenced without the 'dot' operator.
- in v2.0, error 'Constant value too large' may have occured if the
SHL operator was used in expressions to define an immediate value
and the result didn't fit in 32-bits.
- directive '=': expression wasn't rejected if it contained externals.
Now error 'Constant expected' is displayed.
- JWASMR only: detecting the size of an immediate operand often failed,
which then gave error 'immediate data out of range'.
- segment/group override used in an argument for the OFFSET operator
was ignored.
- format BIN: offsets were always group-relative (OPTION OFFSET:SEGMENT
was ignored).
- arithmetic instructions with immediate operand: the signed (=shortest)
variant of the instruction wasn't generated if the immediate operand
was a negative WORD value.
- absolute segments weren't correctly displayed in the listing file.
- formats MZ: fixups with references to absolute segments weren't
handled correctly.
- SSE2 CMPSD/MOVSD: memory operand of type QWORD was rejected.
- SSSE3 instructions: indirect addressing with ESP didn't emit the
SIB byte.
- in v2.0, a struct field with a name which matched an arbitrary type
was rejected if the type of the struct field was a predefined TYPE
(example: name1 WORD ? ; [<name1> is both a struct field name
and an arbitrary type name] ).
- OMF format: if the LNAME index of a group name was > 255, the link
between the name and the group definition record became broken.
- syntax "EXTERN:" and "EXTERNDEF:" (directive + colon, but no type),
was rejected, but seems to be valid Masm-syntax.
- for PUSHD, only immediate operands were accepted.
- in JWasm, using a text macro before it is defined is to cause
a warning. This worked for text macros defined with EQU only, but
didn't if the macro was defined with CATSTR or TEXTEQU.
- for segment registers, the assume search order in v1.96 and v2.0
didn't match Masm's.
- macro loop directives (REPEAT, FOR, FORC, WHILE) with no data
lines caused a GPF.
- if a text macro contained multiple macro function calls, only the
first one was evaluated on some conditions.
Other changes:
- equates and assembly time variables: magnitude of values has been
increased by 1 bit. Now it's 32bit plus a sign bit - similar to Masm v8.
- multiple overrides in an expression will give a warning.
- if an equate was assigned a PROC, the proc-specific info wasn't stored,
which made it impossible to use the equate for the INVOKE directive.
- instruction sets SSE4.1 and SSE4.2 supported.
- data types MMWORD and XMMWORD supported.
10/12/2009, v2.00:
Bugfixes:
- for output format OMF, the listing contained "random" values of data
bytes in BSS segments.
- syntax check for WHILE didn't reject additional arguments.
- PUSH/POP instruction: a forward reference to a variable caused an
error if cpu was 8086.
- for most MMX and SSE instructions, type of memory operand wasn't
checked too strictly.
- ALIGN for data segments did emit the same bytes as for code segments.
- in 16-bit code, PUSH <imm> with -65535 <= imm <= -129 made JWasm push
a DWORD value or - if cpu was < 80386 - caused error 'instruction form
requires 80386'.
- in v1.96, usage of a not-yet-defined symbol in a data definition may
have caused error "initializer magnitude too large".
- .NO87 had no effect in v1.96.
- OMF format: size of LNAMES record may have exceeded 1024 bytes.
- in v1.96, if -Zm was set, structure fields had offset 0 when they were
referenced without the structure name.
- inside macros, value of predefined symbol @Line was current macro line
number instead of current source line number.
- support for IMAGEREL and SECTIONREL operators was effectively disabled.
- missing quotation mark in strings wasn't flagged.
- JWASMR.EXE: array initialization strings caused a syntax error.
- JWASMR.EXE: value of equates was truncated to 16bit.
- argument of INCLUDE directive was always expanded. Now it's only
expanded if the expansion operator (%) is the line's first character
(Masm compatible).
- -Zp switch was ignored.
- padding of a struct's last member didn't depend on the largest type
of the structure, thus it was incompatible with common C compilers.
- ECHO without argument might have displayed garbage.
- alignment of members of type STRUCT didn't work as expected.
- equate @FileCur always returned the main source filename.
- in v1.96, indirectly calling a function with a different offset
magnitude by type coercion (call PF16 ptr [ebx]) created wrong code.
- the argument of REPEAT was treated as unsigned integer, but should be
a signed integer.
- JWasm complained about a missing <text> argument for IRC/IRPC, but
this is actually a valid syntax.
- If a struct member's name was also a type name and the member's type
was of arbitrary type, a syntax error occured.
- directive ASSUME <reg>:ptr <type> caused an error in pass 2 if <type>
still wasn't defined. Now it's just skipped, which is what Masm does.
- DB directive: empty string argument ("") wasn't rejected if directive
was used without label.
- directives [ELSE]IF[N]DEF without argument caused a warning.
- code generated by runtime conditionals might have been wrong if
expression had the format (<expr> && (<expr> || <expr>))
- INCBIN was ignored if it was first instruction to insert bytes.
- if cpu was 8086, INVOKE failed for constant arguments.
- operators SIZE and LENGTH worked like SIZEOF/LENGTHOF if expression
contained the DUP operator.
- directives INCLUDE, INCLUDELIB and INCBIN: filenames beginning with
a digit may have caused a GPF.
- indirect addressing mode: usage of multiple index registers wasn't
detected in all cases.
Other changes:
- support for 64-bit enabled.
- new cmdline options -win64 and -elf64.
- new cmdline cpu options -7, -8, -9, -10.
- object module is accessed with standard stream functions, low-level
file i/o isn't used anymore.
- format of error/warning msgs is more Masm-compatible.
- directives for 64-bit SEH added (.ALLOCSTACK, .PUSHFRAME, ... )
- OPTION FRAME added.
- type SQWORD supported.
- OPTION DOTNAME | NODOTNAME fully supported (previously NODOTNAME was
ignored).
- directive .SAFESEH and cmdline option -safeseh supported.
- cmdline option -Zd implemented for COFF output format.
- cmdline option -Zi implemented for OMF and COFF output formats.
- cmdline option -zld removed. File dependency records are written
when options -Zd or -Zi are set.
- Masm compatible cmdline option -Zs added, and existing cmdline option
-zs renamed to -zt to avoid ambiguity.
- operators IMAGEREL and SECTIONREL work with BIN format, which makes it
possible to create PE binaries using this format.
- BIN format: initial ORG in any segment will just set current offset.
Prior to v2.0 this was true for the very first segment only.
- ELF32 format: LD extensions for 8/16-bit relocations supported.
- OPTION ELF added.
- PUSHCONTEXT/POPCONTEXT ALIGNMENT added.
- option -j removed.
- directive OPTION RENAMEKEYWORD added.
- optional attribute LABEL for first macro parameter supported.
- macro loop iteration displayed in error msgs.
- expansion of macro parameters improved.
- regression tests added to source package.
- -Zi switch for COFF output format may have caused an exception when
code was written without using PROC/ENDP.
07/29/2009, v1.96a:
Bugfixes:
- JWASMR.EXE in v1.96 contained a bug in the ASSUME directive which
made it unusable.
Other changes:
- JWASMR.EXE is now distributed in a separate package.
07/26/2009, v1.96:
Bugfixes:
- BIN format: fixups related to $ were always resolved to 0.
- offset <seg_name> didn't return the segment's highest offset.
- if ASSUME forward referenced a type, the type's validity wasn't
checked in pass 2 if the directive was located before any code
or data definitions.
- BIN format: in v1.95, a stack segment generally wasn't written, but
this rule has turned out to be too simple. Now a segment isn't written
if the segment itself AND all segments following it don't contain
initialized data.
- BIN format: if .DOSSEG was set, segments might have got lost in the
binary.
- if a macro which contained EXITM was placed behind a code label, the
code label was duplicated, giving error msg "symbol already defined".
- INVOKE directive, cpu 8086: if ADDR operator was used to push the
direct address of a memory variable, a "PUSH OFFSET <address>" was
generated. However, push with immediate operands isn't supported by
this cpu.
- BIN output format: operators LOW and HIGH were rejected.
- OMF output format: in code lines, the HIGH operator was ignored,
resulting in a wrong fixup type.
- cmdline "-Fo<directory>\ *.asm" didn't work reliably, the <directory>
information got lost after the first file had been assembled. Same for
-Fr and -Fl.
- the JWasm versions for DOS 16-bit, OS/2 and Linux had problems if a
cmdline option and its argument were separated by a white space
(i.e.: -Fo Sample.com).
- nesting of response files wasn't handled properly.
- if name of response file contained spaces, it wasn't parsed correctly.
- type coercion within () did force the whole operand to this type.
example: mov (<type PTR ds:[mem_addr]).<struct_field>, ax
- a macro function invoked by EXITM might have caused a line number mess.
- JWasm did complain if a character was found in a number without 'h'
suffix. This is too rigid if current radix is > 10.
- output format COFF, ELF: a buffer was allocated for segments which
contain just uninitialized data. This isn't necessary.
- output format COFF: segments with combine type STACK were marked as
'uninitialized', even if they contained initialized data.
- no error msg was displayed if a non-segment register was on the left
side of the ':' operator.
- no error msg was displayed if a segment register which was assumed to
error was used in an expression.
- if a data label was defined more than once, an error was displayed.
However, this is to happen only if the label's address or type differs
from the previous definition.
- (invalid) fixups were created for data items consisting of a
segment override and a number (i.e. "dw ds:[12h]").
- -fpc option was virtually ineffective because cpu directives also
set a default fpu mode.
- SYSENTER was erroneously marked as a privileged instruction.
- in v1.95, there was a regression if a literal enclosed in <> contained
(double) quotes and was used as a parameter for FORC,IRPC.
- OPTION PROC:PUBLIC caused a syntax error.
- EXITM did restore the line number too late. Thus the macro's line number
was displayed in error msgs, although the macro function itself ran
successfully.
- regressions in v1.95: for SSE2 instructions CMPSD/MOVSD, the code
which was generated wasn't correct.
- no check was done to ensure that index for ST(n) doesn't exceed 7.
- there was no error msg if a third argument was given for instructions
which accept two arguments at most.
- INVOKE: a general-purpose register which was assumed to be a function
pointer wasn't accepted as first argument.
- OPTION OLDSTRUCTS didn't work the way it does in Masm.
Other changes:
- -mz format option added.
- directive OPTION MZ added.
- a segment map was added to the listing file of binary formats.
- undocumented (and useless) cmdline option -7 removed.
- samples Mixed216 and Mixed232 added.
- invalid cmdline options don't abort the assembly process anymore,
just a warning is displayed.
- GccDos.MAK, PellesC.MAK, BCC.MAK and TCC.MAK added.
- the 16bit version, JWASMR, no longer supports -coff and -elf. It
didn't work reliably in v1.95.
- Makefile: creating JWASMD.EXE now also works with OW v1.8.
- OW v1.8 used to create the JWasm binaries. Previously it was v1.7a.
- INVOKE: extending a memory argument from word to dword won't destroy
content of register EAX if option -Zg is set.
- experimental support for x86-64 added to the source (not active in
the binaries).
- support for FASTCALL implemented, replaces language WATCOM_C.
- options -zf0 and -zf1 added.
- options -zzo and -zzp renamed to -zs0 and -zs1 for better
name consistency. Option -zs2 added.
- options -fp5 and -fp6 removed. They were useless.
- instruction UD2 added (requires cpu .686)
05/26/2009, v1.95:
Bugfixes:
- listing of items in initialized structures was wrong.
- listing for .STARTUP and .EXIT was messed up.
- optional value behind .EXIT directive wasn't parsed correctly.
- .LISTIF didn't display true conditionals inside macros.
- -Sa cmdline option didn't set .LISTMACROALL
- "if" state wasn't saved/restored if a macro had to be run in a
line with expansion operator at the beginning of the line.
- bit 6 returned by OPATTR was set for local variables only, but
is has to be set for any indirect memory reference related to SS.
- TYPE with indirect memory operand and a type coercion returned 0.
- line continuation caused by a comma as last token did ignore empty
lines. However, an empty line must stop the continuation.
- OPATTR didn't accept expressions as operands which contained the
OFFSET operator.
- if the expression evaluator found a macro name, it changed the
symbol's type to a label. Now error 'invalid symbol type in
expression' is displayed.
- if an INVOKE directive was first line to emit code bytes and was
placed outside of a PROC, the code which was generated was wrong.
- names of locals in macros beginning with a digit weren't rejected.
- using OFFSET operator in 'LEA <reg>,[ OFFSET <symbol>]' was rejected.
- if an array of data items was defined, a terminating comma caused a
syntax error.
- if a term '<variable>.<type>' was found in an expression, it wasn't
handled similar to '<type> PTR <variable>'.
- @InStr and @SizeStr returned result as string in radix 10, but
current radix is to be used instead (which "usually" IS 10).
- AT segments didn't work in v1.94.
- ALIGN directive did emit bytes in BSS and AT segments.
- OMF output format: segment and class names must be converted to
uppercase for both OPTION CASEMAP:ALL and OPTION CASEMAP:NOTPUBLIC.
- syntax check of LABEL directive wasn't restrictive enough.
- labels within structure definitions wasn't rejected.
- TYPE with struct operand returned wrong result in v1.94 if size of
struct was > 8.
- ASSUME did reject forward references to types.
- syntax check for PUBLIC, EXTERN, EXTERNDEF, GROUP, ENDS, LOCAL
wasn't fool-proved.
- @SizeStr's parameter wasn't optional.
- it wasn't possible to define an array of 0 items with the LOCAL
directive, size was silently changed to 1 item then.
- a forward reference to a symbol of RECORD type gave an error.
- the MOD operator didn't check if second operand was zero.
- syntax check for conditional assembly directives did accept invalid
formats.
- value of $ was wrong inside structure or array definitions.
- reserved word '.386C' was missing.
- once the cpu was set > .8086 it wasn't possible to set .8086 again.
- wrong fixup generated for 32bit addressing modes if the symbol was
16bit.
- JWasm got confused if a macro's VARARG parameter did start with a ','.
- in v1.94, OPTION SEGMENT:USE32 set default segment size to USE16.
- JWasm didn't reject an undefined symbol in an expression after IF.
- OPATTR for code labels returned wrong value.
- .NOCREF/.XCREF directives didn't accept arguments.
- type conflicts for symbols which had an additional EXTERNDEF entry
were detected for data labels only.
- IF[N]DEF <symbol> failed if <symbol> was a forward reference.
- ':' operator did clear a type which was set by the PTR operator.
Test case: <type> PTR ds:[0].
- hll expression evaluator did always handle the '()' operator, while
it should handle it only if the expression enclosed contains a
hll operator.
- -D cmdline option didn't tolerate spaces between -D and macro name.
- IF[N]DEF directive didn't work reliably in pass two. This was hardly
noticed because in JWasm all passes except the first one handle
preprocessed input only - usually.
- protection exception occured if a parameter for INVOKE consist of a
register pair (DS::SI) and value of register [E]AX was modified before.
- forward references of assembly time variables were evaluated to 0,
but the value must be the variable's value after pass one is finished.
- in v1.94, data initializer of strings within structures didn't cover
the full array length.
- ASSUME ignored the PTR operator and accepted invalid types for register.