This code is quick and dirty, with the only purpose of perserving in a known place all registers at statup and loading second phase (next 32 sectors) into lower memory.
From what I understand, not all BIOS's begin with CS = 0000 & IP = 7C00. For my segmentation model, I want 7C0:0006
- 00 EA0600C007 jmp word 7c0:06
- 06 FA cli
On the machines I have to work with, I've discovered inital SP is at either 7C00 or 400. When lower, the pointer is actually at 3EC so after this it would be 3D4. In that case, hopefully this doesn't trash BIOS IVT.
- 07 60 pushaw
- 08 16 push ss
- 09 06 push es
- 0A 1E push ds
- 0B 0E push cs
Stack is about to be trashed so, SS:SP need to be kept in a safe place temporarily
- 0C 8CD3 mov bx,ss
- 0E 89E6 mov si,sp
If for no other reason that I can, I've choosen to place bottom of stack at what
BIOS believes to be top of memory.
- 10 B84000 mov ax,40
- 13 8ED8 mov ds,ax
- 15 A11300 mov ax,[13] Usually somewhere between 280H & 27FH
- 18 C1E002 shl ax,2
- 1B BC2000 mov sp,20
- 1E 29E0 sub ax,sp
- 20 8ED0 mov ss,ax
- 22 C1E404 shl sp,4 Room for 256 words. Should be enough
Subsequent code will alter stack until these pieces of data have been displayed.
- 25 53 push bx
- 26 56 push si
- 27 52 push dx
Finish by setting Data & Extra segments appropriately.
- 28 8CC8 mov ax,cs
- 2A 8ED8 mov ds,ax
- 2C 8EC0 mov es,ax
- 2E FB sti
The lions share of work is done from this point, but as not to be restricted by space (512 bytes), The next 32 sectors second phase is loaded @ 80:0
- 2F 06 push es
- 30 B88000 mov ax,80
- 33 8EC0 mov es,ax
- 35 31DB xor bx,bx
- 37 B90200 mov cx,2
- 3A B82002 mov ax,220
- 3D CD13 int 13
- 3F 07 pop es
- 40 723E jc 80
Complete source attached.