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 "MSZIP.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 "MSZIP 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