mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-01-13 23:27:21 +00:00
213 lines
2.9 KiB
NASM
213 lines
2.9 KiB
NASM
TITLE CREATE IML FILE LOADER/DUMPER
|
|
|
|
SUBTTL CONSTANTS, DATA, STACK, ETC
|
|
PAGE +
|
|
|
|
RECSIZ EQU 14 ; OFFSET FOR RECORD SIZE IN FCB
|
|
RNDREC EQU 33 ; OFFSET FOR RANDOM RECORD SLOT
|
|
|
|
DTASIZ EQU 2200H
|
|
DTABKS EQU 20H
|
|
|
|
SEQRD EQU 14H ; CONSTANTS DEFINED BY DOS
|
|
SEQWR EQU 15H
|
|
FILSIZ EQU 23H
|
|
SDTA EQU 1AH
|
|
FILOPN EQU 0FH
|
|
FILCLS EQU 10H
|
|
FILMAK EQU 16H
|
|
FILDEL EQU 13H
|
|
|
|
STK_SG SEGMENT PARA STACK
|
|
DW 20H DUP(?)
|
|
STK_TOP LABEL WORD
|
|
STK_SG ENDS
|
|
|
|
DATA_SG SEGMENT PARA
|
|
|
|
ASKNAM DB "Name of game: ",80H
|
|
NONAME DB "No name supplied",0
|
|
NOINT DB "TIZIP.EXE not found",0
|
|
WRTERR DB "Disk write error on drive B",0
|
|
DONE DB "Finis",0
|
|
|
|
INBUF DB 9
|
|
INCNT DB 0
|
|
GAMNAM DB " "
|
|
GAMEXT DB "EXE"
|
|
DB 25 DUP(0)
|
|
|
|
ZIPFCB DB 0
|
|
DB "TIZIP EXE"
|
|
DB 25 DUP(0)
|
|
|
|
DTA DB DTASIZ DUP(0) ; DISK TRANSFER AREA
|
|
|
|
DATA_SG ENDS
|
|
|
|
SUBTTL MACROS
|
|
PAGE +
|
|
|
|
MOVM MACRO D,S,R
|
|
MOV R,S
|
|
MOV D,R
|
|
ENDM
|
|
|
|
FATAL MACRO STR
|
|
PRINT STR
|
|
JMP EXIT
|
|
ENDM
|
|
|
|
PRINT MACRO STR
|
|
PUSH AX
|
|
MOV AX,OFFSET STR
|
|
CALL .PRINT
|
|
POP AX
|
|
ENDM
|
|
|
|
DISK MACRO X,Y
|
|
MOV AH,X
|
|
MOV DX,OFFSET Y
|
|
INT 21H
|
|
ENDM
|
|
|
|
SETDTA MACRO
|
|
MOV AH,SDTA
|
|
MOV DX,OFFSET DTA
|
|
INT 21H
|
|
ENDM
|
|
|
|
RECCNT MACRO X,Y
|
|
DISK FILSIZ,X
|
|
MOV DI,OFFSET X
|
|
MOV Y,RNDREC[DI] ; LOAD THE # OF PASSES WE NEED TO MAKE
|
|
CMP AL,0
|
|
ENDM
|
|
|
|
SETSIZ MACRO X
|
|
MOV DI,OFFSET X
|
|
MOV WORD PTR RECSIZ[DI],DTASIZ
|
|
ENDM
|
|
|
|
SUBTTL CODE
|
|
PAGE +
|
|
|
|
CODE_SG SEGMENT PARA
|
|
ASSUME CS:CODE_SG,DS:DATA_SG,SS:STK_SG
|
|
|
|
START PROC FAR
|
|
MOVM DS,DATA_SG,AX
|
|
MOVM SS,STK_SG,AX
|
|
MOV SP,OFFSET STK_TOP
|
|
PUSH ES ; SAVE OLD ES FOR DOS RETURN
|
|
MOVM ES,DATA_SG,AX
|
|
JMP MAIN
|
|
START ENDP
|
|
|
|
EXIT PROC FAR
|
|
SUB AX,AX ; OLD ES IS ALREADY ON THE STACK
|
|
PUSH AX
|
|
RET
|
|
EXIT ENDP
|
|
|
|
MAIN PROC
|
|
SETSIZ ZIPFCB
|
|
RECCNT ZIPFCB,CX
|
|
JZ ZIP1
|
|
FATAL NOINT
|
|
ZIP1: DISK FILOPN,ZIPFCB
|
|
SETSIZ ZIPFCB
|
|
SETDTA
|
|
DISK SEQRD,ZIPFCB
|
|
DISK FILCLS,ZIPFCB
|
|
|
|
PRINT ASKNAM
|
|
MOV DX,OFFSET INBUF
|
|
MOV AH,0AH
|
|
INT 21H ; READ A LINE FROM THE TTY
|
|
MOV DL,10
|
|
MOV AH,6
|
|
INT 21H ; LINE FEED
|
|
MOV AL,INCNT
|
|
CMP AL,0
|
|
JNE ZIP2
|
|
FATAL NONAME
|
|
|
|
ZIP2: MOV BX,OFFSET GAMNAM
|
|
MOV CX,8
|
|
ZIP21L: MOV AL,BYTE PTR [BX]
|
|
CMP AL,0DH
|
|
JNE ZIP21
|
|
MOV BYTE PTR [BX],20H
|
|
ZIP21: ADD BX,1
|
|
LOOP ZIP21L
|
|
|
|
MOV BX,OFFSET DTA+0201H ; OFFSET TO DS
|
|
MOV BX,[BX]
|
|
MOV CL,4
|
|
SHL BX,CL
|
|
PUSH BX
|
|
ADD BX,OFFSET DTA+0201H
|
|
MOV BP,OFFSET GAMNAM
|
|
MOV CX,8
|
|
ZIPL1: MOV AL,BYTE PTR DS:[BP]
|
|
CMP AL,0DH
|
|
JNE ZIPL1A
|
|
MOV AL,20H
|
|
ZIPL1A: MOV BYTE PTR [BX],AL
|
|
ADD BX,1
|
|
ADD BP,1
|
|
LOOP ZIPL1
|
|
POP BX
|
|
ADD BX,OFFSET DTA+022BH
|
|
MOV BP,OFFSET GAMNAM
|
|
MOV CX,8
|
|
ZIPL2: MOV AL,BYTE PTR DS:[BP]
|
|
CMP AL,0DH
|
|
JNE ZIPL2A
|
|
MOV AL,20H
|
|
ZIPL2A: MOV BYTE PTR [BX],AL
|
|
ADD BX,1
|
|
ADD BP,1
|
|
LOOP ZIPL2
|
|
MOV INCNT,0 ; THIS IS NOW AN FCB
|
|
MOV GAMEXT,"E"
|
|
DISK FILDEL,INCNT
|
|
DISK FILMAK,INCNT
|
|
SETSIZ INCNT
|
|
DISK SEQWR,INCNT
|
|
DISK FILCLS,INCNT
|
|
FATAL DONE
|
|
MAIN ENDP
|
|
|
|
.PRINT PROC
|
|
PUSH BX
|
|
MOV BX,AX
|
|
.PR1$: MOV AL,[BX]
|
|
CMP AL,0
|
|
JE .PR2$
|
|
CMP AL,80H
|
|
JE .PR3$
|
|
CALL .TTYOUT
|
|
INC BX
|
|
JMP .PR1$
|
|
.PR2$: NOP
|
|
.PR3$: POP BX
|
|
RET
|
|
.PRINT ENDP
|
|
|
|
.TTYOUT PROC
|
|
PUSH BX
|
|
PUSH BP
|
|
MOV DL,AL
|
|
MOV AH,02H
|
|
SUB DH,DH
|
|
INT 21H
|
|
POP BP
|
|
POP BX
|
|
RET
|
|
.TTYOUT ENDP
|
|
|
|
CODE_SG ENDS
|
|
|
|
END START |