Subversion Repositories NedoOS

Rev

Rev 1135 | Rev 1510 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1.         DEVICE ZXSPECTRUM128
  2.         include "../_sdk/sys_h.asm"
  3.  
  4. ;при закрытии cmd term должен закрыться
  5.  
  6. RECODEINPUT=1
  7.  
  8. MOUSETIMEOUT=150;50
  9.  
  10. READPASTABUF_SZ=80
  11. STDINBUF_SZ=256
  12.  
  13. HTMLTOPY=0
  14. HTMLHGT=25
  15.  
  16. COLOR=7
  17. CURSORCOLOR=0x38
  18.  
  19. REPEATNOKEY=0;2
  20.  
  21.         macro BDOSSETPGSSCR
  22.         ld a,(user_scr0_low) ;ok ;pgscr0_0 ;attr
  23.         SETPG32KLOW
  24.         ld a,(user_scr0_high) ;ok ;pgscr0_1 ;text
  25.         SETPG32KHIGH
  26.         endm
  27.  
  28.         org PROGSTART
  29. begin
  30.         ld sp,0x4000
  31.         OS_HIDEFROMPARENT
  32.         ld e,6 ;textmode
  33.         OS_SETGFX
  34.         ld de,ansipal
  35.         OS_SETPAL
  36.         OS_GETMAINPAGES ;out: d,e,h,l=pages in 0000,4000,8000,c000, c=flags, b=id
  37.         ld a,e
  38.         ld (pgscrbuf),a
  39.         push hl
  40.         ld e,l
  41.         OS_DELPAGE
  42.         pop hl
  43.         ld e,h
  44.         OS_DELPAGE
  45.  
  46.         OS_SETSYSDRV
  47.  
  48.         ld de,tpipename
  49.         push de
  50.         OS_OPENHANDLE
  51.         ld a,b
  52.         ld (stdinhandle),a
  53.         pop de
  54.         OS_OPENHANDLE
  55.         ld a,b
  56.         ld (stdouthandle),a
  57.        
  58.         ld e,COLOR
  59.         call BDOS_cls
  60.  
  61.         ld a,(stdinhandle)
  62.         ld e,a
  63.         ld a,(stdouthandle)
  64.         ld d,a
  65.         ld h,0xff ;rnd
  66. ;b=id, e=stdin, d=stdout, h=stderr        
  67.         OS_SETSTDINOUT
  68.  
  69. ;TODO запускать файл, указанный в параметре (по умолчанию cmd, искать в bin)
  70.         ld de,cmd_filename
  71.         OS_OPENHANDLE
  72.         or a
  73.         jr nz,execcmd_error
  74.        
  75.         call readapp ;делает CLOSE
  76.        
  77.         push af
  78.         ld b,a
  79.         ld a,(stdinhandle)
  80.         ld d,a
  81.         ld a,(stdouthandle)
  82.         ld e,a
  83.         ld h,0xff ;rnd
  84. ;b=id, e=stdin, d=stdout, h=stderr        
  85.         OS_SETSTDINOUT
  86.        
  87.         pop af ;id
  88.  
  89.         ld e,a ;id
  90.         ld (waitpid_id),a
  91.         OS_RUNAPP
  92.  
  93.         ld hl,trecode
  94.         ld d,trecodeback/256
  95. maketrecodeback0
  96.         ld e,(hl)
  97.         ld a,l
  98.         ld (de),a
  99.         inc l
  100.         jr nz,maketrecodeback0
  101.  
  102. execcmd_error
  103. mainloop_afternokey
  104.        if REPEATNOKEY != 0
  105. ;если два раза подряд нет событий, то надо делать YIELD, иначе YIELDKEEP
  106. ;т.е. когда нет событий, идёт всё время YIELD. А если событие,пусто,событие,пусто, то всё время YIELDKEEP
  107. ;тогда курсор исчезает - плохо
  108. wasnokey=$+1
  109.         ld a,1
  110.         dec a
  111.         jr nz,mainloop_yieldkeep
  112.         ;scf
  113.         ;ld a,55 ;"scf"
  114.         ;ld (wasnokey),a
  115.         ;jr nc,mainloop_yieldkeep
  116.        else
  117. mainloop_afterkey
  118.        endif
  119.         call printcursor
  120.          ld hl,(pr_buf_curaddr)
  121.          ld (wascursorcuraddr),hl        
  122.         call getmousexy
  123.         ld (mousecursor_wasxy),de
  124. mousetimeout=$+1
  125.         ld a,1
  126.         dec a
  127.         jr z,noshowmouse
  128.         ld (mousetimeout),a
  129.         call BDOS_countattraddr_mousecursor
  130.         ld a,(hl)
  131.         cpl
  132.         ld (hl),a
  133.          ;ld (hl),CURSORCOLOR
  134. noshowmouse
  135.  
  136.         ;OS_SETWAITING ;засыпаем, будем просыпаться только при появлении чего-то в пайпе
  137.         YIELD ;вернётся раньше, если что-то появилось в пайпе
  138.         ld a,(pgscrbuf) ;ok
  139.         SETPG16K
  140.         call BDOS_countattraddr
  141. wascursorcuraddr=$+1
  142.         ld de,killbuf_byte
  143.         ld a,e
  144.         add a,0x40 ;attr
  145.         adc a,0
  146.         ld e,a
  147.         ld a,(de) ;из pgscrbuf
  148.         ld (hl),a;COLOR
  149.  
  150.        if REPEATNOKEY != 0
  151.         jr mainloop_afterkeyq
  152. mainloop_afterkey
  153.        ;if REPEATNOKEY != 0
  154.         ;ld a,55+128 ;"or a"
  155.         ;ld (wasnokey),a
  156.         ld a,REPEATNOKEY;2
  157. mainloop_yieldkeep
  158.         ld (wasnokey),a
  159.        ;endif
  160.         ;OS_SETWAITING ;засыпаем, будем просыпаться только при появлении чего-то в пайпе
  161.         YIELD ;вернётся раньше, если что-то появилось в пайпе
  162. mainloop_afterkeyq
  163.        endif
  164. mousecursor_wasxy=$+1
  165.         ld de,0
  166.          call getscrbuftop_a
  167.          add a,d ;0..24
  168.          ld h,a
  169.          ld a,e
  170.          or 0x80
  171.          rrca ;(x/2)+0x40 или 0xc0
  172.         add a,0x40 ;attr
  173.         adc a,0
  174.         ld l,a
  175.         ld a,(hl) ;из pgscrbuf
  176.         push af
  177.         call BDOS_countattraddr_mousecursor
  178.         pop af
  179.         ld (hl),a ;screen
  180.  
  181. mainloop_afterredraw
  182.        
  183. waitpid_id=$+1
  184.         ld e,0
  185.         OS_CHECKPID ;TODO проверять, что пайп с той стороны не закрыт
  186.         or a
  187.         jp z,quit ;dead
  188.        
  189.         jr mainloop_type0_go
  190. mainloop_type0
  191.         ;OS_SETWAITING ;засыпаем, будем просыпаться только при появлении чего-то в пайпе
  192.         ;YIELDKEEP
  193.  
  194. mainloop_type0_go
  195.         call type_stdin ;stdin to screen
  196.         jr nc,mainloop_type0 ;data present
  197.        
  198.         if 1==0
  199. ;if long time no message from stdin, print cursor
  200.         OS_GETTIMER ;hlde=timer
  201.         push de
  202.         ex de,hl
  203. lastsdtinmsgtimer=$+1
  204.         ld de,0
  205.          ;ld (lastsdtinmsgtimer),hl
  206.         or a
  207.         sbc hl,de ;hl=timer-oldtimer
  208. cursortimelimit=$+1
  209.         ld bc,1
  210.         or a
  211.         sbc hl,bc
  212.         pop hl
  213.         jr c,noprintcursor
  214.          ;ld (lastsdtinmsgtimer),hl
  215.        
  216.         ld a,4
  217.         out (0xfe),a
  218.         call printcursor
  219.         ld a,1
  220.         ld (cursortimelimit),a
  221.  
  222.         ld a,2
  223.         out (0xfe),a
  224.         jr noprintcursorq
  225. noprintcursor
  226.         ld a,7
  227.         out (0xfe),a
  228. noprintcursorq
  229.         endif
  230.  
  231.         GET_KEY ;out: a=key (NOKEY=no key), de=mouse position (y,x), l=mouse buttons (bits 0,1,2: 0=pressed)+mouse wheel (bits 7..4), h=high bits of key|register, bc=keynolang, nz=no focus (mouse position=0, ignore it!)
  232.         jp nz,mainloop_afternokey ;no focus
  233.  
  234.         ;or a ;cp NOKEY ;keylang==0?
  235.         ;jr nz,$+3
  236.         ;cp c ;keynolang==0?
  237.         ;jp z,mainloop_afternokey
  238.         cp key_redraw
  239.         jp z,term_redraw
  240.         ld b,a
  241.  
  242.         ld a,l
  243.         and 0xf0
  244. control_imer_oldmousewheel=$+2
  245.         ld hx,0
  246.         ld (control_imer_oldmousewheel),a
  247.         sub hx
  248.         ;ld (mouse_scrollvalue),a
  249.         jr z,nowheelmove
  250.         jp p,term_pgdown
  251.         jp term_pgup
  252. nowheelmove
  253.         ;ld a,0
  254.         ;ld (mouse_scrollvalue),a ;default scrollvalue
  255.  
  256.         ld a,b
  257.         or a
  258.         jp nz,term_sendchar        
  259. ;no action? mouse coords change is also an action
  260. control_imer_oldmousecoords=$+1
  261.         ld bc,0
  262.         ld (control_imer_oldmousecoords),de
  263.         ld a,b
  264.         sub d
  265.         ld d,a
  266.         ld a,e
  267.         sub c
  268.         ld e,a
  269.         or d
  270.         jr z,nomousemove
  271.         push hl
  272.         call mousemove
  273.         pop hl
  274.         jr sendmouseevent
  275. nomousemove
  276.         ld a,l ;mouse buttons
  277. oldmousebuttons=$+1
  278.         ld h,0
  279.         ld (oldmousebuttons),a
  280.         xor h
  281.         and 7
  282.         ;jr nz,sendmouseevent
  283.         jp z,mainloop_afternokey
  284. sendmouseevent
  285.          ld a,MOUSETIMEOUT;50
  286.          ld (mousetimeout),a
  287.         ld a,l
  288.         cpl
  289.         and 7
  290.         jr z,sendmouseevent_noclick
  291.         call getmousexy
  292.         ld a,d
  293.         or e
  294.         jr nz,sendmouseevent_noclicktopleft
  295.         ld de,tpastaname
  296.         OS_CREATEHANDLE
  297.         ld a,b
  298.         ld (pastahandle),a
  299.        
  300.         ld a,(pgscrbuf)
  301.         SETPG16K
  302.         ld hl,0x4040
  303. savepasta0
  304.         push hl
  305.         call savepastaline
  306.         pop hl
  307.         inc h
  308.         jp p,savepasta0        
  309.         ld a,(pastahandle)
  310.         ld b,a
  311.         OS_CLOSEHANDLE
  312.         jp mainloop_afterkey
  313. sendmouseevent_noclicktopleft
  314.         ld a,d
  315.         sub 24
  316.         or e
  317.         jr nz,sendmouseevent_click
  318.         ld de,tpastaname
  319.         OS_OPENHANDLE
  320.         ld a,b
  321.         ld (pastahandle),a
  322.         ld de,readpastabuf
  323.         push de
  324.         ld hl,READPASTABUF_SZ
  325.         OS_READHANDLE ;hl=реально прочитано
  326.         pop de
  327.         call sendchars
  328.         ld a,(pastahandle)
  329.         ld b,a
  330.         OS_CLOSEHANDLE
  331.         jp mainloop_afterkey
  332. sendmouseevent_noclick
  333.         ld b,'@' ;mouse move
  334.         jr sendmouseevent_ok
  335. sendmouseevent_click
  336.         ld a,l ;mouse buttons
  337.         ld b,1+32
  338.         rra
  339.         jr nc,sendmouseevent_ok
  340.         inc b
  341.         rra
  342.         jr nc,sendmouseevent_ok
  343.         inc b
  344.         rra
  345.         jr nc,sendmouseevent_ok
  346.         ld b,0+32 ;unclick
  347. sendmouseevent_ok
  348. ;send mousemove event
  349.         ld hl,stdoutbuf
  350.         ld (hl),0x1b
  351.         inc hl
  352.         ld (hl),'['
  353.         inc hl
  354.         ld (hl),'M'
  355.         inc hl
  356.         ld (hl),b
  357.         inc hl
  358.         call getmousexy
  359.          ld a,e
  360.          add a,32
  361.         ld (hl),a
  362.         inc hl
  363.          ld a,e
  364.          add a,32
  365.         ld (hl),a
  366.         ld de,stdoutbuf
  367.         ld hl,6
  368.         call sendchars
  369.         jp mainloop_afterkey
  370.        
  371. printcursor
  372.          ;ld hl,4
  373.          ;ld (cursortimelimit),hl
  374.         call BDOS_countattraddr
  375.         ld (hl),CURSORCOLOR
  376.         ret
  377.  
  378. term_sendchar
  379.         cp key_esc
  380.         jr z,term_esckey
  381.         if RECODEINPUT
  382.         call sendkey
  383.         else
  384.         call sendchar_byte_a
  385.         endif
  386.         jp mainloop_afterkey
  387. term_esckey
  388.         if RECODEINPUT
  389.         call sendchar_byte_a
  390.         ld a,key_esc
  391.         call sendchar_byte_a
  392.         else
  393.         call sendchar_byte_a
  394.         endif
  395.         jp mainloop_afterkey
  396.  
  397. term_pgdown
  398.         ld hl,redraw_scroll
  399.         ld a,(hl)
  400.         cp 0;24
  401.         jr z,$+3
  402.         dec a
  403.         ld (hl),a
  404.         call redraw
  405.         jp mainloop_afterredraw
  406. term_pgup
  407.         ld hl,redraw_scroll
  408.         ld a,(hl)
  409.         cp 63 -24
  410.         jr z,$+3
  411.         inc a
  412.         ld (hl),a
  413.         call redraw
  414.         jp mainloop_afterredraw
  415.  
  416. term_redraw
  417.         ld hl,redraw_scroll
  418.         ld (hl),0
  419.         call redraw
  420.         jp mainloop_afterredraw
  421.  
  422. redraw_to_base
  423.         ld hl,redraw_scroll
  424.         inc (hl)
  425.         dec (hl)
  426.         ret z
  427.         ld (hl),0
  428.         push af
  429.         call redraw
  430.         pop af
  431.         ret
  432. redraw
  433. ;scrbuf состоит из строк длиной 256 байт
  434. ;каждая из них из 4 слоёв:
  435. ;+0x40: аналог +0x4000 (text0) ;1
  436. ;+0x80: аналог +0x2000 (attr0) ;3
  437. ;+0xc0: аналог +0x6000 (text1) ;2
  438. ;+0x01: аналог +0x0001 (attr1) ;4
  439.         ld a,(pgscrbuf)
  440.         SETPG16K
  441.         BDOSSETPGSSCR
  442.          call getscrbuftop_a
  443.         ld h,a
  444.         ld de,0xc1c0
  445.         ld b,25
  446. redrawlines0
  447.         push bc
  448.         ld l,0x40
  449.         push de
  450.         call copylinelayer
  451.         set 5,d
  452.         set 7,l
  453.         call copylinelayer
  454.         res 6,d
  455.         res 6,l
  456.         call copylinelayer
  457.         res 5,d
  458.         res 7,l
  459.         call copylinelayer
  460.         pop de
  461.         ex de,hl
  462.         ld bc,0x0040
  463.         add hl,bc
  464.         ex de,hl
  465.         inc h ;TODO nextpg
  466.         pop bc
  467.         djnz redrawlines0
  468.         ret
  469.        
  470. quit
  471. ;cmd closed!!!
  472.  
  473.         dup 2 ;close twice - as stdin and as stdout! на случай, если клиент не закрыл у себя
  474.         ld a,(stdinhandle)
  475.         ld b,a
  476.         OS_CLOSEHANDLE
  477.         ld a,(stdouthandle)
  478.         ld b,a
  479.         OS_CLOSEHANDLE
  480.         edup
  481.         QUIT
  482.  
  483. savepastaline
  484. ;hl=lineaddr
  485. ;текст лежит в 0x40, 0xc0, 0x41, 0xc1,.... 0xfe, 0x7f, 0xff
  486. ;ищем конец строки (первый символ с конца, не равный 0/0x20)
  487.         ld l,0xc0+39 ;end of text
  488.         ld b,80
  489. savepastaline_findend0
  490.         ld a,(hl)
  491.         or a
  492.         jr z,savepastaline_findend0ok
  493.         cp 0x20
  494.         jr nz,savepastaline_findendq
  495. savepastaline_findend0ok
  496.         ld a,l
  497.         sub 0x80
  498.         sbc a,0
  499.         ld l,a
  500.         djnz savepastaline_findend0
  501.         jr savepastaline_skip
  502. savepastaline_findendq
  503. ;hl=end of line
  504. ;сохраняем всю строку до конца
  505.         ld l,0x40 ;start of text
  506. savepastaline0
  507.         ld a,(hl)
  508.         or a
  509.         jr nz,$+4
  510.         ld a,0x20
  511.         push bc
  512.         push hl
  513.         call writechar2pasta
  514.         pop hl
  515.         pop bc
  516.         ld a,l
  517.         add a,0x80
  518.         adc a,0
  519.         ld l,a
  520.         djnz savepastaline0
  521. savepastaline_skip
  522.         ld a,0x0d
  523.         call writechar2pasta
  524.         ld a,0x0a
  525. writechar2pasta
  526.         ld d,trecodeback/256
  527.         ld e,a
  528.         ld a,(de)
  529.         ld de,pastabuf
  530.         ld (de),a
  531.         ld hl,1
  532. pastahandle=$+1
  533.         ld b,0
  534.         OS_WRITEHANDLE
  535.         ret
  536.  
  537. getmousexy
  538. mousexy=$+1
  539.         ld de,0
  540.         ret
  541.  
  542. type_stdin
  543. ;out: CY=no data
  544.         ld de,stdinbuf
  545.         ld hl,STDINBUF_SZ
  546. stdinhandle=$+1
  547.         ld b,0
  548.         ;ld b,0xff
  549.         OS_READHANDLE ;6933t (incl. 5350=ldir 255 bytes)
  550. ;hl=size
  551.         ld a,h
  552.         or l
  553.         scf ;out: CY=no data
  554.         ret z ;jr z,nostdinmsg;mainloop_afterkey
  555.         if REPEATNOKEY != 0
  556.          ld a,REPEATNOKEY;2
  557.          ld (wasnokey),a
  558.         endif
  559.  
  560.         push hl
  561.         call redraw_to_base
  562.          ;OS_GETTIMER ;hlde=timer
  563.          ;ld (lastsdtinmsgtimer),de
  564.         BDOSSETPGSSCR
  565. pgscrbuf=$+1
  566.         ld a,0 ;ok
  567.         SETPG16K
  568.         pop bc
  569.         push bc
  570.         ld b,c
  571.         ld hl,stdinbuf
  572. TERM_ST_SINGLE=1 ;wait for single symbol
  573. TERM_ST_AFTERESC=2 ;after 0x1b
  574. TERM_ST_AFTERESCBRACKET=3 ;after 0x1b [ [number] (might be more digits)
  575. term_prfsmcurstate=$+1
  576.          ld a,TERM_ST_SINGLE
  577.          dec a
  578.          jr nz,term_prfsm
  579. term_print0
  580.         ld a,(hl)
  581.         cp 0x1b+1
  582.         jr c,term_print0_maybecontrolcode
  583.         push hl
  584.         call BDOS_prchar_a_nocrlf ;226/227t
  585.         ;call term_prfsm ;520/521t
  586.         pop hl
  587. term_print0_maybecontrolcodeq
  588.         inc hl
  589.         djnz term_print0
  590.          ld a,TERM_ST_SINGLE
  591.         jp term_print0q
  592. term_print0_maybecontrolcode
  593.         cp 0x1b
  594.         jr z,term_prfsm_afteresc ;next state
  595.         push hl
  596.         call BDOS_prchar_a
  597.         pop hl
  598.         jp term_print0_maybecontrolcodeq
  599.        
  600. term_prfsm
  601.          dec a
  602.          jr nz,term_prfsm_afterescbracket
  603. term_prfsm_afteresc0
  604.         xor a
  605.         ld (term_prfsm_curnumber),a
  606.         ld (term_prfsm_curnumber1),a
  607.         ld (term_prfsm_curnumber2),a
  608.         ld (term_prfsm_curnumber3),a
  609.         ;ld a,(hl) ;todo check bracket
  610.         jp term_prfsm_afterescbracket_ok ;next state
  611. term_prfsm_afteresc
  612.         inc hl
  613.         djnz term_prfsm_afteresc0
  614.          ld a,TERM_ST_AFTERESC
  615.         jp term_print0q
  616.  
  617. term_prfsm_afterescbracket_nosemicolon
  618.         push hl
  619.         call term_prfsm_letter
  620.         pop hl
  621.         jp term_print0_maybecontrolcodeq ;initial state
  622. term_prfsm_afterescbracket
  623. term_prfsm_afterescbracket0
  624.         ld a,(hl)
  625.         sub '0'
  626.         cp 10
  627.         jr nc,term_prfsm_afterescbracket_nonumber
  628.         ;push de
  629.         ld e,a
  630.         ld a,(term_prfsm_curnumber)
  631.         ld d,a
  632.         add a,a
  633.         add a,a
  634.         add a,d
  635.         add a,a ;*10
  636.         add a,e
  637.         ld (term_prfsm_curnumber),a
  638.         ;pop de
  639.         jp term_prfsm_afterescbracket_ok
  640. term_prfsm_afterescbracket_nonumber
  641.         add a,'0'
  642.         cp ';'
  643.         jr nz,term_prfsm_afterescbracket_nosemicolon
  644.         ld a,(term_prfsm_curnumber2)
  645.         ld (term_prfsm_curnumber3),a
  646.         ld a,(term_prfsm_curnumber1)
  647.         ld (term_prfsm_curnumber2),a
  648.         ld a,(term_prfsm_curnumber)
  649.         ld (term_prfsm_curnumber1),a
  650.         xor a
  651.         ld (term_prfsm_curnumber),a
  652. term_prfsm_afterescbracket_ok
  653.         inc hl
  654.         djnz term_prfsm_afterescbracket0
  655.          ld a,TERM_ST_AFTERESCBRACKET
  656. term_print0q
  657.          ld (term_prfsmcurstate),a
  658.         pop hl
  659.         ld bc,STDINBUF_SZ
  660.         or a
  661.         sbc hl,bc
  662.         ret z ;out: NC=data present
  663.         scf
  664.         ret ;no more data
  665.  
  666. sendchar_esckey
  667.         push bc
  668.          ;call forcereprintcursor
  669.         ld hl,stdoutbuf
  670.         ld (hl),0x1b
  671.         inc hl
  672.         ;call sendchar_byte_a
  673.         ld (hl),'['
  674.         ;call sendchar_byte_a
  675.         ld de,stdoutbuf
  676.         ld hl,2
  677.         call sendchars
  678.         pop bc
  679.         jr sendchar_byte
  680.  
  681. sendchar_esckey2
  682.         push bc
  683.         ld hl,stdoutbuf
  684.         ld (hl),0x1b
  685.         inc hl
  686.         ;call sendchar_byte_a
  687.         ld (hl),'['
  688.         inc hl
  689.         ;call sendchar_byte_a
  690.         pop bc
  691.         push bc
  692.         ld (hl),b
  693.         ;call sendchar_byte_a
  694.         ld de,stdoutbuf
  695.         ld hl,3
  696.         call sendchars
  697.         pop bc
  698.         jr sendchar_byte
  699.  
  700.         if 1==0
  701. sendchar_num
  702. ;a=num
  703.         ld c,'0'-1
  704.         inc c
  705.         sub 10
  706.         jr nc,$-3
  707.         push af
  708.         call sendchar_byte
  709.         pop af
  710.         add a,'0'+10
  711.         jr sendchar_byte_a
  712.         endif
  713.  
  714. sendkey
  715. ;key to stdout
  716.         ;cp 0x80
  717.         ;jr nc,sendchar_rustoutf8
  718.         ;cp 0x08 ;backspace
  719.         ;cp 0x0d ;enter
  720.         cp key_left
  721.         ld c,'D'
  722.         jr z,sendchar_esckey
  723.         cp key_right
  724.         ld c,'C'
  725.         jr z,sendchar_esckey
  726.         cp key_down
  727.         ld c,'B'
  728.         jr z,sendchar_esckey
  729.         cp key_up
  730.         ld c,'A'
  731.         jr z,sendchar_esckey
  732.         cp key_del
  733.         ld bc,'3'*256+'~'
  734.         jr z,sendchar_esckey2
  735.         cp key_home
  736.         ld bc,'1'*256+'~'
  737.         jr z,sendchar_esckey2
  738.         cp key_end
  739.         ld bc,'4'*256+'~'
  740.         jr z,sendchar_esckey2
  741.         cp key_ins
  742.         ld bc,'2'*256+'~'
  743.         jr z,sendchar_esckey2
  744.         ld c,a
  745. sendchar_byte
  746.         ld a,c
  747. sendchar_byte_a
  748. sendchar
  749.         ;cp 0x80
  750.         ;jr nc,sendchar_rustoutf8
  751. ;sendchar_byte_a
  752.         ld (stdoutbuf),a
  753.         ld hl,1
  754.         ld de,stdoutbuf
  755. sendchars
  756. ;send chars to stdout (in: de=buf, hl=size, out: A=error)
  757.         ld b,5 ;attempts
  758. sendchars0
  759.         push bc
  760.         push de
  761.         push hl
  762. stdouthandle=$+1
  763.         ld b,0
  764.         OS_WRITEHANDLE ;1436t ;[2718t (1225 before BDOS_writehandle + 195 before BDOS_writehandle_pipe + 477 ..findpipe_byhandle + 301 pipe + 192 end BDOS_writehandle + 326 end BDOS)]
  765.         ld b,h
  766.         ld c,l ;bytes actually written
  767.         pop hl
  768.         pop de
  769.         pop ix
  770.          or a
  771.           ret nz ;error ;TODO обработать? а так пока просто избегаем зацикливания
  772.          sbc hl,bc ;datasize-byteswritten
  773.          ret z
  774.        ;ld a,5 ;m
  775.        ;out (-2),a
  776.          ex de,hl
  777.          add hl,bc ;dataaddr+byteswritten
  778.          ex de,hl
  779. ;hl=remaining data size
  780. ;de=remaining data addr
  781.         push ix
  782.         push de
  783.         push hl
  784.         YIELDKEEP ;2158t
  785.         call type_stdin
  786.         pop hl
  787.         pop de
  788.         pop bc
  789.         djnz sendchars0
  790.         xor a ;z=no error
  791.         ret ;клиент завис, но не сдох
  792.  
  793. term_prfsm_letter
  794.         ;ld hl,term_prfsm_curstate
  795.         ;ld (hl),TERM_ST_SINGLE
  796.          ;ld b,TERM_ST_SINGLE
  797.         cp 'H'
  798.         jr z,term_prfsm_afterescbracket_H
  799.         cp 'G'
  800.         jr z,term_prfsm_afterescbracket_G
  801.         cp 'm'
  802.         jr z,term_prfsm_afterescbracket_m
  803.         cp 'K'
  804.         jr z,term_prfsm_afterescbracket_clearline
  805. ;TODO J etc.
  806.         ;cp 'A' ;cursor_up
  807.         cp 'B'
  808.         jp z,cursor_down
  809.         cp 'C'
  810.         jp z,cursor_right
  811.         cp 'D'
  812.         jp z,cursor_left
  813.         cp 's'
  814.         jp z,cursor_store
  815.         cp 'd' ;NON-STANDARD!
  816.         jp z,term_prfsm_afterescbracket_scrolldown
  817.         cp 'u' ;NON-STANDARD!
  818.         jp z,term_prfsm_afterescbracket_scrollup ;+cursor remember
  819.         ;cp '~'
  820.         ;jr z,term_prfsm_afterescbracket_tilde
  821.         ret
  822. ;term_prfsm_afterescbracket_tilde
  823. ;        ret
  824.  
  825. term_prfsm_afterescbracket_clearline
  826. ;не двигает курсор
  827.         push bc
  828.         ld de,(pr_textmode_curaddr)
  829.         ld hl,(pr_buf_curaddr)
  830.         ld bc,0x0040
  831. term_prfsm_afterescbracket_clearline0
  832.         xor a
  833.         ld (de),a
  834.         ld a,d
  835.         xor 0x60 ;attr + 0x20
  836.         ld d,a
  837.         and 0x20
  838.         jr nz,$+3
  839.         inc e
  840.         xor a
  841.         ld (de),a
  842.         set 6,d
  843.         ld (hl),a
  844.         ld a,l
  845.         add a,c;0x40 ;attr
  846.         adc a,b;0
  847.         ld l,a
  848.         ld (hl),b;0
  849.         add a,c;0x40 ;text (next)
  850.         ld l,a
  851.         cp 0x40+(80/2)
  852.         jp nz,term_prfsm_afterescbracket_clearline0
  853.         pop bc
  854.         ret
  855.  
  856. term_prfsm_afterescbracket_G
  857.         ld a,(term_prfsm_curnumber) ;column
  858.         dec a
  859.         ld e,a
  860.         jp BDOS_setx
  861.  
  862. term_prfsm_afterescbracket_H
  863.         ld a,(term_prfsm_curnumber1) ;row
  864.         dec a
  865.         ld d,a
  866.         ld a,(term_prfsm_curnumber) ;column
  867.         dec a
  868.         ld e,a
  869.         jp BDOS_setxy
  870.        
  871.         if 1==0
  872.         ;jp forcereprintcursor ;не прокатит? в начале печати cmd тоже setxy
  873. forcereprintcursor
  874.         ;push de
  875.         ;push hl
  876.         ;OS_GETTIMER ;hlde=timer
  877.         ;dec d
  878.         ;ld (lastsdtinmsgtimer),de
  879.          ld hl,0;2
  880.          ld (cursortimelimit),hl
  881.         ;pop hl
  882.         ;pop de
  883.         ret
  884.         endif
  885.        
  886. term_prfsm_afterescbracket_m
  887. ;CSI Pm m Character Attributes (SGR)
  888. ;Ps = 30  Set foreground color to Black.
  889. ;Ps = 31  Set foreground color to Red.
  890. ;Ps = 32  Set foreground color to Green.
  891. ;Ps = 33  Set foreground color to Yellow.
  892. ;Ps = 34  Set foreground color to Blue.
  893. ;Ps = 35  Set foreground color to Magenta.
  894. ;Ps = 36  Set foreground color to Cyan. (Grey?)
  895. ;Ps = 37  Set foreground color to White.
  896. ;Ps = 39  Set foreground color to default, ECMA-48 3rd.
  897. ;Ps = 40  Set background color to Black.
  898. ;Ps = 41  Set background color to Red.
  899. ;Ps = 42  Set background color to Green.
  900. ;Ps = 43  Set background color to Yellow.
  901. ;Ps = 44  Set background color to Blue.
  902. ;Ps = 45  Set background color to Magenta.
  903. ;Ps = 46  Set background color to Cyan.
  904. ;Ps = 47  Set background color to White.
  905. ;Ps = 49  Set background color to default, ECMA-48 3rd.
  906.  ;Ps = 8   Invisible, i.e., hidden, ECMA-48 2nd, VT300. (не работает в Putty!!!)
  907.  ;Ps = 28  Visible, i.e., not hidden, ECMA-48 3rd, VT300. (не работает в Putty!!!)
  908. ;Assume that xterm's resources are set so that the ISO color codes are the first 8 of a set of 16. Then the aixterm colors are the bright versions of the ISO colors:
  909. ;Ps = 90  Set foreground color to Black.
  910. ;Ps = 91  Set foreground color to Red.
  911. ;Ps = 92  Set foreground color to Green.
  912. ;Ps = 93  Set foreground color to Yellow.
  913. ;Ps = 94  Set foreground color to Blue.
  914. ;Ps = 95  Set foreground color to Magenta.
  915. ;Ps = 96  Set foreground color to Cyan.
  916. ;Ps = 97  Set foreground color to White.
  917.  ;TODO 1  -  BRIGHT ON: Включение яркости INK. (Bold, VT100.)
  918.  ;TODO 22 - Normal (neither bold nor faint), ECMA-48 3rd. [21  -  BRIGHT OFF: Выключение яркости INK. (Doubly-underlined, ECMA-48 3rd.)]
  919.         ld a,(pr_textmode_curcolor)
  920.         ld e,a
  921.         ld a,(term_prfsm_curnumber)
  922.         call term_setcolorpp
  923.         ld a,(term_prfsm_curnumber1)
  924.         call term_setcolorpp
  925.         ld a,e
  926.         ld (pr_textmode_curcolor),a
  927.         ret
  928.  
  929. term_prfsm_afterescbracket_scrolldown
  930.         push bc
  931.         ld a,(term_prfsm_curnumber1)
  932.         ld e,a ;xtop
  933.         ld a,(term_prfsm_curnumber)
  934.         ld d,a ;ytop
  935.         ld hl,(term_prfsm_curnumber3) ;первый по счёту
  936.         ld a,(term_prfsm_curnumber2) ;wid
  937.         ld h,a ;hgt
  938.         push de
  939.         push hl
  940.         ld a,l
  941.         cp 80
  942.         jr nz,term_prfsm_afterescbracket_scrolldown_OS
  943. ;de=topyx, hl=hgt,wid
  944. ;x, wid even
  945.         ld a,d
  946.         add a,h
  947.         dec a
  948.         ld d,a ;ybottom
  949.         call BDOS_scroll_prepare
  950. BDOS_scrolldown0
  951.         push bc
  952.         ld d,h
  953.         ld e,l
  954.         ld bc,-64
  955.         add hl,bc
  956.         call BDOS_scrollpageline
  957.         pop bc
  958.         djnz BDOS_scrolldown0
  959.         jr term_prfsm_afterescbracket_scrolldown_OSq
  960. term_prfsm_afterescbracket_scrolldown_OS
  961.         OS_SCROLLDOWN
  962. term_prfsm_afterescbracket_scrolldown_OSq
  963.         pop hl
  964.         pop de        
  965.         ld a,d
  966.         add a,h
  967.         dec a
  968.         ld d,a ;ybottom
  969.         call BDOS_scrollbuf_prepare
  970.        ld (BDOS_scrolldown_call),de
  971. BDOS_scrolldown_buf0
  972.         push bc
  973.         ld d,h
  974.         ld e,l
  975.         dec h
  976. BDOS_scrolldown_call=$+1
  977.         call BDOS_scrollpageline_bufwindow
  978.         pop bc
  979.         djnz BDOS_scrolldown_buf0
  980.         pop bc
  981.         ret
  982.        
  983. cursor_store
  984.         ld hl,(pr_textmode_curaddr)
  985.         ld (cursor_remember_scraddr),hl
  986.         ld hl,(pr_buf_curaddr)
  987.         ld (cursor_remember_bufaddr),hl
  988.         ret
  989. cursor_remember
  990. cursor_remember_scraddr=$+1
  991.         ld hl,0xc1c0
  992.         ld (pr_textmode_curaddr),hl
  993. cursor_remember_bufaddr=$+1
  994.         ld hl,0x4040
  995.         ld (pr_buf_curaddr),hl
  996.         ret
  997.  
  998. term_prfsm_afterescbracket_scrollup
  999.         ld a,(term_prfsm_curnumber1)
  1000.         ld e,a ;xtop
  1001.         ld a,(term_prfsm_curnumber)
  1002.         ld d,a ;ytop
  1003.         ld hl,(term_prfsm_curnumber3) ;wid ;первый по счёту
  1004.         ld a,(term_prfsm_curnumber2)
  1005.         ld h,a ;hgt
  1006.         ld a,l
  1007.         or a
  1008.         jr z,cursor_remember
  1009.         push bc
  1010.         push de
  1011.         push hl
  1012.         cp 80
  1013.         jr nz,term_prfsm_afterescbracket_scrollup_OS
  1014. ;de=topyx, hl=hgt,wid
  1015. ;x, wid even
  1016.         call BDOS_scroll_prepare
  1017.         call BDOS_scrollpage0 ;62927 t
  1018.         jr term_prfsm_afterescbracket_scrollup_OSq
  1019. term_prfsm_afterescbracket_scrollup_OS
  1020.         OS_SCROLLUP ;95597 t
  1021. term_prfsm_afterescbracket_scrollup_OSq
  1022.         pop hl
  1023.         pop de
  1024.         call BDOS_scrollbuf_prepare
  1025.        ld (BDOS_scrollup_call),de
  1026. BDOS_scrollup_buf0
  1027.         push bc
  1028.         ld d,h
  1029.         ld e,l
  1030.         inc h
  1031. BDOS_scrollup_call=$+1
  1032.         call BDOS_scrollpageline_bufwindow
  1033.         pop bc
  1034.         djnz BDOS_scrollup_buf0 ;62131[91221] t
  1035.         pop bc
  1036.         ret
  1037.  
  1038. BDOS_scrollbuf_prepare
  1039.         ld a,(pgscrbuf)
  1040.         SETPG16K
  1041.         ld a,l
  1042.         srl a
  1043.         ld (BDOS_scrollpagelinelayer_wid),a
  1044.         ld b,h
  1045.         dec b
  1046.          call getscrbuftop_a
  1047.          add a,d ;0..24
  1048.          ld h,a
  1049.          ld a,e
  1050.          or 0x80
  1051.          rrca ;(x/2)+0x40 или 0xc0
  1052.          ld l,a
  1053.         ld a,(BDOS_scrollpagelinelayer_wid)
  1054.         cp 40
  1055.         ld de,BDOS_scrollpageline_buf
  1056.         ret z
  1057.         ld de,BDOS_scrollpageline_bufwindow
  1058.         ret
  1059.  
  1060. BDOS_scroll_prepare
  1061.         BDOSSETPGSSCR
  1062.         ;ld a,l
  1063.         ;srl a
  1064.         ;ld (BDOS_scrollpagelinelayer_wid),a
  1065.         ld b,h
  1066.         dec b
  1067. ;BDOS_countxy
  1068. ;keeps bc
  1069.         ld a,d ;y
  1070.         sub -0x87&0xff ;0xe1c0*4=0x8700
  1071.         rra
  1072.         ld h,a
  1073.          ld a,0;16
  1074.         rra
  1075.         sra h
  1076.         rra
  1077.         ld l,e ;x
  1078.         srl l
  1079.         jr c,$+4
  1080.         res 5,h
  1081.         add a,l
  1082.         ld l,a
  1083.         ret
  1084.  
  1085. BDOS_scrollpageline_bufwindow
  1086.         or a
  1087.         call BDOS_scrollpageline_bufwindowlayers ;text
  1088.         res 6,l ;attr
  1089.         res 6,e ;attr
  1090.         scf
  1091.         call BDOS_scrollpageline_bufwindowlayers ;attr
  1092.         set 6,l ;text
  1093.         ret
  1094. BDOS_scrollpageline_bufwindowlayers
  1095.         push af
  1096.         push de
  1097.         push hl
  1098.         set 7,l
  1099.         set 7,e
  1100.         or a
  1101.         call BDOS_scrollpageline_bufwindowlayer
  1102.         pop hl
  1103.         pop de
  1104.         pop af
  1105. BDOS_scrollpageline_bufwindowlayer
  1106.         push de
  1107.         push hl
  1108.         jr nc,$+4
  1109.         inc hl
  1110.         inc de
  1111. BDOS_scrollpagelinelayer_wid=$+1
  1112.         ld bc,39;40
  1113.         ldir
  1114.         pop hl
  1115.         pop de
  1116.         ret
  1117.  
  1118. BDOS_scrollpageline_buf
  1119.         dup 39
  1120.         ldi
  1121.         edup
  1122.         ld a,(hl)
  1123.         ld (de),a
  1124.         set 7,l
  1125.         set 7,e        
  1126.         dup 39
  1127.         ldd
  1128.         edup
  1129.         ld a,(hl)
  1130.         ld (de),a
  1131.  
  1132.         res 6,l ;attr
  1133.         res 6,e ;attr
  1134.        
  1135.         dup 39
  1136.         ldi
  1137.         edup
  1138.         ld a,(hl)
  1139.         ld (de),a
  1140.         res 7,l
  1141.         res 7,e
  1142.         inc l
  1143.         inc e
  1144.         dup 39
  1145.         ldd
  1146.         edup
  1147.         ld a,(hl)
  1148.         ld (de),a
  1149.  
  1150.         ld l,0x40 ;text
  1151.         ret
  1152.  
  1153. BDOS_scrollpage
  1154. ;156046t [195810t]
  1155.         BDOSSETPGSSCR
  1156.         ld hl,0xc1c0
  1157.         ld b,24
  1158. BDOS_scrollpage0
  1159.         push bc
  1160.         ld d,h
  1161.         ld e,l
  1162.         ld bc,64
  1163.         add hl,bc
  1164.         call BDOS_scrollpageline
  1165.         pop bc
  1166.         djnz BDOS_scrollpage0
  1167.         ret
  1168. BDOS_scrollpageline
  1169.         dup 39
  1170.         ldi
  1171.         edup
  1172.         ld a,(hl)
  1173.         ld (de),a
  1174.         set 5,h
  1175.         set 5,d
  1176.         dup 39
  1177.         ldd
  1178.         edup
  1179.         ld a,(hl)
  1180.         ld (de),a
  1181.        
  1182.         res 6,h ;attr
  1183.         res 6,d ;attr
  1184.        
  1185.         dup 39
  1186.         ldi
  1187.         edup
  1188.         ld a,(hl)
  1189.         ld (de),a
  1190.         res 5,h
  1191.         res 5,d
  1192.         inc l
  1193.         inc e
  1194.         dup 39
  1195.         ldd
  1196.         edup
  1197.         ld a,(hl)
  1198.         ld (de),a
  1199.         dec l
  1200.         dec e
  1201.         set 6,h
  1202.         set 6,d
  1203.         ret
  1204.        
  1205. copylinelayer
  1206.         push de
  1207.         push hl
  1208.         dup 40
  1209.         ldi
  1210.         edup
  1211.         ld a,(hl)
  1212.         ld (de),a
  1213.         pop hl
  1214.         pop de
  1215.         ret
  1216.  
  1217. term_setcolorpp
  1218.         cp 8
  1219.         jr z,term_setinvisible
  1220.         ret c
  1221.         cp 28
  1222.         jr z,term_setvisible
  1223.         cp 90
  1224.         jr c,term_nosetbrightink
  1225.         sub 90-64 ;ink + bright
  1226.         xor e
  1227.         and 0x47
  1228.         xor e
  1229.         ld e,a
  1230.         ret
  1231. term_nosetbrightink
  1232.         cp 40
  1233.         jr c,term_nosetpaper
  1234.         sub 40 ;paper
  1235.         add a,a
  1236.         add a,a
  1237.         add a,a
  1238.         xor e
  1239.         and 0x38
  1240.         xor e
  1241.         ld e,a
  1242.         ret
  1243. term_nosetpaper
  1244.         sub 30 ;ink
  1245.         xor e
  1246.         and 0x47
  1247.         xor e
  1248.         ld e,a
  1249.         ret
  1250. term_setvisible
  1251.         xor a
  1252.         ld (finvisible),a
  1253.         ld (finvisible2),a
  1254.         ret
  1255. term_setinvisible
  1256.         ld a,0x5e ;"ld e,(hl)"
  1257.         ld (finvisible),a
  1258.         ;ld a,0x4e ;"ld c,(hl)"
  1259.         ld (finvisible2),a
  1260.         ret
  1261.  
  1262. MOUSEFACTOR=8
  1263. mousemove
  1264. ;de=mouse delta
  1265. ;чтобы двигать не резко, надо отдельно хранить младшие части x,y (не отображаемые на экране)
  1266.         ld hl,(mousexy)
  1267. htmlcursorxylow=$+1
  1268.         ld bc,0 ;bits 7..5 (for Y) 7..6 (for X), others=0
  1269.         dup 3
  1270.         sla b
  1271.         rl h
  1272.         edup        
  1273.         ld a,h
  1274.         add a,d
  1275.         bit 7,d
  1276.         jr z,html_mousemove_yplus
  1277.         jr nc,html_mousemove_yminus_overflow
  1278.         cp HTMLTOPY*MOUSEFACTOR
  1279.         jr nc,html_mousemove_yq
  1280. html_mousemove_yminus_overflow
  1281.         ld a,HTMLTOPY*MOUSEFACTOR
  1282.         jr html_mousemove_yq
  1283. html_mousemove_yplus
  1284.         jr c,html_mousemove_yplus_overflow
  1285.         cp MOUSEFACTOR*(HTMLTOPY+HTMLHGT-1)
  1286.         jr c,html_mousemove_yq
  1287. html_mousemove_yplus_overflow
  1288.         ld a,MOUSEFACTOR*(HTMLTOPY+HTMLHGT-1)
  1289. html_mousemove_yq  
  1290.         srl a
  1291.         rr b
  1292.         rra
  1293.         rr b
  1294.         rra
  1295.         rr b
  1296.         ld (mousexy+1),a
  1297.  
  1298.         ld h,0
  1299.         sla c
  1300.         rl l
  1301.         sla c
  1302.         adc hl,hl
  1303.         ld a,e
  1304.         rla
  1305.         sbc a,a
  1306.         ld d,a
  1307.         add hl,de
  1308.         bit 7,e
  1309.         jr z,html_mousemove_xplus
  1310.         jr c,html_mousemove_xq
  1311.         ld hl,0 ;ld a,HTMLTOPY*MOUSEFACTOR
  1312.         jr html_mousemove_xq
  1313. html_mousemove_xplus
  1314.         ld de,MOUSEFACTOR/2*(80-1)
  1315.         jr c,html_mousemove_xplus_overflow
  1316.         ;or a
  1317.         sbc hl,de
  1318.         add hl,de
  1319.         jr c,html_mousemove_xq
  1320. html_mousemove_xplus_overflow
  1321.         ex de,hl
  1322. html_mousemove_xq
  1323.         ld a,l
  1324.         rr h
  1325.         rra
  1326.         rr c
  1327.         rra
  1328.         rr c
  1329.         ld (mousexy),a
  1330.  
  1331.         ld (htmlcursorxylow),bc
  1332.         ret
  1333.  
  1334. BDOS_countattraddr_mousecursor
  1335. ;de=yx
  1336.         ld a,(user_scr0_low) ;ok
  1337.         SETPG32KLOW ;attr ;TODO убрать? считывать из scrbuf!
  1338.         ld a,d ;y
  1339.         sub -0x87&0xff ;0xe1c0*4=0x8700
  1340.         rra
  1341.         ld h,a
  1342.          ld a,0;16
  1343.         rra
  1344.         sra h
  1345.         rra
  1346.         ld l,e ;x
  1347.         srl l
  1348.         jr c,$+4
  1349.         res 5,h
  1350.         add a,l
  1351.         ld l,a
  1352.         ld a,h
  1353.         xor 0x60 ;attr + 0x20
  1354.         ld h,a
  1355.          and 0x20
  1356.         ret nz ;jr nz,$+3
  1357.         inc l
  1358.         ret
  1359.  
  1360. BDOS_countattraddr
  1361.         ld a,(user_scr0_low) ;ok
  1362.         SETPG32KLOW ;attr ;TODO убрать? считывать из scrbuf!
  1363.         ld hl,(pr_textmode_curaddr)
  1364. textaddrtoattraddr
  1365.         ld a,h
  1366.         xor 0x60 ;attr + 0x20
  1367.         ld h,a
  1368.          and 0x20
  1369.         ret nz ;jr nz,$+3
  1370.         inc l
  1371.         ret
  1372.  
  1373. getscrbuftop_a
  1374.         ld hl,(pr_buf_curtopaddr)
  1375.         ld a,h
  1376. redraw_scroll=$+1
  1377.         sub 0;24
  1378.          cp 0x40
  1379.          jr nc,$+4
  1380.          ld a,0x40 ;TODO prevpg
  1381.         ret
  1382.  
  1383. cursor_left
  1384. ;TODO с переходом на предыдущую строку
  1385.         ld hl,(pr_textmode_curaddr)
  1386.         ld a,h
  1387.         xor 0x20 ;attr + 0x20
  1388.         ld h,a
  1389.         and 0x20
  1390.         jr z,$+3
  1391.         dec l
  1392.         ld (pr_textmode_curaddr),hl
  1393.         ld hl,(pr_buf_curaddr)
  1394.         ld a,l
  1395.         sub 0x40
  1396.         sub 0x40
  1397.         sbc a,0
  1398.         ld l,a
  1399.         ld (pr_buf_curaddr),hl
  1400.         ret
  1401.  
  1402. cursor_right
  1403.         xor a
  1404.         ld (writed1),a
  1405.         ld (writed2),a
  1406.         ld (writee1),a
  1407.         ld (writee2),a
  1408.         push bc
  1409.         ld a,(term_prfsm_curnumber)
  1410.         sub 1
  1411.         adc a,1 ;0->1
  1412.         ld b,a
  1413. cursor_right0
  1414.         ld a,' '
  1415.         call BDOS_prchar_a_nocrlf
  1416.         djnz cursor_right0
  1417.         pop bc
  1418.         ld a,0x72 ;"ld (hl),d"
  1419.         ld (writed1),a
  1420.         ld (writed2),a
  1421.         ld a,0x73 ;"ld (hl),e"
  1422.         ld (writee1),a
  1423.         ld (writee2),a
  1424.         ret
  1425.  
  1426. BDOS_setx
  1427. ;e=x
  1428.         ld a,e
  1429.         or 0x80
  1430.         rrca ;(x/2)+0x40 или 0xc0
  1431.         ld (pr_buf_curaddr),a
  1432.         ld hl,(pr_textmode_curaddr)
  1433.         ld a,e ;x
  1434.         rra
  1435.         set 5,h
  1436.         jr c,$+4
  1437.         res 5,h
  1438.         xor l
  1439.         and 0x3f
  1440.         xor l
  1441.         ld l,a
  1442.         jr BDOS_settextcuraddr
  1443.  
  1444. BDOS_setxy
  1445. ;de=yx
  1446.          call getscrbuftop_a
  1447.          add a,d ;0..24
  1448.          ld h,a
  1449.          ld a,e
  1450.          or 0x80
  1451.          rrca ;(x/2)+0x40 или 0xc0
  1452.          ld l,a
  1453.          ld (pr_buf_curaddr),hl
  1454.        
  1455.         ld a,d ;y
  1456.         sub -0x87&0xff ;0xe1c0*4=0x8700
  1457.         rra
  1458.         ld h,a
  1459.          ld a,0;16
  1460.         rra
  1461.         sra h
  1462.         rra
  1463.         ld l,e ;x
  1464.         srl l
  1465.         jr c,$+4
  1466.         res 5,h
  1467.         add a,l
  1468.         ld l,a
  1469. BDOS_settextcuraddr
  1470.         ld (pr_textmode_curaddr),hl
  1471.         ret
  1472.        
  1473. BDOS_prchar_controlcode
  1474.          ld hl,(pr_textmode_curaddr)
  1475.         cp 0x0a
  1476.         jr z,BDOS_prchar_lf
  1477.         cp 0x0d
  1478.         jp nz,BDOS_prchar_nocontrolcode
  1479. BDOS_prchar_cr
  1480.          ld a,0x40
  1481.          ld (pr_buf_curaddr),a ;x=0
  1482.         ld a,l
  1483.         and 0xc0
  1484.         ld l,a
  1485.         res 5,h
  1486.         jr BDOS_settextcuraddr
  1487.        
  1488. buftopaddr_down
  1489. pr_buf_curtopaddr=$+1
  1490.         ld hl,0x4040
  1491.         inc h
  1492.         ld (pr_buf_curtopaddr),hl
  1493.         ret
  1494.        
  1495. BDOS_prchar_lf
  1496.         push hl
  1497.         ld hl,(pr_buf_curaddr)
  1498.         inc h
  1499.         call m,scrollscrbuf
  1500.         ld (pr_buf_curaddr),hl
  1501.         ;call buftopaddr_down
  1502.         pop hl
  1503.        
  1504.         ld a,l
  1505.         add a,0x40
  1506.         ld l,a
  1507.         jr nc,BDOS_settextcuraddr
  1508.         jp BDOS_prchar_lf_q
  1509.  
  1510. cursor_down
  1511.         ld a,0x0a ;lf
  1512. BDOS_prchar_a
  1513. ;keeps bc!
  1514.         cp 0x0e
  1515.         jr c,BDOS_prchar_controlcode
  1516. BDOS_prchar_a_nocrlf
  1517. pr_textmode_curaddr=$+1
  1518.         ld hl,0xc1c0
  1519.         ld d,trecode/256
  1520.         ld e,a
  1521.         ld a,(de)
  1522. BDOS_prchar_nocontrolcode
  1523.         ld e,a
  1524. pr_textmode_curcolor=$+1
  1525.         ld d,7
  1526. finvisible=$
  1527.         nop ;/ld e,(hl)
  1528. writee1=$
  1529.         ld (hl),e
  1530.  
  1531.         ld a,h
  1532.         xor 0x60 ;attr + 0x20
  1533.         ld h,a
  1534.         and 0x20
  1535.         jr nz,$+3
  1536.         inc l
  1537. writed1=$
  1538.         ld (hl),d
  1539.  
  1540.         set 6,h
  1541.         ld (pr_textmode_curaddr),hl
  1542.  
  1543. ;scrbuf состоит из строк длиной 256 байт
  1544. ;каждая из них из 4 слоёв:
  1545. ;+0x40: аналог +0x4000 (text0)
  1546. ;+0x80: аналог +0x2000 (attr0)
  1547. ;+0xc0: аналог +0x6000 (text1)
  1548. ;+0x01: аналог +0x0001 (attr1)
  1549.  
  1550. pr_buf_curaddr=$+1
  1551.         ld hl,0x4000+0x40 ;text0
  1552. finvisible2=$
  1553.         nop ;/ld e,(hl)
  1554. writee2=$
  1555.          ld (hl),e
  1556.         ld a,l
  1557.         add a,0x40 ;attr
  1558.         adc a,0
  1559.         ld l,a
  1560. writed2=$
  1561.          ld (hl),d
  1562.         add a,0x40 ;text (next)
  1563.         ld l,a
  1564.         ld (pr_buf_curaddr),hl
  1565.  
  1566.         cp 0x40+(80/2)
  1567.         ret nz ;нет переноса строки
  1568.         ld l,0x40
  1569.         inc h
  1570.         call m,scrollscrbuf
  1571.         ld (pr_buf_curaddr),hl
  1572.         ;call buftopaddr_down
  1573.        
  1574.         ld hl,(pr_textmode_curaddr)
  1575.         ld a,l
  1576.         and 0xc0
  1577.         add a,0x40
  1578.         ld l,a
  1579.         jp nc,BDOS_settextcuraddr
  1580. BDOS_prchar_lf_q
  1581.         inc h
  1582.         bit 3,h
  1583.         jp z,BDOS_settextcuraddr ;нет выхода за последнюю строку
  1584. BDOS_scrolllock0
  1585.         ld a,0xfe
  1586.         in a,(0xfe)
  1587.         rra ;Caps Shift
  1588.         jr nc,BDOS_scrolllock0
  1589. ;scroll+clear bottom line
  1590.        push bc
  1591.         call buftopaddr_down
  1592.         call BDOS_scrollpage ;attr
  1593.         ld a,(user_scr0_high) ;ok ;pgscr0_1 ;text
  1594.         SETPG32KHIGH ;call sys_setpgc000
  1595.         xor a
  1596.         call BDOS_cllastline
  1597.         ld a,(user_scr0_low) ;ok ;pgscr0_0 ;attr
  1598.         SETPG32KHIGH ;call sys_setpgc000
  1599.         ld a,COLOR
  1600.         call BDOS_cllastline
  1601.         BDOSSETPGSSCR
  1602.        pop bc
  1603.         ld hl,0xc7c0
  1604.         jp BDOS_settextcuraddr
  1605.        
  1606. scrollscrbuf
  1607. ;TODO reserve page
  1608. ;TODO unreserve very old page
  1609.        push bc
  1610.         dec h
  1611.         push hl
  1612.         ld de,0x4000 ;0x4040 ;text ;TODO scroll attr
  1613.         ld hx,0x3f*4;*2
  1614. scrollscrbuf0
  1615.         ld h,d
  1616.         ld l,e
  1617.         inc h
  1618.         dup 40
  1619.         ldi
  1620.         edup
  1621.         ld a,(hl)
  1622.         ld (de),a
  1623.         ld bc,64-40;128-40
  1624.         add hl,bc
  1625.         ex de,hl
  1626.         add hl,bc
  1627.         ex de,hl
  1628.         dec hx
  1629.         jp nz,scrollscrbuf0
  1630.         xor a
  1631.         ld hl,0x7f40 ;text
  1632.         call BDOS_scrollpage_cllinelayer
  1633.         ld hl,0x7fc0 ;text
  1634.         call BDOS_scrollpage_cllinelayer
  1635.         ld a,COLOR
  1636.         ld hl,0x7f01 ;attr
  1637.         call BDOS_scrollpage_cllinelayer
  1638.         ld hl,0x7f80 ;attr
  1639.         call BDOS_scrollpage_cllinelayer
  1640.         ld hl,pr_buf_curtopaddr+1
  1641.         dec (hl) ;compensate shift
  1642.         pop hl
  1643.        pop bc
  1644.         ret
  1645.  
  1646. BDOS_cllastline
  1647.         ld hl,0xc7c0
  1648.         call BDOS_scrollpage_cllinelayer
  1649.         ld hl,0xe7c0
  1650. BDOS_scrollpage_cllinelayer
  1651.         ld d,h
  1652.         ld e,l
  1653.         inc e
  1654.         ld bc,41-1;64-1
  1655.         ld (hl),a
  1656.         ldir ;clear bottom line
  1657.         ret
  1658.  
  1659. BDOS_cls
  1660. ;e=color byte
  1661.         ;ld a,(pgscrbuf_low)
  1662.         ;SETPG32KLOW
  1663.         ;ld a,(pgscrbuf_high)
  1664.         ;SETPG32KHIGH
  1665.         ;call clspp
  1666.         ld a,(pgscrbuf)
  1667.         SETPG16K
  1668.         ld hl,0x4000
  1669.         ld de,0x4001
  1670.         ld bc,0x0040
  1671.         ld (hl),COLOR
  1672.         ldir
  1673.         ld c,0x40
  1674.         ld (hl),b;0
  1675.         ldir
  1676.         ld c,0x40
  1677.         ld (hl),COLOR
  1678.         ldir
  1679.         ld c,0x40
  1680.         ld (hl),b;0
  1681.         ldir        
  1682.         dec h;ld hl,0x4000
  1683.         ld de,0x4100
  1684.         ld b,0x3f
  1685.         ldir
  1686. ;TODO reset current number of lines in buf
  1687.  
  1688.         BDOSSETPGSSCR
  1689.  
  1690. ;textmode (6)
  1691. clspp
  1692.         ld a,e
  1693.          ld hl,0x8000
  1694.          call cls_halfpg
  1695.          ld hl,0xa000
  1696.          call cls_halfpg
  1697.  
  1698.         xor a
  1699.          ld hl,0xc000
  1700.          call cls_halfpg
  1701.          ld hl,0xe000
  1702. cls_halfpg
  1703.          ld bc,0x1aff
  1704.         ld d,h
  1705.         ld e,l
  1706.         inc de
  1707.         ld (hl),a
  1708.         ldir
  1709.         ret
  1710.  
  1711.  
  1712. readapp
  1713.         ld a,b
  1714.         ld (curhandle),a
  1715.        
  1716.         OS_NEWAPP ;для первой создаваемой задачи будут созданы первые два пайпа и подключены
  1717. ;dehl=номера страниц в 0000,4000,8000,c000 нового приложения, b=id, a=error
  1718.         push bc ;b=id
  1719.  
  1720.         ld a,d
  1721.         SETPG32KHIGH
  1722.         push de
  1723.         push hl
  1724.         ld hl,COMMANDLINE ;command line
  1725.         call skipword
  1726.         call skipspaces ;пропустили первое слово (там было term.com, а дальше, например, cmd.com autoexec.bat)
  1727.         ld de,0xc080
  1728.         ld bc,128  
  1729.         ldir ;command line
  1730.         pop hl
  1731.         pop de
  1732.  
  1733.         call readfile_pages_dehl
  1734.  
  1735.         ld a,(curhandle)
  1736.         ld b,a
  1737.         OS_CLOSEHANDLE
  1738.  
  1739.         pop af ;id
  1740.         ret
  1741.  
  1742. readfile_pages_dehl
  1743.         ld a,d
  1744.         SETPG32KHIGH
  1745.         ld a,0xc100/256
  1746.         call cmd_loadpage
  1747.         ret nz
  1748.         ld a,e
  1749.         call cmd_loadfullpage
  1750.         ret nz
  1751.         ld a,h
  1752.         call cmd_loadfullpage
  1753.         ret nz
  1754.         ld a,l
  1755. cmd_loadfullpage
  1756.         SETPG32KHIGH
  1757.         ld a,0xc000/256
  1758. cmd_loadpage
  1759. ;out: a=error
  1760. ;keeps hl,de
  1761.         push de
  1762.         push hl
  1763.         ld d,a
  1764.         xor a
  1765.         ld l,a
  1766.         ld e,a
  1767.         sub d
  1768.         ld h,a ;de=buffer, hl=size
  1769. curhandle=$+1
  1770.         ld b,0
  1771.         OS_READHANDLE
  1772.         pop hl
  1773.         pop de
  1774.         or a
  1775.         ret
  1776.  
  1777. skipword
  1778. ;hl=string
  1779. ;out: hl=terminator/space addr
  1780. skipword0
  1781.         ld a,(hl)
  1782.         or a
  1783.         ret z
  1784.         sub ' '
  1785.         ret z
  1786.         inc hl ;ldi
  1787.         jr skipword0
  1788.  
  1789. skipspaces
  1790. ;hl=string
  1791. ;out: hl=after last space
  1792.         ld a,(hl)
  1793.         cp ' '
  1794.         ret nz
  1795.         inc hl
  1796.         jr skipspaces
  1797.  
  1798. ansipal
  1799.         ;dw 0xffff,0xfefe,0xfdfd,0xfcfc,0xefef,0xeeee,0xeded,0xecec
  1800.         ;dw 0x1f1f,0x1e1e,0x1d1d,0x1c1c,0x0f0f,0x0e0e,0x0d0d,0x0c0c
  1801.         dw 0xffff,0xfdfd,0xefef,0xeded,0xfefe,0xfcfc,0xeeee,0xecec
  1802.         dw 0x1f1f,0x1d1d,0x0f0f,0x0d0d,0x1e1e,0x1c1c,0x0e0e,0x0c0c
  1803.  
  1804. term_prfsm_curnumber
  1805.          db 0
  1806. term_prfsm_curnumber1
  1807.          db 0
  1808. term_prfsm_curnumber2
  1809.          db 0
  1810. term_prfsm_curnumber3
  1811.          db 0
  1812.  
  1813. cmd_filename
  1814.         db "cmd.com",0
  1815.  
  1816. tpastaname
  1817.         db "pasta.txt",0
  1818.  
  1819. tpipename
  1820.         db "z:",0
  1821.  
  1822. killbuf_byte
  1823.         db COLOR;0
  1824.  
  1825. pastabuf    
  1826.         db 0
  1827.  
  1828. readpastabuf
  1829.         ds READPASTABUF_SZ
  1830.  
  1831. stdoutbuf
  1832.         ds 6
  1833.  
  1834. stdinbuf
  1835.         ds STDINBUF_SZ
  1836.  
  1837.         align 256
  1838. trecode
  1839.         incbin "../_sdk/codepage/866toatm"
  1840. trecodeback
  1841.         ds 256
  1842.        
  1843. end
  1844.         savebin "term.com",begin,end-begin
  1845.        
  1846.         LABELSLIST "..\..\us\user.l"
  1847.