mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-02-08 09:11:27 +00:00
92 lines
1.3 KiB
NASM
92 lines
1.3 KiB
NASM
TITLE BOOT BOOTSTRAP LOADER FOR ZORK
|
|
|
|
ABS SEGMENT AT 0H
|
|
ABS ENDS
|
|
|
|
STK SEGMENT PARA STACK
|
|
STK ENDS
|
|
|
|
DATA SEGMENT WORD
|
|
DATA ENDS
|
|
|
|
CODE SEGMENT PARA
|
|
ASSUME CS:CODE
|
|
|
|
START PROC FAR
|
|
CLI
|
|
SUB AX,AX
|
|
MOV DS,AX
|
|
MOV BX,78H
|
|
MOV CX,OFFSET CS:TBL$
|
|
MOV DX,7C0H ; SIGH
|
|
MOV SI,[BX]
|
|
MOV DI,[BX+2]
|
|
MOV [BX],CX
|
|
MOV [BX+2],DX
|
|
|
|
MOV AX,CS
|
|
MOV DS,AX
|
|
MOV DX,0
|
|
MOV SS,DX
|
|
MOV BX,7C00H
|
|
MOV SP,BX
|
|
STI
|
|
|
|
MOV AX,60H
|
|
MOV DS,AX
|
|
MOV ES,AX ; LOAD THE GAME AT SEGMENT 60H
|
|
SUB AX,AX
|
|
SUB DX,DX
|
|
INT 13H ; RESET THE DISK SYSTEM
|
|
MOV DX,3 ; WILL NEED THREE PASSES
|
|
SUB BX,BX ; LOAD TO ES:[BX]
|
|
MOV CH,1 ; START WITH TRACK 1
|
|
LOOP$: PUSH DX ; GET NUMBER OF PASSES NEEDED TO LOAD
|
|
MOV CL,1 ; TRACK N, SECTOR 0
|
|
PUSH CX
|
|
SUB DX,DX ; DRIVE 0, HEAD 0
|
|
MOV AX,0204H ; READ, 4 SECTORS
|
|
INT 13H
|
|
JC YUK$
|
|
POP CX ; GET BACK TRACK,SECTOR
|
|
INC CH ; NEXT TRACK NEXT TIME
|
|
ADD BX,1000H ; NEXT BUNCH OF CORE ALSO
|
|
POP DX
|
|
DEC DX
|
|
JNZ LOOP$ ; LOOP UNTIL DONE
|
|
SUB AX,AX
|
|
MOV DS,AX
|
|
MOV BX,78H
|
|
MOV [BX],SI
|
|
MOV [BX+2],DI
|
|
PUSH ES ; ES IS WHERE WE LOADED THE GAME
|
|
SUB AX,AX
|
|
PUSH AX ; CODE STARTS AT ZERO
|
|
RET ; JUMP TO INTERPRETER
|
|
YUK$: SUB BX,BX
|
|
MOV AL,"I"
|
|
MOV AH,14
|
|
INT 10H
|
|
MOV AL,"L"
|
|
MOV AH,14
|
|
INT 10H
|
|
MOV AL,"L"
|
|
MOV AH,14
|
|
INT 10H
|
|
HLT
|
|
TBL$ DB 11001111B
|
|
DB 2
|
|
DB 37
|
|
DB 3
|
|
DB 4
|
|
DB 02AH
|
|
DB 0FFH
|
|
DB 050H
|
|
DB 0F6H
|
|
DB 25
|
|
DB 4
|
|
START ENDP
|
|
CODE ENDS
|
|
|
|
END START
|