?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM128
  2.         include "../_sdk/sys_h.asm"
  3.  
  4. ;при закрытии cmd term должен закрыться
  5.  
  6. ;TEXTMODE=0
  7.        if TEXTMODE
  8. ;CHRHGT=8 ;реально нигде не используется в TEXTMODE
  9. HTMLHGT=25
  10. MOUSEFACTOR=8
  11. SCRBASE=0xc1c0
  12. LINESTEP=64
  13. CHRLINESTEP=64
  14.        else
  15. CHRHGT=6
  16. HTMLHGT=33
  17. MOUSEFACTOR=4
  18. SCRBASE=0xc000
  19. LINESTEP=40
  20. CHRLINESTEP=40*CHRHGT
  21.        endif
  22.  
  23.  
  24. RECODEINPUT=1
  25.  
  26. MOUSETIMEOUT=150;50
  27.  
  28. READPASTABUF_SZ=80
  29. STDINBUF_SZ=256
  30.  
  31. HTMLTOPY=0
  32. MOUSEFACTORX=4
  33.  
  34. COLOR=7
  35. CURSORCOLOR=0x38
  36.  
  37. REPEATNOKEY=0;2
  38.  
  39.  
  40.         macro BDOSSETPGSSCR
  41.         ld a,(user_scr0_low) ;ok ;pgscr0_0 ;attr
  42.         SETPG8000
  43.         ld a,(user_scr0_high) ;ok ;pgscr0_1 ;text
  44.         SETPGC000
  45.         endm
  46.  
  47.         org PROGSTART
  48. begin
  49.         ld sp,0x4000
  50.         OS_HIDEFROMPARENT
  51.        if TEXTMODE
  52.         ld e,6 ;textmode
  53.        else
  54.         ld e,2 ;mc hires
  55.        endif
  56.         OS_SETGFX
  57.  
  58.         OS_GETMAINPAGES ;out: d,e,h,l=pages in 0000,4000,8000,c000, c=flags, b=id
  59.        push bc ;b=id
  60.         ld a,e
  61.         ld (pgscrbuf),a
  62.         push hl
  63.         ld e,h
  64.         OS_DELPAGE
  65.         pop hl
  66.         ld e,l
  67.         OS_DELPAGE
  68.  
  69.         ld e,COLOR
  70.         call BDOS_cls ;там SETPGSSCR
  71.         ld de,ansipal
  72.         OS_SETPAL
  73.  
  74.         OS_SETSYSDRV
  75.  
  76.         ld de,tpipename
  77.         push de
  78.         OS_OPENHANDLE
  79.         ld a,b
  80.         ld (stdinhandle),a
  81.         pop de
  82.         OS_OPENHANDLE
  83.         ld a,b
  84.         ld (stdouthandle),a
  85.  
  86.        pop bc ;b=id
  87.         ld a,(stdinhandle)
  88.         ld e,a
  89.         ld a,(stdouthandle)
  90.         ld d,a
  91.         ld h,0xff ;rnd
  92. ;b=id, e=stdin, d=stdout, h=stderr        
  93.         OS_SETSTDINOUT
  94.  
  95. ;TODO запускать файл, указанный в параметре (по умолчанию cmd, искать в bin)
  96.         ld hl,COMMANDLINE ;command line
  97.         call skipword
  98.         ld de,cmd_filename
  99.         call skipspaces ;пропустили первое слово (там было term.com, а дальше, например, cmd.com autoexec.bat)
  100.         ld a,(hl)
  101.         or a
  102.         jr z,norunparameter
  103.         ld d,h
  104.         ld e,l
  105.         call skipword
  106. norunparameter
  107.        ld b,(hl)
  108.         ld (hl),0 ;end filename
  109.        push bc
  110.        push hl
  111.         OS_OPENHANDLE ;out: b=handle, a=error
  112.        pop hl
  113.        pop de
  114.        ld (hl),d ;restore parameters after filename
  115.         or a
  116.         jr nz,execcmd_error
  117.        
  118.         call readapp ;делает CLOSE ;включает какие-то страницы
  119.        
  120.         push af
  121.         ld b,a ;id
  122.         ld a,(stdinhandle)
  123.         ld d,a
  124.         ld a,(stdouthandle)
  125.         ld e,a
  126.         ld h,0xff ;rnd
  127. ;b=id, e=stdin, d=stdout, h=stderr        
  128.         OS_SETSTDINOUT
  129.        
  130.         pop af ;id
  131.  
  132.         ld e,a ;id
  133.         ld (waitpid_id),a
  134.         OS_RUNAPP
  135.        if TEXTMODE
  136.         ld hl,trecode
  137.         ld d,trecodeback/256
  138. maketrecodeback0
  139.         ld e,(hl)
  140.         ld a,l
  141.         ld (de),a
  142.         inc l
  143.         jr nz,maketrecodeback0
  144.        endif
  145.  
  146. execcmd_error
  147.         BDOSSETPGSSCR
  148.  
  149. mainloop_afternokey
  150.        if REPEATNOKEY != 0
  151. ;если два раза подряд нет событий, то надо делать YIELD, иначе YIELDKEEP
  152. ;т.е. когда нет событий, идёт всё время YIELD. А если событие,пусто,событие,пусто, то всё время YIELDKEEP
  153. ;тогда курсор исчезает - плохо
  154. wasnokey=$+1
  155.         ld a,1
  156.         dec a
  157.         jr nz,mainloop_yieldkeep
  158.         ;scf
  159.         ;ld a,55 ;"scf"
  160.         ;ld (wasnokey),a
  161.         ;jr nc,mainloop_yieldkeep
  162.        else
  163. mainloop_afterkey
  164.        endif
  165.         call printcursor
  166.          ld hl,(pr_buf_curaddr)
  167.          ld (wascursorcuraddr),hl        
  168.         call getmousexy
  169.         ld (mousecursor_wasxy),de
  170. mousetimeout=$+1
  171.         ld a,1
  172.         dec a
  173.         jr z,noshowmouse
  174.         ld (mousetimeout),a
  175.         call BDOS_countattraddr_mousecursor
  176.        if TEXTMODE
  177.         ld a,(hl)
  178.         cpl
  179.         ld (hl),a
  180.        else
  181.         ld de,LINESTEP
  182.         ld b,CHRHGT
  183.         ld a,(hl)
  184.         cpl
  185.         ld (hl),a
  186.         add hl,de
  187.         djnz $-4
  188.        endif
  189. noshowmouse
  190.  
  191.         ;OS_SETWAITING ;засыпаем, будем просыпаться только при появлении чего-то в пайпе
  192.         YIELD ;вернётся раньше, если что-то появилось в пайпе
  193.         ld a,(pgscrbuf) ;ok
  194.         SETPG4000
  195.         call BDOS_countattraddr
  196. wascursorcuraddr=$+1
  197.         ld de,killbuf_byte
  198.         ld a,e
  199.         add a,0x40 ;attr
  200.         adc a,0
  201.         ld e,a
  202.         ld a,(de) ;из pgscrbuf
  203.        if TEXTMODE
  204.         ld (hl),a;COLOR
  205.        else
  206.         ld de,LINESTEP
  207.         ld b,CHRHGT
  208.         ld (hl),a
  209.         add hl,de
  210.         djnz $-2
  211.        endif
  212.  
  213.        if REPEATNOKEY != 0
  214.         jr mainloop_afterkeyq
  215. mainloop_afterkey
  216.        ;if REPEATNOKEY != 0
  217.         ;ld a,55+128 ;"or a"
  218.         ;ld (wasnokey),a
  219.         ld a,REPEATNOKEY;2
  220. mainloop_yieldkeep
  221.         ld (wasnokey),a
  222.        ;endif
  223.         ;OS_SETWAITING ;засыпаем, будем просыпаться только при появлении чего-то в пайпе
  224.         YIELD ;вернётся раньше, если что-то появилось в пайпе
  225. mainloop_afterkeyq
  226.        endif
  227. mousecursor_wasxy=$+1
  228.         ld de,0
  229.          call getscrbuftop_a
  230.          add a,d ;0..24
  231.          ld h,a
  232.          ld a,e ;mousex
  233.          or 0x80
  234.          rrca ;(x/2)+0x40 или 0xc0
  235.         add a,0x40 ;attr
  236.         adc a,0
  237.         ld l,a
  238.         ld a,(hl) ;из pgscrbuf
  239.         push af
  240.         call BDOS_countattraddr_mousecursor
  241.         pop af
  242.        if TEXTMODE
  243.         ld (hl),a ;screen
  244.        else
  245.         ld de,LINESTEP
  246.         ld b,CHRHGT
  247.         ld (hl),a
  248.         add hl,de
  249.         djnz $-2
  250.        endif
  251.  
  252. mainloop_afterredraw
  253.        
  254. waitpid_id=$+1
  255.         ld e,0
  256.         OS_CHECKPID ;TODO проверять, что пайп с той стороны не закрыт
  257.         or a
  258.         jp z,quit ;dead
  259.        
  260.         jr mainloop_type0_go
  261. mainloop_type0
  262.         ;OS_SETWAITING ;засыпаем, будем просыпаться только при появлении чего-то в пайпе
  263.         ;YIELDKEEP
  264.  
  265. mainloop_type0_go
  266.         call type_stdin ;stdin to screen
  267.         jr nc,mainloop_type0 ;data present
  268.        
  269.         if 1==0
  270. ;if long time no message from stdin, print cursor
  271.         OS_GETTIMER ;dehl=timer
  272.         push hl
  273. lastsdtinmsgtimer=$+1
  274.         ld de,0
  275.          ;ld (lastsdtinmsgtimer),hl
  276.         or a
  277.         sbc hl,de ;hl=timer-oldtimer
  278. cursortimelimit=$+1
  279.         ld bc,1
  280.         or a
  281.         sbc hl,bc
  282.         pop hl
  283.         jr c,noprintcursor
  284.          ;ld (lastsdtinmsgtimer),hl
  285.        
  286.         ld a,4
  287.         out (0xfe),a
  288.         call printcursor
  289.         ld a,1
  290.         ld (cursortimelimit),a
  291.  
  292.         ld a,2
  293.         out (0xfe),a
  294.         jr noprintcursorq
  295. noprintcursor
  296.         ld a,7
  297.         out (0xfe),a
  298. noprintcursorq
  299.         endif
  300.  
  301.         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!)
  302.         jp nz,mainloop_afternokey ;no focus
  303.  
  304.         ;or a ;cp NOKEY ;keylang==0?
  305.         ;jr nz,$+3
  306.         ;cp c ;keynolang==0?
  307.         ;jp z,mainloop_afternokey
  308.         cp key_redraw
  309.         jp z,term_redraw
  310.         ld b,a
  311.  
  312.         ld a,l
  313.         and 0xf0
  314. control_imer_oldmousewheel=$+2
  315.         ld hx,0
  316.         ld (control_imer_oldmousewheel),a
  317.         sub hx
  318.         ;ld (mouse_scrollvalue),a
  319.         jr z,nowheelmove
  320.         jp p,term_pgdown
  321.         jp term_pgup
  322. nowheelmove
  323.         ;ld a,0
  324.         ;ld (mouse_scrollvalue),a ;default scrollvalue
  325.  
  326.         ld a,b
  327.         or a
  328.         jp nz,term_sendchar        
  329. ;no action? mouse coords change is also an action
  330. control_imer_oldmousecoords=$+1
  331.         ld bc,0
  332.         ld (control_imer_oldmousecoords),de
  333.         ld a,b
  334.         sub d
  335.         ld d,a
  336.         ld a,e
  337.         sub c
  338.         ld e,a
  339.         or d
  340.         jr z,nomousemove
  341.         push hl
  342.         call mousemove
  343.         pop hl
  344.         jr sendmouseevent
  345. nomousemove
  346.         ld a,l ;mouse buttons
  347. oldmousebuttons=$+1
  348.         ld h,0
  349.         ld (oldmousebuttons),a
  350.         xor h
  351.         and 7
  352.         ;jr nz,sendmouseevent
  353.         jp z,mainloop_afternokey
  354. sendmouseevent
  355.          ld a,MOUSETIMEOUT;50
  356.          ld (mousetimeout),a
  357.         ld a,l
  358.         cpl
  359.         and 7
  360.         jr z,sendmouseevent_noclick
  361.         call getmousexy
  362.         ld a,d
  363.         or e
  364.         jr nz,sendmouseevent_noclicktopleft
  365.         ld de,tpastaname
  366.         OS_CREATEHANDLE
  367.         ld a,b
  368.         ld (pastahandle),a
  369.        
  370.         ld a,(pgscrbuf)
  371.         SETPG4000
  372.         ld hl,0x4040
  373. savepasta0
  374.         push hl
  375.         call savepastaline
  376.         pop hl
  377.         inc h
  378.         jp p,savepasta0        
  379.         ld a,(pastahandle)
  380.         ld b,a
  381.         OS_CLOSEHANDLE
  382.         jp mainloop_afterkey
  383. sendmouseevent_noclicktopleft
  384.         ld a,d
  385.         sub HTMLHGT-1;24
  386.         or e
  387.         jr nz,sendmouseevent_click
  388.         ld de,tpastaname
  389.         OS_OPENHANDLE
  390.         ld a,b
  391.         ld (pastahandle),a
  392.         ld de,readpastabuf
  393.         push de
  394.         ld hl,READPASTABUF_SZ
  395.         OS_READHANDLE ;hl=реально прочитано
  396.         pop de
  397.         call sendchars
  398.         ld a,(pastahandle)
  399.         ld b,a
  400.         OS_CLOSEHANDLE
  401.         jp mainloop_afterkey
  402. sendmouseevent_noclick
  403.         ld b,'@' ;mouse move
  404.         jr sendmouseevent_ok
  405. sendmouseevent_click
  406.         ld a,l ;mouse buttons
  407.         ld b,1+32
  408.         rra
  409.         jr nc,sendmouseevent_ok
  410.         inc b
  411.         rra
  412.         jr nc,sendmouseevent_ok
  413.         inc b
  414.         rra
  415.         jr nc,sendmouseevent_ok
  416.         ld b,0+32 ;unclick
  417. sendmouseevent_ok
  418. ;send mousemove event
  419.         ld hl,stdoutbuf
  420.         ld (hl),0x1b
  421.         inc hl
  422.         ld (hl),'['
  423.         inc hl
  424.         ld (hl),'M'
  425.         inc hl
  426.         ld (hl),b
  427.         inc hl
  428.         call getmousexy
  429.          ld a,e
  430.          add a,32
  431.         ld (hl),a
  432.         inc hl
  433.          ld a,e
  434.          add a,32
  435.         ld (hl),a
  436.         ld de,stdoutbuf
  437.         ld hl,6
  438.         call sendchars
  439.         jp mainloop_afterkey
  440.        
  441. printcursor
  442.          ;ld hl,4
  443.          ;ld (cursortimelimit),hl
  444.         call BDOS_countattraddr
  445.        if TEXTMODE
  446.         ld (hl),CURSORCOLOR
  447.        else
  448.         ld de,LINESTEP
  449.         ld bc,CHRHGT*256+CURSORCOLOR
  450.         ld (hl),c
  451.         add hl,de
  452.         djnz $-2
  453.        endif
  454.         ret
  455.  
  456. term_sendchar
  457.         cp key_esc
  458.         jr z,term_esckey
  459.         if RECODEINPUT
  460.         call sendkey
  461.         else
  462.         call sendchar_byte_a
  463.         endif
  464.         jp mainloop_afterkey
  465. term_esckey
  466.         if RECODEINPUT
  467.         call sendchar_byte_a
  468.         ld a,key_esc
  469.         call sendchar_byte_a
  470.         else
  471.         call sendchar_byte_a
  472.         endif
  473.         jp mainloop_afterkey
  474.  
  475. term_pgdown
  476.         ld hl,redraw_scroll
  477.         ld a,(hl)
  478.         or a;cp 0;24
  479.         jr z,$+3
  480.         dec a
  481.         ld (hl),a
  482.         call redraw
  483.         jp mainloop_afterredraw
  484. term_pgup
  485.         ld hl,redraw_scroll
  486.         ld a,(hl)
  487.         cp 63 -(HTMLHGT-1);24
  488.         jr z,$+3
  489.         inc a
  490.         ld (hl),a
  491.         call redraw
  492.         jp mainloop_afterredraw
  493.  
  494. term_redraw
  495.         ld hl,redraw_scroll
  496.         ld (hl),0
  497.         call redraw
  498.         jp mainloop_afterredraw
  499.  
  500. redraw_to_base
  501.         ld hl,redraw_scroll
  502.         inc (hl)
  503.         dec (hl)
  504.         ret z
  505.         ld (hl),0
  506.         push af
  507.         call redraw
  508.         pop af
  509.         ret
  510. redraw
  511. ;scrbuf состоит из строк длиной 256 байт
  512. ;каждая из них из 4 слоёв:
  513. ;+0x40: аналог +0x4000 (text0) ;1
  514. ;+0x80: аналог +0x2000 (attr0) ;3
  515. ;+0xc0: аналог +0x6000 (text1) ;2
  516. ;+0x01: аналог +0x0001 (attr1) ;4
  517.         ld a,(pgscrbuf)
  518.         SETPG4000
  519.         BDOSSETPGSSCR
  520.          call getscrbuftop_a
  521.         ld b,HTMLHGT;25
  522.        if TEXTMODE
  523.         ld h,a
  524.         ld de,SCRBASE
  525. redrawlines0
  526.         push bc
  527.         ld l,0x40
  528.         push de
  529.         call copylinelayer
  530.         set 5,d
  531.         set 7,l
  532.         call copylinelayer
  533.         res 6,d
  534.         res 6,l
  535.         call copylinelayer
  536.         res 5,d
  537.         res 7,l
  538.         call copylinelayer
  539.         pop de
  540.         ex de,hl
  541.         ld bc,CHRLINESTEP
  542.         add hl,bc
  543.         ex de,hl
  544.         inc h ;TODO nextpg
  545.         pop bc
  546.         djnz redrawlines0
  547.         ret
  548.  
  549.        else ;mc hires
  550.  
  551.         ld hx,a
  552.         ld hl,SCRBASE
  553. redrawlines0
  554.         push bc
  555. ;scrbuf состоит из строк длиной 256 байт
  556. ;каждая из них из 4 слоёв:
  557. ;+0x40: аналог +0x4000 (text0)
  558. ;+0x80: аналог +0x2000 (attr0)
  559. ;+0xc0: аналог +0x6000 (text1)
  560. ;+0x01: аналог +0x0001 (attr1)
  561. _ixbase=0x80-40 ;чтобы зациклить по jp p
  562.         ld lx,_ixbase
  563.         ld d,fnt/256
  564. redrawlinechars0
  565.         ld e,(ix-_ixbase+0x40) ;text0
  566.         ld bc,LINESTEP
  567.         dup CHRHGT-1
  568.         ld a,(de)
  569.         ld (hl),a
  570.         inc d
  571.         add hl,bc
  572.         edup
  573.         ld a,(de)
  574.         ld (hl),a
  575.         set 5,h
  576.         ld e,(ix-_ixbase+0xc0) ;text1
  577.         ld bc,-LINESTEP
  578.         dup CHRHGT-1
  579.         ld a,(de)
  580.         ld (hl),a
  581.         dec d
  582.         add hl,bc
  583.         edup
  584.         ld a,(de)
  585.         ld (hl),a
  586.         res 6,h ;attr
  587.         ld a,(ix-_ixbase+0x01) ;attr1
  588.         ld bc,LINESTEP
  589.         dup CHRHGT-1
  590.         ld (hl),a
  591.         add hl,bc
  592.         edup
  593.         ld (hl),a
  594.         res 5,h
  595.         ld a,(ix-_ixbase+0x80) ;attr0
  596.         ld bc,-LINESTEP
  597.         dup CHRHGT-1
  598.         ld (hl),a
  599.         add hl,bc
  600.         edup
  601.         ld (hl),a
  602.         set 6,h ;text
  603.         inc hl
  604.         inc lx
  605.         jp p,redrawlinechars0
  606.         ld bc,CHRLINESTEP-40
  607.         add hl,bc
  608.         inc hx ;TODO nextpg
  609.         pop bc
  610.         djnz redrawlines0
  611.        ;затираем последние 2 строки (200 - (33*6) = 2)
  612.         ;call redrawcl2lines
  613.         ;set 5,h
  614.         ;call redrawcl2lines
  615.         res 6,h ;attr
  616.         call redrawcl2lines
  617.         set 5,h ;res 5,d
  618. redrawcl2lines
  619.         push hl
  620.         ld d,h
  621.         ld e,l
  622.         inc de
  623.         ld [hl],0
  624.         ld bc,40*2-1
  625.         ldir
  626.         pop hl
  627.         ret        
  628.        endif
  629.  
  630.  
  631.        if TEXTMODE
  632. copylinelayer ;for redraw
  633.         push de
  634.         push hl
  635.         dup 40
  636.         ldi
  637.         edup
  638.         ld a,(hl)
  639.         ld (de),a
  640.         pop hl
  641.         pop de
  642.         ret
  643.        endif
  644.  
  645. quit
  646. ;cmd closed!!!
  647.  
  648.         dup 2 ;close twice - as stdin and as stdout! на случай, если клиент не закрыл у себя
  649.         ld a,(stdinhandle)
  650.         ld b,a
  651.         OS_CLOSEHANDLE
  652.         ld a,(stdouthandle)
  653.         ld b,a
  654.         OS_CLOSEHANDLE
  655.         edup
  656.         QUIT
  657.  
  658. savepastaline
  659. ;hl=lineaddr
  660. ;текст лежит в 0x40, 0xc0, 0x41, 0xc1,.... 0xfe, 0x7f, 0xff
  661. ;ищем конец строки (первый символ с конца, не равный 0/0x20)
  662.         ld l,0xc0+39 ;end of text
  663.         ld b,80
  664. savepastaline_findend0
  665.         ld a,(hl)
  666.         or a
  667.         jr z,savepastaline_findend0ok
  668.         cp 0x20
  669.         jr nz,savepastaline_findendq
  670. savepastaline_findend0ok
  671.         ld a,l
  672.         sub 0x80
  673.         sbc a,0
  674.         ld l,a
  675.         djnz savepastaline_findend0
  676.         jr savepastaline_skip
  677. savepastaline_findendq
  678. ;hl=end of line
  679. ;сохраняем всю строку до конца
  680.         ld l,0x40 ;start of text
  681. savepastaline0
  682.         ld a,(hl)
  683.         or a
  684.         jr nz,$+4
  685.         ld a,0x20
  686.         push bc
  687.         push hl
  688.         call writechar2pasta
  689.         pop hl
  690.         pop bc
  691.         ld a,l
  692.         add a,0x80
  693.         adc a,0
  694.         ld l,a
  695.         djnz savepastaline0
  696. savepastaline_skip
  697.         ld a,0x0d
  698.         call writechar2pasta
  699.         ld a,0x0a
  700. writechar2pasta
  701.        if TEXTMODE
  702.         ld d,trecodeback/256
  703.         ld e,a
  704.         ld a,(de)
  705.        endif
  706.         ld de,pastabuf
  707.         ld (de),a
  708.         ld hl,1
  709. pastahandle=$+1
  710.         ld b,0
  711.         OS_WRITEHANDLE
  712.         ret
  713.  
  714. getmousexy
  715. mousexy=$+1
  716.         ld de,0
  717.         ret
  718.  
  719. type_stdin
  720. ;out: CY=no data
  721.         ld de,stdinbuf
  722.         ld hl,STDINBUF_SZ
  723. stdinhandle=$+1
  724.         ld b,0
  725.         ;ld b,0xff
  726.         OS_READHANDLE ;6933t (incl. 5350=ldir 255 bytes)
  727. ;hl=size
  728.         ld a,h
  729.         or l
  730.         scf ;out: CY=no data
  731.         ret z ;jr z,nostdinmsg;mainloop_afterkey
  732.         if REPEATNOKEY != 0
  733.          ld a,REPEATNOKEY;2
  734.          ld (wasnokey),a
  735.         endif
  736.  
  737.         push hl
  738.         call redraw_to_base
  739.          ;OS_GETTIMER ;dehl=timer
  740.          ;ld (lastsdtinmsgtimer),hl
  741.         BDOSSETPGSSCR
  742. pgscrbuf=$+1
  743.         ld a,0 ;ok
  744.         SETPG4000
  745.         pop bc
  746.         push bc
  747.         ld b,c
  748.         ld hl,stdinbuf
  749. TERM_ST_SINGLE=1 ;wait for single symbol
  750. TERM_ST_AFTERESC=2 ;after 0x1b
  751. TERM_ST_AFTERESCBRACKET=3 ;after 0x1b [ [number] (might be more digits)
  752. term_prfsmcurstate=$+1
  753.          ld a,TERM_ST_SINGLE
  754.          dec a
  755.          jr nz,term_prfsm
  756. term_print0
  757.         ld a,(hl)
  758.         cp 0x1b+1
  759.         jr c,term_print0_maybecontrolcode
  760.         push hl
  761.         call BDOS_prchar_a_nocrlf ;226/227t
  762.         ;call term_prfsm ;520/521t
  763.         pop hl
  764. term_print0_maybecontrolcodeq
  765.         inc hl
  766.         djnz term_print0
  767.          ld a,TERM_ST_SINGLE
  768.         jp term_print0q
  769. term_print0_maybecontrolcode
  770.         cp 0x1b
  771.         jr z,term_prfsm_afteresc ;next state
  772.         push hl
  773.         call BDOS_prchar_a
  774.         pop hl
  775.         jp term_print0_maybecontrolcodeq
  776.        
  777. term_prfsm
  778.          dec a
  779.          jr nz,term_prfsm_afterescbracket
  780. term_prfsm_afteresc0
  781.         xor a
  782.         ld (term_prfsm_curnumber),a
  783.         ld (term_prfsm_curnumber1),a
  784.         ld (term_prfsm_curnumber2),a
  785.         ld (term_prfsm_curnumber3),a
  786.         ;ld a,(hl) ;todo check bracket
  787.         jp term_prfsm_afterescbracket_ok ;next state
  788. term_prfsm_afteresc
  789.         inc hl
  790.         djnz term_prfsm_afteresc0
  791.          ld a,TERM_ST_AFTERESC
  792.         jp term_print0q
  793.  
  794. term_prfsm_afterescbracket_nosemicolon
  795.         push hl
  796.         call term_prfsm_letter
  797.         pop hl
  798.         jp term_print0_maybecontrolcodeq ;initial state
  799. term_prfsm_afterescbracket
  800. term_prfsm_afterescbracket0
  801.         ld a,(hl)
  802.         sub '0'
  803.         cp 10
  804.         jr nc,term_prfsm_afterescbracket_nonumber
  805.         ;push de
  806.         ld e,a
  807.         ld a,(term_prfsm_curnumber)
  808.         ld d,a
  809.         add a,a
  810.         add a,a
  811.         add a,d
  812.         add a,a ;*10
  813.         add a,e
  814.         ld (term_prfsm_curnumber),a
  815.         ;pop de
  816.         jp term_prfsm_afterescbracket_ok
  817. term_prfsm_afterescbracket_nonumber
  818.         add a,'0'
  819.         cp ';'
  820.         jr nz,term_prfsm_afterescbracket_nosemicolon
  821.         ld a,(term_prfsm_curnumber2)
  822.         ld (term_prfsm_curnumber3),a
  823.         ld a,(term_prfsm_curnumber1)
  824.         ld (term_prfsm_curnumber2),a
  825.         ld a,(term_prfsm_curnumber)
  826.         ld (term_prfsm_curnumber1),a
  827.         xor a
  828.         ld (term_prfsm_curnumber),a
  829. term_prfsm_afterescbracket_ok
  830.         inc hl
  831.         djnz term_prfsm_afterescbracket0
  832.          ld a,TERM_ST_AFTERESCBRACKET
  833. term_print0q
  834.          ld (term_prfsmcurstate),a
  835.         pop hl
  836.         ld bc,STDINBUF_SZ
  837.         or a
  838.         sbc hl,bc
  839.         ret z ;out: NC=data present
  840.         scf
  841.         ret ;no more data
  842.  
  843. sendchar_esckey
  844.         push bc
  845.          ;call forcereprintcursor
  846.         ld hl,stdoutbuf
  847.         ld (hl),0x1b
  848.         inc hl
  849.         ;call sendchar_byte_a
  850.         ld (hl),'['
  851.         ;call sendchar_byte_a
  852.         ld de,stdoutbuf
  853.         ld hl,2
  854.         call sendchars
  855.         pop bc
  856.         jr sendchar_byte
  857.  
  858. sendchar_esckey2
  859.         push bc
  860.         ld hl,stdoutbuf
  861.         ld (hl),0x1b
  862.         inc hl
  863.         ;call sendchar_byte_a
  864.         ld (hl),'['
  865.         inc hl
  866.         ;call sendchar_byte_a
  867.         pop bc
  868.         push bc
  869.         ld (hl),b
  870.         ;call sendchar_byte_a
  871.         ld de,stdoutbuf
  872.         ld hl,3
  873.         call sendchars
  874.         pop bc
  875.         jr sendchar_byte
  876.  
  877.         if 1==0
  878. sendchar_num
  879. ;a=num
  880.         ld c,'0'-1
  881.         inc c
  882.         sub 10
  883.         jr nc,$-3
  884.         push af
  885.         call sendchar_byte
  886.         pop af
  887.         add a,'0'+10
  888.         jr sendchar_byte_a
  889.         endif
  890.  
  891. sendkey
  892. ;key to stdout
  893.         ;cp 0x80
  894.         ;jr nc,sendchar_rustoutf8
  895.         ;cp 0x08 ;backspace
  896.         ;cp 0x0d ;enter
  897.         cp key_left
  898.         ld c,'D'
  899.         jr z,sendchar_esckey
  900.         cp key_right
  901.         ld c,'C'
  902.         jr z,sendchar_esckey
  903.         cp key_down
  904.         ld c,'B'
  905.         jr z,sendchar_esckey
  906.         cp key_up
  907.         ld c,'A'
  908.         jr z,sendchar_esckey
  909.         cp key_del
  910.         ld bc,'3'*256+'~'
  911.         jr z,sendchar_esckey2
  912.         cp key_home
  913.         ld bc,'1'*256+'~'
  914.         jr z,sendchar_esckey2
  915.         cp key_end
  916.         ld bc,'4'*256+'~'
  917.         jr z,sendchar_esckey2
  918.         cp key_ins
  919.         ld bc,'2'*256+'~'
  920.         jr z,sendchar_esckey2
  921.         ld c,a
  922. sendchar_byte
  923.         ld a,c
  924. sendchar_byte_a
  925. sendchar
  926.         ;cp 0x80
  927.         ;jr nc,sendchar_rustoutf8
  928. ;sendchar_byte_a
  929.         ld (stdoutbuf),a
  930.         ld hl,1
  931.         ld de,stdoutbuf
  932. sendchars
  933. ;send chars to stdout (in: de=buf, hl=size, out: A=error)
  934.         ld b,5 ;attempts
  935. sendchars0
  936.         push bc
  937.         push de
  938.         push hl
  939. stdouthandle=$+1
  940.         ld b,0
  941.         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)]
  942.         ld b,h
  943.         ld c,l ;bytes actually written
  944.         pop hl
  945.         pop de
  946.         pop ix
  947.          or a
  948.           ret nz ;error ;TODO обработать? а так пока просто избегаем зацикливания
  949.          sbc hl,bc ;datasize-byteswritten
  950.          ret z
  951.        ;ld a,5 ;m
  952.        ;out (-2),a
  953.          ex de,hl
  954.          add hl,bc ;dataaddr+byteswritten
  955.          ex de,hl
  956. ;hl=remaining data size
  957. ;de=remaining data addr
  958.         push ix
  959.         push de
  960.         push hl
  961.         YIELDKEEP ;2158t
  962.         call type_stdin
  963.         pop hl
  964.         pop de
  965.         pop bc
  966.         djnz sendchars0
  967.         xor a ;z=no error
  968.         ret ;клиент завис, но не сдох
  969.  
  970. term_prfsm_letter
  971.         ;ld hl,term_prfsm_curstate
  972.         ;ld (hl),TERM_ST_SINGLE
  973.          ;ld b,TERM_ST_SINGLE
  974.         cp 'H'
  975.         jr z,term_prfsm_afterescbracket_H
  976.         cp 'G'
  977.         jr z,term_prfsm_afterescbracket_G
  978.         cp 'm'
  979.         jp z,term_prfsm_afterescbracket_m
  980.         cp 'K'
  981.         jr z,term_prfsm_afterescbracket_clearline
  982. ;TODO J etc.
  983.         ;cp 'A' ;cursor_up
  984.         cp 'B'
  985.         jp z,cursor_down
  986.         cp 'C'
  987.         jp z,cursor_right
  988.         cp 'D'
  989.         jp z,cursor_left
  990.         cp 's'
  991.         jp z,cursor_store
  992.         cp 'd' ;NON-STANDARD!
  993.         jp z,term_prfsm_afterescbracket_scrolldown
  994.         cp 'u' ;NON-STANDARD!
  995.         jp z,term_prfsm_afterescbracket_scrollup ;+cursor remember
  996.         ;cp '~'
  997.         ;jr z,term_prfsm_afterescbracket_tilde
  998.         ret
  999. ;term_prfsm_afterescbracket_tilde
  1000. ;        ret
  1001.  
  1002. term_prfsm_afterescbracket_clearline
  1003. ;не двигает курсор
  1004.         push bc
  1005.         ld de,(pr_textmode_curaddr)
  1006.         ld hl,(pr_buf_curaddr)
  1007.        if TEXTMODE
  1008.         ld bc,LINESTEP;0x0040
  1009. term_prfsm_afterescbracket_clearline0
  1010.         xor a
  1011.         ld (de),a
  1012.         ld a,d
  1013.         xor 0x60 ;attr + 0x20
  1014.         ld d,a
  1015.         and 0x20
  1016.         jr nz,$+3
  1017.         inc e
  1018.         xor a
  1019.         ld (de),a
  1020.         set 6,d
  1021.         ld (hl),a
  1022.         ld a,l
  1023.         add a,c;0x40 ;attr
  1024.         adc a,b;0
  1025.         ld l,a
  1026.         ld (hl),b;0
  1027.         add a,c;0x40 ;text (next)
  1028.         ld l,a
  1029.         cp 0x40+(80/2)
  1030.         jp nz,term_prfsm_afterescbracket_clearline0
  1031.        else
  1032. ;TODO speedup
  1033.         ld bc,LINESTEP;40
  1034. term_prfsm_afterescbracket_clearline0
  1035.         ex de,hl
  1036.         xor a
  1037.         dup CHRHGT-1
  1038.         ld (hl),a
  1039.         add hl,bc
  1040.         edup
  1041.         ld (hl),a
  1042.         res 6,h
  1043.         ld bc,-LINESTEP
  1044.         dup CHRHGT-1
  1045.         ld (hl),a
  1046.         add hl,bc
  1047.         edup
  1048.         ld (hl),a
  1049.         ld bc,LINESTEP;40
  1050.         set 6,h
  1051.         bit 5,h
  1052.         set 5,h
  1053.         jr z,clearline_nextaddr_ok
  1054.         res 5,h
  1055.         inc hl
  1056. clearline_nextaddr_ok
  1057.         ex de,hl
  1058.         ld (hl),a
  1059.         ld a,l
  1060.         add a,0x40 ;attr
  1061.         adc a,b
  1062.         ld l,a
  1063.         ld (hl),b
  1064.         add a,0x40 ;text (next)
  1065.         ld l,a
  1066.         cp 0x40+(80/2)
  1067.         jp nz,term_prfsm_afterescbracket_clearline0
  1068.        endif
  1069.         pop bc
  1070.         ret
  1071.  
  1072. term_prfsm_afterescbracket_G
  1073.         ld a,(term_prfsm_curnumber) ;column
  1074.         dec a
  1075.         ld e,a
  1076.         jp BDOS_setx
  1077.  
  1078. term_prfsm_afterescbracket_H
  1079.         ld a,(term_prfsm_curnumber1) ;row
  1080.         dec a
  1081.         ld d,a
  1082.         ld a,(term_prfsm_curnumber) ;column
  1083.         dec a
  1084.         ld e,a
  1085.         jp BDOS_setxy
  1086.        
  1087.         if 1==0
  1088. forcereprintcursor
  1089.         ;push de
  1090.         ;push hl
  1091.         ;OS_GETTIMER ;dehl=timer
  1092.         ;dec h
  1093.         ;ld (lastsdtinmsgtimer),hl
  1094.          ld hl,0;2
  1095.          ld (cursortimelimit),hl
  1096.         ;pop hl
  1097.         ;pop de
  1098.         ret
  1099.         endif
  1100.        
  1101. term_prfsm_afterescbracket_m
  1102. ;CSI Pm m Character Attributes (SGR)
  1103. ;Ps = 30  Set foreground color to Black.
  1104. ;Ps = 31  Set foreground color to Red.
  1105. ;Ps = 32  Set foreground color to Green.
  1106. ;Ps = 33  Set foreground color to Yellow.
  1107. ;Ps = 34  Set foreground color to Blue.
  1108. ;Ps = 35  Set foreground color to Magenta.
  1109. ;Ps = 36  Set foreground color to Cyan. (Grey?)
  1110. ;Ps = 37  Set foreground color to White.
  1111. ;Ps = 39  Set foreground color to default, ECMA-48 3rd.
  1112. ;Ps = 40  Set background color to Black.
  1113. ;Ps = 41  Set background color to Red.
  1114. ;Ps = 42  Set background color to Green.
  1115. ;Ps = 43  Set background color to Yellow.
  1116. ;Ps = 44  Set background color to Blue.
  1117. ;Ps = 45  Set background color to Magenta.
  1118. ;Ps = 46  Set background color to Cyan.
  1119. ;Ps = 47  Set background color to White.
  1120. ;Ps = 49  Set background color to default, ECMA-48 3rd.
  1121.  ;Ps = 8   Invisible, i.e., hidden, ECMA-48 2nd, VT300. (не работает в Putty!!!)
  1122.  ;Ps = 28  Visible, i.e., not hidden, ECMA-48 3rd, VT300. (не работает в Putty!!!)
  1123. ;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:
  1124. ;Ps = 90  Set foreground color to Black.
  1125. ;Ps = 91  Set foreground color to Red.
  1126. ;Ps = 92  Set foreground color to Green.
  1127. ;Ps = 93  Set foreground color to Yellow.
  1128. ;Ps = 94  Set foreground color to Blue.
  1129. ;Ps = 95  Set foreground color to Magenta.
  1130. ;Ps = 96  Set foreground color to Cyan.
  1131. ;Ps = 97  Set foreground color to White.
  1132.  ;TODO 1  -  BRIGHT ON: Включение яркости INK. (Bold, VT100.)
  1133.  ;TODO 22 - Normal (neither bold nor faint), ECMA-48 3rd. [21  -  BRIGHT OFF: Выключение яркости INK. (Doubly-underlined, ECMA-48 3rd.)]
  1134.         ld a,(pr_textmode_curcolor)
  1135.         ld e,a
  1136.         ld a,(term_prfsm_curnumber)
  1137.         call term_setcolorpp
  1138.         ld a,(term_prfsm_curnumber1)
  1139.         call term_setcolorpp
  1140.         ld a,e
  1141.         ld (pr_textmode_curcolor),a
  1142.         ret
  1143.  
  1144. term_prfsm_afterescbracket_scrolldown
  1145.         push bc
  1146.         ld a,(term_prfsm_curnumber1)
  1147.         ld e,a ;xtop
  1148.         ld a,(term_prfsm_curnumber)
  1149.         ld d,a ;ytop
  1150.         ld hl,(term_prfsm_curnumber3) ;wid первый по счёту
  1151.         ld a,(term_prfsm_curnumber2) ;hgt
  1152.         ld h,a ;hgt
  1153.         push de
  1154.         push hl
  1155.         ld a,d
  1156.         add a,h
  1157.         dec a
  1158.         ld d,a ;ybottom
  1159.        if TEXTMODE
  1160.         ld a,l ;wid
  1161.         cp 80
  1162.         jr nz,term_prfsm_afterescbracket_scrolldown_OS
  1163. ;de=bottomyx, hl=hgt,wid
  1164. ;x, wid even
  1165.         call BDOS_scroll_prepare
  1166. BDOS_scrolldown0
  1167.         push bc
  1168.         ld d,h
  1169.         ld e,l
  1170.         ld bc,-LINESTEP
  1171.         add hl,bc
  1172.         call BDOS_scrollpageline ;spoils a (ldi)
  1173.         pop bc
  1174.         djnz BDOS_scrolldown0
  1175.         jr term_prfsm_afterescbracket_scrolldown_OSq
  1176. term_prfsm_afterescbracket_scrolldown_OS
  1177.         ;OS_SCROLLDOWN ;было до пересчёта ybottom
  1178.         call BDOS_scroll_prepare
  1179.         ld a,b
  1180.         ld bc,-LINESTEP
  1181.         call BDOS_scrollwindow ;(ldir)
  1182. term_prfsm_afterescbracket_scrolldown_OSq
  1183.        else
  1184.         call BDOS_scroll_prepare
  1185. ;hl=pixelline(bottom-5)
  1186.         ex de,hl
  1187.         ld hl,CHRLINESTEP-LINESTEP ;pixelline(bottom)
  1188.         add hl,de
  1189.         ex de,hl
  1190.         ld a,b
  1191.         ld bc,-LINESTEP
  1192.         add hl,bc
  1193. ;hl=pixelline(bottom-6)
  1194. ;de=pixelline(bottom)
  1195.         call BDOS_scrollwindow
  1196.        endif
  1197.         pop hl
  1198.         pop de
  1199.         ld a,d
  1200.         add a,h
  1201.         dec a
  1202.         ld d,a ;ybottom
  1203.         call BDOS_scrollbuf_prepare
  1204.        ld (BDOS_scrolldown_call),de
  1205. BDOS_scrolldown_buf0
  1206.         push bc
  1207.         ld d,h
  1208.         ld e,l
  1209.         dec h
  1210. BDOS_scrolldown_call=$+1
  1211.         call BDOS_scrollpageline_bufwindow
  1212.         pop bc
  1213.         djnz BDOS_scrolldown_buf0
  1214.         pop bc
  1215.         ret
  1216.        
  1217. cursor_store
  1218.         ld hl,(pr_textmode_curaddr)
  1219.         ld (cursor_remember_scraddr),hl
  1220.        if !TEXTMODE
  1221.         ld hl,(pr_curlineaddr)
  1222.         ld (cursor_remember_scrlineaddr),hl
  1223.        endif
  1224.         ld hl,(pr_buf_curaddr)
  1225.         ld (cursor_remember_bufaddr),hl
  1226.         ret
  1227. cursor_remember
  1228. cursor_remember_scraddr=$+1
  1229.         ld hl,SCRBASE
  1230.         ld (pr_textmode_curaddr),hl
  1231.        if !TEXTMODE
  1232. cursor_remember_scrlineaddr=$+1
  1233.         ld hl,SCRBASE
  1234.         ld (pr_curlineaddr),hl
  1235.        endif
  1236. cursor_remember_bufaddr=$+1
  1237.         ld hl,0x4040
  1238.         ld (pr_buf_curaddr),hl
  1239.         ret
  1240.  
  1241. term_prfsm_afterescbracket_scrollup
  1242.         ld a,(term_prfsm_curnumber1)
  1243.         ld e,a ;xtop
  1244.         ld a,(term_prfsm_curnumber)
  1245.         ld d,a ;ytop
  1246.         ld hl,(term_prfsm_curnumber3) ;wid ;первый по счёту
  1247.         ld a,(term_prfsm_curnumber2)
  1248.         ld h,a ;hgt
  1249.         ld a,l ;wid
  1250.         or a
  1251.         jr z,cursor_remember
  1252.         push bc
  1253.         push de
  1254.         push hl
  1255. ;de=topyx, hl=hgt,wid
  1256. ;x, wid even
  1257.        if TEXTMODE
  1258.         cp 80
  1259.         jr nz,term_prfsm_afterescbracket_scrollup_OS
  1260.         call BDOS_scroll_prepare
  1261.         call BDOS_scrollpage0 ;62927 t (ldi)
  1262.         jr term_prfsm_afterescbracket_scrollup_OSq
  1263. term_prfsm_afterescbracket_scrollup_OS
  1264.         ;OS_SCROLLUP ;95597 t
  1265.         call BDOS_scroll_prepare
  1266.         ld a,b
  1267.         ld bc,LINESTEP
  1268.         call BDOS_scrollwindow ;(ldir)
  1269. term_prfsm_afterescbracket_scrollup_OSq
  1270.        else
  1271.         call BDOS_scroll_prepare
  1272.         ex de,hl
  1273.         ld hl,CHRLINESTEP
  1274.         add hl,de
  1275.         ld a,b
  1276.         ld bc,LINESTEP
  1277.         call BDOS_scrollwindow
  1278.        endif
  1279.         pop hl
  1280.         pop de
  1281.         call BDOS_scrollbuf_prepare
  1282.        ld (BDOS_scrollup_call),de
  1283. BDOS_scrollup_buf0
  1284.         push bc
  1285.         ld d,h
  1286.         ld e,l
  1287.         inc h
  1288. BDOS_scrollup_call=$+1
  1289.         call BDOS_scrollpageline_bufwindow
  1290.         pop bc
  1291.         djnz BDOS_scrollup_buf0 ;62131[91221] t
  1292.         pop bc
  1293.         ret
  1294.  
  1295. BDOS_scrollbuf_prepare
  1296.         ld a,(pgscrbuf)
  1297.         SETPG4000
  1298.         ld a,l
  1299.         srl a
  1300.         ld (BDOS_scrollpagelinelayer_wid),a
  1301.         ld b,h
  1302.         dec b
  1303.          call getscrbuftop_a
  1304.          add a,d ;0..24
  1305.          ld h,a
  1306.          ld a,e
  1307.          or 0x80
  1308.          rrca ;(x/2)+0x40 или 0xc0
  1309.          ld l,a
  1310.         ld a,(BDOS_scrollpagelinelayer_wid)
  1311.         cp 40
  1312.         ld de,BDOS_scrollpageline_buf
  1313.         ret z
  1314.         ld de,BDOS_scrollpageline_bufwindow
  1315.         ret
  1316.  
  1317. BDOS_scroll_prepare
  1318.         BDOSSETPGSSCR
  1319.         ld a,l
  1320.         srl a
  1321.         ld (BDOS_scrollwindowlinelayer_wid),a
  1322.        if TEXTMODE
  1323.         ld b,h ;hgt
  1324.         dec b
  1325.         ld a,d ;y
  1326.         sub -0x87&0xff ;0xe1c0*4=0x8700
  1327.         rra
  1328.         ld h,a
  1329.          ld a,0;16
  1330.         rra
  1331.         sra h
  1332.         rra
  1333.         ld l,e ;x
  1334.         srl l
  1335.         jr c,$+4
  1336.         res 5,h
  1337.         add a,l
  1338.         ld l,a
  1339.         ret
  1340.        else
  1341.         ld a,h ;hgt
  1342.         dec a
  1343.         ld b,a
  1344.         add a,a
  1345.         add a,b
  1346.         add a,a ;hgt*6 (CHRHGT=6)
  1347.         ld b,a
  1348. xytoscr
  1349.         ld a,e ;x
  1350.         call ytoscr
  1351.         rra
  1352.         jr nc,$+4
  1353.         set 5,h
  1354.         add a,l
  1355.         ld l,a
  1356.         ret nc;jr nc,$+3
  1357.         inc h
  1358.         ret
  1359. ytoscr
  1360.         ld l,d ;y
  1361.         ld h,0
  1362.         ld d,h
  1363.         ld e,l
  1364.         add hl,hl
  1365.         add hl,hl
  1366.         add hl,de ;y*5
  1367.         add hl,hl
  1368.         add hl,hl
  1369.         add hl,hl ;y*40
  1370.         ld d,h
  1371.         ld e,l
  1372.         add hl,hl
  1373.         add hl,de
  1374.         add hl,hl ;y*40*6 (CHRHGT=6)
  1375.         set 7,h
  1376.         set 6,h
  1377.         ret
  1378.        endif
  1379.  
  1380. BDOS_scrollpageline_bufwindow
  1381.        if TEXTMODE
  1382.         or a
  1383.        endif
  1384.         call BDOS_scrollpageline_bufwindowlayers ;text
  1385.         res 6,l ;attr
  1386.         res 6,e ;attr
  1387.        if TEXTMODE
  1388.         scf
  1389.        endif
  1390.         call BDOS_scrollpageline_bufwindowlayers ;attr
  1391.         set 6,l ;text
  1392.         ret
  1393. BDOS_scrollpageline_bufwindowlayers
  1394.         push af
  1395.         push de
  1396.         push hl
  1397.         set 7,l
  1398.         set 7,e
  1399.        if TEXTMODE
  1400.         or a
  1401.        endif
  1402.         call BDOS_scrollpageline_bufwindowlayer
  1403.         pop hl
  1404.         pop de
  1405.         pop af
  1406. BDOS_scrollpageline_bufwindowlayer
  1407.         push de
  1408.         push hl
  1409.        if TEXTMODE
  1410.         jr nc,$+4
  1411.         inc hl
  1412.         inc de
  1413.        endif
  1414. BDOS_scrollpagelinelayer_wid=$+1
  1415.         ld bc,39;40
  1416.         ldir
  1417.         pop hl
  1418.         pop de
  1419.         ret
  1420.  
  1421. BDOS_scrollpageline_buf
  1422.         dup 39
  1423.         ldi
  1424.         edup
  1425.         ld a,(hl)
  1426.         ld (de),a
  1427.         set 7,l
  1428.         set 7,e        
  1429.         dup 39
  1430.         ldd
  1431.         edup
  1432.         ld a,(hl)
  1433.         ld (de),a
  1434.  
  1435.         res 6,l ;attr
  1436.         res 6,e ;attr
  1437.        
  1438.         dup 39
  1439.         ldi
  1440.         edup
  1441.         ld a,(hl)
  1442.         ld (de),a
  1443.         res 7,l
  1444.         res 7,e
  1445.         inc l
  1446.         inc e
  1447.         dup 39
  1448.         ldd
  1449.         edup
  1450.         ld a,(hl)
  1451.         ld (de),a
  1452.  
  1453.         ld l,0x40 ;text
  1454.         ret
  1455.  
  1456. BDOS_scrollpage ;for lf_q
  1457. ;156046t [195810t ldir]
  1458.         BDOSSETPGSSCR
  1459.        if TEXTMODE
  1460.         ld hl,SCRBASE
  1461.         ld b,HTMLHGT-1;24
  1462.        else
  1463.         ld hl,SCRBASE+CHRLINESTEP
  1464.         ld de,SCRBASE
  1465.         ld b,CHRHGT*(HTMLHGT-1)
  1466.        endif
  1467. BDOS_scrollpage0
  1468.         push bc
  1469.        if TEXTMODE
  1470.         ld d,h
  1471.         ld e,l
  1472.         ld bc,LINESTEP
  1473.         add hl,bc
  1474.         call BDOS_scrollpageline
  1475.        else
  1476.         call BDOS_scrollpageline
  1477.         ld bc,LINESTEP
  1478.         add hl,bc
  1479.         ex de,hl
  1480.         add hl,bc
  1481.         ex de,hl
  1482.        endif
  1483.         pop bc
  1484.         djnz BDOS_scrollpage0
  1485.         ret
  1486. BDOS_scrollpageline
  1487.         dup 39
  1488.         ldi
  1489.         edup
  1490.         ld a,(hl)
  1491.         ld (de),a
  1492.         set 5,h
  1493.         set 5,d
  1494.         dup 39
  1495.         ldd
  1496.         edup
  1497.         ld a,(hl)
  1498.         ld (de),a
  1499.        
  1500.         res 6,h ;attr
  1501.         res 6,d ;attr
  1502.        
  1503.         dup 39
  1504.         ldi
  1505.         edup
  1506.         ld a,(hl)
  1507.         ld (de),a
  1508.         res 5,h
  1509.         res 5,d
  1510.        if TEXTMODE
  1511.         inc l
  1512.         inc e
  1513.        endif
  1514.         dup 39
  1515.         ldd
  1516.         edup
  1517.         ld a,(hl)
  1518.         ld (de),a
  1519.        if TEXTMODE
  1520.         dec l
  1521.         dec e
  1522.        endif
  1523.         set 6,h
  1524.         set 6,d
  1525.         ret
  1526.  
  1527. BDOS_scrollwindow
  1528. ;a=hgt-scrollstep
  1529. ;bc=linestep
  1530. ;TEXTMODE: hl=top
  1531. ;!TEXTMODE: hl=topfrom, de=topto
  1532. BDOS_scrollwindow0
  1533.        if TEXTMODE
  1534.         ld d,h
  1535.         ld e,l
  1536.         add hl,bc
  1537.        endif
  1538.         push bc
  1539.         call BDOS_scrollwindowline
  1540.         pop bc
  1541.        if !TEXTMODE
  1542.         add hl,bc
  1543.         ex de,hl
  1544.         add hl,bc
  1545.         ex de,hl
  1546.        endif
  1547.         dec a
  1548.         jr nz,BDOS_scrollwindow0
  1549.         ret
  1550.  
  1551. BDOS_scrollwindowline
  1552.        if TEXTMODE
  1553.         or a
  1554.        endif
  1555.         call BDOS_scrollwindowlinelayers ;text
  1556.        if TEXTMODE
  1557.         scf
  1558.        endif
  1559.         res 6,h ;attr
  1560.         res 6,d ;attr
  1561.         call BDOS_scrollwindowlinelayers
  1562.         set 6,h ;text
  1563.         set 6,d ;text
  1564.         ret
  1565. BDOS_scrollwindowlinelayers
  1566.        if TEXTMODE
  1567.         push af
  1568.        endif
  1569.         push de
  1570.         push hl
  1571.         set 5,h
  1572.         set 5,d
  1573.        if TEXTMODE
  1574.         or a
  1575.        endif
  1576.         call BDOS_scrollwindowlinelayer
  1577.         pop hl
  1578.         pop de
  1579.        if TEXTMODE
  1580.         pop af
  1581.        endif
  1582. BDOS_scrollwindowlinelayer
  1583.         push de
  1584.         push hl
  1585.        if TEXTMODE
  1586.         jr nc,$+4
  1587.         inc hl
  1588.         inc de
  1589.        endif
  1590. BDOS_scrollwindowlinelayer_wid=$+1
  1591.         ld bc,39;40
  1592.         ldir
  1593.         pop hl
  1594.         pop de
  1595.         ret
  1596.  
  1597. term_setcolorpp
  1598.         cp 8
  1599.         jr z,term_setinvisible
  1600.         ret c
  1601.         cp 28
  1602.         jr z,term_setvisible
  1603.         cp 90
  1604.         jr c,term_nosetbrightink
  1605.         sub 90-64 ;ink + bright
  1606.         xor e
  1607.         and 0x47
  1608.         xor e
  1609.         ld e,a
  1610.         ret
  1611. term_nosetbrightink
  1612.         cp 40
  1613.         jr c,term_nosetpaper
  1614.         sub 40 ;paper
  1615.         add a,a
  1616.         add a,a
  1617.         add a,a
  1618.         xor e
  1619.         and 0x38
  1620.         xor e
  1621.         ld e,a
  1622.         ret
  1623. term_nosetpaper
  1624.         sub 30 ;ink
  1625.         xor e
  1626.         and 0x47
  1627.         xor e
  1628.         ld e,a
  1629.         ret
  1630. term_setvisible
  1631.         ld a,FINVISIBLE_OFF
  1632.         ld (finvisible),a
  1633.         xor a
  1634.         ld (finvisible2),a
  1635.         ret
  1636. term_setinvisible
  1637.         ld a,FINVISIBLE_ON
  1638.         ld (finvisible),a
  1639.         ld a,0x5e ;"ld e,(hl)"
  1640.         ld (finvisible2),a
  1641.         ret
  1642.  
  1643. mousemove
  1644. ;de=mouse delta
  1645. ;чтобы двигать не резко, надо отдельно хранить младшие части x,y (не отображаемые на экране)
  1646.         ld hl,(mousexy)
  1647. htmlcursorxylow=$+1
  1648.         ld bc,0 ;bits 7..5 (for Y) 7..6 (for X), others=0
  1649.         sla b
  1650.         rl h
  1651.         sla b
  1652.         rl h
  1653.        if MOUSEFACTOR == 8
  1654.         sla b
  1655.         rl h
  1656.        endif
  1657.         ld a,h
  1658.         add a,d
  1659.         bit 7,d
  1660.         jr z,html_mousemove_yplus
  1661.         jr nc,html_mousemove_yminus_overflow
  1662.         cp HTMLTOPY*MOUSEFACTOR
  1663.         jr nc,html_mousemove_yq
  1664. html_mousemove_yminus_overflow
  1665.         ld a,HTMLTOPY*MOUSEFACTOR
  1666.         jr html_mousemove_yq
  1667. html_mousemove_yplus
  1668.         jr c,html_mousemove_yplus_overflow
  1669.         cp MOUSEFACTOR*(HTMLTOPY+HTMLHGT-1)
  1670.         jr c,html_mousemove_yq
  1671. html_mousemove_yplus_overflow
  1672.         ld a,MOUSEFACTOR*(HTMLTOPY+HTMLHGT-1)
  1673. html_mousemove_yq  
  1674.         srl a
  1675.         rr b
  1676.         rra
  1677.         rr b
  1678.        if MOUSEFACTOR == 8
  1679.         rra
  1680.         rr b
  1681.        endif
  1682.         ld (mousexy+1),a
  1683.  
  1684.         ld h,0
  1685.         sla c
  1686.         rl l
  1687.         sla c
  1688.         adc hl,hl
  1689.         ld a,e
  1690.         rla
  1691.         sbc a,a
  1692.         ld d,a
  1693.         add hl,de
  1694.         bit 7,e
  1695.         jr z,html_mousemove_xplus
  1696.         jr c,html_mousemove_xq
  1697.         ld hl,0 ;ld a,HTMLTOPY*MOUSEFACTOR
  1698.         jr html_mousemove_xq
  1699. html_mousemove_xplus
  1700.         ld de,MOUSEFACTORX*(80-1)
  1701.         jr c,html_mousemove_xplus_overflow
  1702.         ;or a
  1703.         sbc hl,de
  1704.         add hl,de
  1705.         jr c,html_mousemove_xq
  1706. html_mousemove_xplus_overflow
  1707.         ex de,hl
  1708. html_mousemove_xq
  1709.         ld a,l
  1710.         rr h
  1711.         rra
  1712.         rr c
  1713.         rra
  1714.         rr c
  1715.         ld (mousexy),a
  1716.  
  1717.         ld (htmlcursorxylow),bc
  1718.         ret
  1719.  
  1720. BDOS_countattraddr_mousecursor
  1721. ;de=yx
  1722.         ;ld a,(user_scr0_low) ;ok
  1723.         ;SETPG8000 ;attr ;TODO убрать? считывать из scrbuf!
  1724.        if TEXTMODE
  1725.         ld a,d ;y
  1726.         sub -0x87&0xff ;0xe1c0*4=0x8700
  1727.         rra
  1728.         ld h,a
  1729.          ld a,0;16
  1730.         rra
  1731.         sra h
  1732.         rra
  1733.         ld l,e ;x
  1734.         srl l
  1735.         jr c,$+4
  1736.         res 5,h
  1737.         add a,l
  1738.         ld l,a
  1739.         ld a,h
  1740.         xor 0x60 ;attr + 0x20
  1741.         ld h,a
  1742.          and 0x20
  1743.         ret nz ;jr nz,$+3
  1744.         inc l
  1745.        else
  1746.         call xytoscr
  1747.         res 6,h ;attr
  1748.        endif
  1749.         ret
  1750.  
  1751. BDOS_countattraddr
  1752.         ld a,(user_scr0_low) ;ok
  1753.         SETPG8000 ;attr ;TODO убрать? считывать из scrbuf!
  1754.         ld hl,(pr_textmode_curaddr)
  1755. ;textaddrtoattraddr
  1756.        if TEXTMODE
  1757.         ld a,h
  1758.         xor 0x60 ;attr + 0x20
  1759.         ld h,a
  1760.          and 0x20
  1761.         ret nz ;jr nz,$+3
  1762.         inc l
  1763.        else
  1764.         res 6,h
  1765.        endif
  1766.         ret
  1767.  
  1768. getscrbuftop_a
  1769.         ld hl,(pr_buf_curtopaddr)
  1770.         ld a,h
  1771. redraw_scroll=$+1
  1772.         sub 0;24
  1773.          cp 0x40
  1774.          ret nc;jr nc,$+4
  1775.          ld a,0x40 ;TODO prevpg
  1776.         ret
  1777.  
  1778. cursor_left
  1779. ;TODO с переходом на предыдущую строку?
  1780.         ld hl,(pr_textmode_curaddr)
  1781.        if TEXTMODE
  1782.         ld a,h
  1783.         xor 0x20 ;attr + 0x20
  1784.         ld h,a
  1785.         and 0x20
  1786.         jr z,cursor_left_nodec
  1787.         ld a,l
  1788.         and 0x3f
  1789.         jr z,cursor_left_nodec ;остаёмся в начале строки
  1790.         dec l
  1791. cursor_left_nodec
  1792.        else
  1793.         bit 5,h
  1794.         res 5,h
  1795.         jr nz,cursor_left_nodec
  1796.         set 5,h
  1797.         dec hl
  1798.         ld de,(pr_curlineaddr)
  1799.         or a
  1800.         sbc hl,de
  1801.         jr nc,$+3
  1802.         ex de,hl ;остаёмся в начале строки
  1803. cursor_left_nodec
  1804.        endif
  1805.         ld (pr_textmode_curaddr),hl
  1806.         ld hl,(pr_buf_curaddr)
  1807.         ld a,l
  1808.         sub 0x40
  1809.         sub 0x40
  1810.         sbc a,0
  1811.         ld l,a
  1812.         ld (pr_buf_curaddr),hl
  1813.         ret
  1814.  
  1815. cursor_right
  1816.         ld a,WRITED1_OFF
  1817.         ld (writed1),a
  1818.         ld a,WRITEE1_OFF
  1819.         ld (writee1),a
  1820.         xor a
  1821.         ld (writed2),a
  1822.         ld (writee2),a
  1823.         push bc
  1824.         ld a,(term_prfsm_curnumber)
  1825.         sub 1
  1826.         adc a,1 ;0->1
  1827.         ld b,a
  1828. cursor_right0
  1829.         ld a,' '
  1830.         call BDOS_prchar_a_nocrlf
  1831.         djnz cursor_right0
  1832.         pop bc
  1833.         ld a,WRITED1_ON
  1834.         ld (writed1),a
  1835.         ld a,WRITEE1_ON
  1836.         ld (writee1),a
  1837.         ld a,0x72 ;"ld (hl),d"
  1838.         ld (writed2),a
  1839.         ld a,0x73 ;"ld (hl),e"
  1840.         ld (writee2),a
  1841.         ret
  1842.  
  1843. BDOS_setx
  1844. ;e=x
  1845.         ld a,e
  1846.         or 0x80
  1847.         rrca ;(x/2)+0x40 или 0xc0
  1848.         ld (pr_buf_curaddr),a
  1849.        if TEXTMODE
  1850.         ld hl,(pr_textmode_curaddr)
  1851.         ld a,e ;x
  1852.         rra
  1853.         set 5,h
  1854.         jr c,$+4
  1855.         res 5,h
  1856.         xor l
  1857.         and 0x3f
  1858.         xor l
  1859.         ld l,a
  1860.         jr BDOS_settextcuraddr
  1861.        else
  1862.         ld hl,(pr_curlineaddr)
  1863.         ld a,e ;x
  1864.         jr BDOS_setxy_setx
  1865.        endif
  1866.  
  1867. BDOS_setxy
  1868. ;de=yx
  1869.          call getscrbuftop_a
  1870.          add a,d ;0..24
  1871.          ld h,a
  1872.          ld a,e
  1873.          or 0x80
  1874.          rrca ;(x/2)+0x40 или 0xc0
  1875.          ld l,a
  1876.          ld (pr_buf_curaddr),hl
  1877.        if TEXTMODE
  1878.         ld a,d ;y
  1879.         sub -0x87&0xff ;0xe1c0*4=0x8700
  1880.         rra
  1881.         ld h,a
  1882.          ld a,0;16
  1883.         rra
  1884.         sra h
  1885.         rra
  1886.         ld l,e ;x
  1887.         srl l
  1888.         jr c,$+4
  1889.         res 5,h
  1890.         add a,l
  1891.         ld l,a
  1892.        else
  1893.         ld a,e
  1894.         call ytoscr
  1895.         ld (pr_curlineaddr),hl
  1896. BDOS_setxy_setx
  1897.         srl a ;rra
  1898.         jr nc,$+4
  1899.         set 5,h
  1900.         add a,l
  1901.         ld l,a
  1902.         jr nc,$+3
  1903.         inc h
  1904.        endif
  1905. BDOS_settextcuraddr
  1906.         ld (pr_textmode_curaddr),hl
  1907.         ret
  1908.  
  1909. BDOS_prchar_tab
  1910.         ld a,' '
  1911.         call BDOS_prchar_a_nocrlf
  1912.         ld hl,(pr_textmode_curaddr)
  1913.         bit 5,h
  1914.         jr nz,BDOS_prchar_tab
  1915.         ld a,l
  1916.         and 3 ;tab = 8 chrs = 4 pairs
  1917.         jr nz,BDOS_prchar_tab
  1918.         ret
  1919.  
  1920. BDOS_prchar_controlcode
  1921.          ld hl,(pr_textmode_curaddr)
  1922.         cp 0x09
  1923.         ;jr z,BDOS_prchar_tab
  1924.         cp 0x0a
  1925.         jr z,BDOS_prchar_lf
  1926.         cp 0x0d
  1927.         jp nz,BDOS_prchar_nocontrolcode
  1928. BDOS_prchar_cr
  1929.          ld a,0x40
  1930.          ld (pr_buf_curaddr),a ;x=0
  1931.        if TEXTMODE
  1932.         ld a,l
  1933.         and 0xc0
  1934.         ld l,a
  1935.         res 5,h
  1936.        else
  1937. pr_curlineaddr=$+1
  1938.         ld hl,SCRBASE
  1939.        endif
  1940.         jr BDOS_settextcuraddr
  1941.        
  1942. buftopaddr_down
  1943. pr_buf_curtopaddr=$+1
  1944.         ld hl,0x4040
  1945.         inc h
  1946.         ld (pr_buf_curtopaddr),hl
  1947.         ret
  1948.        
  1949. BDOS_prchar_lf
  1950.         push hl
  1951.         ld hl,(pr_buf_curaddr)
  1952.         inc h
  1953.         call m,scrollscrbuf
  1954.         ld (pr_buf_curaddr),hl
  1955.         ;call buftopaddr_down
  1956.         pop hl
  1957.        if TEXTMODE
  1958.         ld a,l
  1959.         add a,CHRLINESTEP;0x40
  1960.         ld l,a
  1961.         jr nc,BDOS_settextcuraddr
  1962.         jp BDOS_prchar_lf_inchq
  1963.        else
  1964.         ld de,CHRLINESTEP;40*CHRHGT
  1965.         add hl,de
  1966.         push hl
  1967.         ld hl,(pr_curlineaddr)
  1968.         add hl,de
  1969.         ld (pr_curlineaddr),hl
  1970.         ld de,SCRBASE+(HTMLHGT*CHRLINESTEP)
  1971.         sbc hl,de
  1972.         pop hl
  1973.         jr c,BDOS_settextcuraddr
  1974.         jp BDOS_prchar_lf_q
  1975.        endif
  1976.  
  1977. cursor_down
  1978.         ld a,0x0a ;lf
  1979. BDOS_prchar_a
  1980. ;keeps bc!
  1981.         cp 0x0e
  1982.         jr c,BDOS_prchar_controlcode
  1983. BDOS_prchar_a_nocrlf
  1984. pr_textmode_curaddr=$+1
  1985.         ld hl,SCRBASE
  1986.        if TEXTMODE
  1987.         ld d,trecode/256
  1988.         ld e,a
  1989.         ld a,(de)
  1990.        endif
  1991. BDOS_prchar_nocontrolcode
  1992.         ld e,a
  1993.        if TEXTMODE
  1994. FINVISIBLE_OFF=0
  1995. FINVISIBLE_ON=0x5e ;"ld e,(hl)"
  1996. WRITEE1_ON=0x73 ;"ld (hl),e"
  1997. WRITEE1_OFF=0
  1998. finvisible=$
  1999.         nop ;/ld e,(hl)
  2000. writee1=$ ;patch для cursorright
  2001.         ld (hl),e
  2002.        else
  2003.         push bc
  2004.         ld bc,40
  2005.         or a
  2006. WRITEE1_ON=0x38 ;"jr c"
  2007. WRITEE1_OFF=0x30 ;"jr nc"
  2008. writee1=$ ;patch для cursorright
  2009.         jr c,prchar_skip_e
  2010. FINVISIBLE_OFF=0x38 ;"jr c"
  2011. FINVISIBLE_ON=0x30 ;"jr nc"
  2012. finvisible=$
  2013.         jr c,prchar_skip_e
  2014. ;prchar_skip_e_base=$
  2015.         push hl
  2016.         ld d,fnt/256
  2017.        dup CHRHGT-1
  2018.         ld a,(de)
  2019.         ld (hl),a
  2020.         inc d
  2021.         add hl,bc
  2022.        edup
  2023.         ld a,(de)
  2024.         ld (hl),a
  2025.         pop hl
  2026. prchar_skip_e
  2027. ;FINVISIBLE_OFF=0 ;no skip
  2028. ;FINVISIBLE_ON=prchar_skip_e-prchar_skip_e_base
  2029.        endif
  2030.  
  2031. pr_textmode_curcolor=$+1
  2032.         ld d,7
  2033.        if TEXTMODE
  2034.         ld a,h
  2035.         xor 0x60 ;attr + 0x20
  2036.         ld h,a
  2037.         and 0x20
  2038.         jr nz,$+3
  2039.         inc l
  2040.        else
  2041.         res 6,h
  2042.        endif
  2043.        if TEXTMODE
  2044. WRITED1_ON=0x72 ;"ld (hl),d"
  2045. WRITED1_OFF=0
  2046. writed1=$ ;patch для cursorright
  2047.         ld (hl),d
  2048.        else
  2049. WRITED1_ON=0x38 ;"jr c"
  2050. WRITED1_OFF=0x30 ;"jr nc"
  2051. writed1=$ ;patch для cursorright
  2052.         jr c,prchar_skip_d
  2053. ;prchar_skip_d_base=$
  2054.         push hl
  2055.        dup CHRHGT-1
  2056.         ld (hl),d
  2057.         add hl,bc
  2058.        edup
  2059.         ld (hl),d
  2060.         pop hl
  2061. prchar_skip_d
  2062. ;WRITED1_ON=0 ;no skip
  2063. ;WRITED1_OFF=prchar_skip_d-prchar_skip_d_base
  2064.         pop bc
  2065.        endif
  2066.  
  2067.        if TEXTMODE
  2068.         set 6,h
  2069.         ld (pr_textmode_curaddr),hl
  2070.        else
  2071.         set 6,h
  2072.         bit 5,h
  2073.         set 5,h
  2074.         jr z,pr_nextaddr_ok
  2075.         res 5,h
  2076.         inc hl
  2077. pr_nextaddr_ok
  2078.         ld (pr_textmode_curaddr),hl
  2079.        endif
  2080.  
  2081. ;scrbuf состоит из строк длиной 256 байт
  2082. ;каждая из них из 4 слоёв:
  2083. ;+0x40: аналог +0x4000 (text0)
  2084. ;+0x80: аналог +0x2000 (attr0)
  2085. ;+0xc0: аналог +0x6000 (text1)
  2086. ;+0x01: аналог +0x0001 (attr1)
  2087.  
  2088. pr_buf_curaddr=$+1
  2089.         ld hl,0x4000+0x40 ;text0
  2090. finvisible2=$
  2091.         nop ;/ld e,(hl)
  2092. writee2=$
  2093.          ld (hl),e
  2094.         ld a,l
  2095.         add a,0x40 ;attr
  2096.         adc a,0
  2097.         ld l,a
  2098. writed2=$
  2099.          ld (hl),d
  2100.         add a,0x40 ;text (next)
  2101.         ld l,a
  2102.         ld (pr_buf_curaddr),hl
  2103.  
  2104.         cp 0x40+(80/2)
  2105.         ret nz ;нет переноса строки
  2106.         ld l,0x40
  2107.         inc h
  2108.         call m,scrollscrbuf
  2109.         ld (pr_buf_curaddr),hl
  2110.         ;call buftopaddr_down
  2111.  
  2112. ;new line
  2113.        if TEXTMODE
  2114.         ld hl,(pr_textmode_curaddr)
  2115.         ld a,l
  2116.         and 0xc0
  2117.         add a,CHRLINESTEP;0x40
  2118.         ld l,a
  2119.         jp nc,BDOS_settextcuraddr
  2120. BDOS_prchar_lf_inchq
  2121.         inc h
  2122.         bit 3,h
  2123.         jp z,BDOS_settextcuraddr ;нет выхода за последнюю строку
  2124.        else
  2125.         ld hl,(pr_curlineaddr)
  2126.         ld de,CHRLINESTEP
  2127.         add hl,de
  2128.         ld (pr_curlineaddr),hl
  2129.         ;or a
  2130.         ld de,SCRBASE+(HTMLHGT*CHRLINESTEP)
  2131.         sbc hl,de
  2132.         add hl,de
  2133.         jp c,BDOS_settextcuraddr
  2134. ;hl=адрес начала следующей строки, но экран кончился, поэтому считаем на строку выше
  2135. BDOS_prchar_lf_q
  2136.        endif
  2137. ;hl=адрес внутри следующей строки, но экран кончился, поэтому считаем на строку выше
  2138.         ld de,-CHRLINESTEP
  2139.         add hl,de
  2140.         ld (pr_textmode_curaddr),hl
  2141.        if !TEXTMODE
  2142.         ld hl,(pr_curlineaddr)
  2143.         add hl,de
  2144.         ld (pr_curlineaddr),hl
  2145.        endif
  2146. BDOS_scrolllock0
  2147.         ld a,0xfe
  2148.         in a,(0xfe)
  2149.         rra ;Caps Shift
  2150.         jr nc,BDOS_scrolllock0
  2151. ;scroll+clear bottom line
  2152.        push bc
  2153.         call buftopaddr_down
  2154.         call BDOS_scrollpage
  2155.        if TEXTMODE
  2156. _lastlineshift=0x07c0
  2157.        else
  2158. _lastlineshift=(HTMLHGT-1)*CHRHGT*40
  2159.        endif
  2160.         xor a
  2161.         ld hl,0xc000+_lastlineshift
  2162.         call BDOS_cllastline_layer
  2163.         ld hl,0xe000+_lastlineshift
  2164.         call BDOS_cllastline_layer
  2165.         ld a,COLOR
  2166.         ld hl,0x8000+_lastlineshift
  2167.         call BDOS_cllastline_layer
  2168.         ld hl,0xa000+_lastlineshift
  2169.         call BDOS_cllastline_layer
  2170.        pop bc
  2171.         ret
  2172.        
  2173. scrollscrbuf
  2174. ;TODO reserve page
  2175. ;TODO unreserve very old page
  2176.        push bc
  2177.         dec h
  2178.         push hl
  2179.         ld de,0x4000 ;0x4040 ;text ;TODO scroll attr
  2180.         ld hx,0x3f*4;*2
  2181. scrollscrbuf0
  2182.         ld h,d
  2183.         ld l,e
  2184.         inc h
  2185.         dup 40
  2186.         ldi
  2187.         edup
  2188.         ld a,(hl)
  2189.         ld (de),a
  2190.         ld bc,64-40;128-40
  2191.         add hl,bc
  2192.         ex de,hl
  2193.         add hl,bc
  2194.         ex de,hl
  2195.         dec hx
  2196.         jp nz,scrollscrbuf0
  2197.         xor a
  2198.         ld hl,0x7f40 ;text
  2199.         call BDOS_scrollpage_cllinelayer
  2200.         ld hl,0x7fc0 ;text
  2201.         call BDOS_scrollpage_cllinelayer
  2202.         ld a,COLOR
  2203.         ld hl,0x7f01 ;attr
  2204.         call BDOS_scrollpage_cllinelayer
  2205.         ld hl,0x7f80 ;attr
  2206.         call BDOS_scrollpage_cllinelayer
  2207.         ld hl,pr_buf_curtopaddr+1
  2208.         dec (hl) ;compensate shift
  2209.         pop hl
  2210.        pop bc
  2211.         ret
  2212.  
  2213. BDOS_cllastline_layer
  2214.        if !TEXTMODE
  2215.         ld bc,40*CHRHGT-1
  2216.         jr BDOS_scrollpage_cllinelayer_bc
  2217.        endif
  2218. BDOS_scrollpage_cllinelayer ;for buf
  2219.         ld bc,41-1
  2220. BDOS_scrollpage_cllinelayer_bc
  2221.         ld d,h
  2222.         ld e,l
  2223.         inc e
  2224.         ld (hl),a
  2225.         ldir ;clear bottom line
  2226.         ret
  2227.  
  2228. BDOS_cls
  2229. ;e=color byte
  2230.         ld a,(pgscrbuf)
  2231.         SETPG4000
  2232.         ld hl,0x4000
  2233.         ld de,0x4001
  2234.         ld bc,0x0040
  2235.         ld (hl),COLOR
  2236.         ldir
  2237.         ld c,0x40
  2238.         ld (hl),b;0
  2239.         ldir
  2240.         ld c,0x40
  2241.         ld (hl),COLOR
  2242.         ldir
  2243.         ld c,0x40
  2244.         ld (hl),b;0
  2245.         ldir        
  2246.         dec h;ld hl,0x4000
  2247.         ld de,0x4100
  2248.         ld b,0x3f
  2249.         ldir
  2250. ;TODO reset current number of lines in buf
  2251.  
  2252.         BDOSSETPGSSCR
  2253.  
  2254. clspp
  2255. ;textmode (6)
  2256.         ld a,e
  2257.          ld hl,0x8000
  2258.          call cls_halfpg
  2259.          ld hl,0xa000
  2260.          call cls_halfpg
  2261.  
  2262.         xor a
  2263.          ld hl,0xc000
  2264.          call cls_halfpg
  2265.          ld hl,0xe000
  2266. cls_halfpg
  2267.        if TEXTMODE
  2268.          ld bc,0x1aff
  2269.        else
  2270.          ld bc,8000-1
  2271.        endif
  2272.         ld d,h
  2273.         ld e,l
  2274.         inc de
  2275.         ld (hl),a
  2276.         ldir
  2277.         ret
  2278.  
  2279.  
  2280. readapp
  2281.         ld a,b
  2282.         ld (curhandle),a
  2283.        
  2284.         OS_NEWAPP ;для первой создаваемой задачи будут созданы первые два пайпа и подключены
  2285. ;dehl=номера страниц в 0000,4000,8000,c000 нового приложения, b=id, a=error
  2286.         push bc ;b=id
  2287.  
  2288.         ld a,d
  2289.         SETPGC000
  2290.         push de
  2291.         push hl
  2292.         ld hl,COMMANDLINE ;command line
  2293.         call skipword
  2294.         call skipspaces ;пропустили первое слово (там было term.com, а дальше, например, cmd.com autoexec.bat)
  2295.         ld de,0xc080
  2296.         ld bc,128  
  2297.         ldir ;command line
  2298.         pop hl
  2299.         pop de
  2300.  
  2301.         call readfile_pages_dehl
  2302.  
  2303.         ld a,(curhandle)
  2304.         ld b,a
  2305.         OS_CLOSEHANDLE
  2306.  
  2307.         pop af ;id
  2308.         ret
  2309.  
  2310. readfile_pages_dehl
  2311.         ld a,d
  2312.         SETPGC000
  2313.         ld a,0xc100/256
  2314.         call cmd_loadpage
  2315.         ret nz
  2316.         ld a,e
  2317.         call cmd_loadfullpage
  2318.         ret nz
  2319.         ld a,h
  2320.         call cmd_loadfullpage
  2321.         ret nz
  2322.         ld a,l
  2323. cmd_loadfullpage
  2324.         SETPGC000
  2325.         ld a,0xc000/256
  2326. cmd_loadpage
  2327. ;out: a=error
  2328. ;keeps hl,de
  2329.         push de
  2330.         push hl
  2331.         ld d,a
  2332.         xor a
  2333.         ld l,a
  2334.         ld e,a
  2335.         sub d
  2336.         ld h,a ;de=buffer, hl=size
  2337. curhandle=$+1
  2338.         ld b,0
  2339.         OS_READHANDLE
  2340.         pop hl
  2341.         pop de
  2342.         or a
  2343.         ret
  2344.  
  2345. skipword
  2346. ;hl=string
  2347. ;out: hl=terminator/space addr
  2348. skipword0
  2349.         ld a,(hl)
  2350.         or a
  2351.         ret z
  2352.         sub ' '
  2353.         ret z
  2354.         inc hl ;ldi
  2355.         jr skipword0
  2356.  
  2357. skipspaces
  2358. ;hl=string
  2359. ;out: hl=after last space
  2360.         ld a,(hl)
  2361.         cp ' '
  2362.         ret nz
  2363.         inc hl
  2364.         jr skipspaces
  2365.  
  2366. ansipal
  2367.         ;dw 0xffff,0xfefe,0xfdfd,0xfcfc,0xefef,0xeeee,0xeded,0xecec
  2368.         ;dw 0x1f1f,0x1e1e,0x1d1d,0x1c1c,0x0f0f,0x0e0e,0x0d0d,0x0c0c
  2369.         dw 0xffff,0xfdfd,0xefef,0xeded,0xfefe,0xfcfc,0xeeee,0xecec
  2370.         dw 0x1f1f,0x1d1d,0x0f0f,0x0d0d,0x1e1e,0x1c1c,0x0e0e,0x0c0c
  2371.  
  2372. term_prfsm_curnumber
  2373.          db 0
  2374. term_prfsm_curnumber1
  2375.          db 0
  2376. term_prfsm_curnumber2
  2377.          db 0
  2378. term_prfsm_curnumber3
  2379.          db 0
  2380.  
  2381. cmd_filename
  2382.         db "cmd.com",0
  2383.  
  2384. tpastaname
  2385.         db "pasta.txt",0
  2386.  
  2387. tpipename
  2388.        if TEXTMODE
  2389.         db "z:/a25",0
  2390.        else
  2391.         db "z:/a33",0
  2392.        endif
  2393.  
  2394. killbuf_byte
  2395.         db COLOR;0
  2396.  
  2397. pastabuf    
  2398.         db 0
  2399.  
  2400. readpastabuf
  2401.         ds READPASTABUF_SZ
  2402.  
  2403. stdoutbuf
  2404.         ds 6
  2405.  
  2406. stdinbuf
  2407.         ds STDINBUF_SZ
  2408.  
  2409.         align 256
  2410.        if TEXTMODE
  2411. trecode
  2412.         incbin "../_sdk/codepage/866toatm"
  2413. trecodeback
  2414.         ds 256
  2415.        else
  2416. fnt
  2417.         incbin "1125ver6.fnt"
  2418.        endif
  2419.        
  2420. end
  2421.        if TEXTMODE
  2422.         savebin "term.com",begin,end-begin
  2423.        else
  2424.         savebin "term33.com",begin,end-begin
  2425.        endif
  2426.  
  2427.         LABELSLIST "..\..\us\user.l"
  2428.