📄 demo.asm
字号:
PAGE 59,132
;圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹
;圹 圹
;圹 DEMO 圹
;圹 圹
;圹 Created: 2-Mar-89 圹
;圹 Version: 圹
;圹 Passes: 5 Analysis Options on: ABFOP 圹
;圹 Copyright (C) 1986 圹
;圹 圹
;圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹
movseg macro reg16, unused, Imm16 ; Fixup for Assembler
ifidn <reg16>, <bx>
db 0BBh
endif
ifidn <reg16>, <cx>
db 0B9h
endif
ifidn <reg16>, <dx>
db 0BAh
endif
ifidn <reg16>, <si>
db 0BEh
endif
ifidn <reg16>, <di>
db 0BFh
endif
ifidn <reg16>, <bp>
db 0BDh
endif
ifidn <reg16>, <sp>
db 0BCh
endif
ifidn <reg16>, <BX>
db 0BBH
endif
ifidn <reg16>, <CX>
db 0B9H
endif
ifidn <reg16>, <DX>
db 0BAH
endif
ifidn <reg16>, <SI>
db 0BEH
endif
ifidn <reg16>, <DI>
db 0BFH
endif
ifidn <reg16>, <BP>
db 0BDH
endif
ifidn <reg16>, <SP>
db 0BCH
endif
dw seg Imm16
endm
DATA_1E EQU 2CH ; (97DE:002C=0)
DATA_17E EQU 0AC71H ; (97DE:AC71=0FFFFH)
SEG_A SEGMENT BYTE PUBLIC
ASSUME CS:SEG_A, DS:SEG_A
ORG 100h
DEMO PROC FAR
START:
JMP LOC_31 ; (24E1)
OR AX,2020H
AND [DI],CL
OR CL,[SI+4FH]
PUSH SP
PUSH BP
PUSH BX
AND [BX+SI+41H],CL
DEC SP
AND [SI+65H],AL
DB 'monstration', 0DH, 0AH
COPYRIGHT DB 'Copyright (C) 1986'
DB 0DH, 0AH, 'Lotus Development Corp'
DB 'oration', 0DH, 0AH, 'Singular So'
DB 'lutions & GNP', 0DH, 0AH, 'All R'
DB 'ights Reserved', 0DH, 0AH, 'Rele'
DB 'ase 1.00', 0DH, 0AH
DB 1AH, 0DH
DATA_4 DB 0AH, 'Please wait ...', 0DH, 0AH, '$'
DB 'MAGELLAN.DAT', 0
DB 'MAGELLAN.DBD', 0
DB 0DH, 0AH, 0AH, 'Cannot find MAGEL'
DB 'LAN.DAT$'
DB 0DH, 0AH, 0AH, 'Cannot find MAGEL'
DB 'LAN.DBD$'
DATA_7 DB 80 DUP (0)
DATA_8 DB 0FCH
DB 20H, 00H
DB 139 DUP (0)
DB ' -arg mono'
DB 00H, 00H, 49H, 02H
DATA_10 DW 0
DB 5CH, 00H
DATA_11 DW 0
DB 6CH, 00H
DATA_12 DW 0
DEMO ENDP
;圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹
;
; External Entry Point
;
;圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹
INT_23H_ENTRY PROC FAR
MOV AX,600H
MOV BH,7
XOR CX,CX ; Zero register
MOV DX,184FH
INT 10H ; Video display ah=functn 06h
; scroll up, al=lines
MOV AH,2
MOV BH,0
XOR DX,DX ; Zero register
INT 10H ; Video display ah=functn 02h
; set cursor location in dx
MOV AX,4C01H
INT 21H ; DOS Services ah=function 4Ch
; terminate with al=return code
MOV AX,2523H
MOV DX,2F0H
INT 21H ; DOS Services ah=function 25h
; set intrpt vector al to ds:dx
CALL SUB_3 ; (03B1)
MOV SP,414H
PUSHF ; Push flags
MOV AH,9
MOV DX,195H
INT 21H ; DOS Services ah=function 09h
; display char string at ds:dx
MOV AX,1B4H
CALL SUB_4 ; (0495)
MOV DX,1DDH
JC LOC_5 ; Jump if carry Set
MOV BX,AX
MOV AH,3EH ; '>'
INT 21H ; DOS Services ah=function 3Eh
; close file, bx=file handle
PUSH CS
POP ES
MOV SI,1F9H
MOV DI,24BH
CLD ; Clear direction
LOC_2:
INC DATA_8 ; (97DE:0249=0FCH)
LODSB ; String [si] to al
STOSB ; Store al to es:[di]
OR AL,AL ; Zero ?
JNZ LOC_2 ; Jump if not zero
SUB DI,5
MOV SI,2D7H
MOV CX,1
ADD DATA_8,CL ; (97DE:0249=0FCH)
REP MOVSB ; Rep when cx >0 Mov [si] to es:[di]
POPF ; Pop flags
JC LOC_3 ; Jump if carry Set
MOV SI,2D8H
MOV CX,0AH
ADD DATA_8,CL ; (97DE:0249=0FCH)
REP MOVSB ; Rep when cx >0 Mov [si] to es:[di]
LOC_3:
MOV BYTE PTR [DI],0DH
MOV AX,1A7H
CALL SUB_4 ; (0495)
JC LOC_4 ; Jump if carry Set
MOV BX,AX
MOV AH,3EH ; '>'
INT 21H ; DOS Services ah=function 3Eh
; close file, bx=file handle
MOV BX,SP
ADD BX,0FH
MOV CL,4
SHR BX,CL ; Shift w/zeros fill
PUSH CS
POP ES
MOV AH,4AH ; 'J'
INT 21H ; DOS Services ah=function 4Ah
; change mem allocation, bx=siz
MOV AX,CS
MOV ES,AX
MOV DATA_10,AX ; (97DE:02E6=0)
MOV DATA_11,AX ; (97DE:02EA=0)
MOV DATA_12,AX ; (97DE:02EE=0)
MOV AX,4B00H
MOV DX,1F9H
MOV BX,2E2H
INT 21H ; DOS Services ah=function 4Bh
; run progm @ds:dx, parm @es:bx
MOV AX,CS
MOV SS,AX
MOV SP,39DH
MOV DS,AX
JNC LOC_6 ; Jump if carry=0
LOC_4:
MOV DX,1C1H
LOC_5:
MOV AH,9
INT 21H ; DOS Services ah=function 09h
; display char string at ds:dx
LOC_6:
MOV AX,4C00H
INT 21H ; DOS Services ah=function 4Ch
; terminate with al=return code
DATA_13 DB 0
INT_23H_ENTRY ENDP
;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌
; SUBROUTINE
;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘
SUB_3 PROC NEAR
MOV AH,0FH
INT 10H ; Video display ah=functn 0Fh
; get state, al=mode, bh=page
MOV DATA_13,AL ; (97DE:03B0=0)
CMP AL,2
JAE LOC_7 ; Jump if above or =
ADD AL,2
MOV AH,0
INT 10H ; Video display ah=functn 00h
; set display mode in al
LOC_7:
XOR DX,DX ; Zero register
MOV SI,5A0H
CMP DATA_13,7 ; (97DE:03B0=0)
JNE LOC_8 ; Jump if not equal
MOV SI,1540H
LOC_8:
PUSH DX
PUSH SI
MOV AH,2
XOR BH,BH ; Zero register
INT 10H ; Video display ah=functn 02h
; set cursor location in dx
POP SI
CLD ; Clear direction
LODSW ; String [si] to ax
PUSH SI
MOV BL,AH
XOR BH,BH ; Zero register
MOV AH,9
MOV CX,1
INT 10H ; Video display ah=functn 09h
; set char al & attrib bl @curs
POP SI
POP DX
INC DX
CMP DL,50H ; 'P'
JB LOC_8 ; Jump if below
INC DH
MOV DL,0
CMP DH,19H
JB LOC_8 ; Jump if below
MOV AH,2
MOV BH,0
MOV DX,1900H
INT 10H ; Video display ah=functn 02h
; set cursor location in dx
LOC_9:
MOV AX,0C08H
INT 21H ; DOS Services ah=function 0Ch
; clear keybd buffer & input al
CMP DATA_13,7 ; (97DE:03B0=0)
JE LOC_11 ; Jump if equal
CMP AL,4DH ; 'M'
JE LOC_11 ; Jump if equal
CMP AL,6DH ; 'm'
JE LOC_11 ; Jump if equal
CMP AL,43H ; 'C'
JE LOC_10 ; Jump if equal
CMP AL,63H ; 'c'
JE LOC_10 ; Jump if equal
MOV AX,0E07H
XOR BL,BL ; Zero register
INT 10H ; Video display ah=functn 0Eh
; write char al, teletype mode
JMP SHORT LOC_9 ; (0402)
LOC_10:
STC ; Set carry flag
JMP SHORT LOC_12 ; (042B)
LOC_11:
CLC ; Clear carry flag
LOC_12:
PUSHF ; Push flags
MOV AX,600H
MOV BH,7
XOR CX,CX ; Zero register
MOV DX,184FH
INT 10H ; Video display ah=functn 06h
; scroll up, al=lines
MOV AH,2
MOV BH,0
XOR DX,DX ; Zero register
INT 10H ; Video display ah=functn 02h
; set cursor location in dx
POPF ; Pop flags
RETN
SUB_3 ENDP
DB 81 DUP (0)
DATA_15 DW 0
;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌
; SUBROUTINE
;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘
SUB_4 PROC NEAR
MOV DATA_15,AX ; (97DE:0493=0)
MOV DI,443H
CALL SUB_5 ; (0529)
JNC LOC_RET_18 ; Jump if carry=0
MOV ES,DS:DATA_1E ; (97DE:002C=0)
XOR SI,SI ; Zero register
CMP BYTE PTR ES:[SI],50H ; 'P'
JE LOC_21 ; Jump if equal
LOC_13:
CMP WORD PTR ES:[SI],5000H
JE LOC_20 ; Jump if equal
LOC_14:
INC SI
CMP WORD PTR ES:[SI-1],0
JNE LOC_13 ; Jump if not equal
MOV AH,30H ; '0'
INT 21H ; DOS Services ah=function 30h
; get DOS version number ax
CMP AL,3
JB LOC_17 ; Jump if below
MOV DI,443H
XOR CX,CX ; Zero register
LOC_15:
MOV AL,ES:[SI+3]
INC SI
MOV [DI],AL
INC DI
INC CX
OR AL,AL ; Zero ?
JNZ LOC_15 ; Jump if not zero
LOCLOOP_16:
CMP BYTE PTR [DI-1],3AH ; ':'
JE LOC_19 ; Jump if equal
CMP BYTE PTR [DI-1],5CH ; '\'
JE LOC_19 ; Jump if equal
DEC DI
LOOP LOCLOOP_16 ; Loop if cx > 0
LOC_17:
STC ; Set carry flag
LOC_RET_18:
RETN
LOC_19:
CALL SUB_5 ; (0529)
RETN
LOC_20:
INC SI
LOC_21:
INC SI
CMP WORD PTR ES:[SI],5441H
JNE LOC_14 ; Jump if not equal
INC SI
INC SI
CMP WORD PTR ES:[SI],3D48H
JNE LOC_14 ; Jump if not equal
INC SI
INC SI
LOC_22:
MOV DI,443H
LOC_23:
MOV AL,ES:[SI]
CMP AL,0
JE LOC_24 ; Jump if equal
INC SI
MOV [DI],AL
INC DI
CMP AL,3BH ; ';'
JNE LOC_23 ; Jump if not equal
DEC DI
CMP DI,443H
JE LOC_22 ; Jump if equal
CALL SUB_5 ; (0529)
JC LOC_22 ; Jump if carry Set
RETN
LOC_24:
CMP DI,443H
JE LOC_14 ; Jump if equal
CALL SUB_5 ; (0529)
JC LOC_14 ; Jump if carry Set
RETN
SUB_4 ENDP
;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌
; SUBROUTINE
;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘
SUB_5 PROC NEAR
MOV WORD PTR [DI],0
MOV BX,445H
MOV AX,[BX-2]
CMP AH,3AH ; ':'
JE LOC_25 ; Jump if equal
MOV AH,19H
INT 21H ; DOS Services ah=function 19h
; get default drive al (0=a:)
CBW ; Convrt byte to word
ADD AX,3A41H
DEC BX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -