Compare commits

...

5 Commits

Author SHA1 Message Date
Virgil Dupras 66b27b0790 8086asm: properly initialize DS and DF 2020-06-12 19:07:23 -04:00
Virgil Dupras 177750c928 recipes/pcat: first steps into 8086! 2020-06-12 14:03:31 -04:00
Virgil Dupras 4e18fafe46 8086asm: now enough tooling to assemble a PC/AT Hello World boot 2020-06-12 13:12:41 -04:00
Virgil Dupras 210b833c71 8086asm: begin adding MODRM-enabled ops 2020-06-12 12:07:48 -04:00
Virgil Dupras 749fdf1b18 8086asm: add 8-bit JMP, MOVrI, INT,
Verified against nasm with equivalent code.
2020-06-12 11:29:00 -04:00
14 changed files with 89 additions and 6 deletions

View File

@ -10,7 +10,7 @@ MASTER INDEX
550 TI-84+ Recipe 580 RC2014 Recipe
620 Sega Master System Recipe
650 AVR assembler 730 8086 assembler
810 PC/AT Recipe

View File

@ -2,7 +2,7 @@
Work in progress. Load with "750 LOAD".
Test code at B731

View File

@ -1,2 +0,0 @@
AH 0x42 MOVri,
8 H@ 2 - DUMP

View File

@ -1 +1 @@
1 3 LOADR+
1 5 LOADR+

View File

@ -1,5 +1,8 @@
VARIABLE ORG
CREATE BIN( 0 , : BIN(+ BIN( @ + ;
VARIABLE L1 VARIABLE L2 VARIABLE L3 VARIABLE L4
: AL 0 ; : CL 1 ; : DL 2 ; : BL 3 ;
: AH 4 ; : CH 5 ; : DH 6 ; : BH 7 ;
: AX 8 ; : CX 9 ; : DX 10 ; : BX 11 ;
: SP 12 ; : BP 13 ; : SI 14 ; : DI 15 ;
: ES 0 ; : CS 1 ; : SS 2 ; : DS 3 ;

View File

@ -1,2 +1,8 @@
: PC H@ ORG @ - ;
( Splits word into msb/lsb, lsb being on TOS )
: SPLITB
256 /MOD SWAP
;
: PC H@ ORG @ - BIN( @ + ;
: A, C, ;
( dst8 src8 -- modrm )
: MODRMrr 0x7 AND 3 LSHIFT SWAP 0x7 AND OR 0xc0 OR ;

View File

@ -1 +1,10 @@
: MOVri, SWAP 0xb0 OR A, A, ;
: MOVrI, SWAP 0xb0 OR A, SPLITB A, A, ;
: MOVsx, 0x8e A, SWAP MODRMrr A, ;
: INT, 0xcd A, A, ;
( no argument, flow ops are special )
: JMP8, 0xeb A, ; : JMP16, 0xe9 A, ; : JZ, 0x74 A, ;
: LODSB, 0xac A, ; : CLI, 0xfa A, ; : HLT, 0xf4 A, ;
: ORrr, 0x08 A, MODRMrr A, ;
: XORxx, 0x31 A, MODRMrr A, ;
: CLD, 0xfc A, ; : STD, 0xfd A, ;

16
blk/754 Normal file
View File

@ -0,0 +1,16 @@
( Place BEGIN, where you want to jump back and AGAIN after
a relative jump operator. Just like BSET and BWR. )
: BEGIN, PC ;
: BSET PC SWAP ! ;
( same as BSET, but we need to write a placeholder )
( : FJR, PC 0 A, ;
: IFZ, JRNZ, FJR, ;
: IFNZ, JRZ, FJR, ;
: IFC, JRNC, FJR, ;
: IFNC, JRC, FJR, ; )
: THEN,
DUP PC ( l l pc )
-^ 1- ( l off )
( warning: l is a PC offset, not a mem addr! )
SWAP ORG @ + BIN( @ - ( off addr )
C! ;

9
blk/755 Normal file
View File

@ -0,0 +1,9 @@
: FWR8 BSET 0 A, ;
: FSET @ THEN, ;
( : BREAK, FJR, 0x8000 OR ;
: BREAK?, DUP 0x8000 AND IF
0x7fff AND 1 ALLOT THEN, -1 ALLOT
THEN ; )
: AGAIN, ( BREAK?, ) PC - 1- A, ;
: BWR @ AGAIN, ;

5
blk/810 Normal file
View File

@ -0,0 +1,5 @@
PC/AT Recipe
Work in progress.
811 Hello World boot

14
blk/811 Normal file
View File

@ -0,0 +1,14 @@
: _filler 510 H@ ORG @ - DO 0 A, LOOP 0x55 A, 0xaa A, ;
H@ ORG ! 0x7c00 BIN( ! ( BIOS loads boot bin at 0x7c00 )
JMP8, L1 FWR8 ( start )
L2 BSET ( msg ) ," Hello, World!" 0 A,
L1 FSET ( start )
CLI, CLD, AX AX XORxx, DS AX MOVsx,
AH 0 MOVri, AL 2 MOVri, ( 80x25 BW video mode ) 0x10 INT,
SI L2 @ ( msg ) MOVrI, AH 0x0e MOVri, ( print char )
L1 BSET ( loop ) LODSB, AL AL ORrr, ( end of str? )
JZ, L2 FWR8 ( next ) 0x10 INT, ( print char )
JMP8, L1 ( loop ) BWR
L2 FSET ( next ) AH 0 MOVri, 0x16 INT, ( read kbd )
AH 0x0e MOVri, 0x10 INT, ( spit read char ) HLT, ( done )
_filler

16
recipes/pcat/Makefile Normal file
View File

@ -0,0 +1,16 @@
TARGET = boot.bin
BASEDIR = ../..
EDIR = $(BASEDIR)/emul
STAGE = $(EDIR)/stage
.PHONY: all
all: $(TARGET)
$(TARGET): xcomp.fs $(STAGE)
cat xcomp.fs | $(STAGE) > $@
$(STAGE):
$(MAKE) -C $(EDIR) stage
.PHONY: emul
emul: $(TARGET)
qemu-system-i386 -fda $(TARGET)

3
recipes/pcat/README.md Normal file
View File

@ -0,0 +1,3 @@
# PC/AT recipe
Work in progress.

4
recipes/pcat/xcomp.fs Normal file
View File

@ -0,0 +1,4 @@
750 LOAD
811 LOAD
ORG @ 256 /MOD 2 PC! 2 PC!
H@ 256 /MOD 2 PC! 2 PC!