荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店