?login_element?

Subversion Repositories NedoOS

Rev

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

  1. swapimer
  2.         di
  3.         ld de,0x0038
  4.         ld hl,oldimer
  5.         ld bc,3
  6. swapimer0
  7.         ld a,(de)
  8.         ldi ;[oldimer] -> [0x0038]
  9.         dec hl
  10.         ld (hl),a ;[0x0038] -> [oldimer]
  11.         inc hl
  12.         jp pe,swapimer0
  13.         ei
  14.         ret
  15. oldimer
  16.         jp on_int ;заменится на код из 0x0038
  17.         jp 0x0038+3
  18.  
  19. on_int
  20. ;restore stack with de
  21.         LD (on_int_hl),HL
  22.         LD (on_int_sp),SP
  23.         pop hl
  24.         LD (on_int_jp),HL
  25.         LD (on_int_sp2),SP
  26.         LD SP,INTSTACK
  27.         push af
  28.         push bc
  29.         push de
  30.         ex de,hl
  31. ;если стек в экране, то восстанавливаем нулём, иначе de
  32.         ld a,(on_int_sp+1)
  33.         sub 0x40
  34.         cp 0x3f
  35.         jr nc,$+5 ;not screen
  36.         ld hl,0
  37. on_int_sp=$+1
  38.         ld (0),hl ;восстановили запоротый стек
  39.  
  40.         exx
  41.         ex af,af' ;'
  42.         push af
  43.         push bc
  44.         push de
  45.         push hl
  46.         push ix
  47.         push iy
  48.  
  49. int_curborder=$+1
  50.         ld e,0
  51.         OS_SETBORDER
  52.  
  53. curscrnum_int=$+1
  54.         ld e,0
  55.         OS_SETSCREEN
  56.        
  57.         call oldimer ;ei ;а что если выйдем поздно (по yield)? надо в конце обработчика убрать ei, но и это не поможет, т.к. yield сейчас с включенными прерываниями!!!
  58.  
  59.         ld a,(curpg16k) ;ok
  60.         push af
  61.         ld a,(curpg32klow) ;ok
  62.         push af
  63.         ld a,(curpg32khigh) ;ok
  64.         push af
  65.  
  66.         if KEMPSTON
  67.         GET_KEY
  68.         ld a,lx
  69.         ld (kempstonbuttons),a
  70.         endif
  71.  
  72.         if VIRTUALKEYS
  73.         ;GET_KEY
  74.         ;ld a,c ;кнопка без учёта языка
  75.         ;or a
  76.         ;jr z,$+5
  77.         ;ld (curkey),a
  78.        
  79.         OS_GETKEYMATRIX
  80.         rr c ;'a'
  81.         rla ;A
  82.         rr c ;'s'
  83.         rla ;B
  84.         ld c,lx
  85.         rr c ;'Space'
  86.         rla ;Select
  87.         ld c,hx
  88.         rr c ;'Enter'
  89.         rla ;Start
  90.         add a,a
  91.         bit 3,h ;7
  92.         jr z,$+3
  93.         inc a ;Up
  94.         add a,a
  95.         bit 4,h ;6
  96.         jr z,$+3
  97.         inc a ;Down
  98.         add a,a
  99.         bit 4,e ;5
  100.         jr z,$+3
  101.         inc a ;Left
  102.         add a,a
  103.         bit 2,h ;8
  104.         jr z,$+3
  105.         inc a ;Right
  106.         ;cpl
  107.        ifdef CLIENT
  108.         ld (joyTMPstate),a ;TODO в очередь, а в логике брать в том же порядке
  109.        else
  110.         ld (joy1state),a
  111.        endif
  112.        ;display "joy1state=",joy1state
  113. ;bit - button (ZX key)
  114. ;7 - A (A)
  115. ;6 - B (S)
  116. ;5 - Select (Space)
  117. ;4 - Start (Enter)
  118. ;3 - Up (7)
  119. ;2 - Down (6)
  120. ;1 - Left (5)
  121. ;0 - Right (8)
  122.         endif
  123.        
  124.         call setpgsmain40008000
  125.         ;LD     BC,PAGE3
  126.         ;LD     A,#C3
  127.         ;OUT    (C),A
  128.         call setpgc3
  129.  
  130.         CALL    PLAYS
  131.         LD      A,(SOUNDW)
  132.         CP      0
  133.         CALL    Z,PLAYS3
  134.         LD      A,5
  135.         LD      (SOUNDGO),A
  136.  
  137.         pop af
  138.         SETPG32KHIGH
  139.         pop af
  140.         SETPG32KLOW
  141.         pop af
  142.         SETPG16K
  143.  
  144.         ;call logic
  145.  
  146.         ld hl,timer
  147.         inc (hl)
  148.  
  149.         pop iy
  150.         pop ix
  151.         pop hl
  152.         pop de
  153.         pop bc
  154.         pop af
  155.         ex af,af' ;'
  156.         exx
  157.         pop de
  158.         pop bc
  159.         pop af        
  160. on_int_hl=$+1
  161.         ld hl,0
  162. on_int_sp2=$+1
  163.         ld sp,0
  164.         ei
  165. on_int_jp=$+1
  166.         jp 0
  167.  
  168. timer
  169.         db 0
  170.  
  171.        if VIRTUALKEYS
  172. joyTMPstate
  173.         db 0xff
  174. joy1state
  175.         db 0xff
  176. joy2state
  177.         db 0xff
  178.        endif
  179.        
  180. PLAYS
  181.         LD      A,(SOUNDW)
  182.         CP      0
  183.         RET     Z
  184.         LD      A,(MAP)
  185.         CP      15
  186.         JR      Z,BOSSPLA
  187.         CP      31
  188.         JR      Z,BOSSPLA
  189.         CALL    #C005
  190.         LD      A,(SOUNDW)
  191.         DEC     A
  192.         LD      (SOUNDW),A
  193.         RET
  194. BOSSPLA
  195.         CALL    #CBB8+5
  196.         LD      A,(SOUNDW)
  197.         DEC     A
  198.         LD      (SOUNDW),A
  199.         RET
  200. PLAYS3
  201.         CALL    AFXFRAME
  202.         LD      A,(SOUND1)
  203.         DEC     A
  204.         CP      0
  205.         JP      Z,PLAYS4
  206.         LD      (SOUND1),A
  207.         RET
  208. PLAYS4
  209.         LD      A,(NEWLEVEL)
  210.         CP      1
  211.         JR      Z,PLAYS4A
  212.         LD      A,(SOUNDGO)
  213.         CALL    AFXPLAY
  214.         LD      A,8
  215.         LD      (SOUND1),A
  216.         RET
  217. PLAYS4A
  218.         LD      A,(SOUNDGO)
  219.         CP      5
  220.         RET     Z
  221.         CALL    AFXPLAY
  222.         LD      A,8
  223.         LD      (SOUND1),A
  224.         RET
  225. SOUND1  DEFB    8
  226. SOUNDW  DEFB    200
  227.  
  228. kempstonbuttons
  229.         db 0
  230.  
  231.        ifdef CLIENT
  232.        if CLIENT
  233. sendjoyTMP
  234. ;отправить joyTMP
  235.         ld de,joyTMPstate ;ptr
  236.         ld hl,1 ;сколько слать
  237.         ld a,(datasoc)
  238.         OS_WIZNETWRITE
  239.         ;bit 7,h
  240.         ;JR Z,SEND_OK   ;ошибок нет
  241.         ;CP ERR_EMSGSIZE
  242.         ;JP NZ,ERR_EXIT ;обработка ошибки
  243.         ;OS_YIELD               ;не обязательно. Если время не критично,
  244.                                                 ;то отдадим квант времени системе.
  245.         ;JR WAIT_SEND   ;буфер отправки переполнен, ждём освобождения
  246. ;SEND_OK
  247.         ret
  248.  
  249. readstream0_retry
  250.         halt;YIELD
  251. readstream0
  252. ;bc=size
  253.         push de ;ptr
  254.         push bc ;размер
  255.         ld h,b
  256.         ld l,c ;ld hl,inetbuf_sz ;сколько читать
  257.         ld a,(datasoc)
  258.         OS_WIZNETREAD
  259.         bit 7,h
  260.         pop bc
  261.         pop de ;ptr
  262.        jr nz,readstream0_retry
  263.         ;jr z,readstream_ok
  264.         ;cp ERR_EAGAIN
  265.         ;jr z,readstream0 ;вдруг ответ не успел прийти
  266.         ;jp readstream_err
  267.         ;ld hl,0 ;size
  268. ;readstream_ok
  269. ;hl=сколько прочитали
  270.         ld a,h
  271.         or l
  272.         jr z,readstream0_retry
  273.         ret
  274.  
  275. twobytes
  276.         dw 0
  277.  
  278. readfrominet_tojoy1joy2
  279. ;hl=адрес процедуры, которую вызвать, если приняли сообщение (и так для всех сообщений в очереди)
  280.         ld (readfrominet_call),hl
  281. ;принять одно сообщение из TCP в очередь
  282. ;если там есть, то дешифровать истинные joy1(от сервера), joy2(наш с задержкой)
  283. ;надо принять гарантированно хотя бы одно!!!
  284.         ld de,twobytes
  285.         call readinetqueue ;чтобы принять гарантированно хотя бы одно сообщение
  286. inetqueue_oldsize=$+1
  287.        ld hl,0 ;до вынимания этого сообщения (2 байт)
  288. inetqueue_oldaddr=$+1
  289.        ld de,0
  290. ;hl=сколько есть байтов данных
  291. ;de=где
  292. readstream_parse0
  293.         ld a,(de)
  294.        or a
  295.        jr z,readstream_parse_sync
  296.         ld (joy1state),a
  297.         inc de
  298.         ld a,(de)
  299.         ld (joy2state),a
  300.        ;ld (logicindex),a
  301.         inc de
  302.         push de
  303.         push hl
  304. readfrominet_call=$+1
  305.         call 0
  306.         pop hl
  307.         pop de
  308.         dec hl
  309.         dec hl
  310.         ld a,h
  311.         or l
  312.         jr nz,readstream_parse0
  313.        ld (inetqueue_cursize),hl
  314.        ld hl,inetbuf
  315.        ld (inetqueue_curaddr),hl
  316.         ret
  317. readstream_parse_sync
  318. ;неожиданно пришёл sync, перестаём парсить
  319.        ld (inetqueue_cursize),hl
  320.        ld (inetqueue_curaddr),de
  321.         ret
  322.  
  323. readinetqueue_retry
  324.        push de
  325.         ld de,inetbuf
  326.        ld (inetqueue_curaddr),de
  327.         ld bc,inetbuf_sz
  328.         call readstream0
  329.        ld (inetqueue_cursize),hl
  330.        pop de
  331. readinetqueue
  332. ;читаем 2 байта из очереди в de
  333. ;если в очереди ничего нет, то подчитываем из интернета
  334. inetqueue_cursize=$+1
  335.         ld hl,0
  336. inetqueue_curaddr=$+1
  337.         ld bc,inetbuf
  338.         ld a,h
  339.         or l
  340.         jr z,readinetqueue_retry
  341.        ld (inetqueue_oldsize),hl
  342.        ld (inetqueue_oldaddr),bc
  343.         ld a,(bc)
  344.         ld (de),a
  345.         inc bc
  346.         inc de
  347.         dec hl
  348.         ld a,(bc)
  349.         ld (de),a
  350.         inc bc
  351.         inc de
  352.         dec hl
  353.        ld (inetqueue_cursize),hl
  354.        ld (inetqueue_curaddr),bc
  355.         ret
  356.  
  357. readinetblock
  358. ;de=addr
  359. ;hl=size (even)
  360.         push de
  361.         push hl
  362.         call readinetqueue
  363.         pop hl
  364.         pop de
  365.         inc de
  366.         inc de
  367.         dec hl
  368.         dec hl
  369.         ld a,h
  370.         or l
  371.         jr nz,readinetblock
  372.         ret
  373.  
  374. inet_waitsync
  375.         ;ld hl,inet_waitsync_check
  376.         ;call readfrominet_tojoy1joy2
  377.         ld de,twobytes;joy1state
  378.         call readinetqueue;readstream0
  379.         ld a,(twobytes)
  380.         or a
  381.         jr nz,inet_waitsync
  382.         ld de,rndseed1
  383.         call readinetqueue;readstream0
  384.         ld de,rndseed2
  385.         call readinetqueue;readstream0
  386.         ;ld de,MESTO
  387.         ;call readinetqueue;readstream0
  388.        xor a
  389.        ld (MESTO),a
  390.         ld de,UNITS
  391.         ld hl,UNITS_blocksz
  392.         call readinetblock
  393.        if LOGGING
  394.        ld hl,0
  395.        ld (logicindex),hl
  396.        ld a,0
  397.        ld (wrlog),a
  398.        endif
  399. ;inet_waitsync_check
  400.         ret
  401.  
  402.        else ;SERVER
  403.  
  404. readfrominet_tojoy2
  405. ;принять сколько получится из TCP в очередь
  406. ;если там есть полный joy2, то дешифровать для текущего фрейма логики (иначе останется старое значение joy2)
  407. ;костыль: принимаем сколько есть, если >=1, то берём последний байт
  408.         ld de,inetbuf
  409. ;readstream0
  410.         push de ;ptr
  411.         ;push hl ;размер
  412.         ld hl,inetbuf_sz;1 ;сколько читать
  413.         ld a,(datasoc)
  414.         OS_WIZNETREAD
  415.         bit 7,h
  416.         ;pop hl
  417.         pop de ;ptr
  418.         jr z,readstream_ok
  419.         ;cp ERR_EAGAIN
  420.         ;jr z,readstream0 ;вдруг ответ не успел прийти
  421.         ;jp readstream_err
  422.         ld hl,0 ;size
  423. readstream_ok
  424. ;hl=сколько прочитали
  425.         ld a,h
  426.         or l
  427.         jr z,serv_gotnothing
  428.         add hl,de
  429.         dec hl
  430.         ld a,(hl) ;last byte received
  431.         ld (joy2state),a
  432. serv_gotnothing
  433.         ret
  434.  
  435. sendjoy1joy2
  436.        ld a,(joyTMPstate)
  437.        ld (joy1state),a ;атомарно
  438.        ;ld a,(joy2state)
  439.        ;push af
  440.        ;ld a,(logicindex)
  441.        ;ld (joy2state),a
  442. ;отправить joy1, joy2
  443.         ld de,joy1state ;ptr
  444.         call sendjoy1joy2_de
  445.        ;pop af
  446.        ;ld (joy2state),a
  447.         ret
  448.  
  449.        
  450. sendjoy1joy2_de
  451.         ld hl,2 ;сколько слать
  452. sendblock
  453.         ld a,(datasoc)
  454.         OS_WIZNETWRITE
  455.         ;bit 7,h
  456.         ;JR Z,SEND_OK   ;ошибок нет
  457.         ;CP ERR_EMSGSIZE
  458.         ;JP NZ,ERR_EXIT ;обработка ошибки
  459.         ;OS_YIELD               ;не обязательно. Если время не критично,
  460.                                                 ;то отдадим квант времени системе.
  461.         ;JR WAIT_SEND   ;буфер отправки переполнен, ждём освобождения
  462. ;SEND_OK
  463.         ret
  464.  
  465.        if 0
  466. sendblock
  467. ;de=addr
  468. ;hl=size (even)
  469.         push de
  470.         push hl
  471.         call sendjoy1joy2_de
  472.         pop hl
  473.         pop de
  474.         inc de
  475.         inc de
  476.         dec hl
  477.         dec hl
  478.         ld a,h
  479.         or l
  480.         jr nz,sendblock
  481.         ret
  482.        endif
  483.  
  484. inet_sendsync
  485.         ld de,twozeros
  486.         call sendjoy1joy2_de
  487.         ld de,rndseed1
  488.         call sendjoy1joy2_de
  489.         ld de,rndseed2
  490.         call sendjoy1joy2_de
  491.         ;ld de,MESTO
  492.         ;call sendjoy1joy2_de
  493.        xor a
  494.        ld (MESTO),a
  495.         ld de,UNITS
  496.         ld hl,UNITS_blocksz
  497.         call sendblock
  498.        if LOGGING
  499.        ld hl,0
  500.        ld (logicindex),hl
  501.        ld a,0
  502.        ld (wrlog),a
  503.        endif
  504.         ret
  505. twozeros
  506.         dw 0
  507.        
  508.        endif ;SERVER
  509.  
  510.        if LOGGING
  511. wrlog
  512.        ret ;/nop
  513. logicindex=$+1
  514.         ld hl,0
  515.         ld (logportion+0),hl
  516.         ld hl,(joy1state)
  517.         ld (logportion+2),hl
  518.         ld hl,(rndseed1)
  519.         ld (logportion+4),hl
  520.         ld hl,(rndseed2)
  521.         ld (logportion+6),hl
  522. loghandle=$+1
  523.         ld b,0
  524.         ld de,logportion
  525.         ld hl,8
  526.         OS_WRITEHANDLE
  527.        
  528.         ld hl,(logicindex)
  529.         ld a,h
  530.         cp 15
  531.         ret c
  532.        ld a,0xc9
  533.        ld (wrlog),a
  534.        ld a,(loghandle)
  535.        ld b,a
  536.        OS_CLOSEHANDLE
  537.         ret
  538.        endif
  539.  
  540. logportion
  541.         ds 8 ;time,joy1joy2,rndseed1,rndseed2
  542.  
  543.        endif
  544.