Subversion Repositories NedoOS

Rev

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

  1. STRINGBUFSZ=512;256
  2.  
  3. ;for text
  4. stringbuf1header
  5. TEXT_BASE
  6. TEXT_NEXT=$-TEXT_BASE
  7.         ds 3 ;next
  8. TEXT_PREV=$-TEXT_BASE
  9.         ds 3 ;prev
  10. TEXT_Y=$-TEXT_BASE
  11.         ds 2 ;y
  12. TEXT_X=$-TEXT_BASE
  13.         ds 1 ;x
  14. TEXT_TEXT=$-TEXT_BASE
  15. stringbuf1
  16.         ds STRINGBUFSZ
  17.  
  18. firstpointer
  19.         dw 0
  20. firstpointerHSB
  21.         db 0
  22.        
  23. ;for href
  24. stringbuf2header
  25. HREF_BASE
  26. HREF_NEXT=$-HREF_BASE
  27.         ds 3 ;next
  28. HREF_PREV=$-HREF_BASE
  29.         ds 3 ;prev
  30. HREF_Y=$-HREF_BASE
  31.         ds 2 ;y
  32. HREF_X=$-HREF_BASE
  33.         ds 1 ;x
  34. HREF_ENDY=$-HREF_BASE
  35.         ds 2 ;endy (TODO ёыюцэє■ ухюьхЄЁш■ ёё√ыюъ ЁрчсштрЄ№ эр ўрёЄш ё юс∙шь яюыхь ёё√ыюъ, эю Ёрчэ√ьш яюы ьш ухюьхЄЁшш)
  36. HREF_ENDX=$-HREF_BASE
  37.         ds 1 ;endx (TODO ёыюцэє■ ухюьхЄЁш■ ёё√ыюъ ЁрчсштрЄ№ эр ўрёЄш ё юс∙шь яюыхь ёё√ыюъ, эю Ёрчэ√ьш яюы ьш ухюьхЄЁшш)
  38. HREF_VISITED=$-HREF_BASE
  39.         ds 1 ;visited
  40. HREF_TEXT=$-HREF_BASE
  41. stringbuf2
  42.         ds STRINGBUFSZ
  43.  
  44. first2pointer
  45.         dw 0
  46. first2pointerHSB
  47.         db 0
  48.  
  49. ;ёыхфшЄ№ чр яхЁхяюыэхэшхь STRINGBUFSZ!
  50. printtostringbuf1
  51. curstringbuf1addr=$+1
  52.         ld hl,stringbuf1
  53.          push de
  54.          ld de,stringbuf1+STRINGBUFSZ
  55.          or a
  56.          sbc hl,de
  57.          add hl,de
  58.          pop de
  59.          ret nc
  60.         ld (hl),a
  61.         inc hl
  62.         ld (curstringbuf1addr),hl
  63.         ret
  64.        
  65. ;ёыхфшЄ№ чр яхЁхяюыэхэшхь STRINGBUFSZ!
  66. printtostringbuf2
  67. curstringbuf2addr=$+1
  68.         ld hl,stringbuf2
  69.          push de
  70.          ld de,stringbuf2+STRINGBUFSZ
  71.          or a
  72.          sbc hl,de
  73.          add hl,de
  74.          pop de
  75.          ret nc
  76.         ld (hl),a
  77.         inc hl
  78.         ld (curstringbuf2addr),hl
  79.         ret
  80.  
  81. linklastpointer_next_ahl_setlastpointer
  82. ;if (not isnull(lastpointer)) lastpointer->next=addr else firstpointer=addr
  83. ;lastpointer = addr
  84.         push af
  85.         push hl
  86.         ex af,af'
  87.        ld b,h
  88.        ld c,l
  89.        ld hl,(lastpointer)
  90.        ld a,(lastpointerHSB)
  91.        call isnull
  92.        jr z,linklastpointer_lastnull
  93.        call writeword ;bc
  94.        ex af,af'
  95.          ;cp 0xff
  96.          ;jr z,$
  97.         ld c,a
  98.         ex af,af'
  99.        call writebyte ;c
  100.        jr linklastpointer_lastnullq
  101. linklastpointer_lastnull
  102.        ex af,af'
  103.         ld (firstpointer),bc
  104.         ld (firstpointerHSB),a
  105. linklastpointer_lastnullq
  106.         pop hl
  107.         pop af
  108.         ld (lastpointer),hl
  109.         ld (lastpointerHSB),a
  110.         ret
  111.  
  112. linklast2pointer_next_ahl_setlast2pointer
  113. ;if (not isnull(last2pointer)) last2pointer->next=addr else first2pointer=addr
  114. ;last2pointer = addr
  115.         push af
  116.         push hl
  117.         ex af,af'
  118.        ld b,h
  119.        ld c,l
  120.        ld hl,(last2pointer)
  121.        ld a,(last2pointerHSB)
  122.        call isnull
  123.        jr z,linklast2pointer_lastnull
  124.        call writeword ;bc
  125.        ex af,af'
  126.         ld c,a
  127.         ex af,af'
  128.        call writebyte ;c
  129.        jr linklast2pointer_lastnullq
  130. linklast2pointer_lastnull
  131.        ex af,af'
  132.         ld (first2pointer),bc
  133.         ld (first2pointerHSB),a
  134. linklast2pointer_lastnullq
  135.         pop hl
  136.         pop af
  137.         ld (last2pointer),hl
  138.         ld (last2pointerHSB),a
  139.         ret
  140.  
  141. savestringbuf1
  142. ;add terminator
  143. ;find size
  144. ;form header
  145. ;reservemem & put
  146. ;if (not isnull(lastpointer)) link lastpointer->next = addr
  147. ;lastpointer = addr
  148. ;initialize stringbuf1
  149.         ld hl,(curstringbuf1addr)
  150.         xor a
  151.         ld (hl),a
  152.         inc hl
  153.         ld de,stringbuf1header
  154.         ;or a
  155.         sbc hl,de ;hl=size
  156.         ld b,h
  157.         ld c,l
  158.        
  159. ;form header:
  160.         ld hl,-1
  161.         ld a,-1
  162.         ld (stringbuf1header+TEXT_NEXT),hl
  163.         ld (stringbuf1header+TEXT_NEXT+2),a
  164. lastpointer=$+1
  165.         ld hl,-1
  166. lastpointerHSB=$+1
  167.         ld a,-1
  168.         ld (stringbuf1header+TEXT_PREV),hl
  169.         ld (stringbuf1header+TEXT_PREV+2),a
  170. laststringy=$+1
  171.         ld hl,0
  172.         ld (stringbuf1header+TEXT_Y),hl
  173. laststringx=$+1
  174.         ld a,0
  175.         ld (stringbuf1header+TEXT_X),a
  176.        
  177. ;if iscentered then TEXT_X = (textfieldwidth-textlength)/2
  178. iscentered=$+1
  179.         ld a,0
  180.         or a
  181.         jr z,savestringbuf1_notcentered
  182.         call countlinewidth ;hl
  183.         ld a,80 ;TODO textfieldwidth
  184.         sub l
  185.         rra
  186.         ld (stringbuf1header+TEXT_X),a
  187. savestringbuf1_notcentered
  188.        
  189.         if 1==0
  190.         push bc
  191.         push de
  192.         push hl
  193.        
  194.         ld hl,(stringbuf1header+TEXT_Y)
  195.         ld bc,25
  196.         or a
  197.         sbc hl,bc
  198.         add hl,bc
  199.         jr nc,notest1
  200.         ld a,l
  201.         add a,a
  202.         add a,a
  203.         add a,a
  204.         ld d,a
  205.         ld a,(stringbuf1header+TEXT_X)
  206.         ld e,a
  207.         call setxymc_stateful
  208.         ld hl,stringbuf1
  209. test10
  210.         ld a,(hl)
  211.         or a
  212.         jr z,notest1
  213.         inc hl
  214.         push hl
  215.         ;halt
  216.         call prcharmc_stateful
  217.         pop hl
  218.         jr test10
  219.        
  220. notest1
  221.         pop hl
  222.         pop de
  223.         pop bc
  224.         endif
  225.        
  226.         ex de,hl
  227. ;hl=from
  228. ;bc=size
  229. ;out: ahl=addr
  230.         ;jr $
  231.         call reservemem_puttomem
  232.         call linklastpointer_next_ahl_setlastpointer        
  233. initstringbuf1
  234.         xor a
  235.         ld (iscentered),a
  236.         ;ld (ncharsinline),a
  237.         ld hl,stringbuf1
  238.         ld (curstringbuf1addr),hl
  239.         jp setfontweight
  240.  
  241. savestringbuf2
  242. ;add terminator
  243. ;find size
  244. ;form header
  245. ;reservemem & put
  246. ;if (not isnull(lastpointer)) lastpointer->next=addr else firstpointer=addr
  247. ;lastpointer = addr
  248. ;initialize stringbuf2
  249.         ld hl,(curstringbuf2addr)
  250.         xor a
  251.         ld (hl),a
  252.         inc hl
  253.         ld de,stringbuf2header
  254.         ;or a
  255.         sbc hl,de ;hl=size
  256.         push hl ;size
  257.        
  258. ;form header:
  259.         ld a,(prcharvirtual_stateful_x)
  260.         ld (stringbuf2header+HREF_ENDX),a
  261.         ld hl,(curprintvirtualy)
  262.         ld (stringbuf2header+HREF_ENDY),hl
  263.         ld a,-1
  264.         ld h,a
  265.         ld l,a
  266.         ld (stringbuf2header+HREF_NEXT),hl
  267.         ld (stringbuf2header+HREF_NEXT+2),a
  268. last2pointer=$+1
  269.         ld hl,-1
  270. last2pointerHSB=$+1
  271.         ld a,-1
  272.         ld (stringbuf2header+HREF_PREV),hl
  273.         ld (stringbuf2header+HREF_PREV+2),a
  274. hrefyposition=$+1
  275.         ld hl,0
  276.         ld (stringbuf2header+HREF_Y),hl
  277. hrefxposition=$+1
  278.         ld a,0
  279.         ld (stringbuf2header+HREF_X),a
  280.         xor a
  281.         ld (stringbuf2header+HREF_VISITED),a ;TODO check history
  282.         ;jr $
  283.        
  284.         if 1==0
  285.         push de
  286.         push hl
  287.        
  288.         ld hl,(stringbuf2header+HREF_Y)
  289.         ld bc,25
  290.         or a
  291.         sbc hl,bc
  292.         add hl,bc
  293.         jr nc,notest
  294.         ld a,l
  295.         add a,a
  296.         add a,a
  297.         add a,a
  298.         ld d,a
  299.         ld a,(stringbuf2header+HREF_X)
  300.         ld e,a
  301.         call setxymc_stateful
  302.         ld a,'@'
  303.         call prcharmc_stateful        
  304.        
  305. notest
  306.         pop hl
  307.         pop de
  308.         endif
  309.        
  310.         ex de,hl
  311.         pop bc ;size
  312. ;hl=from
  313. ;bc=size
  314. ;out: ahl=addr
  315.         ;jr $
  316.         call reservemem_puttomem
  317.         call linklast2pointer_next_ahl_setlast2pointer
  318. initstringbuf2
  319.         ld hl,stringbuf2
  320.         ld (curstringbuf2addr),hl
  321.         ret
  322.  
  323. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;        
  324.  
  325. setdefaultfontweight
  326.         xor a
  327.         ld (curbold),a
  328.         ld (curlink),a
  329.         ld (curlinkimg),a
  330.         ld (curmark),a
  331.         ld (curitalic),a
  332.         ld (curunderline),a
  333.         ld (curstroke),a
  334.         ret
  335.  
  336. setfontweight
  337.         ld a,(printableflag)
  338.         or a
  339.         ret z
  340.          ld a,1
  341.          call prcharvirtual_stateful
  342. curbold=$+1
  343.         ld a,0
  344. curlink=$+1
  345.         or 0
  346. curlinkimg=$+1
  347.         or 0
  348. curmark=$+1
  349.         or 0
  350.         inc a
  351.         call prcharvirtual_stateful
  352.          ld a,2
  353.          call prcharvirtual_stateful
  354. curitalic=$+1
  355.         ld a,0
  356.         inc a
  357.         call prcharvirtual_stateful
  358.          ld a,3
  359.          call prcharvirtual_stateful
  360. curstroke=$+1
  361.         ld a,0
  362.         inc a
  363.         call prcharvirtual_stateful
  364.          ld a,4
  365.          call prcharvirtual_stateful
  366. curunderline=$+1
  367.         ld a,0
  368.         inc a
  369.         jp prcharvirtual_stateful
  370.  
  371. prcharvirtual_tab_stateful
  372.         ld a,(prcharvirtual_stateful_x)
  373.         and 7 ;0..7
  374.         cpl ;-1..-8
  375.         add a,9
  376.         ld b,a ;8..1
  377. prcharvirtual_tab_stateful0
  378.         push bc
  379.         ld a,' '
  380.         call prcharvirtual_stateful
  381.         pop bc
  382.         djnz prcharvirtual_tab_stateful0
  383.         ret
  384.        
  385. prcharvirtual_controlcode
  386.         cp 0x09 ;tab
  387.         jr z,prcharvirtual_tab_stateful
  388.         cp 0x0a ;LF
  389.         jr z,prcharvirtual_crlf_stateful
  390.         cp 0x0d ;CR
  391.         ret z
  392.         jr prcharvirtual_stateful_nocontrolcode
  393.        
  394. prcharvirtual_stateful
  395. ;a=code
  396. printableflag=$+1
  397.         ld l,0
  398.         dec l
  399.         ret nz
  400.         cp 32
  401.         jr c,prcharvirtual_controlcode
  402. prcharvirtual_stateful_nocontrolcode
  403.         push af
  404.          cp 0x80
  405.          jr c,prcharvirtual_noutf8
  406. utf8flag=$+1
  407.          ld l,0
  408.          dec l
  409.          jr nz,prcharvirtual_noutf8
  410.          sub 0xd0
  411.          jr z,prcharvirtual_utf8_d0
  412.          cp 1
  413.          jr z,prcharvirtual_utf8_d0
  414.          cp 0xe2-0xd0 ;dash = e2 80 94 (эю 80 шёяюы№чєхЄё  т "р" = d1 80)
  415.          jr z,prcharvirtual_utf8_e2
  416.          cp 0xc2-0xd0 ;bullet = c2 b7
  417.          jr z,prcharvirtual_utf8_c2
  418.          ;sub 0x80
  419. prcharvirtual_utf8_add=$+1
  420.         add a,0x00
  421.         ;add a,0x80
  422.          cp 0x01
  423.          jr z,prcharvirtual_utf8_yo
  424.          cp 0x20
  425.          jr nc,prcharvirtual_noutf8
  426.          pop af
  427.          ret
  428. prcharvirtual_utf8_yo
  429.          ld a,0xb8;'╕'
  430.         jr prcharvirtual_noutf8
  431. prcharvirtual_utf8_c2
  432.         ld a,0xb7-0xb7+0xd0
  433.         ld (prcharvirtual_utf8_add),a
  434.         pop af
  435.         ret
  436. prcharvirtual_utf8_e2
  437.         ld a,'-'-0x94+0xd0
  438.         ld (prcharvirtual_utf8_add),a
  439.         pop af
  440.         ret
  441. prcharvirtual_utf8_d0
  442.         add a,a
  443.         add a,a
  444.         add a,a
  445.         add a,a
  446.         add a,a
  447.         add a,a
  448.         ld (prcharvirtual_utf8_add),a
  449.         pop af
  450.         ret
  451. prcharvirtual_noutf8
  452.         ld h,twinto866/256
  453.         ld l,a
  454.         ld a,(hl)
  455.         call printtostringbuf1
  456.         pop af
  457.         cp 32
  458.         ret c
  459. prcharvirtual_stateful_x=$+1
  460.         ld a,0
  461.         inc a
  462.         ld (prcharvirtual_stateful_x),a
  463.         cp 80
  464.         ret c
  465. prcharvirtual_crlf_stateful
  466.         ld a,(printableflag)
  467.         or a
  468.         jr z,prcharvirtual_x0
  469.         call savestringbuf1
  470. curprintvirtualy=$+1
  471.         ld hl,0
  472.         inc hl
  473.         ld (laststringy),hl
  474.         ld (curprintvirtualy),hl
  475. prcharvirtual_x0
  476.         xor a
  477.         ld (prcharvirtual_stateful_x),a
  478.         ld (laststringx),a
  479.         ret
  480.  
  481. countlinewidth
  482. ;out:hl
  483.         ld a,(prcharvirtual_stateful_x)
  484.         ld hl,laststringx
  485.         sub (hl)
  486.         ld l,a ;number of visible chars in line        
  487.         ld h,0
  488.         ret
  489.