荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: edguo (Computer Digger), 信区: Program
标 题: asm source
发信站: 荔园晨风BBS站 (Fri May 25 03:40:57 2001), 转信
首天在此发表愚论, 送大家两个以前写的assembler source.
希望主修汇编的同学们好好学习这门基础课----
她锻炼你的严密思维能力.
* 这是1998年我到现在为止写的最后一个纯汇编程序,
是DOS下将flash memory变为logical drive 的东东.
这间公司的所有主力都是深大电子系91级的, 如果你看懂了这个,
我敢保证你的汇编已经比较可以了. ;>
http://ftp.simtel.net/pub/simtelnet/msdos/ramdisk/flashdsk.zip
* 这个是我很久以前写的一个小游戏, 比较不怎么样,但当时感觉还可以,
就是学了汇编没多久写的. 直接paste:
;
;PUZZLE v1.2 Update: 6-20-94
;Computer Digger Author: Edward Guo
;91 Computer Science of Shenzhen University
;
code segment
assume cs:code,ds:code,es:code
org 100h
@start: jmp @begin
;-----------------------
hotkey equ 3ah; 'CapsLock'
hintlen equ 28
int22ofs equ 000ah
paramofs equ 80h
paramlen equ 100h-80h
winbufofs equ paramofs+hintlen+1
ltop equ '?';'?'
rtop equ '?';'?'
vmid equ '?';'?'
hmid equ '?';'?'
lb equ '?';'?'
rb equ '?';'?'
column equ 21
row equ 7
minx equ 0
miny equ 0
maxx equ 80-column
maxy equ 25-row
midlen equ 19
msgofs equ 15
listlen equ 16
delaytick equ 15000
cclow equ 3fh
cchigh equ 70h
cctext equ 30h
cchot equ 3dh
cmlow equ 7fh
cmhigh equ 07h
cmtext equ 70h
cmhot equ 09h
vcseg equ 0b800h
vmseg equ 0b000h
up equ 48h
down equ 50h
left equ 4bh
right equ 4dh
pgup equ 49h
pgdn equ 51h
home equ 47h
endk equ 4fh
cup equ 8dh
cdown equ 91h
cleft equ 73h
cright equ 74h
winbuf db (column*row*2-paramlen+hintlen-1) dup(0)
atitle db 15h,30h,3fh,3fh,29h,20h,65h,33h,74h,6bh,77h
titlelen equ $-atitle ;88h;
msg3 db 01h,2ch,22h,22h,20h,37h,81h,74h,81h,00h,21h,32h,24h,37h,21h
msg3len equ $-msg3
list db listlen dup(0)
msg2 db 'New'
msg2len equ $-msg2
msg1 db 'Step'
msg1len equ $-msg1
count1 db '0'
count2 db '0'
count3 db '0'
count4 db '0'
enable db 1
copies db 1
inited db 0
running db 0
str1 db ' '
str2 db ' '
str3 db ' '
videoseg dw vcseg
ranseed dw 33867
ranseed2 dw 52736
clow db cclow
chigh db cchigh
ctext db cctext
chot db cchot
curx db 28
cury db 10
old9 label dword
old9ofs dw ?
old9seg dw ?
old32 label dword
old32ofs dw ?
old32seg dw ?
LCtrl db 0
_screen struc
shape dw 0
pageno db 0
psize dw 0
_screen ends
screen _screen 1 dup (<>)
;-----------------------
;New int 32h entry
@32entry: cmp ax,505ah ; 'PZ'
jne @notme
cmp cx,504fh ; 'PO'
jne @check1
call _chkpop
iret
@check1:
cmp cx,454eh ; 'EN'
jne @check2
mov al,1
jmp short @fin
@check2:
cmp cx,4449h ; 'DI'
jne @check3
mov al,0
@fin:
cmp cs:[enable],al
mov cs:[enable],al
mov al,5ah
je @notme
xor cx,cx
mov al,cs:copies
iret
@check3:
cmp cx,0101h
jne @notme
push cs
pop ds
mov ch,3dh
mov cl,enable
mov al,copies
mov si,cs
les bx,old32
lds dx,old9
iret
@notme:
jmp dword ptr cs:[old32]
;-----------------------
;New int 9h entry
@9entry:
sti
push ds
push ax
push cs
pop ds
in al,60h
push ax
in al,61h
or al,80h
out 61h,al
and al,7fh
out 61h,al
pop ax
cmp al,1dh
jne @done1
mov byte ptr [LCtrl],1
jmp @not_me
@exec:
mov byte ptr [LCtrl],0
cmp byte ptr [running],1
je @not_me
cmp byte ptr [enable],1
jne @not_me
mov al,20h
out 20h,al
call _chkpop
pop ax
pop ds
iret
@done1:
cmp al,hotkey
jne @done3
cmp byte ptr [LCtrl],1
je @exec
@done3:
mov byte ptr [LCtrl],0
@not_me:
pop ax
pop ds
jmp dword ptr cs:[old9]
;-----------------------
;Check if it can be poped.
;Main proc
_chkpop proc near
push ax
push bx
push cx
push dx
push si
push di
push bp
push ds
push es
push cs
pop ds
mov byte ptr [running],1
mov ax,0040h
mov es,ax
mov ax,es:[4ch]
mov screen.psize,ax
mov ax,es:[60h]
mov screen.shape,ax
mov al,es:[62h]
mov screen.pageno,al
mov al,es:[49h]
cmp al,3
jne @bw
mov al,2
@bw:
cmp al,2
jne @mono
mov byte ptr [ctext],cctext
mov byte ptr [chot],cchot
mov byte ptr [clow],cclow
mov byte ptr [chigh],cchigh
mov word ptr [videoseg],vcseg
jmp short @runme
@mono:
cmp al,7
jne @fail
mov byte ptr [ctext],cmtext
mov byte ptr [chot],cmhot
mov byte ptr [clow],cmlow
mov byte ptr [chigh],cmhigh
mov word ptr [videoseg],vmseg
@runme:
mov ah,1
mov cx,0bf1fh
int 10h
cld
call _readwin
call _run
call _writewin
mov ah,1
mov cx,screen.shape
int 10h
jmp short @done0
@fail:
call _bell
call _bell
@done0:
mov byte ptr [running],0
pop es
pop ds
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
_chkpop endp
;-----------------------
;Write oneline
_oneline proc near
push cx
mov cx,column
rep movsw
pop cx
ret
_oneline endp
;-----------------------
;Store window
_readwin proc near
call _getdx
call _getxy
mov ax,es
mov bx,cs
mov si,di
mov di,winbufofs
mov es,bx
mov ds,ax
mov cx,row
@rl:
call _oneline
add si,160-(column*2)
loop @rl
push cs
pop ds
ret
_readwin endp
;-----------------------
;Restore window
_writewin proc near
call _getdx
call _getxy
mov si,winbufofs
mov cx,row
@wl:
call _oneline
inc dh
call _getxy
loop @wl
push cs
pop es
ret
_writewin endp
;-----------------------
;RETURN: AL: CHAR
_readkey proc near
mov ah,10h
int 16h
ret
_readkey endp
;-----------------------
;IN: DH:Y DL:X
;OUT: ES:VIDEOSEG
; DI:POSITION
_getxy proc near
push cx
push bx
mov bx,videoseg
mov es,bx
xor bh,bh
mov bl,dh
mov di,bx
mov bl,dl
shl bx,1
mov cl,5
shl di,cl
mov cx,di
shl di,1
shl di,1
add di,cx
add di,bx
mov cl,screen.pageno
xor ch,ch
cmp cl,0
je @donecalc
@addpage:
add di,screen.psize
loop @addpage
@donecalc:
pop bx
pop cx
ret
_getxy endp
;-----------------------
;AH ATTRIBUTE
;AL CHAR
;CX NUMBER OF TIMES(CL)
;DX YX
;RETURN NO
_writechar proc near
push cx
push es
push di
call _getxy
xor ch,ch
rep stosw
pop di
pop es
pop cx
ret
_writechar endp
;-----------------------
;DS:SI STRING TO WRITE
;CX STRING LENGTH
;AH ATTRIBUTE
;DX YX
;RETURN NO
_writestr proc near
push cx
push es
push di
call _getxy
@loop1:
lodsb
stosw
loop @loop1
pop di
pop es
pop cx
ret
_writestr endp
;-----------------------
;AH ATTRIBUTE
;DX YX
_box proc near
mov bx,dx
mov cl,1
mov al,ltop
call _writechar
inc dl
mov al,vmid
mov cl,midlen
call _writechar
add dl,midlen
mov cl,1
mov al,rtop
call _writechar
mov cx,row-2
mov al,hmid
@middle:
push cx
mov dl,bl
inc dh
mov cl,1
call _writechar
add dl,midlen+1
call _writechar
pop cx
loop @middle
mov dx,bx
add dh,5
mov cl,1
mov al,lb
call _writechar
inc dl
mov al,vmid
mov cl,midlen
call _writechar
add dl,midlen
mov cl,1
mov al,rb
call _writechar
ret
_box endp
;-----------------------
;DX CURRENT YX
_getdx proc near
mov dh,cury
mov dl,curx
ret
_getdx endp
;-----------------------
;Draw one item ' A '
_drawchar proc near
mov bx,0404h
mov cx,3
call _getdx
inc dh
inc dl
lea si,list
@drawc:
lodsb
cmp al,8
jbe @islow
mov ah,chigh
jmp short @check0
@islow:
mov ah,clow
@check0:
cmp al,0
jne @notzero
mov al,' '
jmp @fillstr
@notzero:
add al,40h
@fillstr:
lea di,str2
stosb
push si
lea si,str1
call _writestr
pop si
add dl,3
dec bl
cmp bl,0
jne @drawc
mov bl,4
inc dh
mov dl,curx
inc dl
dec bh
cmp bh,0
jne @drawc
ret
_drawchar endp
;-----------------------
;Display puzzle
_draw proc near
mov ah,ctext
call _getdx
call _box
mov bl,4
mov ah,ctext
call _getdx
inc dl
inc dh
mov al,' '
@clear:
mov cx,midlen
call _writechar
inc dh
dec bl
cmp bl,0
jne @clear
lea si,atitle
mov cx,titlelen
mov ah,ctext
call _getdx
add dl,5
call _writestr
lea si,msg3
mov cx,msg3len
add dh,5
dec dl
dec dl
call _writestr
call _getdx
inc dh
add dl,msgofs
lea si,msg2
mov cx,msg2len
call _writestr
mov al,4eh
mov ah,chot
mov cx,1
call _writechar
add dh,2
mov ah,ctext
lea si,msg1
mov cx,msg1len
call _writestr
lea si,count1
mov cx,4
add dh,1
call _writestr
call _drawchar
ret
_draw endp
;-----------------------
;IN AL
;OUT AL MOD 16
_mod16 proc near
push cx
push dx
xor ah,ah
cwd
mov cx,16
idiv cx
xchg dx,ax
pop dx
pop cx
ret
_mod16 endp
;-----------------------
;SHUFFLE PUZZLE
_new proc near
mov byte ptr [inited],0
push cs
pop es
call _draw
@store0:
mov di,0ffffh
call _random
mov dl,al
mov dh,5
@store1:
push dx
mov di,4
call _random
call _find0
mov bx,si
cmp al,0
jne @mdn
@mup:
call _moveup
jmp @complete
@mdn:
cmp al,1
jne @mri
call _movedown
jmp @complete
@mri:
cmp al,2
jne @mlf
call _moveright
jmp @complete
@mlf:
call _moveleft
@complete:
pop dx
dec dx
cmp dx,0
jne @store1
call _checkwin
cmp al,1
je @store0
mov ax,3030h
mov word ptr[count1],ax
mov word ptr[count3],ax
call _draw
mov byte ptr [inited],1
ret
_new endp
;-----------------------
;DI RANGE
;AX RANDOM_NUMBER
_random proc near
push bx
push cx
push dx
mov ax,ranseed
mov cx,ax
mov bx,8405h
mul bx
shl cx,1
shl cx,1
shl cx,1
add ch,cl
add dx,cx
add dx,bx
shl bx,1
shl bx,1
add dx,bx
add dh,bl
mov cl,5
shl bx,cl
add dh,bl
inc ax
adc dx,0000
mov ranseed,ax
mov ranseed2,dx
mov bx,ranseed2
mov bx,sp
mov cx,dx
mul di
mov ax,cx
mov cx,dx
mul di
add ax,cx
adc dx,0000
mov ax,dx
pop dx
pop cx
pop bx
ret
_random endp
;-----------------------
;OUT SI: POSITION OF 0
_find0 proc near
push ax
lea si,list
mov di,si
@next:
lodsb
cmp al,0
jnz @next
sub si,di
pop ax
ret
_find0 endp
;-----------------------
;MAKE SOUND
_bell proc near
mov ax,0e07h
int 10h
ret
_bell endp
;-----------------------
;OUT AL = 1 WIN
; AL = 0 NOTWIN
_checkwin proc near
lea si,list
mov ah,1
@chek1:
lodsb
cmp ah,al
jne @bad
inc ah
cmp ah,listlen-1
jbe @chek1
mov al,1
ret
@bad:
mov al,0
ret
_checkwin endp
;-----------------------
;MOVE ITEM UP
_moveup proc near
mov ax,si
sub al,5
cmp al,11
ja @uret
mov si,di
add di,ax
add si,bx
dec si
call _movement
@uret:
ret
_moveup endp
;-----------------------
;MOVE ITEM DOWN
_movedown proc near
mov ax,si
add al,5
cmp al,17
ja @dret
mov si,di
add di,ax
add si,bx
dec si
sub di,2
call _movement
@dret:
ret
_movedown endp
;-----------------------
;IN AL
;OUT AL MOD 4
_mod4 proc near
push dx
xor ah,ah
cwd
mov cx,0004h
idiv cx
xchg dx,ax
pop dx
ret
_mod4 endp
;-----------------------
;MOVE ITEM LEFT
_moveleft proc near
mov ax,si
call _mod4
cmp al,1
jne @canmove
jmp @lret
@canmove:
add di,bx
dec di
mov si,di
dec di
call _movement
@lret:
ret
_moveleft endp
;-----------------------
;MOVE ITEM RIGHT
_moveright proc near
mov ax,si
call _mod4
cmp al,0
je @rret
add di,bx
mov si,di
dec si
call _movement
@rret:
ret
_moveright endp
;-----------------------
;CALL BY MOVE??? , ACTION
_movement proc near
push cs
pop es
mov ah,[di]
xor al,al
stosb
mov [si],ah
inc count4
cmp byte ptr[count4],':'
jb @redraw
mov byte ptr[count4],'0'
inc count3
cmp byte ptr[count3],':'
jb @redraw
mov byte ptr[count3],'0'
inc count2
cmp byte ptr[count2],':'
jb @redraw
mov byte ptr[count2],'0'
inc count1
cmp byte ptr[count1],':'
jb @redraw
mov byte ptr[count1],'0'
@redraw:
call _getdx
mov ah,ctext
lea si,count1
mov cx,4
add dh,4
add dl,msgofs
call _writestr
call _drawchar
cmp byte ptr [inited],1
jne @notwin
call _checkwin
cmp al,1
jne @notwin
mov bl,clow
mov bh,chigh
mov clow,bh
push bx
call _drawchar
pop bx
mov clow,bl
call _bell
call _readkey
call _new
@notwin:
ret
_movement endp
;-----------------------
;MAIN ROUNTINE
_run proc near
cmp byte ptr [inited],1
je @did
call _new
@did:
call _draw
@play:
mov ax,0040h
mov es,ax
mov ax,es:[001ah]
mov es:[001ch],ax
call _readkey
cmp al,1bh
jne @n1
jmp @quit
@n1:
cmp al,'N'
jne @n2
jmp @newit
@n2:
cmp al,'n'
jne @find0
jmp @newit
@find0:
call _find0
mov bx,si
@down:
cmp ah,up
jne @up
call _movedown
jmp @play
@up:
cmp ah,down
jne @right
call _moveup
jmp @play
@right:
cmp ah,left
jne @left
call _moveright
jmp @play
@left:
cmp ah,right
jne @movewin
call _moveleft
jmp @play
@movewin:
@winup:
cmp ah,cup
jne @windn
cmp byte ptr [cury],miny
ja @dec1
jmp @play
@dec1:
call _writewin
dec byte ptr [cury]
jmp @renew
@windn:
cmp ah,cdown
jne @winleft
cmp byte ptr [cury],maxy
jb @inc1
jmp @play
@inc1:
call _writewin
inc byte ptr [cury]
jmp @renew
@winleft:
cmp ah,cleft
jne @winright
cmp byte ptr [curx],minx
ja @dec2
jmp @play
@dec2:
call _writewin
dec byte ptr [curx]
jmp @renew
@winright:
cmp ah,cright
jne @home
cmp byte ptr [curx],maxx
jb @inc2
jmp @play
@inc2:
call _writewin
inc byte ptr [curx]
jmp @renew
@home:
cmp ah,home
jne @end
call _writewin
mov byte ptr [curx],minx
jmp @renew
@end:
cmp ah,endk
jne @pgup
call _writewin
mov byte ptr [curx],maxx
jmp @renew
@pgup:
cmp ah,pgup
jne @pgdn
call _writewin
mov byte ptr [cury],miny
jmp @renew
@pgdn:
cmp ah,pgdn
je @pgdnit
jmp @play
@pgdnit:
call _writewin
mov byte ptr [cury],maxy
@renew:
call _readwin
call _draw
jmp @play
@newit:
call _new
jmp @play
@quit:
ret
_run endp
;Resident
;--------------------------------------------------------------------------
;Can be removed
;
;INIT PROGRAM
_init proc near
lea di,list
add di,listlen-1
std
xor ax,ax
stosb
mov cx,listlen-1
@sto1:
mov al,cl
stosb
loop @sto1
cld
mov ax,0040h
mov es,ax
mov ax,es:[006ch]
mov ranseed,ax
mov ax,es:[006eh]
mov ranseed2,ax
mov al,es:[0049h]
mov mode,al
push cs
pop es
lea di,msg3
mov si,di
mov cx,msg3len
call _xor
lea di,atitle
mov si,di
mov cx,titlelen
call _xor
ret
_init endp
;-----------------------
;IF MODE NOT CORRECT THEN RESET IT
_setmode proc near
mov al,mode
cmp al,7
je @goodmode
cmp al,3
je @goodmode
cmp al,2
je @goodmode
@setmode:
mov ax,0003h
int 10h
@goodmode:
ret
_setmode endp
;-----------------------
;SIMPLE ENCRYPTION
_xor proc near
@xorit:
lodsb
xor al,45h
stosb
loop @xorit
ret
_xor endp
;-----------------------
;GET PARAMETER
_getparam proc near
mov si,paramofs ;GetCommandLine
mov cl,[si]
cmp cl,1
jb @ret1
inc si
@blank:
lodsb
cmp al,20h
jne @nospace
loop @blank
@nospace:
cmp al,'/'
jne @ret1
lodsb
cmp byte ptr [si],20h
je @goodsw
cmp byte ptr [si],0dh
je @goodsw
jmp @badsw
@goodsw:
cmp al,'r'
je @ret0
cmp al,'R'
je @ret0
cmp al,'u'
je @ret2
cmp al,'U'
je @ret2
cmp al,'p'
je @ret3
cmp al,'P'
je @ret3
cmp al,'e'
je @ret4
cmp al,'E'
je @ret4
cmp al,'d'
je @ret5
cmp al,'D'
je @ret5
cmp al,'g'
je @ret6
cmp al,'G'
je @ret6
cmp al,'n'
je @ret7
cmp al,'N'
je @ret7
cmp al,'?'
je @dohelp
cmp al,'h'
je @dohelp
cmp al,'H'
jne @badsw
@dohelp:
mov dx,offset helpmsg
call _show
mov ax,4cffh
int 21h
@ret0:
mov byte ptr[resident],1
@ret1:
ret
@badsw:
mov dx,offset badsw
call _show
jmp @dohelp
@ret2:
mov byte ptr[uninstall],1
ret
@ret3:
mov byte ptr[popit],1
ret
@ret4:
mov byte ptr[active],1
ret
@ret5:
mov byte ptr[active],0
ret
@ret6:
mov byte ptr[newgame],1
ret
@ret7:
mov byte ptr[resident],1
mov byte ptr[newer],1
ret
_getparam endp
;-----------------------
;ENABLE PUZZLE IN MEMORY
_enable proc near
call _setmode
mov ax,[tsrseg]
cmp ax,0
je @return1
mov ax,505ah
mov cx,454eh
int 32h
or cx,cx
jnz @return1
add al,30h
mov [which5],al
@return1:
ret
_enable endp
;-----------------------
;DISABLE PUZZLE IN MEMORY
_disable proc near
mov ax,[tsrseg]
cmp ax,0
je @return2
mov ax,505ah
mov cx,4449h
int 32h
or cx,cx
jnz @return2
add al,30h
mov [which4],al
@return2:
ret
_disable endp
;-----------------------
;DISPLAY MESSAGE
_show proc near
push cs
pop ds
mov ah,9
int 21h
ret
_show endp
;-----------------------
;SET INT VECTOR
_setvec proc near
mov ah,25h
int 21h
ret
_setvec endp
;-----------------------
@new23: iret
;-----------------------
tsrseg dw 0
my9 label dword
my9ofs dw ?
my9seg dw ?
my32 label dword
my32ofs dw ?
my32seg dw ?
status db 0
uninstall db 0
resident db 0
popit db 0
active db 255
mode db 3
newgame db 0
newer db 0
donemsg db 13,10
db 'Puzzle v1.2 resident('
which3 db '1)!',13,10
hintmsg db 'Press Ctrl-CapsLock to play!',13,10,'$'
badsw db 13,10
db 'Bad switch!',13,10,7,'$'
helpmsg db 13,10
db 'Puzzle v1.2 help message 谀? Puzzle 哪?',13,10
db 'Usage: PUZZLE /R (resident) ? A B C D ?',13,10
db ' PUZZLE /U (uninstall) ? E F G H ?',13,10
db ' PUZZLE /P (popup) ? I J K L ?',13,10
db ' PUZZLE /E (enable) ? M N <- O ?',13,10
db ' PUZZLE /D (disable) 滥哪哪哪哪哪馁',13,10
db ' PUZZLE /G (play game)',13,10
db ' PUZZLE /N (a new TSR)',13,10
db ' PUZZLE (play/show status)',13,10,13,10
db 'Ctrl-CapsLock will activate if installed, Esc to quit',13,10
db 'During playing, arrows to move, N for new game,',13,10
db 'Ctrl-arrows, Home/End, PgUp/PgDn to move window',13,10
db 'Puzzle can be popuped in mode 2(B&W),3(Color),7(Mono)',13,10
db 'Contact me if you find any bugs!',13,10
db 'Computer Digger, 1994, Edward Guo',13,10
db 'SZU, Shenzhen, P.R. China',13,10,'$'
playmsg db 13,10
db 'Status: Not resident => PUZZLE /R to resident',13,10
db 'Arrow keys to move, N for new game, Esc to quit',13,10
db 'Ctrl-arrows, Home/End, PgUp/PgDn to move window',13,10,'$'
resmsg db 'PUZZLE /? to get help, Computer Digger, 1994',13,10,'$'
already db 13,10
db 'Already installed, Ctrl-CapsLock to activate('
which1 db '1)',13,10,'$'
stmsgE db 'Status: Enable => PUZZLE /D to disable',13,10,'$'
stmsgD db 'Status: Disable => PUZZLE /E to enable',13,10,'$'
stealmsg db 'Can not uninstall copy '
which db '1 ! Interrupt vector changed!',13,10,7
dismsg db 'PUZZLE('
which4 db '1) disabled!',13,10,'$'
enmsg db 'PUZZLE('
which5 db '1) enabled!',13,10,'$'
succmsg db 'Puzzle v1.2 ('
which2 db '1) successfully uninstalled!',13,10,'$'
nomsg db 'Puzzle did not install!',7,13,10,'$'
dosmsg db 'DOS version incorrect!',13,10,'$'
toomany db 'Too many copies!',7,13,10,'$'
@begin:
cld
mov ah,30h
int 21h
cmp al,2
jae @higher
mov dx,offset dosmsg
call _show
int 20h
@higher:
mov al,23h
mov dx,offset @new23
call _setvec
call _init
call _getparam
mov ax,3509h
int 21h
mov old9ofs,bx
mov old9seg,es
mov ax,3532h
int 21h
mov old32ofs,bx
mov old32seg,es
push cs
mov ax,505ah
mov cx,0101h
int 32h
cmp ch,3dh
jz @is_me
jmp @install
@is_me:
mov cs:[tsrseg],si
mov cs:[status],cl
mov si,es
mov cx,ds
pop ds
mov my32seg,si
inc al
mov copies,al
add al,2fh
mov [which],al
mov [which1],al
mov [which2],al
mov [which4],al
mov [which5],al
inc al
mov [which3],al
mov [msg3+7],al
mov my32ofs,bx
mov my9seg,cx
mov my9ofs,dx
cmp byte ptr [newer],1
jnz @xxx
jmp @inst
@xxx:
cmp byte ptr [uninstall],1
jnz @yyy
jmp @uninst
@yyy:
cmp byte ptr [popit],1
jne @ability
call _enable
mov ax,505ah
mov cx,504fh
int 32h
mov al,1
jmp @finish
@ability:
cmp byte ptr [active],1
je @enableit
cmp byte ptr [active],0
jne @insted
call _disable
mov dx,offset dismsg
call _show
mov al,1
jmp @finish
@enableit:
call _enable
mov dx,offset enmsg
call _show
mov al,1
jmp @finish
@insted:
cmp byte ptr [newgame],1
jne @notnew
mov di,offset msg3+7
mov byte ptr [di],01h
call _setmode
call _chkpop
mov al,1
jmp @finish
@notnew:
mov dx,offset already
call _show
mov dx,offset resmsg
call _show
cmp byte ptr [status],1
je @isenable
mov dx,offset stmsgD
jmp short @showst
@isenable:
mov dx,offset stmsgE
@showst:
call _show
cmp byte ptr [resident],1
jne @_insted
call _enable
mov dx,offset enmsg
call _show
@_insted:
mov al,1
jmp @finish
@uninst:
mov cx,tsrseg
cmp cx,old32seg
jnz @bad2
cmp cx,old9seg
jnz @bad2
mov es,cx
mov si,offset @32entry
cmp si,old32ofs
jnz @bad2
mov di,si
mov cx,offset @9entry
sub cx,si
repz cmpsb
jnz @bad2
mov si,offset @9entry
cmp si,old9ofs
jnz @bad2
mov di,si
mov cx,offset _chkpop
sub cx,si
repz cmpsb
jz @good
@bad2:
call _disable
mov dx,offset stealmsg
call _show
mov al,3
jmp @finish
@good:
push ds
mov ax,my9seg
mov cx,my32seg
mov bx,my32ofs
mov dx,my9ofs
mov ds,ax
mov al,9
call _setvec
mov ds,cx
mov dx,bx
mov al,32h
call _setvec
pop ds
mov di,int22ofs
mov bx,es
mov ax,offset @succ
stosw
push cs
pop ax
stosw
mov ah,50h
int 21h
mov ah,4ch
int 21h
@succ:
push cs
pop bx
mov ah,50h
int 21h
push cs
pop ds
mov dx,offset succmsg
call _show
mov al,2
jmp @finish
@install:
pop ds
cmp byte ptr [resident],1
je @inst
cmp byte ptr [uninstall],1
je @no
cmp byte ptr [popit],1
je @no
cmp byte ptr [active],0
je @no
cmp byte ptr [active],1
je @no
call _setmode
mov dx,offset playmsg
mov di,offset msg3+7
mov byte ptr [di],01h
call _show
call _chkpop
mov dx,offset resmsg
call _show
mov al,1
jmp @finish
@no:
mov dx,offset nomsg
call _show
xor al,al
jmp @finish
@inst:
mov al,copies
cmp al,10
jb @validcopy
mov dx,offset toomany
call _show
mov al,255
jmp @finish
@validcopy:
mov es,cs:[2ch]
mov ah,49h
int 21h
mov al,9h
mov dx,offset @9entry
call _setvec
mov al,32h
mov dx,offset @32entry
call _setvec
push cs
pop ds
mov dx,offset donemsg
call _show
push cs
pop es
mov di,paramofs
mov al,hintlen
stosb
xor ch,ch
mov cl,al
lea si,hintmsg
rep movsb
mov dx,offset _init
mov cl,4
shr dx,cl
inc dx
mov ax,3100h
int 21h
@finish:
mov ah,4ch
int 21h
code ends
end @start
--
"640K ought to be enough for anybody." - Bill Gates 1981
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 202.104.103.142]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店