0100 B8 30 11 0 MOV AX,1130
0103 32 FF 2 XOR BH,BH
0105 CD 10 INT 10 ;DL=rows-1
0107 B4 0F MOV AH,0F
0109 CD 10 INT 10 ;AH=columns
010B 8A F4 MOV DH,AH ;DH=columns
010D 0E PUSH CS
010E 07 POP ES ;restore ES
010F 33 F6 3 XOR SI,SI ;SI=screen offset
0111 BF 00 02 MOV DI,0200 ;DI=data store
0114 8B EF MOV BP,DI ;BP=contains offset of end of
; last non-blank line
0116 57 W PUSH DI ;stack=0200
0117 B8 00 B8 MOV AX,B800
011A 8E D8 MOV DS,AX ;DS=screen segment
011C 0F B6 CE MOVZX CX,DH ;CX=screen columns
011F 8B DF MOV BX,DI ;BX=offset of last non-blank
0121 AD LODSW ;get next character
0122 A8 DF TEST AL,DF
0124 75 02 u JNZ 0128
0126 B0 20 MOV AL,20 ;00=>SPACE
0128 AA STOSB ;store
0129 74 02 t JZ 012D
012B 8B DF MOV BX,DI ;BX updated every non-blank
012D E2 F2 LOOP 0121 ;
012F 87 FB XCHG BX,DI ;DI=last non-blank on line
0131 2B DF + SUB BX,DI ;BX=#trailing blanks on line
0133 B8 0D 0A MOV AX,0A0D
0136 AB STOSW ;append newline to store
0137 38 F3 8 CMP BL,DH ;line is all blanks?
0139 74 02 t JZ 013D
013B 8B EF MOV BP,DI ;if not update BP to include
;up to this line
013D FE CA DEC DL ;loop for each screen row
013F 79 DB y JNS 011C
0141 0E PUSH CS
0142 1F POP DS
0143 BA 5B 01 [ MOV DX,015B ;DS:DX="SNAP"
0146 33 C9 3 XOR CX,CX
0148 B4 3C < MOV AH,3C
014A CD 21 ! INT 21 ;open create file
014C 93 XCHG BX,AX
014D 5A Z POP DX ;DX=0200 (data start)
014E 8B CD MOV CX,BP ;CX=data bytes upto
0150 2B CA + SUB CX,DX ; last non-blank line
0152 B4 40 @ MOV AH,40
0154 CD 21 ! INT 21 ;write file
0156 B4 3E > MOV AH,3E ;close file
0158 CD 21 ! INT 21
015A C3 RET
=D15BL5 ;default filename
015B 53 4E 41 50 00 SNAP
=Q