1 line
41 KiB
Plaintext
1 line
41 KiB
Plaintext
\ Assembler test suite 8086/8087 assembler test suite \ Assembler test suite empty forth definitions decimal application 1 fload ASM87 ( load assemblers if not present ) marker ASMTEST cr .( testing assembler: ) 2 #screens 1- thru cr .( passed) /stack forth forget asmtest decimal application \ Assembler test suite system variable org : /stack ( i*x -- ) begin depth 0> while drop repeat ; : init ( -- ) /stack s" [ASM READY" evaluate here org ! ; \ Assembler test suite \ Test compiled code : { ( -- ) [ assembler ] LODS [ forth ] \ should compile LODSW s" CHECK ASM]" evaluate [char] } parse evaluate $AD \ opcode for LODSW here begin dup org @ u> while 1- dup c@ rot <> if org @ 16 dump -1 abort" failed" then repeat drop here org @ - -allot ( freemem) init ; application \ Assembler test suite hex : adr ( -- l h ) here 1- 0 100 um/mod ; 1234 constant BVAR 1235 constant WVAR 1237 constant LVAR 123B constant SUBR 54329876. 2constant FARSUB init .( 8086 ) AAA { 37 } AAD { D5 0A } AAM { D4 0A } AAS { 3F } DX BX ADC { 11 D3 } 0 [BX+SI] CX ADC { 13 08 } CX 0 [BX+SI] ADC { 11 08 } 3456 # wvar ) ADC { 81 16 35 12 56 34 } FF80 # wvar ) ADC { 83 16 35 12 80 } 5 # AX ADC { 15 05 00 } \ 8086 BX SP ADD { 01 DC } ES: 967 [BX+DI] BP ADD { 26 03 A9 67 09 } AX 967 [BX+DI] ADD { 01 81 67 09 } 6789 # SI ADD { 81 C6 89 67 } 5432 # wvar ) ADD { 81 06 35 12 32 54 } FF80 # wvar ) ADD { 83 06 35 12 80 } 5 # AX ADD { 05 05 00 } SP DI AND { 21 E7 } DS: 1234 [BP+SI] BL AND { 3E 22 9A 34 12 } BP CS: 4567 [BP+SI] AND { 2E 21 AA 67 45 } 6789 # BX AND { 81 E3 89 67 } 1234 # wvar ) AND { 81 26 35 12 34 12 } FF80 # wvar ) AND { 83 26 35 12 80 } 5 # AL AND { 24 05 } \ 8086 here 48 - ) CALL { E8 B5 FF } farsub ) FAR CALL { 9A 76 98 32 54 } wvar [BP+DI] CALL { FF 93 35 12 } CX CALL { FF D1 } lvar [] FAR CALL { FF 1E 37 12 } CBW { 98 } CLC { F8 } CLD { FC } CLI { FA } CMC { F5 } \ 8086 67 # CH CMP { 82 FD 67 } AH BH CMP { 38 E7 } 0 [SI] CL CMP { 3A 0C } SS: AL 0 [SI] CMP { 36 38 04 } 9678 # wvar ) CMP { 81 3E 35 12 78 96 } FF80 # wvar ) CMP { 83 3E 35 12 80 } 5432 # AX CMP { 3D 32 54 } BYTE CMPS { A6 } CMPS { A7 } CS: { 2E } CWD { 99 } DAA { 27 } DAS { 2F } \ 8086 BX DEC { 4B } BL DEC { FE CB } bvar [SI] BYTE DEC { FE 8C 34 12 } wvar [DI] DEC { FF 8D 35 12 } CL DIV { F6 F1 } BX DIV { F7 F3 } bvar ) BYTE DIV { F6 36 34 12 } DS: { 3E } ES: { 26 } HLT { F4 } CL IDIV { F6 F9 } BX IDIV { F7 FB } bvar ) BYTE IDIV { F6 3E 34 12 } \ 8086 CL IMUL { F6 E9 } BX IMUL { F7 EB } bvar ) BYTE IMUL { F6 2E 34 12 } AL 7B # IN { E4 7B } 7B # AL IN ( deprecated) { E4 7B } AX 7B # IN { E5 7B } 7B # AX IN ( deprecated) { E5 7B } DX AL IN { EC } DX AX IN { ED } AX INC { 40 } AL INC { FE C0 } 5 [SI] BYTE INC { FE 44 05 } 0 [BP] INC { FF 46 00 } \ 8086 17 INT { CD 17 } 3 INT { CC } INTO { CE } IRET { CF } here 3 + JA { 77 01 } here 4 - JA { 77 FA } here 3 + JNC { 73 01 } here 4 - JNC { 73 FA } here 3 + JC { 72 01 } here 4 - JC { 72 FA } here 3 + JNA { 76 01 } here 4 - JNA { 76 FA } \ 8086 here 3 + JCXZ { E3 01 } here 3 + JZ { 74 01 } here 4 - JZ { 74 FA } here 3 + JG { 7F 01 } here 4 - JG { 7F FA } here 3 + JNL { 7D 01 } here 4 - JNL { 7D FA } here 3 + JL { 7C 01 } here 4 - JL { 7C FA } here 3 + JNG { 7E 01 } here 4 - JNG { 7E FA } here 3 + JNZ { 75 01 } here 4 - JNZ { 75 FA } here 3 + JNO { 71 01 } \ 8086 here 3 + JNS { 79 01 } here 3 + JPO { 7B 01 } here 4 - JPO { 7B FA } here 3 + JO { 70 01 } here 3 + JPE { 7A 01 } here 4 - JPE { 7A FA } here 3 + JS { 78 01 } here 4 - JU { EB FA } here 3 + JU { EB 01 } here 1234 + ) JMP { E9 31 12 } farsub ) FAR JMP { EA 76 98 32 54 } wvar [] JMP { FF 26 35 12 } BX JMP { FF E3 } lvar [SI] FAR JMP { FF AC 37 12 } \ 8086 LAHF { 9F } LOCK { F0 } lvar [BX] AX LDS { C5 87 37 12 } lvar [BX] BX LEA { 8D 9F 37 12 } lvar [BX] BX LES { C4 9F 37 12 } BYTE LODS { AC } LODS { AD } here 8 - LOOP { E2 F6 } here 9 - LOOPZ { E1 F5 } here 3 + LOOPNZ { E0 01 } \ 8086 DS: AL bvar [BP] MOV { 3E 88 86 34 12 } AX wvar [BX] MOV { 89 87 35 12 } DS: bvar [BP] AL MOV { 3E 8A 86 34 12 } wvar [BX] AX MOV { 8B 87 35 12 } DX CX MOV { 8B CA } DX AX MOV { 8B C2 } bvar ) AL MOV { A0 34 12 } wvar ) AX MOV { A1 35 12 } AL bvar ) MOV { A2 34 12 } AX wvar ) MOV { A3 35 12 } wvar ) BP MOV { 8B 2E 35 12 } BP wvar ) MOV { 89 2E 35 12 } 9876 # DX MOV { BA 76 98 } 1 # DX MOV { BA 01 00 } 1 # DL MOV { B2 01 } \ 8086 lvar # wvar ) MOV { C7 06 35 12 37 12 } 67 # bvar ) byte MOV { C6 06 34 12 67 } CX SS MOV { 8E D1 } DS CX MOV { 8C D9 } wvar ) ES MOV { 8E 06 35 12 } CS wvar ) MOV { 8C 0E 35 12 } BYTE MOVS { A4 } MOVS { A5 } CL MUL { F6 E1 } BX MUL { F7 E3 } bvar ) BYTE MUL { F6 26 34 12 } \ 8086 BL NEG { F6 DB } BX NEG { F7 DB } wvar [BX] NEG { F7 9F 35 12 } BL NOT { F6 D3 } BX NOT { F7 D3 } wvar [BX] NOT { F7 97 35 12 } BH DL OR { 08 FA } 0 [SI] DH OR { 0A 34 } BL 0 [SI] OR { 08 1C } 6789 # BX OR { 81 CB 89 67 } 7698 # wvar ) OR { 81 0E 35 12 98 76 } FF80 # wvar ) OR { 83 0E 35 12 80 } 5 # AX OR { 0D 05 00 } \ 8086 AX 44 # OUT { E7 44 } 44 # AX OUT ( deprecated) { E7 44 } AL 45 # OUT { E6 45 } AX DX OUT { EF } AL DX OUT { EE } AX POP { 58 } ES POP { 07 } wvar [BX] POP { 8F 87 35 12 } POPF { 9D } AX PUSH { 50 } CS PUSH { 0E } wvar [BX] PUSH { FF B7 35 12 } \ 8086 PUSHF { 9C } CX RCL { D1 D1 } AX CL RCL { D3 D0 } wvar ) RCL { D1 16 35 12 } wvar ) CL RCL { D3 16 35 12 } CL 1 RCR { D0 D9 } AL CL RCR { D2 D8 } bvar ) BYTE RCR { D0 1E 34 12 } bvar ) CL BYTE RCR { D2 1E 34 12 } REP BYTE LODS { F3 AC } REPZ BYTE LODS { F3 AC } REPNZ BYTE LODS { F2 AC } \ 8086 RET { C3 } 5 +RET { C2 05 00 } FAR RET { CB } 1234 FAR +RET { CA 34 12 } CL 1 ROR { D0 C9 } AL CL ROR { D2 C8 } bvar ) BYTE ROR { D0 0E 34 12 } bvar ) CL BYTE ROR { D2 0E 34 12 } CL 1 ROL { D0 C1 } AL CL ROL { D2 C0 } bvar ) BYTE ROL { D0 06 34 12 } bvar ) CL BYTE ROL { D2 06 34 12 } \ 8086 SAHF { 9E } CL 1 SHL { D0 E1 } AL CL SHL { D2 E0 } bvar ) BYTE SHL { D0 26 34 12 } bvar ) CL BYTE SHL { D2 26 34 12 } CL 1 SAR { D0 F9 } AL CL SAR { D2 F8 } bvar ) BYTE SAR { D0 3E 34 12 } bvar ) CL BYTE SAR { D2 3E 34 12 } \ 8086 CH BH SBB { 18 EF } 0 [SI] CX SBB { 1B 0C } CL 0 [SI] SBB { 18 0C } 6789 # BX SBB { 81 DB 89 67 } 9988 # wvar ) SBB { 81 1E 35 12 88 99 } FF80 # wvar ) SBB { 83 1E 35 12 80 } 5 # AX SBB { 1D 05 00 } BYTE SCAS { AE } SCAS { AF } CL 1 SHR { D0 E9 } AL CL SHR { D2 E8 } bvar ) BYTE SHR { D0 2E 34 12 } bvar ) CL BYTE SHR { D2 2E 34 12 } \ 8086 SS: { 36 } STC { F9 } STD { FD } STI { FB } BYTE STOS { AA } STOS { AB } \ 8086 DH DL SUB { 28 F2 } 0 [SI] CX SUB { 2B 0C } DL 0 [SI] SUB { 28 14 } 6789 # BX SUB { 81 EB 89 67 } 1234 # wvar ) SUB { 81 2E 35 12 34 12 } FF80 # wvar ) SUB { 83 2E 35 12 80 } 5 # AX SUB { 2D 05 00 } SI SI TEST { 85 F6 } CX 0 [SI] TEST { 85 0C } 6789 # BX TEST { F7 C3 89 67 } 1239 # wvar ) TEST { F7 06 35 12 39 12 } 5 # AX TEST { A9 05 00 } \ 8086 WAIT { 9B } DI AX XCHG { 97 } BL AL XCHG { 86 C3 } BX CX XCHG { 87 CB } DX wvar ) XCHG { 87 16 35 12 } wvar ) DX XCHG { 87 16 35 12 } DL wvar ) XCHG { 86 16 35 12 } wvar ) DL XCHG { 86 16 35 12 } AX 0 [SI] XCHG { 87 04 } 0 [SI] AX XCHG { 87 04 } 0 [SI] AL XCHG { 86 04 } AL 0 [SI] XCHG { 86 04 } XLAT { D7 } \ 8086 BX SI XOR { 31 DE } 0 [SI] CX XOR { 33 0C } DX 0 [SI] XOR { 31 14 } 6789 # BX XOR { 81 F3 89 67 } 1234 # wvar ) XOR { 81 36 35 12 34 12 } FF80 # wvar ) XOR { 83 36 35 12 80 } 5 # AX XOR { 35 05 00 } \ 8086 1 $: 1 $ JNZ 1 $ ) JMP 1 $ ) CALL { 75 FE EB FC E8 F9 FF } 1 $ JNZ 1 $ ) JMP 1 $ ) CALL 1 $: { 75 06 E9 03 00 E8 00 00 } 1 $ ) AL MOV 1 $ ) AX MOV 1 $: { A0 adr A1 adr } AL 1 $ ) MOV AX 1 $ ) MOV 1 $: { A2 adr A3 adr } \ 8086 1 $ ) BL MOV 1 $ ) BX MOV 1 $: { 8A 1E adr 8B 1E adr } 1 $ # AX MOV 1 $: { B8 adr } 3 $ JNZ 1 $: 2 $ JNZ 2 $: 4 $ JNZ 3 $: 2 $ JNZ 4 $: 1 $ JNZ { 75 04 75 00 75 02 75 FC 75 F8 } .( 8087 ) FABS { D9 E1 } ST(1) ST FADD { D8 C1 } ST ST(1) FADD { DC C1 } 9871 [BX] DWORD FADD { D8 87 71 98 } 9871 [BX] FADD { DC 87 71 98 } ST(2) FADDP { DE C2 } wvar ) FBLD { DF 26 35 12 } 8765 [BX] FBSTP { DF B7 65 87 } \ 8087 FCHS { D9 E0 } FCLEX { DB E2 } ST(3) FCOM { D8 D3 } 0 [BP] DWORD FCOM { D8 56 00 } 0 [SI] FCOM { DC 14 } ST(4) FCOMP { D8 DC } 1234 [BP] DWORD FCOMP { D8 9E 34 12 } 9876 [BX] FCOMP { DC 9F 76 98 } FCOMPP { DE D9 } FCOS ( 387 only ) { D9 FF } \ 8087 FDECSTP { D9 F6 } FDISI { DB E1 } ST(5) ST FDIV { D8 F5 } ST ST(4) FDIV { DC FC } wvar ) DWORD FDIV { D8 36 35 12 } wvar ) FDIV { DC 36 35 12 } ST(5) FDIVP { DE FD } ST(6) ST FDIVR { D8 FE } ST ST(5) FDIVR { DC F5 } wvar ) DWORD FDIVR { D8 3E 35 12 } wvar ) FDIVR { DC 3E 35 12 } \ 8087 ST(7) FDIVRP { DE F7 } FENI { DB E0 } ST(1) FFREE { DD C1 } wvar ) WORD FIADD { DE 06 35 12 } wvar ) DWORD FIADD { DA 06 35 12 } wvar ) WORD FICOM { DE 16 35 12 } wvar ) DWORD FICOM { DA 16 35 12 } wvar ) WORD FICOMP { DE 1E 35 12 } wvar ) DWORD FICOMP { DA 1E 35 12 } \ 8087 wvar ) WORD FIDIV { DE 36 35 12 } wvar ) DWORD FIDIV { DA 36 35 12 } wvar ) WORD FIDIVR { DE 3E 35 12 } wvar ) DWORD FIDIVR { DA 3E 35 12 } wvar ) WORD FILD { DF 06 35 12 } wvar ) DWORD FILD { DB 06 35 12 } wvar ) FILD { DF 2E 35 12 } wvar ) WORD FIMUL { DE 0E 35 12 } wvar ) DWORD FIMUL { DA 0E 35 12 } \ 8087 FINCSTP { D9 F7 } FINIT { DB E3 } wvar ) WORD FIST { DF 16 35 12 } wvar ) DWORD FIST { DB 16 35 12 } wvar ) WORD FISTP { DF 1E 35 12 } wvar ) DWORD FISTP { DB 1E 35 12 } wvar ) FISTP { DF 3E 35 12 } wvar ) WORD FISUB { DE 26 35 12 } wvar ) DWORD FISUB { DA 26 35 12 } \ 8087 wvar ) WORD FISUBR { DE 2E 35 12 } wvar ) DWORD FISUBR { DA 2E 35 12 } ST(0) FLD { D9 C0 } wvar ) DWORD FLD { D9 06 35 12 } wvar ) FLD { DD 06 35 12 } wvar ) FLDCW { D9 2E 35 12 } wvar ) FLDENV { D9 26 35 12 } \ 8087 FLDLG2 { D9 EC } FLDLN2 { D9 ED } FLDL2E { D9 EA } FLDL2T { D9 E9 } FLDPI { D9 EB } FLDZ { D9 EE } FLD1 { D9 E8 } ST(1) ST FMUL { D8 C9 } ST ST(3) FMUL { DC CB } wvar ) DWORD FMUL { D8 0E 35 12 } wvar ) FMUL { DC 0E 35 12 } ST(2) FMULP { DE CA } \ 8087 FNOP { D9 D0 } FPATAN { D9 F3 } FPREM { D9 F8 } FPREM1 ( 387 only ) { D9 F5 } FPTAN { D9 F2 } FRNDINT { D9 FC } 1234 ) FRSTOR { DD 26 34 12 } 1234 [BX] FSAVE { DD B7 34 12 } FSCALE { D9 FD } FSIN ( 387 only ) { D9 FE } FSINCOS ( 387 only ) { D9 FB } FSQRT { D9 FA } \ 8087 ST(5) FST { DD D5 } wvar ) DWORD FST { D9 16 35 12 } wvar ) FST { DD 16 35 12 } wvar ) FSTCW { D9 3E 35 12 } wvar ) FSTENV { D9 36 35 12 } ST(0) FSTP { DD D8 } wvar ) DWORD FSTP { D9 1E 35 12 } wvar ) FSTP { DD 1E 35 12 } wvar ) FSTSW { DD 3E 35 12 } AX FSTSW ( 287/387) { DF E0 } \ 8087 ST(1) ST FSUB { D8 E1 } ST ST(1) FSUB { DC E9 } wvar ) DWORD FSUB { D8 26 35 12 } wvar ) FSUB { DC 26 35 12 } ST(6) FSUBP { DE EE } ST(3) ST FSUBR { D8 EB } ST ST(3) FSUBR { DC E3 } wvar ) DWORD FSUBR { D8 2E 35 12 } wvar ) FSUBR { DC 2E 35 12 } ST(3) FSUBRP { DE E3 } \ 8087 wvar ) TBYTE FLD { DB 2E 35 12 } FTST { D9 E4 } wvar ) TBYTE FSTP { DB 3E 35 12 } FXAM { D9 E5 } ST(3) FXCH { D9 CB } FXTRACT { D9 F4 } FYL2X { D9 F1 } FYL2XP1 { D9 F9 } F2XM1 { D9 F0 } |