diff --git a/sectorlisp.S b/sectorlisp.S index 74b2e14..483090c 100644 --- a/sectorlisp.S +++ b/sectorlisp.S @@ -36,13 +36,19 @@ kCdr: .asciz "CDR" # ordering matters kCons: .asciz "CONS" # ordering matters kEq: .asciz "EQ" # needs to be last -begin: push %cs # that means ss = ds = es = cs +begin: xor %sp,%sp # use highest address as stack + # set independently of SS! + # 8088 doesn't stop interrupts + # after SS is set, and PC BIOS + # sets SP to a value that will + # damage our code if int fires + # between setting SS and SP + push %cs # that means ss = ds = es = cs pop %ds # noting ljmp set cs to 0x7c00 push %cs # that's the bios load address pop %es # therefore NULL points to NUL push %cs # terminated NIL string above! pop %ss # errata exists but don't care - xor %sp,%sp # use highest address as stack mov $2,%bx main: mov $0x8000,%cx # dl (g_look) is zero or cr call GetToken