1
0
mirror of https://github.com/hsoft/collapseos.git synced 2025-04-02 15:28:39 +11:00

8086asm: add support for modrm 8-bit displacement

This commit is contained in:
Virgil Dupras 2020-06-15 06:52:47 -04:00
parent d8d2e05eb2
commit dabbd6c253
6 changed files with 17 additions and 12 deletions

View File

@ -6,7 +6,7 @@ Mnemonics are followed by argument types. For example, MOVri,
moves 8-bit immediate to 8-bit register. moves 8-bit immediate to 8-bit register.
'r' = 8-bit register 'x' = 16-bit register 'r' = 8-bit register 'x' = 16-bit register
'i' = immediate, size depends on other operand. 'i' = 8-bit immediate 'I' = 16-bit immediate
's' = SREG register 's' = SREG register
Mnemonics that only have one signature (for example INT,) don't Mnemonics that only have one signature (for example INT,) don't

View File

@ -1,11 +1,16 @@
: OPrm CREATE C, DOES> C@ A, SWAP 3 LSHIFT OR A, ; : OPrm CREATE C, DOES> C@ A, SWAP 3 LSHIFT OR A, ;
0x8a OPrm MOVr[], 0x8b OPrm MOVx[], 0x8a OPrm MOVr[], 0x8b OPrm MOVx[],
: OPrm+ ( r m off ) CREATE C, DOES>
C@ A, ROT 3 LSHIFT ROT OR 0x40 OR A, A, ;
0x8a OPrm+ MOVr[]+, 0x8b OPrm+ MOVx[]+,
: MOVri, SWAP 0xb0 OR A, A, ; : MOVri, SWAP 0xb0 OR A, A, ;
: MOVxi, SWAP 0xb8 OR A, A,, ; : MOVxI, SWAP 0xb8 OR A, A,, ;
: MOVsx, 0x8e A, SWAP 3 LSHIFT OR 0xc0 OR A, ; : MOVsx, 0x8e A, SWAP 3 LSHIFT OR 0xc0 OR A, ;
: MOVxm, 0x8b A, SWAP 3 LSHIFT 0x6 OR A, A,, ; : MOVxm, 0x8b A, SWAP 3 LSHIFT 0x6 OR A, A,, ;
: INT, 0xcd A, A, ; : INT, 0xcd A, A, ;
: ADDAXi, 0x05 A, A,, ; : ADDALi, 0x04 A, A, ; : ADDAXI, 0x05 A, A,, ; : ADDALi, 0x04 A, A, ;
: SUBxi, 0x83 A, SWAP 0xe8 OR A, A, ;
: JMPr, 0xff A, 7 AND 0xe0 OR A, ; : JMPr, 0xff A, 7 AND 0xe0 OR A, ;
: JMPf, ( seg off ) 0xea A, SPLITB A, A, A,, ; : JMPf, ( seg off ) 0xea A, SPLITB A, A, A,, ;

View File

@ -2,9 +2,9 @@ H@ ORG ! 0x7c00 BIN( ! ( BIOS loads boot bin at 0x7c00 )
JMPs, L1 FWRs ( start ) JMPs, L1 FWRs ( start )
ORG @ 0x25 + HERE ! ( bypass BPB ) ORG @ 0x25 + HERE ! ( bypass BPB )
L1 FSET ( start ) L1 FSET ( start )
CLI, CLD, AX 0x800 MOVxi, DS AX MOVsx, ES AX MOVsx, CLI, CLD, AX 0x800 MOVxI, DS AX MOVsx, ES AX MOVsx,
SS AX MOVsx, SP 0xffff MOVxi, STI, SS AX MOVsx, SP 0xffff MOVxI, STI,
AH 2 MOVri, DX 0 MOVxi, CH 0 MOVri, CL 2 MOVri, AL 1 MOVri, AH 2 MOVri, DX 0 MOVxI, CH 0 MOVri, CL 2 MOVri, AL 1 MOVri,
BX 0 MOVxi, 0x13 INT, ( read 2nd sector of boot floppy ) BX 0 MOVxI, 0x13 INT, ( read 2nd sector of boot floppy )
0x800 0 JMPf, 0x800 0 JMPf,
ORG @ 0x1fe + HERE ! 0x55 A, 0xaa A, ORG @ 0x1fe + HERE ! 0x55 A, 0xaa A,

View File

@ -5,12 +5,12 @@ L4 BSET PC 3 - ORG @ 4 + ! ( find )
SI INCx, ( first char ) AX AX XORxx, ( initial prev ) SI INCx, ( first char ) AX AX XORxx, ( initial prev )
BEGIN, ( loop ) BEGIN, ( loop )
DI AX SUBxx, ( jump to prev wordref ) DI AX SUBxx, ( jump to prev wordref )
DI DECx, AL [DI] MOVr[], ( strlen ) AL [DI] -1 MOVr[]+, ( strlen )
CL AL CMPrr, IFZ, ( same len ) CL AL CMPrr, IFZ, ( same len )
SI PUSHx, DI PUSHx, CX PUSHx, ( --> lvl 3 ) SI PUSHx, DI PUSHx, CX PUSHx, ( --> lvl 3 )
2 ADDALi, ( prev ) AH AH XORrr, DI AX SUBxx, 3 ADDALi, ( header ) AH AH XORrr, DI AX SUBxx,
REPZ, CMPSB, REPZ, CMPSB,
CX POPx, DI POPx, SI POPx, ( <-- lvl 3 ) CX POPx, DI POPx, SI POPx, ( <-- lvl 3 )
IFZ, DI INCx, AL AL XORrr, ( Z ) RETn, THEN, IFZ, AL AL XORrr, ( Z ) RETn, THEN,
THEN, THEN,
( cont. ) ( cont. )

View File

@ -1,5 +1,5 @@
( find cont. ) ( find cont. )
DI DECx, DI DECx, AX [DI] MOVx[], ( prev ) DI 3 SUBxi, AX [DI] MOVx[], ( prev )
AX AX ORxx, AX AX ORxx,
JNZ, AGAIN, ( loop ) JNZ, AGAIN, ( loop )
AX INCx, ( NZ ) RETn, AX INCx, ( NZ ) RETn,

View File

@ -1,7 +1,7 @@
L3 BSET 3 A, 'F' A, 'O' A, 'O' A, L3 BSET 3 A, 'F' A, 'O' A, 'O' A,
PC 3 - ORG @ 1+ ! ( main ) PC 3 - ORG @ 1+ ! ( main )
DI 0x08 MOVxm, ( LATEST ) DI 0x08 MOVxm, ( LATEST )
SI L3 @ MOVxi, SI L3 @ MOVxI,
CALLn, L4 @ RPCn, ( find ) CALLn, L4 @ RPCn, ( find )
IFZ, JMPs, L1 @ RPCs, ( execute ) THEN, IFZ, JMPs, L1 @ RPCs, ( execute ) THEN,
AH 0x0e MOVri, ( print char ) AL '!' MOVri, 0x10 INT, AH 0x0e MOVri, ( print char ) AL '!' MOVri, 0x10 INT,