⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chess.asm

📁 基于Menuet OS的用户应用程序及其系统应用程序(用户:BMP/jpg图片查看器 系统:CPU 状态监控程序等)
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;
;    CHESS CLIENT for CHESSCLUB.COM (VT)
;
;    Compile with FASM for Menuet
;
   
use32
   
                org     0x0
   
                db      'MENUET00'              ; 8 byte id
                dd      38                      ; required os
                dd      START                   ; program start
                dd      I_END                   ; program image size
                dd      0x100000                ; required amount of memory
                                                ; esp = 0x7FFF0
                dd      0x00000000              ; reserved=no extended header
   
   
file_info:
   
      dd  0,0,-1,0x4000,0x20000
      db  '/rd/1/chess.bmp',0
   
pawn_color:
   
     dd  0x000000
     dd  0x222222
     dd  0x444444
     dd  0xf0f0f0
     dd  0xc0c0c0
     dd  0xa0a0a0
     dd  0xa0a0a0
     dd  0x707070
     dd  0xb0b0b0
     dd  0xc0c0c0
     dd  0xd0d0d0
     dd  0xd8d8d8
     dd  0xe0e0e0
     dd  0xe8e8e8
     dd  0x00ff00
     dd  0xffffff
   
   
   
texts  equ  board_old+80*30
   
text   equ  texts+80*32*4
   
   
START:                          ; start of execution
   
    mov  eax,58
    mov  ebx,file_info
    int  0x40
   
    mov  esi,0x4000+22*3+4+24*2
    mov  edi,0x10000+18*3
   
    mov  ebx,0
    mov  ecx,0
   
  newp:
   
    xor  eax,eax
    mov  al,[esi]
    and  al,0xf0
    shr  al,4
    shl  eax,2
    mov  eax,[pawn_color+eax]
    mov  [edi+0],eax
   
    xor  eax,eax
    mov  al,[esi]
    and  al,0x0f
    shl  eax,2
    mov  eax,[pawn_color+eax]
    mov  [edi+3],eax
   
    add  edi,6
    add  esi,1
   
    inc  ebx
    cmp  ebx,23
    jbe  newp
   
    sub  edi,12
   
    mov  ebx,0
   
    inc  ecx
    cmp  ecx,279
    jb   newp
   
    ; Clear the screen memory
    mov     eax, '    '
    mov     edi,text
    mov     ecx,80*30 /4
    cld
    rep     stosd
   
   
    call draw_window
   
still:
   
    call  check_for_board
   
    call  board_changed
   
    call  draw_board
   
    ; check connection status
    mov  eax,53
    mov  ebx,6
    mov  ecx,[socket]
    int  0x40
   
    mov     ebx, [socket_status]
    mov     [socket_status], eax
   
    cmp     eax, ebx
    je      waitev
   
    call    display_status
   
waitev:
    mov  eax,23                 ; wait here for event
    mov  ebx,20
    int  0x40
   
    cmp  eax,1                  ; redraw request ?
    je   red
    cmp  eax,2                  ; key in buffer ?
    je   key
    cmp  eax,3                  ; button in buffer ?
    je   button
   
    ; any data from the socket?
   
    mov     eax, 53
    mov     ebx, 2
    mov     ecx, [socket]
    int     0x40
    cmp     eax, 0
    jne      read_input
   
    jmp  still
   
   
read_input:
   
    push ecx
    mov     eax, 53
    mov     ebx, 3
    mov     ecx, [socket]
    int     0x40
    pop  ecx
   
    call    handle_data
   
    push    ecx
    mov     eax, 53
    mov     ebx, 2
    mov     ecx, [socket]
    int     0x40
    pop     ecx
    cmp     eax, 0
   
   
    jne   read_input
    call draw_text
    jmp  still
   
   
   
check_for_board:
   
    pusha  
   
    mov  esi,text-80
   news:
    add  esi,80
    cmp  esi,text+80*10
    je   board_not_found
    cmp  [esi+11],dword '----'
    je   cfb1
    jmp  news
   cfb1:
    cmp  [esi+16*80+11],dword '----'
    je   cfb2
    jmp  news
  cfb2:
    cmp  [esi+2*80+11],dword '+---'
    jne  news
   
    cmp  [esi+4*80+11],dword '+---'
    jne  news
   
  board_found:
    dec  esi
    mov  edi,chess_board
    mov  ecx,80*18
    cld
    rep  movsb
   
   board_not_found:
   
     popa
   
     ret
   
   
yst     dd  150
textx   equ 10
ysts    equ 410
   
boardx  dd 45
boardy  dd 45
   
boardxs dd 44
boardys dd 44
   
conx    equ 420
cony    equ 118
   
dconx   equ 420
dcony   equ 148
   
statusx equ 420
statusy equ 178
   
   
drsq:
   
     push eax ebx
   
     mov  ecx,ebx
     mov  ebx,eax
   
     mov  eax,ebx
     add  eax,ecx
   
     imul ebx,[boardxs]
     add  ebx,[boardx]
     shl  ebx,16
     imul ecx,[boardys]
     add  ecx,[boardy]
     shl  ecx,16
   
     add  ebx,[boardxs]
     add  ecx,[boardys]
   
     mov  edx,[sq_black]
     test eax,1
     jnz  dbl22
     mov  edx,[sq_white]
   dbl22:
   
     mov  eax,13
     int  0x40
   
     pop  ebx eax
   
     ret
   
   
   
draw_pawn:
   
;    edi,0  ; white / black
;    esi,0  ; from position 2  , 20 square
;    eax,2  ; board x
;    ebx,0  ; board y
   
     pusha
   
     call drsq
   
     cmp  esi,20
     jne  no_sqd
   
     popa
     ret
   
   no_sqd:
   
     imul eax,[boardxs]
     imul ebx,[boardys]
   
     add  eax,[boardx]
     add  ebx,[boardy]
   
     imul esi,44*45*3
     add  esi,0x10000+18*3
   
     mov  ecx,43
   
   dp0:
   
     pusha
   
     mov  ecx,44
   
   ldp1:
   
     pusha
   
     mov  ecx,ebx
     mov  ebx,eax
   
     mov  edx,[esi]
     and  edx,0xffffff
     mov  eax,1
     cmp  edx,0x00ff00
     je   nowp
     cmp  edi,1
     jne  nobl
     shr  edx,1
     and  edx,0x7f7f7f
   nobl:
     int  0x40
   nowp:
   
     popa
   
     add  esi,3
     add  eax,1
   
     dec  ecx
     jnz  ldp1
   
     popa
   
     add  ebx,1
     add  esi,3*44
   
     dec  ecx
     jnz  dp0
   
     popa
   
     ret
   
   
board_changed:
   
    pusha
   
    mov  eax,0
    mov  esi,chess_board
  bcl1:
    add  eax,[esi]
    add  esi,4
    cmp  esi,chess_board+19*80
    jb   bcl1
   
    cmp  eax,[checksum]
    je   bcl2
    mov  [changed],1
  bcl2:
    mov  [checksum],eax
   
    popa
   
    ret
   
   
   
checksum dd 0
   
changed db 1

draw_board:
   
    pusha
   
    cmp   [changed],1
    jne   no_change_in_board
    mov   [changed],0
    mov   eax,0
    mov   ebx,0
  scan_board:
   
    push  eax ebx
   
    mov   esi,ebx
    imul  esi,2
    imul  esi,80
    add   esi,80
    imul  eax,4
    add   eax,10
    add   esi,eax
    movzx edx,word [chess_board+esi]
    cmp   dx,[board_old+esi]
    je    empty_slot
    mov   ecx,13
  newseek2:
    mov   edi,ecx
    imul  edi,8
    sub   edi,8
    cmp   dx,[edi+pawns]
    je    foundpawn2
    loop  newseek2
    jmp   empty_slot
  foundpawn2:
    mov   esi,[edi+pawns+4]
    mov   edi,0
    cmp   dl,'*'
    jne   nnbb
    mov   edi,1
  nnbb:
    mov   eax,[esp+4]
    mov   ebx,[esp]
    call  draw_pawn
  empty_slot:
    pop   ebx eax
    inc   eax
    cmp   eax,8
    jb    scan_board
    mov   eax,0
    inc   ebx
    cmp   ebx,8
    jb    scan_board
    mov   esi,chess_board
    mov   edi,board_old
    mov   ecx,80*19
    cld
    rep   movsb
    mov   eax,13
    mov   ebx,[boardx]
    sub   ebx,14
    shl   ebx,16
    add   ebx,8
    mov   ecx,[boardy]
    shl   ecx,16
    add   ecx,46*8
    mov   edx,[wcolor]
    int   0x40
    mov   eax,4                    
    mov   ebx,[boardx]
    sub   ebx,14
    shl   ebx,16
    add   ebx,[boardy]
    add   ebx,18
    mov   ecx,[tcolor]
    mov   edx,chess_board+80+5
    mov   esi,3
  db1:
    int   0x40
    add   edx,80*2
    add   ebx,[boardxs]
    cmp   edx,chess_board+80*16
    jb    db1
    mov   eax,13
    mov   ebx,[boardx]
    shl   ebx,16
    add   ebx,8*46
    mov   ecx,[boardys]
    imul  ecx,8
    add   ecx,[boardy]
    add   ecx,8
    shl   ecx,16
    add   ecx,10
    mov   edx,[wcolor]
    int   0x40

    ; Letters

    mov   eax,4                    
    mov   ebx,[boardx]
    add   ebx,3
    shl   ebx,16
    mov   bx,word [boardys]
    imul  bx,8
    add   ebx,[boardy]
    add   ebx,8
    mov   ecx,[tcolor]
    mov   edx,chess_board+80*17+8
    mov   esi,4
  db3:
    int   0x40
    mov   edi,[boardxs]
    shl   edi,16
    add   ebx,edi
    add   edx,4
    cmp   edx,chess_board+80*17+8+4*8
    jb    db3
   
    ; Player times
   
    mov   edi,74
    cmp   [chess_board+80+5],byte '1'
    jne   nowww2
    mov   edi,371
  nowww2:
   
    mov   eax,13
    mov   ebx,(conx)*65536+100
    mov   ecx,edi
    shl   ecx,16
    add   ecx,10
    mov   edx,[wcolor]
    int   0x40
    mov   eax,4
    mov   ebx,(conx)*65536
    add   ebx,edi
    mov   ecx,[tcolor]
    mov   edx,chess_board+80*7+59-1
    mov   esi,20
    int   0x40
    mov   edi,74
    cmp   [chess_board+80+5],byte '1'
    je    nowww
    mov   edi,371
  nowww:
   
    mov   eax,13
    mov   ebx,(conx)*65536+100
    mov   ecx,edi
    shl   ecx,16
    add   ecx,10
    mov   edx,[wcolor]
    int   0x40
    mov   eax,4
    mov   ebx,(conx)*65536
    add   ebx,edi
    mov   ecx,[tcolor]
    mov   edx,chess_board+80*9+59-1
    mov   esi,20
    int   0x40
   
    ; Move #
   
    mov   eax,13
    mov   ebx,conx*65536+120
    mov   ecx,200*65536+10
    mov   edx,[wcolor]
    int   0x40
    mov   eax,4
    mov   ebx,conx*65536
    add   ebx,200
    mov   ecx,[tcolor]
    mov   edx,chess_board+80*1+46
    mov   esi,30
    int   0x40
   
  no_change_in_board:
   
    popa
    ret
   
   
   
handle_data:
    ; Telnet servers will want to negotiate options about our terminal window
    ; just reject them all.
    ; Telnet options start with the byte 0xff and are 3 bytes long.
   
    mov     al, [telnetstate]
    cmp     al, 0
    je      state0
    cmp     al, 1
    je      state1
    cmp     al, 2
    je      state2
    jmp     hd001
   
state0:
    cmp     bl, 255
    jne     hd001
    mov     al, 1
    mov     [telnetstate], al
    ret
   
state1:
    mov     al, 2
    mov     [telnetstate], al
    ret
   
state2:
    mov     al, 0
    mov     [telnetstate], al
    mov     [telnetrep+2], bl
   
    mov     edx, 3
    mov     eax,53
    mov     ebx,7
    mov     ecx,[socket]
    mov     esi, telnetrep
    int     0x40
    ret
   
hd001:
    cmp  bl,13                          ; BEGINNING OF LINE
    jne  nobol
    mov  ecx,[pos]
    add  ecx,1
  boll1:
    sub  ecx,1
    mov  eax,ecx
    xor  edx,edx
    mov  ebx,80
    div  ebx
    cmp  edx,0
    jne  boll1
    mov  [pos],ecx
   
    call check_for_board
   
    jmp  newdata
  nobol:
   
    cmp  bl,10                            ; LINE DOWN
    jne  nolf
   addx1:
    add  [pos],dword 1
    mov  eax,[pos]
    xor  edx,edx
    mov  ecx,80
    div  ecx
    cmp  edx,0
    jnz  addx1
    mov  eax,[pos]
    jmp  cm1
  nolf:
   
    cmp  bl,9                             ; TAB
    jne  notab
    add  [pos],dword 8
    jmp  newdata
  notab:
   
    cmp  bl,8                            ; BACKSPACE
    jne  nobasp
    mov  eax,[pos]
    dec  eax
    mov  [pos],eax
    mov  [eax+text],byte 32
    mov  [eax+text+60*80],byte 0
    jmp  newdata
   nobasp:
   
    cmp  bl,15                           ; CHARACTER
    jbe  newdata
    mov  eax,[pos]
    mov  [eax+text],bl
    mov  eax,[pos]
    add  eax,1
  cm1:
    mov  ebx,[scroll+4]
    imul ebx,80
    cmp  eax,ebx

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -