?login_element?

Subversion Repositories NedoOS

Rev

Rev 571 | Rev 584 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.         DEVICE ZXSPECTRUM128
  2.         include "../_sdk/sys_h.asm"
  3.  
  4. STDINBUF_SZ=256
  5. NETINBUF_SZ=256
  6.  
  7. PORT=2323
  8.  
  9. SHUT_RDWR               EQU 2
  10. ERR_EAGAIN              EQU 35          ;/* Try again */
  11. ERR_EWOULDBLOCK EQU ERR_EAGAIN  ;/* Operation would block */
  12. ERR_INTR                EQU 4
  13. ERR_NFILE               EQU 23
  14. ERR_ALREADY     EQU 37
  15. ERR_NOTSOCK     EQU 38
  16. ERR_EMSGSIZE    EQU 40    ;/* Message too long */
  17. ERR_PROTOTYPE   EQU 41
  18. ERR_AFNOSUPPORT EQU 47
  19. ERR_HOSTUNREACH EQU 65
  20. ERR_ECONNABORTED EQU    53      ;/* Software caused connection abort */
  21. ERR_CONNRESET   EQU 54
  22. ERR_NOTCONN     EQU 57
  23.  
  24. ;************************* Протоколы соединений *************************
  25. SOCK_STREAM EQU 0x01            ;tcp/ip
  26. SOCK_ICMP       EQU 0x02                ;icmp
  27. SOCK_DGRAM      EQU 0x03                ;udp/ip
  28.  
  29. AF_INET EQU 2
  30.  
  31.         org PROGSTART
  32. begin
  33. gotostart
  34.         ld sp,0x4000
  35.         OS_HIDEFROMPARENT
  36.         ;ld e,6 ;textmode
  37.         ;OS_SETGFX
  38.         OS_GETMAINPAGES ;dehl
  39.         push de
  40.         push hl
  41.         ld e,l
  42.         OS_DELPAGE
  43.         pop hl
  44.         ld e,h
  45.         OS_DELPAGE
  46.         pop de
  47.         OS_DELPAGE
  48.  
  49. ;1. s = OS_NETSOCKET
  50.         LD D,AF_INET
  51.         LD E,SOCK_STREAM
  52.         OS_NETSOCKET
  53.         BIT 7,L
  54.         JP NZ,inet_exiterr      ;обработка ошибки
  55.         LD A,L
  56.         ld (soc),a
  57. ;2. OS_BIND(s)
  58.         ld a,(soc)
  59.         LD DE,destination_host
  60.         OS_BIND
  61.         BIT 7,L
  62.         JP NZ,inet_exiterr
  63. ;3. OS_LISTEN(s)
  64.         ld a,(soc)
  65.         OS_LISTEN
  66.         bit 7,l
  67.         JP NZ,inet_exiterr
  68. ;4. s1 = OS_ACCEPT(s)
  69. ;5. если s1<0 гото 4
  70. WAIT_CLIENTS
  71.         LD A,(soc)
  72.         OS_ACCEPT
  73.         BIT 7,L
  74.         JR Z,ESTABLISHED
  75.         CP ERR_EAGAIN
  76.         JP NZ,inet_exiterr      ;обработка ошибки
  77.         YIELD   ;не обязательно. Если время реагирования на подключение не критично,
  78.                                 ;то отдадим квант времени системе.
  79.         JR WAIT_CLIENTS ;никто не подключился, ждём
  80. ESTABLISHED
  81.         LD A,L                          ;удачно
  82.         LD (soc_client),A       ;сохраняем дескриптор сокета.
  83. ;6. OS_NETSHUTDOWN(s)
  84. ;close_wait:
  85.         LD A,(soc)
  86.         LD E,0 ;0 - закрыть немедленно, 1 - закрыть только если буфер отправки пуст
  87.         OS_NETSHUTDOWN
  88.         ;BIT 7,L
  89.         ;jp z,close_ok       ;сокет закрылся
  90.         ;CP ERR_EAGAIN
  91.         ;JP NZ,inet_exiterr             ;обработка ошибки не связанной с ожиданием отправки.
  92.         ;YIELD          ;не обязательно. Если время не критично,
  93.                                         ;то отдадим квант времени системе.
  94.         ;JR close_wait ;ожидаем отправки данных
  95. close_ok
  96. ;7. если надо то OS_WIZNETWRITE(s1)
  97. ;8. hl = OS_WIZNETREAD(s1)          
  98. ;9. if hl > 0 then обработаем и goto 7
  99. ;10. if A == ERR_EAGAIN goto 7
  100. ;11. OS_NETSHUTDOWN(s1)
  101. ;12. goto 1
  102.  
  103.         ld de,tpipename
  104.         push de
  105.         OS_OPENHANDLE
  106.         ld a,b
  107.         ld (stdinhandle),a
  108.         pop de
  109.         OS_OPENHANDLE
  110.         ld a,b
  111.         ld (stdouthandle),a
  112.  
  113.         OS_GETMAINPAGES ;out: d,e,h,l=pages in 0000,4000,8000,c000, c=flags, b=id
  114.         ld a,(stdinhandle)
  115.         ld e,a
  116.         ld a,(stdouthandle)
  117.         ld d,a
  118.         ld h,0xff ;rnd
  119. ;b=id, e=stdin, d=stdout, h=stderr        
  120.         OS_SETSTDINOUT
  121.  
  122. ;TODO запускать файл, указанный в параметре (по умолчанию cmd, искать в bin)
  123.         ld de,cmd_filename
  124.         OS_OPENHANDLE
  125.         or a
  126.         jr nz,execcmd_error
  127.        
  128.         call readapp ;делает CLOSE
  129.        
  130.         push af
  131.         ld b,a
  132.         ld a,(stdinhandle)
  133.         ld d,a
  134.         ld a,(stdouthandle)
  135.         ld e,a
  136.         ld h,0xff ;rnd
  137. ;b=id, e=stdin, d=stdout, h=stderr        
  138.         OS_SETSTDINOUT
  139.        
  140.         pop af ;id
  141.  
  142.         ld e,a ;id
  143.         ld (waitpid_id),a
  144.         OS_RUNAPP
  145.  
  146. execcmd_error
  147.  
  148. mainloop
  149.         YIELD
  150.         call checkquit
  151.        
  152.         call send_stdin ;stdin to internet client
  153.        
  154. mainloop_afterkey
  155.         call readsocket_key ;GET_KEY
  156.         or a ;cp NOKEY ;keylang==0?
  157.         ;jr nz,$+3
  158.         ;cp c ;keynolang==0?
  159.         jr z,mainloop
  160.        
  161.          ;push af
  162.          ;call prhex ;debug
  163.          ;pop af
  164.        
  165.          cp 240 ;telnet codes
  166.          jr nc,parsetelnetcodes
  167. will_do_flag=$
  168.         or a
  169.         jr c,will_do_off ;skip one byte
  170. subnegotiation_flag=$
  171.         or a
  172.         jr c,mainloop_afterkey
  173.         call sendchar
  174.         jr mainloop_afterkey
  175.  
  176. parsetelnetcodes
  177.          ;cp 240
  178.          jr z,subnegotiation_off
  179.          cp 250
  180.          jr z,subnegotiation_on
  181.          cp 251
  182.          jr z,will_do_on ;skip next byte
  183.          cp 253
  184.          jr z,will_do_on ;skip next byte
  185.          jr mainloop
  186.        
  187. will_do_off
  188.         ld a,55+128 ;or a
  189.         jr will_do_onoff
  190. will_do_on
  191.         ld a,55 ;scf
  192. will_do_onoff
  193.         ld (will_do_flag),a
  194.         jr mainloop_afterkey
  195.  
  196. subnegotiation_off      
  197.         ld a,55+128 ;or a
  198.         jr subnegotiation_onoff
  199. subnegotiation_on
  200.         ld a,55 ;scf
  201. subnegotiation_onoff
  202.         ld (subnegotiation_flag),a
  203.         jr mainloop_afterkey
  204.  
  205.  
  206. checkquit
  207. waitpid_id=$+1
  208.         ld e,0
  209.         OS_WAITPID
  210.         or a
  211.         jp z,quit
  212.         ret
  213.  
  214. quit
  215. ;cmd closed!!!
  216.         LD A,(soc_client)
  217.         LD E,0 ;0 - закрыть немедленно, 1 - закрыть только если буфер отправки пуст
  218.         OS_NETSHUTDOWN
  219.  
  220.         dup 2 ;close twice - as stdin and as stdout! на случай, если клиент не закрыл у себя
  221.         ld a,(stdinhandle)
  222.         ld b,a
  223.         OS_CLOSEHANDLE
  224.         ld a,(stdouthandle)
  225.         ld b,a
  226.         OS_CLOSEHANDLE
  227.         edup
  228. inet_exiterr
  229.         jp gotostart
  230.  
  231.         QUIT
  232.  
  233.         if 1==0
  234. prhex
  235.         push af
  236.         ld a,'#'
  237.         PRCHAR
  238.         pop af
  239.         call prhexdigit
  240. prhexdigit
  241.         rrca
  242.         rrca
  243.         rrca
  244.         rrca
  245.         push af
  246.         or 0xf0
  247.         daa
  248.         add a,0xa0
  249.         adc a,0x40
  250.         PRCHAR
  251.         pop af
  252.         ret
  253.         endif
  254.  
  255. readsocket_key
  256. datain_size=$+1
  257.         ld hl,0
  258.         ld a,h
  259.         or l
  260.         jr z,WAIT_DATA
  261. datain_addr=$+1
  262.         ld hl,netinbuf
  263.         ld a,(hl)
  264.         inc hl
  265.         ld (datain_addr),hl
  266.         ld hl,(datain_size)
  267.         dec hl
  268.         ld (datain_size),hl
  269.         ret
  270. WAIT_DATA
  271. ;out:hl=datain_size
  272.         ld hl,netinbuf
  273.         ld (datain_addr),hl
  274. wait_data0
  275.         LD A,(soc_client)
  276.         LD DE,netinbuf
  277.         LD HL,NETINBUF_SZ
  278.         OS_WIZNETREAD
  279.         BIT 7,H
  280.         JR Z,RECEIVED   ;ошибок нет
  281.         CP ERR_EAGAIN
  282.         JP NZ,inet_exiterr      ;обработка ошибки
  283.         YIELD           ;не обязательно. Если время реагирования на пришедшие данные не критично,
  284.                                                 ;то отдадим квант времени системе.
  285.         call checkquit
  286.         call send_stdin
  287.         JR wait_data0   ;данных нет, ждём
  288. RECEIVED
  289.         ld (datain_size),HL     ;удачно. если требуется, то сохраняем количество принятых данных.
  290.         ;push hl
  291.         ;call term_print
  292.         ;pop hl
  293.         jr readsocket_key
  294.  
  295. sendchar
  296. ;to stdout
  297.         ;cp 0x80
  298.         ;jr nc,sendchar_rustoutf8
  299.         ;cp 0x08 ;backspace
  300.         ;cp 0x0d ;enter
  301. ;        ld c,a
  302. ;sendchar_byte
  303. ;        ld a,c
  304. sendchar_byte_a
  305.         ld (stdoutbuf),a
  306. sendchar_repeat
  307.         ld hl,1
  308.         ld de,stdoutbuf
  309. stdouthandle=$+1
  310.         ld b,0
  311.         OS_WRITEHANDLE
  312.         ld a,h
  313.         or l
  314.         ret nz
  315.         YIELDKEEP
  316.         call checkquit
  317.         jr sendchar_repeat
  318.  
  319. send_stdin
  320. ;stdin to internet client
  321.         ld de,stdinbuf
  322.         ld hl,STDINBUF_SZ
  323. stdinhandle=$+1
  324.         ld b,0
  325.         ;ld b,0xff
  326.         OS_READHANDLE
  327. ;hl=size
  328.         ld a,h
  329.         or l
  330.         ret z;jr z,mainloop_afterkey
  331.         ld b,h
  332.         ld c,l
  333.         ld hl,stdinbuf
  334. term_print0
  335.         push bc
  336.         push hl
  337.         ld a,(hl)
  338.         call term_prfsm_prchar ;to internet client
  339.         pop hl
  340.         pop bc
  341.         cpi
  342.         jp pe,term_print0
  343.         ret
  344.  
  345. term_prfsm_prchar
  346. ;to internet client
  347. ;a=char
  348.         ld (netoutbuf),a        
  349. send_data0
  350.         LD A,(soc_client)
  351. send_data_addr=$+1
  352.         LD DE,netoutbuf
  353. send_data_size=$+1
  354.         LD HL,1
  355.         OS_WIZNETWRITE
  356.         BIT 7,H
  357.         JR Z,send_ok    ;ошибок нет
  358.         CP ERR_EMSGSIZE
  359.         JP NZ,inet_exiterr      ;обработка ошибки
  360.         YIELD           ;не обязательно. Если время не критично,
  361.                                                 ;то отдадим квант времени системе.
  362.         call checkquit
  363.         JR send_data0   ;буфер отправки переполнен, ждём освобождения
  364. send_ok
  365.         ;LD (DATA_SIZE),HL      ;удачно. если требуется, то сохраняем количество отправленных данных.
  366.         ;ld bc,(send_data_size)
  367.         ;or a
  368.         ;sbc hl,bc        
  369.         ret
  370.  
  371. readapp
  372.         ld a,b
  373.         ld (curhandle),a
  374.        
  375.         OS_NEWAPP ;для первой создаваемой задачи будут созданы первые два пайпа и подключены
  376. ;dehl=номера страниц в 0000,4000,8000,c000 нового приложения, b=id, a=error
  377.         push bc ;b=id
  378.  
  379.         ld a,d
  380.         SETPG32KHIGH
  381.         push de
  382.         push hl
  383.         ld hl,COMMANDLINE ;command line
  384.         call skipword
  385.         call skipspaces ;пропустили первое слово (там было term.com, а дальше, например, cmd.com autoexec.bat)
  386.         ld de,0xc080
  387.         ld bc,128  
  388.         ldir ;command line
  389.         pop hl
  390.         pop de
  391.  
  392.         call readfile_pages_dehl
  393.  
  394.         ld a,(curhandle)
  395.         ld b,a
  396.         OS_CLOSEHANDLE
  397.  
  398.         pop af ;id
  399.         ret
  400.  
  401. readfile_pages_dehl
  402.         ld a,d
  403.         SETPG32KHIGH
  404.         ld a,0xc100/256
  405.         call cmd_loadpage
  406.         or a
  407.         ret nz
  408.        
  409.         ld a,e
  410.         SETPG32KHIGH
  411.         ld a,0xc000/256
  412.         call cmd_loadpage
  413.         or a
  414.         ret nz
  415.        
  416.         ld a,h
  417.         SETPG32KHIGH
  418.         ld a,0xc000/256
  419.         call cmd_loadpage
  420.         or a
  421.         ret nz
  422.        
  423.         ld a,l
  424.         SETPG32KHIGH
  425.         ld a,0xc000/256
  426.  
  427. cmd_loadpage
  428. ;out: a=error
  429. ;keeps hl,de
  430.         push de
  431.         push hl
  432.         ld d,a
  433.         xor a
  434.         ld l,a
  435.         ld e,a
  436.         sub d
  437.         ld h,a ;de=buffer, hl=size
  438. curhandle=$+1
  439.         ld b,0
  440.         OS_READHANDLE
  441.         pop hl
  442.         pop de
  443.         ret
  444.  
  445. skipword
  446. ;hl=string
  447. ;out: hl=terminator/space addr
  448. skipword0
  449.         ld a,(hl)
  450.         or a
  451.         ret z
  452.         sub ' '
  453.         ret z
  454.         inc hl
  455.         jp skipword0
  456.  
  457. skipspaces
  458. ;hl=string
  459. ;out: hl=after last space
  460.         ld a,(hl)
  461.         cp ' '
  462.         ret nz
  463.         inc hl
  464.         jr skipspaces
  465.  
  466. cmd_filename
  467.         db "cmd.com",0
  468.  
  469. tpipename
  470.         db "z:",0
  471.  
  472. stdoutbuf
  473.         db 0
  474.  
  475. netoutbuf
  476.         db 0
  477.  
  478. stdinbuf
  479.         ds STDINBUF_SZ
  480.  
  481. netinbuf
  482.         ds NETINBUF_SZ
  483.  
  484. soc
  485.         db 0
  486. soc_client
  487.         db 0
  488.  
  489. ;struct sockaddr_in {unsigned char sin_family;unsigned short sin_port;
  490. ;       struct in_addr sin_addr;char sin_zero[8];};
  491. destination_host               
  492.         DEFB AF_INET
  493.         DEFB PORT/256,PORT&0xff ;port (big endian)
  494.         DEFB 0,0,0,0                    ;исходящий IP адрес (не используется в текущей реализации)
  495.         DEFB 0,0,0,0,0,0,0,0    ;резерв
  496.        
  497. end
  498.         savebin "netterm.com",begin,end-begin
  499.        
  500.         LABELSLIST "..\..\us\user.l"
  501.