?login_element?

Subversion Repositories NedoOS

Rev

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

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