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

📄 stack.inc

📁 MenuetOS是一个用汇编开发的32/64位PC操作系统
💻 INC
📖 第 1 页 / 共 4 页
字号:
cs1:

    mov     bh, [eax]
    mov     bl, [eax + 1]
   
    add     eax, 2
    add     edx, ebx
   
    loopw   cs1
   
cs1_1:

    and     word [checkSize1], 0x01
    jz      cs_test2

    mov     bh, [eax]
    xor     bl, bl
   
    add     edx, ebx
   
cs_test2:

    mov     cx, [checkSize2]
    cmp     cx, 0
    jz      cs_exit                     ; Finished if no 2nd buffer

    mov     eax, [checkAdd2]

    shr     cx, 1
    jz      cs2_1
       
cs2:
    mov     bh, [eax]
    mov     bl, [eax + 1]
   
    add     eax, 2
    add     edx, ebx
   
    loopw   cs2
   
cs2_1:
    and     word [checkSize2], 0x01
    jz      cs_exit

    mov     bh, [eax]
    xor     bl, bl   
   
    add     edx, ebx
   
cs_exit:
    mov     ebx, edx
   
    shr     ebx, 16
    and     edx, 0xffff
    add     edx, ebx
    mov     eax, edx
    shr     eax, 16
    add     edx, eax
    not     dx   
   
    mov     [checkResult], dx
    popa
    ret
   
   
   
   
;***************************************************************************
;   Function
;      app_stack_handler
;
;   Description
;       This is an application service, called by int 0x40 fn 52
;       It provides application access to the network interface layer
;
;***************************************************************************
app_stack_handler:
    cmp     eax, 0
    jnz     not0
    ; Read the configuartion word
    mov     eax, [stack_config]
    ret
   
not0:
    cmp     eax, 1
    jnz     not1
    ; read the IP address
   
    mov     eax, [stack_ip]
    ret
   
not1:
    cmp     eax, 2
    jnz     not2
   
    ; write the configuration word
    mov     [stack_config], ebx
   
    ; <Slip shouldn't be active anyway - thats an operational issue.>
    ; If ethernet now enabled, probe for the card, reset it and empty
    ; the packet buffer
    ; If all successfull, enable the card.
    ; If ethernet now disabled, set it as disabled. Should really
    ; empty the tcpip data area too.
   
    ; ethernet interface is '3' in ls 7 bits
    and     bl, 0x7f
    cmp     bl, 3
   
    je       ash_eth_enable
    ; Ethernet isn't enabled, so make sure that the card is disabled
    mov     [ethernet_active], byte 0
    
    ret
   
ash_eth_enable:
    ; Probe for the card. This will reset it and enable the interface
    ; if found
    call    eth_probe
    cmp     eax, 0
    je      ash_eth_done            ; Abort if no hardware found
   
    mov     [ethernet_active], byte 1
   
ash_eth_done:   
    ret
   
not2:
    cmp     eax, 3
    jnz     not3
    ; write the IP Address
    mov     [stack_ip], ebx
    ret
   
not3:
    cmp     eax, 4
    jnz     not4
    ; Enabled the slip driver on the comm port
    ; slip removed
    ret
   
not4:
    cmp     eax, 5
    jnz     not5
    ; Disable the slip driver on the comm port
    ; slip removed
    
not5:
    cmp     eax, 6
    jnz     not6
    
    ; Insert an IP packet into the stacks received packet queue
    call    stack_insert_packet
    ret
    
not6:
    cmp     eax, 7
    jnz     not7
    
    ; Test for any packets queued for transmission over the network
    
not7:
    cmp     eax, 8
    jnz     not8
    
    call    stack_get_packet
    ; Extract a packet queued for transmission by the network
    ret
    
not8:
    cmp     eax, 9
    jnz     not9
    
    ; read the gateway IP address
   
    mov     eax, [gateway_ip]
    ret

not9:
    cmp     eax, 10
    jnz     not10
    
    ; read the subnet mask
   
    mov     eax, [subnet_mask]
    ret

not10:
    cmp     eax, 11
    jnz     not11
    
    ; write the gateway IP Address
    mov     [gateway_ip], ebx

    ret

not11:
    cmp     eax, 12
    jnz     not12

    ; write the subnet mask
    mov     [subnet_mask], ebx
        

not12:
    cmp     eax, 13
    jnz     not13
    
    ; read the dns
   
    mov     eax, [dns_ip]
    ret

not13:
    cmp     eax, 14
    jnz     stack_driver_end
    
    ; write the dns IP Address
    mov     [dns_ip], ebx

    ret
    
stack_driver_end:
    ret
   
   
   
;***************************************************************************
;   Function
;      app_socket_handler
;
;   Description
;       This is an application service, called by int 0x40
;       It provides application access to stack socket services
;       such as opening sockets
;
;***************************************************************************
app_socket_handler:
    cmp     eax, 0
    jnz     nots0
   
    call    socket_open
    ret
   
nots0:
    cmp     eax, 1
    jnz     nots1
   
    call    socket_close
    ret
   
nots1:
    cmp     eax, 2
    jnz     nots2
   
    call    socket_poll
    ret
   
nots2:
    cmp     eax, 3
    jnz     nots3
   
    call    socket_read
    ret
   
nots3:
    cmp     eax, 4
    jnz     nots4
   
    call    socket_write
    ret
   
nots4:
    cmp     eax, 5
    jnz     nots5

    call    socket_open_tcp
    ret

nots5:
    cmp     eax, 6
    jnz     nots6
   
    call    socket_status
    ret

nots6:
    cmp     eax, 7
    jnz     nots7
   
    call    socket_write_tcp
    ret

nots7:
    cmp     eax, 8
    jnz     nots8
    
    call    socket_close_tcp
    ret
    
nots8:
    cmp     eax, 9
    jnz     nots9
    
    call    is_localport_unused
    ret
    
nots9:
    cmp     eax, 254
    jnz     notdump
   
    ret
   
notdump:
    cmp     eax, 255
    jnz     notsdebug
   
    ; This sub function allows access to debugging information on the stack
    ; ebx holds the request:
    ;  100 : return length of empty queue
    ;  101 : return length of IPOUT QUEUE
    ;  102 : return length of IPIN QUEUE
    ;  103 : return length of NET1OUT QUEUE
    ; 200 : return # of ARP entries
    ; 201 : return size of ARP table ( max # entries )
    ; 202 : select ARP table entry #
    ; 203 : return IP of selected table entry
    ; 204 : return High 4 bytes of MAC address of selected table entry
    ; 205 : return low  2 bytes of MAC address of selected table entry
    ; 206 : return status word of selected table entry
    ; 207 : return Time to live of selected table entry
    

    ;  2 : return number of IP packets received
    ;  3 : return number of packets transmitted
    ;  4 : return number of received packets dumped
    ;  5 : return number of arp packets received
    ;  6 : return status of packet driver
    ;      ( 0 == not active, FFFFFFFF = successful )
   
    call    stack_internal_status
    ret
   
notsdebug:
    ; Invalid Option
    ret
   

ARPTmp:    
times 14 db 0
   
;***************************************************************************
;   Function
;      stack_internal_status
;
;   Description
;       Returns information about the internal status of the stack
;       This is only useful for debugging
;       It works with the ethernet driver
;       sub function in ebx
;       return requested data in eax
;
;***************************************************************************
stack_internal_status:
    cmp     ebx, 100
    jnz     notsis100
   
    ;  100 : return length of EMPTY QUEUE
    mov     ebx, EMPTY_QUEUE
    call    queueSize   
    ret
   
notsis100:
    cmp     ebx, 101
    jnz     notsis101
   
    ;  101 : return length of IPOUT QUEUE
    mov     ebx, IPOUT_QUEUE
    call    queueSize   
    ret
   
notsis101:
    cmp     ebx, 102
    jnz     notsis102
   
    ;  102 : return length of IPIN QUEUE
    mov     ebx, IPIN_QUEUE
    call    queueSize   
    ret

notsis102:
    cmp     ebx, 103
    jnz     notsis103
   
    ;  103 : return length of NET1OUT QUEUE
    mov     ebx, NET1OUT_QUEUE
    call    queueSize   
    ret

notsis103:
    cmp     ebx, 200
    jnz     notsis200
    
    ; 200 : return num entries in arp table
    movzx   eax, byte [NumARP]
    ret
    
notsis200:
    cmp     ebx, 201
    jnz     notsis201
    
    ; 201 : return arp table size
    mov     eax, 20 ; ARP_TABLE_SIZE
    ret

notsis201:
    cmp     ebx, 202
    jnz     notsis202

    ; 202 - read the requested table entry 
    ; into a temporary buffer
    ; ecx holds the entry number
    
    mov     eax, ecx
    mov     ecx, 14 ; ARP_ENTRY_SIZE
    mul     ecx
    
    mov     ecx, [eax + ARPTable]
    mov     [ARPTmp], ecx
    mov     ecx, [eax + ARPTable+4]
    mov     [ARPTmp+4], ecx
    mov     ecx, [eax + ARPTable+8]
    mov     [ARPTmp+8], ecx
    mov     cx, [eax + ARPTable+12]
    mov     [ARPTmp+12], cx
    ret
        
notsis202:    
    cmp     ebx, 203
    jnz     notsis203

    ; 203 - return IP address
    mov     eax, [ARPTmp]
    ret
    
notsis203:
    cmp     ebx, 204
    jnz     notsis204

⌨️ 快捷键说明

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