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

📄 chess.asm

📁 menuet os应用程序源代码,很多汇编写的应用程序
💻 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+12],dword '----'
    je   cfb1
    jmp  news
   cfb1:
    cmp  [esi+16*80+12],dword '----'
    je   cfb2
    jmp  news
  cfb2:
    cmp  [esi+2*80+12],dword '+---'
    jne  news
   
    cmp  [esi+4*80+12],dword '+---'
    jne  news
   
  board_found:
   
    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+nappulat]
     je     foundnappula2
     loop   newseek2
   
     jmp    empty_slot
   
    foundnappula2:
   
     mov   esi,[edi+nappulat+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                    ; numbers at left
     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
   
     mov  eax,4                    ; letters at bottom
     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
   
     ; print 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:
   

⌨️ 快捷键说明

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