?login_element?

Subversion Repositories NedoOS

Rev

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

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