Login

Subversion Repositories NedoOS

Rev

Rev 875 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

        DEVICE ZXSPECTRUM128
        include "../_sdk/sys_h.asm"

STDINBUF_SZ=256
NETINBUF_SZ=256

STACK=0x4000

PORT=2323

SHUT_RDWR               EQU 2
ERR_EAGAIN              EQU 35          ;/* Try again */
ERR_EWOULDBLOCK EQU ERR_EAGAIN  ;/* Operation would block */
ERR_INTR                EQU 4
ERR_NFILE               EQU 23
ERR_ALREADY     EQU 37
ERR_NOTSOCK     EQU 38
ERR_EMSGSIZE    EQU 40    ;/* Message too long */
ERR_PROTOTYPE   EQU 41
ERR_AFNOSUPPORT EQU 47
ERR_HOSTUNREACH EQU 65
ERR_ECONNABORTED EQU    53      ;/* Software caused connection abort */
ERR_CONNRESET   EQU 54
ERR_NOTCONN     EQU 57

;************************* ╨Я╤А╨╛╤В╨╛╨║╨╛╨╗╤Л ╤Б╨╛╨╡╨┤╨╕╨╜╨╡╨╜╨╕╨╣ *************************
SOCK_STREAM EQU 0x01            ;tcp/ip
SOCK_ICMP       EQU 0x02                ;icmp
SOCK_DGRAM      EQU 0x03                ;udp/ip

AF_INET EQU 2

        org PROGSTART
begin
        ld sp,STACK
        OS_HIDEFROMPARENT
        ;ld e,6 ;textmode
        ;OS_SETGFX
        OS_GETMAINPAGES ;dehl
        push de
        push hl
        ld e,l
        OS_DELPAGE
        pop hl
        ld e,h
        OS_DELPAGE
        pop de
        OS_DELPAGE

        ld de,tpipename
        push de
        OS_OPENHANDLE
        ld a,b
        ld (stdinhandle),a
        pop de
        OS_OPENHANDLE
        ld a,b
        ld (stdouthandle),a

        OS_GETMAINPAGES ;out: d,e,h,l=pages in 0000,4000,8000,c000, c=flags, b=id
        ld a,(stdinhandle)
        ld e,a
        ld a,(stdouthandle)
        ld d,a
        ld h,0xff ;rnd
;b=id, e=stdin, d=stdout, h=stderr        
        OS_SETSTDINOUT

;TODO ╨╖╨░╨┐╤Г╤Б╨║╨░╤В╤М ╤Д╨░╨╣╨╗, ╤Г╨║╨░╨╖╨░╨╜╨╜╤Л╨╣ ╨▓ ╨┐╨░╤А╨░╨╝╨╡╤В╤А╨╡ (╨┐╨╛ ╤Г╨╝╨╛╨╗╤З╨░╨╜╨╕╤О cmd, ╨╕╤Б╨║╨░╤В╤М ╨▓ bin)
;TODO ╨╖╨┤╨╡╤Б╤М ╨╜╨╡ ╨╜╨░╨┤╨╛ ╨╖╨░╨┐╤Г╤Б╨║╨░╤В╤М CMD, ╨╖╨░╨┐╤Г╤Б╨║╨░╤В╤М ╨╜╨░╨┤╨╛ ╨┐╨╛╤Б╨╗╨╡ ╨║╨╛╨╜╨╜╨╡╨║╤В╨░ ╨║╨╗╨╕╨╡╨╜╤В╨░
                ld a,(waitpid_id)
                inc a
                jr z,nul_id
                ;TODO ╤В╤Г╤В ╨╜╨░╨┤╨╛ ╨╖╨░╨║╤А╤Л╤В╤М cmd
nul_id
        ld de,cmd_filename
        OS_OPENHANDLE
        or a
        jr nz,execcmd_error
       
        call readapp ;╨┤╨╡╨╗╨░╨╡╤В CLOSE
       
        push af
        ld b,a
        ld a,(stdinhandle)
        ld d,a
        ld a,(stdouthandle)
        ld e,a
        ld h,0xff ;rnd
;b=id, e=stdin, d=stdout, h=stderr        
        OS_SETSTDINOUT
       
        pop af ;id

        ld e,a ;id
        ld (waitpid_id),a
        OS_RUNAPP

execcmd_error
        display $
gotostart
        ld sp,STACK
        ld a,(soc)
        or a
        jr z,nul_soc
        ld e,0
        OS_NETSHUTDOWN
        xor a
        ld (soc),a
nul_soc
        ld a,(soc_client)
        or a
        jr z,nul_soc_client
        ld e,0
        OS_NETSHUTDOWN
        xor a
        ld (soc_client),a
nul_soc_client
;1. s = OS_NETSOCKET
        LD D,AF_INET
        LD E,SOCK_STREAM
        OS_NETSOCKET
        BIT 7,L
        JP NZ,inet_exiterr      ;╨╛╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨╛╤И╨╕╨▒╨║╨╕
        LD A,L
        ld (soc),a
;2. OS_BIND(s)
        ld a,(soc)
        LD DE,destination_host
        OS_BIND
        BIT 7,L
        JP NZ,inet_exiterr
;3. OS_LISTEN(s)
        ld a,(soc)
        OS_LISTEN
        bit 7,l
        JP NZ,inet_exiterr
;4. s1 = OS_ACCEPT(s)
;5. ╨╡╤Б╨╗╨╕ s1<0 ╨│╨╛╤В╨╛ 4
WAIT_CLIENTS
        LD A,(soc)
        OS_ACCEPT
        BIT 7,L
        JR Z,ESTABLISHED
        CP ERR_EAGAIN
        JP NZ,inet_exiterr      ;╨╛╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨╛╤И╨╕╨▒╨║╨╕
        YIELD   ;╨╜╨╡ ╨╛╨▒╤П╨╖╨░╤В╨╡╨╗╤М╨╜╨╛. ╨Х╤Б╨╗╨╕ ╨▓╤А╨╡╨╝╤П ╤А╨╡╨░╨│╨╕╤А╨╛╨▓╨░╨╜╨╕╤П ╨╜╨░ ╨┐╨╛╨┤╨║╨╗╤О╤З╨╡╨╜╨╕╨╡ ╨╜╨╡ ╨║╤А╨╕╤В╨╕╤З╨╜╨╛,
                                ;╤В╨╛ ╨╛╤В╨┤╨░╨┤╨╕╨╝ ╨║╨▓╨░╨╜╤В ╨▓╤А╨╡╨╝╨╡╨╜╨╕ ╤Б╨╕╤Б╤В╨╡╨╝╨╡.
        JR WAIT_CLIENTS ;╨╜╨╕╨║╤В╨╛ ╨╜╨╡ ╨┐╨╛╨┤╨║╨╗╤О╤З╨╕╨╗╤Б╤П, ╨╢╨┤╤С╨╝
ESTABLISHED
        LD A,L                          ;╤Г╨┤╨░╤З╨╜╨╛
        LD (soc_client),A       ;╤Б╨╛╤Е╤А╨░╨╜╤П╨╡╨╝ ╨┤╨╡╤Б╨║╤А╨╕╨┐╤В╨╛╤А ╤Б╨╛╨║╨╡╤В╨░.
;6. OS_NETSHUTDOWN(s)
;close_wait:
        LD A,(soc)
        LD E,0 ;0 - ╨╖╨░╨║╤А╤Л╤В╤М ╨╜╨╡╨╝╨╡╨┤╨╗╨╡╨╜╨╜╨╛, 1 - ╨╖╨░╨║╤А╤Л╤В╤М ╤В╨╛╨╗╤М╨║╨╛ ╨╡╤Б╨╗╨╕ ╨▒╤Г╤Д╨╡╤А ╨╛╤В╨┐╤А╨░╨▓╨║╨╕ ╨┐╤Г╤Б╤В
        OS_NETSHUTDOWN
        xor a
        ld (soc),a
        ;BIT 7,L
        ;jp z,close_ok       ;╤Б╨╛╨║╨╡╤В ╨╖╨░╨║╤А╤Л╨╗╤Б╤П
        ;CP ERR_EAGAIN
        ;JP NZ,inet_exiterr             ;╨╛╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨╛╤И╨╕╨▒╨║╨╕ ╨╜╨╡ ╤Б╨▓╤П╨╖╨░╨╜╨╜╨╛╨╣ ╤Б ╨╛╨╢╨╕╨┤╨░╨╜╨╕╨╡╨╝ ╨╛╤В╨┐╤А╨░╨▓╨║╨╕.
        ;YIELD          ;╨╜╨╡ ╨╛╨▒╤П╨╖╨░╤В╨╡╨╗╤М╨╜╨╛. ╨Х╤Б╨╗╨╕ ╨▓╤А╨╡╨╝╤П ╨╜╨╡ ╨║╤А╨╕╤В╨╕╤З╨╜╨╛,
                                        ;╤В╨╛ ╨╛╤В╨┤╨░╨┤╨╕╨╝ ╨║╨▓╨░╨╜╤В ╨▓╤А╨╡╨╝╨╡╨╜╨╕ ╤Б╨╕╤Б╤В╨╡╨╝╨╡.
        ;JR close_wait ;╨╛╨╢╨╕╨┤╨░╨╡╨╝ ╨╛╤В╨┐╤А╨░╨▓╨║╨╕ ╨┤╨░╨╜╨╜╤Л╤Е
close_ok
        ;TODO ╤В╤Г╤В ╨╜╨░╨┤╨╛ ╨╖╨░╨┐╤Г╤Б╤В╨╕╤В╤М CMD
;7. ╨╡╤Б╨╗╨╕ ╨╜╨░╨┤╨╛ ╤В╨╛ OS_WIZNETWRITE(s1)
;8. hl = OS_WIZNETREAD(s1)          
;9. if hl > 0 then ╨╛╨▒╤А╨░╨▒╨╛╤В╨░╨╡╨╝ ╨╕ goto 7
;10. if A == ERR_EAGAIN goto 7
;11. OS_NETSHUTDOWN(s1)
;12. goto 1

mainloop
        YIELD
        call checkquit
       
        call send_stdin ;stdin to internet client
       
mainloop_afterkey
        call readsocket_key ;GET_KEY
        or a ;cp NOKEY ;keylang==0?
        ;jr nz,$+3
        ;cp c ;keynolang==0?
        jr z,mainloop
       
         ;push af
         ;call prhex ;debug
         ;pop af
       
         cp 240 ;telnet codes
         jr nc,parsetelnetcodes
will_do_flag=$
        or a
        jr c,will_do_off ;skip one byte
subnegotiation_flag=$
        or a
        jr c,mainloop_afterkey
        call sendchar
        jr mainloop_afterkey

parsetelnetcodes
         ;cp 240
         jr z,subnegotiation_off
         cp 250
         jr z,subnegotiation_on
         cp 251 ;do
         jr z,will_do_on ;skip next byte
         cp 253 ;will
         jr z,will_do_on ;skip next byte
         jr mainloop
       
will_do_off
;will_do_off_once_flag=$+1
;        ld a,2
;        dec a
;        jp z,will_do_off_once_skip
;        ld (will_do_off_once_flag),a
        if 1==0
        ld a,255
        call term_prfsm_prchar
        ld a,253 ;will
        call term_prfsm_prchar
        ld a,34 ;??? ╨╜╨╡ ╨▓╨╛╤Б╨┐╤А╨╕╨╜╨╕╨╝╨░╨╡╤В╤Б╤П putty, ╨┐╨╕╤И╨╡╤В ╤Б╨╕╨╝╨▓╨╛╨╗ 34
        call term_prfsm_prchar
        endif
       
        ;ld a,255
        ;call term_prfsm_prchar
        ;ld a,251 ;do
        ;call term_prfsm_prchar
        ;ld a,0x2d ;??? ╨╜╨╡ ╨▓╨╛╤Б╨┐╤А╨╕╨╜╨╕╨╝╨░╨╡╤В╤Б╤П putty, ╨┐╨╕╤И╨╡╤В ╤Б╨╕╨╝╨▓╨╛╨╗ 2d
        ;call term_prfsm_prchar ;disable local echo
       
        if 1==0
        ld a,255
        call term_prfsm_prchar
        ;ld a,254 ;don't
        ld a,251 ;do
        call term_prfsm_prchar
        ld a,1 ;echo
        call term_prfsm_prchar ;╨╡╤Б╨╗╨╕ ╨┤╨╡╨╗╨░╤В╤М IAC IAC_DO IAC_Echo, ╤В╨╛ ╨║╨╗╨╕╨╡╨╜╤В ╨┐╨╛╤Б╤Л╨╗╨░╨╡╤В ╨║╨╜╨╛╨┐╨║╨╕ ╤В╨╛╨╗╤М╨║╨╛ ╨┐╨╛ ╨╡╨╜╤В╨╡╤А╤Г, ╨╜╨╛ ╨┐╤А╨╛╤Ж╨╡╤Б╤Б ╤А╨╡╨┤╨░╨║╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╤П ╨╜╨╡ ╨╛╤В╨╛╨▒╤А╨░╨╢╨░╨╡╤В
        endif

        if 1==0
        ld a,255
        call term_prfsm_prchar
        ld a,254 ;don't
        ;ld a,251 ;do
        call term_prfsm_prchar
        ld a,7 ;Remote Controlled Trans and Echo
        call term_prfsm_prchar ;╨╜╨╕ ╨╜╨░ ╤З╤В╨╛ ╨╜╨╡ ╨▓╨╗╨╕╤П╨╡╤В
        endif
       
        if 1==0
        ld a,255
        call term_prfsm_prchar
        ld a,250 ;╨Э╨░╤З╨░╨╗╨╛ ╤Б╤Г╨▒╨╛╨┐╤Ж╨╕╨╕
        call term_prfsm_prchar
        ld a,34
        call term_prfsm_prchar
        ld a,1
        call term_prfsm_prchar
        ld a,1;0
        call term_prfsm_prchar
        ld a,255
        call term_prfsm_prchar
        ld a,240 ;╨Ч╨░╨▓╨╡╤А╤И╨╡╨╜╨╕╨╡ ╤Б╨╛╨│╨╗╨░╤Б╨╛╨▓╨░╨╜╨╕╤П ╨┐╨░╤А╨░╨╝╨╡╤В╤А╨╛╨▓ (╨║╨╛╨╜╨╡╤Ж ╤Б╤Г╨▒╨╛╨┐╤Ж╨╕╨╕)
        call term_prfsm_prchar ;disable local line editing
        endif

        ld a,255
        call term_prfsm_prchar
        ld a,251
        call term_prfsm_prchar
        ld a,1
        call term_prfsm_prchar

        ld a,255
        call term_prfsm_prchar
        ld a,251
        call term_prfsm_prchar
        ld a,3
        call term_prfsm_prchar
will_do_off_once_skip
        ld a,55+128 ;or a
        jr will_do_onoff
will_do_on
        ld a,55 ;scf
will_do_onoff
        ld (will_do_flag),a
        jp mainloop_afterkey

subnegotiation_off      
        ld a,55+128 ;or a
        jr subnegotiation_onoff
subnegotiation_on
        ld a,55 ;scf
subnegotiation_onoff
        ld (subnegotiation_flag),a
        jp mainloop_afterkey


checkquit
waitpid_id=$+1
        ld e,0xff
        OS_CHECKPID
        or a
        ret nz ;jp z,quit
;dead
        ;ret
                dec a
                ld (waitpid_id),a
quit
;cmd closed!!!
        LD A,(soc_client)
        LD E,0 ;0 - ╨╖╨░╨║╤А╤Л╤В╤М ╨╜╨╡╨╝╨╡╨┤╨╗╨╡╨╜╨╜╨╛, 1 - ╨╖╨░╨║╤А╤Л╤В╤М ╤В╨╛╨╗╤М╨║╨╛ ╨╡╤Б╨╗╨╕ ╨▒╤Г╤Д╨╡╤А ╨╛╤В╨┐╤А╨░╨▓╨║╨╕ ╨┐╤Г╤Б╤В
        OS_NETSHUTDOWN

        dup 2 ;close twice - as stdin and as stdout! ╨╜╨░ ╤Б╨╗╤Г╤З╨░╨╣, ╨╡╤Б╨╗╨╕ ╨║╨╗╨╕╨╡╨╜╤В ╨╜╨╡ ╨╖╨░╨║╤А╤Л╨╗ ╤Г ╤Б╨╡╨▒╤П
        ld a,(stdinhandle)
        ld b,a
        OS_CLOSEHANDLE
        ld a,(stdouthandle)
        ld b,a
        OS_CLOSEHANDLE
        edup
inet_exiterr
        jp gotostart

        QUIT

        if 1==0
prhex
        push af
        ld a,'#'
        PRCHAR
        pop af
        call prhexdigit
prhexdigit
        rrca
        rrca
        rrca
        rrca
        push af
        or 0xf0
        daa
        add a,0xa0
        adc a,0x40
        PRCHAR
        pop af
        ret
        endif

readsocket_key
datain_size=$+1
        ld hl,0
        ld a,h
        or l
        jr z,WAIT_DATA
datain_addr=$+1
        ld hl,netinbuf
        ld a,(hl)
        inc hl
        ld (datain_addr),hl
        ld hl,(datain_size)
        dec hl
        ld (datain_size),hl
        ret
WAIT_DATA
;out:hl=datain_size
        ld hl,netinbuf
        ld (datain_addr),hl
wait_data0
        LD A,(soc_client)
        LD DE,netinbuf
        LD HL,NETINBUF_SZ
        OS_WIZNETREAD
        BIT 7,H
        JR Z,RECEIVED   ;╨╛╤И╨╕╨▒╨╛╨║ ╨╜╨╡╤В
        CP ERR_EAGAIN
        JP NZ,inet_exiterr      ;╨╛╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨╛╤И╨╕╨▒╨║╨╕
        YIELD           ;╨╜╨╡ ╨╛╨▒╤П╨╖╨░╤В╨╡╨╗╤М╨╜╨╛. ╨Х╤Б╨╗╨╕ ╨▓╤А╨╡╨╝╤П ╤А╨╡╨░╨│╨╕╤А╨╛╨▓╨░╨╜╨╕╤П ╨╜╨░ ╨┐╤А╨╕╤И╨╡╨┤╤И╨╕╨╡ ╨┤╨░╨╜╨╜╤Л╨╡ ╨╜╨╡ ╨║╤А╨╕╤В╨╕╤З╨╜╨╛,
                                                ;╤В╨╛ ╨╛╤В╨┤╨░╨┤╨╕╨╝ ╨║╨▓╨░╨╜╤В ╨▓╤А╨╡╨╝╨╡╨╜╨╕ ╤Б╨╕╤Б╤В╨╡╨╝╨╡.
        call checkquit
        call send_stdin
        JR wait_data0   ;╨┤╨░╨╜╨╜╤Л╤Е ╨╜╨╡╤В, ╨╢╨┤╤С╨╝
RECEIVED
        ld (datain_size),HL     ;╤Г╨┤╨░╤З╨╜╨╛. ╨╡╤Б╨╗╨╕ ╤В╤А╨╡╨▒╤Г╨╡╤В╤Б╤П, ╤В╨╛ ╤Б╨╛╤Е╤А╨░╨╜╤П╨╡╨╝ ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╨┐╤А╨╕╨╜╤П╤В╤Л╤Е ╨┤╨░╨╜╨╜╤Л╤Е.
        ;push hl
        ;call term_print
        ;pop hl
        jr readsocket_key

sendchar
;to stdout
        ;cp 0x80
        ;jr nc,sendchar_rustoutf8
        ;cp 0x08 ;backspace
        ;cp 0x0d ;enter
;        ld c,a
;sendchar_byte
;        ld a,c
sendchar_byte_a
        ld (stdoutbuf),a
sendchar_repeat
        ld hl,1
        ld de,stdoutbuf
stdouthandle=$+1
        ld b,0
        OS_WRITEHANDLE
        ld a,h
        or l
        ret nz
        YIELDKEEP
        call checkquit
        jr sendchar_repeat

send_stdin
;stdin to internet client
        ld de,stdinbuf
        ld hl,STDINBUF_SZ
stdinhandle=$+1
        ld b,0
        ;ld b,0xff
        OS_READHANDLE
;hl=size
        ld a,h
        or l
        ret z;jr z,mainloop_afterkey
        ld de,stdinbuf
        jr term_prfsm_prchars
        if 1==0
        ld b,h
        ld c,l
        ld hl,stdinbuf
term_print0
        push bc
        push hl
        ld a,(hl)
        call term_prfsm_prchar ;to internet client
        pop hl
        pop bc
        cpi
        jp pe,term_print0
        ret
        endif

term_prfsm_prchar
;to internet client
;a=char
        ld (netoutbuf),a        
;send_data_addr=$+1
        LD DE,netoutbuf
;send_data_size=$+1
        LD HL,1
term_prfsm_prchars
send_data0
        push de
        push hl
        LD A,(soc_client)
        OS_WIZNETWRITE
        BIT 7,H
        pop hl
        pop de
        JR Z,send_ok    ;╨╛╤И╨╕╨▒╨╛╨║ ╨╜╨╡╤В
        CP ERR_EMSGSIZE
        JP NZ,inet_exiterr      ;╨╛╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨╛╤И╨╕╨▒╨║╨╕
        push de
        push hl
        YIELD           ;╨╜╨╡ ╨╛╨▒╤П╨╖╨░╤В╨╡╨╗╤М╨╜╨╛. ╨Х╤Б╨╗╨╕ ╨▓╤А╨╡╨╝╤П ╨╜╨╡ ╨║╤А╨╕╤В╨╕╤З╨╜╨╛,
                                                ;╤В╨╛ ╨╛╤В╨┤╨░╨┤╨╕╨╝ ╨║╨▓╨░╨╜╤В ╨▓╤А╨╡╨╝╨╡╨╜╨╕ ╤Б╨╕╤Б╤В╨╡╨╝╨╡.
        call checkquit
        pop hl
        pop de
        JR send_data0   ;╨▒╤Г╤Д╨╡╤А ╨╛╤В╨┐╤А╨░╨▓╨║╨╕ ╨┐╨╡╤А╨╡╨┐╨╛╨╗╨╜╨╡╨╜, ╨╢╨┤╤С╨╝ ╨╛╤Б╨▓╨╛╨▒╨╛╨╢╨┤╨╡╨╜╨╕╤П
send_ok
        ;LD (DATA_SIZE),HL      ;╤Г╨┤╨░╤З╨╜╨╛. ╨╡╤Б╨╗╨╕ ╤В╤А╨╡╨▒╤Г╨╡╤В╤Б╤П, ╤В╨╛ ╤Б╨╛╤Е╤А╨░╨╜╤П╨╡╨╝ ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╨╛╤В╨┐╤А╨░╨▓╨╗╨╡╨╜╨╜╤Л╤Е ╨┤╨░╨╜╨╜╤Л╤Е.
        ;ld bc,(send_data_size)
        ;or a
        ;sbc hl,bc        
        ret

readapp
        ld a,b
        ld (curhandle),a
       
        OS_NEWAPP ;╨┤╨╗╤П ╨┐╨╡╤А╨▓╨╛╨╣ ╤Б╨╛╨╖╨┤╨░╨▓╨░╨╡╨╝╨╛╨╣ ╨╖╨░╨┤╨░╤З╨╕ ╨▒╤Г╨┤╤Г╤В ╤Б╨╛╨╖╨┤╨░╨╜╤Л ╨┐╨╡╤А╨▓╤Л╨╡ ╨┤╨▓╨░ ╨┐╨░╨╣╨┐╨░ ╨╕ ╨┐╨╛╨┤╨║╨╗╤О╤З╨╡╨╜╤Л
;dehl=╨╜╨╛╨╝╨╡╤А╨░ ╤Б╤В╤А╨░╨╜╨╕╤Ж ╨▓ 0000,4000,8000,c000 ╨╜╨╛╨▓╨╛╨│╨╛ ╨┐╤А╨╕╨╗╨╛╨╢╨╡╨╜╨╕╤П, b=id, a=error
        push bc ;b=id

        ld a,d
        SETPG32KHIGH
        push de
        push hl
        ld hl,COMMANDLINE ;command line
        call skipword
        call skipspaces ;╨┐╤А╨╛╨┐╤Г╤Б╤В╨╕╨╗╨╕ ╨┐╨╡╤А╨▓╨╛╨╡ ╤Б╨╗╨╛╨▓╨╛ (╤В╨░╨╝ ╨▒╤Л╨╗╨╛ term.com, ╨░ ╨┤╨░╨╗╤М╤И╨╡, ╨╜╨░╨┐╤А╨╕╨╝╨╡╤А, cmd.com autoexec.bat)
        ld de,0xc080
        ld bc,128  
        ldir ;command line
        pop hl
        pop de

        call readfile_pages_dehl

        ld a,(curhandle)
        ld b,a
        OS_CLOSEHANDLE

        pop af ;id
        ret

readfile_pages_dehl
        ld a,d
        SETPG32KHIGH
        ld a,0xc100/256
        call cmd_loadpage
        or a
        ret nz
       
        ld a,e
        SETPG32KHIGH
        ld a,0xc000/256
        call cmd_loadpage
        or a
        ret nz
       
        ld a,h
        SETPG32KHIGH
        ld a,0xc000/256
        call cmd_loadpage
        or a
        ret nz
       
        ld a,l
        SETPG32KHIGH
        ld a,0xc000/256

cmd_loadpage
;out: a=error
;keeps hl,de
        push de
        push hl
        ld d,a
        xor a
        ld l,a
        ld e,a
        sub d
        ld h,a ;de=buffer, hl=size
curhandle=$+1
        ld b,0
        OS_READHANDLE
        pop hl
        pop de
        ret

skipword
;hl=string
;out: hl=terminator/space addr
skipword0
        ld a,(hl)
        or a
        ret z
        sub ' '
        ret z
        inc hl
        jp skipword0

skipspaces
;hl=string
;out: hl=after last space
        ld a,(hl)
        cp ' '
        ret nz
        inc hl
        jr skipspaces

cmd_filename
        db "cmd.com",0

tpipename
        ;db "z:",0
        db "z:/a25",0

stdoutbuf
        db 0

netoutbuf
        db 0

stdinbuf
        ds STDINBUF_SZ

netinbuf
        ds NETINBUF_SZ

soc
        db 0
soc_client
        db 0

;struct sockaddr_in {unsigned char sin_family;unsigned short sin_port;
;       struct in_addr sin_addr;char sin_zero[8];};
destination_host               
        DEFB AF_INET
        DEFB PORT/256,PORT&0xff ;port (big endian)
        DEFB 0,0,0,0                    ;╨╕╤Б╤Е╨╛╨┤╤П╤Й╨╕╨╣ IP ╨░╨┤╤А╨╡╤Б (╨╜╨╡ ╨╕╤Б╨┐╨╛╨╗╤М╨╖╤Г╨╡╤В╤Б╤П ╨▓ ╤В╨╡╨║╤Г╤Й╨╡╨╣ ╤А╨╡╨░╨╗╨╕╨╖╨░╤Ж╨╕╨╕)
        DEFB 0,0,0,0,0,0,0,0    ;╤А╨╡╨╖╨╡╤А╨▓
       
end
        savebin "netterm.com",begin,end-begin
       
        LABELSLIST "..\..\us\user.l"