?login_element?

Subversion Repositories NedoOS

Rev

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

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