2023-11-16 18:19:54 -05:00

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