нужно uInt32.toString() на асме

Programs, sources, embedded, demomaking, whatsoever related to subj :)

Postby lvd » 27 Dec 2011, 15:49

DimkaM wrote:но сортирует уже созданный список.

Неверно. Сортировка кучей состоит из 2 фаз: сначала создаём кучу по 1 элементу прибавляя, потом из кучи выдёргиваем в отсортированном порядке элементы. Первая фаза хорошо ложится на подчитку каталога с девайса.
DimkaM wrote:Но в моём случае проще, я сортирую при создании списка.

Чо у тебя за алго?
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7262
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby DimkaM » 27 Dec 2011, 16:29

lvd wrote:Неверно. Сортировка кучей состоит из 2 фаз: сначала создаём кучу по 1 элементу прибавляя, потом из кучи выдёргиваем в отсортированном порядке элементы. Первая фаза хорошо ложится на подчитку каталога с девайса.
Значит херово я твой исходник прочитал, опыту нету. Ещё и плагин ТоталКомандеровский ругался на ункновнСимболы. Надо Витамина попросить подшаманить его.
lvd wrote:Чо у тебя за алго?
Тупо пробегаюсь по списку и вставляю куда надо. В каждом элементе указатели на следующий и предыдущий элементы. При вставке указатели меняются на нужные, физически элементы остаются на месте.
Code: Select all
   STRUCT FILINFO
FSIZE   DWORD      ;/* FILE SIZE */
FDATE   WORD      ;/* LAST MODIFIED DATE */
FTIME   WORD      ;/* LAST MODIFIED TIME */
FATTRIB   BYTE      ;/* ATTRIBUTE */
FNAME   BLOCK 16,0   ;/* SHORT FILE NAME (8.3 FORMAT) */
MARK   byte      ;marking
NEXT   WORD      ;указатель на следующий итем
NEXTP   BYTE      ; пейджа следующего итема
PREV   WORD      ;указатель на предыдущий итем
PREVP   BYTE      ;пейджа предыдущего итема      
   ENDS
N>"Идите нахуй" со своей политикой...
DimkaM
 
Posts: 1011
Joined: 24 Mar 2010, 12:42
Location: г.Щёлково М.О.
Group: Registered users

Postby lvd » 27 Dec 2011, 17:31

DimkaM wrote:Тупо пробегаюсь по списку и вставляю куда надо. В каждом элементе указатели на следующий и предыдущий элементы. При вставке указатели меняются на нужные, физически элементы остаются на месте.

Значит время выполнения квадратично зависит от кол-ва элементов. В кучеалгоримте время зависит как N*log(N), т.е. для больших N он получается во многие сотни и тысячи раз быстрее твоего.
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7262
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby fk0 » 27 Dec 2011, 22:59

Ламерьё! Для выпечатывания чисел нужно не делить, а умножать на 10, причём в двоично-десятичной системе счисления!
Как распечатать 5 регистров (по две цифры в регистре) надеюсь сами все догадаются.

Code: Select all
#ifdef MAKE_DOC

<section> <title id="math.l2bcd">l2bcd</title>

<variablelist><title>Вход:</title>
<varlistentry><term>(DE,HL)</term>
<listitem>двоичное число</listitem></varlistentry>
</variablelist>
<variablelist><title>Выход:</title>
<varlistentry><term>(C,D,E,H,L)</term>
<listitem>двоично-десятичный эквиэвалент</listitem></varlistentry>
</variablelist>

<para>Функция переводит значение 32-разрядного (двоичного) числа
заданного в регистрах DE и HL (в HL младшие разряды) в
двоично-десятичный формат. Результат возвращается в регистрах
C,D,E,H,L (в C -- старшие разряды, в L -- младшие).
</para>

</section>

#else

EXPORT   global l2bcd  ; long_bin(DE,HL) -> bcd(C,D,E,H,L)

; de,hl -> c,d,e,h,l
   psect text
l2bcd:
        exx
        ld bc, 0x2000
        ld l, c
        ld h, c
        ld e, l
        ld d, h
l2bcd0:
        exx
        add hl, hl
        ex de, hl
        adc hl, hl
        ex de, hl
        exx
        ld a, l
        adc a, a
        daa
        ld l, a
        ld a, h
        adc a, a
        daa
        ld h, a
        ld a, e
        adc a, a
        daa
        ld e, a
        ld a, d
        adc a, a
        daa
        ld d, a
        ld a, c
        adc a, a
        daa
        ld c, a
        djnz l2bcd0
        ret

#endif



#ifdef MAKE_DOC

<section><title id="math.i2bcd">i2bcd</title>

<variablelist><title>Вход:</title>
<varlistentry><term>HL</term>
<listitem>двоичное число</listitem></varlistentry>
</variablelist>
<variablelist><title>Выход:</title>
<varlistentry><term>E, H, L</term>
<listitem>двоично-десятичный эквиэвалент</listitem></varlistentry>
</variablelist>

<para>Функция переводит значение 16-разрядного (двоичного) числа
заданного в регистре HL в двоично-десятичный формат. Результат
возвращается в регистрах E,H,L (в Е &mdash; старшие разряды, в L &mdash;
младшие).
</para>

</section>

#else

EXPORT global i2bcd  ; bin(HL) -> bcd(E,H,L)

; функция переводит 16-разрядное беззнаковое
; двоичное число в двоично-десятичный формат
; e,h,l = bin2bcd(hl)   ~1330 takts.
   psect text
i2bcd:
        ld bc, 0x1000
        ld e, c
        ld d, c
i2bcd0:
        add hl, hl
        ld a, e
        adc a, a
        daa
        ld e, a
        ld a, d
        adc a, a
        daa
        ld d, a
        rl c
        djnz i2bcd0      ; ~83   ~1328
        ex de, hl
        ld e, c
        ret

#endif

Last edited by fk0 on 27 Dec 2011, 23:10, edited 1 time in total.
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1535
Joined: 07 Apr 2007, 01:08
Group: Registered users

Postby fk0 » 27 Dec 2011, 23:06

Ещё исдохняки:

Code: Select all

EXPORT global prdec  ; print decimal BC=0..65535

#include <string.inc>
; global wtoa

   global printhl
   psect text
prdec:
        ld e, c
        ld d, b
        ld hl, -6
        add hl, sp
        ld sp, hl
        push hl
        call wtoa
        pop hl
        call printhl
        pop hl
        pop hl
        pop hl
        ret


EXPORT global prdecl  ; print decimal (DE,BC)=0..4*10^10

#include <string.inc>
;   global ltoa

        global printhl
   psect text

prdecl:
        ld hl, -11
        add hl, sp
        ld sp, hl
        push hl
        call ltoa
        pop hl
        call printhl
        ld hl, 11
        add hl, sp
        ld sp, hl
        ret






EXPORT global printhl  ; вывод сообщения из (hl)

#include <console.inc>
#include <string.inc>

   global prchar
   psect text
printhl:

#ifdef BASIC_IO
        push hl
        ld a, 2
        call 0x1601 ; TODO 2/1chn
        pop hl
printhl0:
        ld a, (hl)
        inc hl
        or a
        ret z

        inc a
        jr z, $+3
          dec a

        call prchar
        jr printhl0

#else  ; 'normal' console

        push hl
        call strlen
        ;dec bc     ;     FIXED  BUG
          ld a, b
          or c
        pop de
          ret z
        jp _tty_puts

#endif


#ifdef MAKE_DOC

<section><title='string.wtoa'>wtoa</title>

<variablelist><title>Вход:</title>
<varlistentry><term>BC</term>
<listitem>число 0..65535</listitem></varlistentry>
<varlistentry><term>HL</term>
<listitem>указатель на строку (минимум 6 байт)</listitem></varlistentry>
</variablelist>

<variablelist><title>Выход:</title>
<varlistentry><term>HL</term>
<listitem>указатель на 0 завершающий строку.</listitem></varlistentry>
</variablelist>

<para>
  Функция записывает беззнаковое число, заданное в регистре BC,
в строку заданную регистром HL, в десятичной системе счисления.
Ведущие нули не записываются.  Может быть записано до 6-и байт,
включая символ с кодом 0 заканчивающий строку. В регистре HL
возвращается указатель на последний символ строки (код 0).</para>

</section>

#else

EXPORT global wtoa  ; decimal2ascii HL=string[6], DE=number -> HL=*0(string)

   global i2bcd
   psect text

; функция записывает 16-разрядное беззнаковое число
; в десятичном виде, ведущие нули не отбрасываются.
; по адресу (hl) будет записано 5 цифр числа и
; символ с кодом 0 завершающий строку.
; *hl = itoa(de) -> hl=указатель на завершающий 0.
wtoa:
        push hl
        ex de, hl
        call i2bcd
        ld a, e
        ex de, hl
        pop hl

        or a
        jr nz, ltoa5
        ld a, d
        and 0xf0
        jr nz, ltoa6
        ld a, d
        and 0x0f
        jr nz, ltoa7
        ld a, e
        and 0xf0
        jr nz, ltoa8
        ld a, e
        jr ltoa9

EXPEND

EXPORT global ltoa5  ; for ltoa
   global ltoa6
   global ltoa7   ; TODO вынести отдельно
   global ltoa8
   global ltoa9


; a,d, e
ltoa5:
        or 0x30
        ld (hl), a
        inc hl
ltoa6:
        ld (hl), d
        ld a, 0x33
        rrd
        inc hl
ltoa7:
        or 0x30
        ld (hl), a
        inc hl
ltoa8:
        ld (hl), e
        ld a, 0x33
        rrd
        inc hl
ltoa9:
        or 0x30
        ld (hl), a

        inc hl
        ld (hl), 0
        ret


#if 0
; a,d,e
wtoa0:
        or 0x30
        ld (hl), a
        inc hl
wtoa1:
        ld (hl), d
        ld a, 0x33
        rrd
        inc hl
wtoa2:
        or 0x30
        ld (hl), a
        inc hl
wtoa3:
        ld (hl), e
        ld a, 0x33
        rrd
        inc hl
wtoa4:
        or 0x30
        ld (hl), a

        inc hl
        ld (hl), 0
        ret
#endif

  EXPORT end

#endif



#ifdef MAKE_DOC

<section><title='string.ltoa'>ltoa</title>

<variablelist><title>Вход:</title>
<varlistentry><term>HL</term>
<listitem>указатель на строку (минимум 11 байт)</listitem></varlistentry>
<varlistentry><term>(DE,BC)</term>
<listitem>32-разрядное число</listitem></varlistentry>
</variablelist>

<variablelist><title>Выход:</title>
<varlistentry><term>HL</term>
<listitem>указатель на последний символ строки</listitem></varlistentry>
</variablelist>

<para>  Функция записывает 32-разрядное беззнаковое число в строку, в
десятичной системе счисления. Ведущие нули не записываются.
Число задаётся в регистрах DE и BC (в DE старшие разряды),
указатель на строку задаётся регистром HL. Может быть записано
до 11-и байт, включая символ с кодом 0 заканчивающий строку. В
регистре HL возвращается указатель на последний символ строки
(код 0).</para>

</section>

#else

EXPORT   global ltoa   ; long2ascii (DE,BC) HL=string[11] -> HL=*0

   global ltoa5  ; export
   global ltoa6  ; TODO вынести отдельно
   global ltoa7
   global ltoa8
   global ltoa9

   global l2bcd   ; from math

   psect text
; long de,bc -> string(hl[11])
;            -> hl=*0
ltoa:
  ; TODO  check
        push hl
        ld l, c
        ld h, b
        call l2bcd
        ex de, hl
        ex (sp), hl
        ld a, c
        ex af, af'
        ld a, c
        pop bc

        and 0xf0
        jr nz, ltoa0
        ex af, af'
        and 0x0f
        jr nz, ltoa1
        ld a, b
        and 0xf0
        jr nz, ltoa2
        ld a, b
        and 0x0f
        jr nz, ltoa3
        ld a, c
        and 0xf0
        jr nz, ltoa4
        ld a, c
        and 0x0f
   
    ; external links...

        jp nz, ltoa5
        ld a, d
        and 0xf0
        jp nz, ltoa6
        ld a, d
        and 0x0f
        jp nz, ltoa7
        ld a, e
        and 0xf0
        jp nz, ltoa8
        ld a, e
        jp ltoa9

; a,a',b,c,d,e
ltoa0:
        ld (hl), a
        ld a, 0x33
        rrd
        inc hl
ltoa1:
        or 0x30
        ld (hl), a
        inc hl
ltoa2:
        ld (hl), b
        ld a, 0x33
        rrd
        inc hl
ltoa3:
        or 0x30
        ld (hl), a
        inc hl
ltoa4:
        ld (hl), c
        ld a, 0x33
        rrd
        inc hl

   jp ltoa5

  EXPORT end

#endif



* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1535
Joined: 07 Apr 2007, 01:08
Group: Registered users

Postby fk0 » 27 Dec 2011, 23:15

math.txt:


amul
=====

Перемножение с суммированием. HL = A * DE + HL ~350 тактов

Функция перемножает беззнаковые числа заданные в регистрах A и
DE и прибавляет результат к содержимому регистра HL. Функция
выполняется быстрей чем функция mul, примерно за 350 тактов и
может быть использована для доступа к элементам массивов. В том
случае если размеры элементов или размерности массивов кратны
2^n или являются константами может быть выгодней использовать
более другие способы ускоренного умножения. В случае, если
требуется более быстрый доступ к элементам массивов с
произвольным размером элемента или размерностью может быть
целесообразным использовать массивы Айлифа.

Смотри также mul, div, lmul, ldiv.





crc16
======

Вход:
IX = указатель массив данных
BC = размер массива данных в байтах
DE = коэффициенты многочлена (0x1021 обычно)
HL = начальное значение ЦИК
----
Выход:
HL = значение ЦИК

Функция рассчитывает значение ЦИК для области памяти с
начальным адресом заданным в регистре IX и длиной в байтах
заданной в регистре BC. В регистре DE указывается порождающий
многочлен ЦИК. В регистре HL указывается начальное или
промежиточное (в случае последовательного рассчёта ЦИК
нескольких массивов) значение ЦИК. Результат рассчёта
возвращается в регистре HL. В качестве порождающего ЦИК
многочлена в телекоммуни кационных протоколах используется
рекомендуемое МКТТ значение 1021h.

Результат работы данной функции полностью аналогичен
выполнению функции crc16_fast, однако эта функция не использует
заранее рассчитанную таблицу и время её работы значительно
больше. Рекомендуется использовать функции crc16_init и
crc16_fast, если требуется вести подсчет ЦИК больших объемов
данных.






crc16_init
==========

Вход:
DE = указатель на массив памяти, 512 байт
BC = коэффициенты многочлена (обычно 0x1021)

Функция инициализирует таблицу для быстрого подсчета
16-разрядного циклического избыточного кода (ЦИК) функцией
crc16_fast. В регистре de передается адрес массива памяти
размером в 512 байт для сохранения рассчитанной таблицы.
В регистре BC указывается порождающий многочлен ЦИК. В
телекоммуникационных протоколах используется рекомендованное
МКТТ значение: 1021h.


crc16_fast
============

Вход:
DE = указатель на рассчитанную таблицу ЦИК.
IX = указатель на массив данных
BC = размер массива данных в байтах
HL = начальное значение ЦИК
------
Выход:
HL = значение ЦИК

Функция рассчитывает значение ЦИК для области памяти с
начальным адресом заданным в регистре IX и длиной в байтах
заданной в регистре BC. В регистре DE передается адрес таблицы
предварительно рассчитанной с помощю функции crc16_init. В
регистре HL указывается начальное или промежиточное (в случае
последовательного рассчёта ЦИК нескольких массивов) значение ЦИК.
Результат рассчёта возвращается в регистре HL.

Результат работы данной функции полностью аналогичен
выполнению функции crc16, которая не использует заранее
рассчитанную таблицу, но время её работы значительно больше.

Пример использования функций crc16_init и crc16_fast для
рассчёта ЦИК файла не умещающегося целиком в оперативную память:

ld hl, -512-4096 ; выделили память:
add hl, sp ; 512 байт для таблицы ЦИК
ld sp, hl ; и 4096 для чтения файла

ex de, hl ; адрес таблицы ЦИК = SP+0
ld bc, 0x1021
call crc16_init ; инициализация таблицы ЦИК

ld hl, 0 ; начальное значение ЦИК
push hl
loop:
ld hl, 512
add hl, sp ; адрес буфера файла = SP+512
push hl
call read_file ; считывание части файла

pop ix ; данные: часть файла
ld bc, 4096 ; размер части файла
ld hl, 0
add hl, sp
ex de, hl ; адрес таблицы ЦИК = SP+0
pop hl ; промежуточное значение ЦИК
call crc16_fast
push hl

call eof ; проверка достижения конца файла
jr nz, loop ; ещё есть данные

pop de ; конечное значение ЦИК
ld hl, 512+4096
add hl, sp
ld sp, hl ; освободили память

ex de, hl ; здесь HL = рассчитанное значение ЦИК
ret






div
====

Целочисленное деление: HL=DE/BC, DE=DE%BC.

Функция делит число заданное в регистре HL на число заданное в
регистре BC, результат помещается в регистр HL, а остаток в
регистр DE. В случае деления на 0 в регистре HL записывается
ноль, а в регистре DE значение делимого. Функция выполняется
примерно за 900 тактов.





flatcher
=========

Вход:
IX = указатель на массив памяти
BC = размер массива в байтах
------
Выход:
HL = младшие разряды 16-разрядного кода
DE = старшие разряды 16-разрядного кода
E,L = 8-разрядный код

Функция рассчитывает значения кода Флетчера. В регистре IX
передается указатель на область памяти, по содержимому которой
будет произведен рассчет. В регистре BC передается размер
области памяти в байтах. В регистрах HL и DE возвращаются
значения 16-разрядного кода Флетчера. Значения 8-разрядного
кода могут быть получены из регистров E (старший байт) и
L (младший найт).

Это не слишком удачная функция для контроля целостности
данных, но работает быстрей функций рассчета КЦК.





i2bcd
======

Вход:
HL = двоичное число
------
Выход:
E,H,L = двоично-десятичный эквиэвалент

Функция переводит значение 16-разрядного (двоичного) числа
заданного в регистре HL в двоично-десятичный формат. Результат
возвращается в регистрах E,H,L (в Е -- старшие разряды, в L --
младшие).





l2bcd
======

Вход:
(DE,HL) = двоичное число
------
Выход:
(C,D,E,H,L) = двоично-десятичный эквиэвалент

Функция переводит значение 32-разрядного (двоичного) числа
заданного в регистрах DE и HL (в HL младшие разряды) в
двоично-десятичный формат. Результат возвращается в регистрах
C,D,E,H,L (в C -- старшие разряды, в L -- младшие).





labs
=====

(HL',HL) = abs (HL', HL)

Функция возвращает в регистрах HL' и HL (в HL' старшие
разряды) абсолютное значение 32-разрядного числа со знаком
заданного в регистрах HL' и HL (в HL' старшие разряды).





ldiv
======

(HL',HL) = (HL',HL) / (DE',DE)
(DE',DE) = (HL',HL) % (DE',DE)

Функция делит беззнаковые 32-разрядные числа. Делимое
задаётся в регистрах HL' и HL (в HL' старшие разряды).
Делитель задаётся в регистрах DE' и DE (в DE' старшие разряды).
Результат деления возвращается в регистрах HL' и HL
(в HL' старшие разряды). Остаток от деления возвращается в
регистрах DE' и DE (в DE' старшие разряды).






lmax
=====

(HL',HL) = max ( (HL',HL), (DE',DE) )

Функция возвращает в регистрах HL' и HL (в HL' старшие
разряды) максимальное значение от двух 32-разрядных
беззнаковых чисел. Первое число задаётся в регистрах HL' и HL
(в HL' старшие разряды). Второе число в регистрах DE' и DE
(в DE' старшие разряды).





lmin
=====

(HL',HL) = min ( (HL',HL), (DE',DE) )

Функция возвращает в регистрах HL' и HL (в HL' старшие
разряды) минимальное значение от двух 32-разрядных
беззнаковых чисел. Первое число задаётся в регистрах HL' и HL
(в HL' старшие разряды). Второе число в регистрах DE' и DE
(в DE' старшие разряды).





lmul
=====

(DE',DE,HL',HL) = (HL'HL) * (DE',DE)

Функция перемножает беззнаковые 32-разрядные числа и получает
64-разрядный результат. Первый сомножитель задаётся в регистрах
HL' и HL (в HL' старшие разряды). Второй сомножитель задаётся в
регистрах DE' и DE (в DE' старшие разряды). Результат
возвращается в регистрах DE',DE,HL',HL (в DE' -- старшие разряды,
в HL младшие).





lshl
=====

CF,(HL',HL) = (HL',HL) << A

Функция осуществляет поразрядный сдвиг "влево" 32-разрядного
беззнакового числа заданного в регистрах HL' и HL (в HL' --
старшие разряды). Число сдвигается на количество разрядов
указанное в регистре A. Младшие разряды числа устанавливается
в ноль. Старшие разряды сдвигаются в флаг переноса. Результат
возвращается в флаге переноса и регистрах HL' и HL (в HL' --
старшие разряды).





lshr
=====

CF,(HL',HL) = (HL',HL) >> A

Функция осуществляет поразрядный сдвиг "вправо" 32-разрядного
беззнакового числа заданного в регистрах HL' и HL (в HL' --
старшие разряды). Число сдвигается на количество разрядов
указанное в регистре A. Старшие разряды числа устанавливается
в ноль. Младшие разряды сдвигаются в флаг переноса. Результат
возвращается в флаге переноса и регистрах HL' и HL (в HL' --
старшие разряды).





max
=====

HL = max ( HL, DE )

Функция возвращает в регистре HL максимальное значение от
двух 16-разрядных беззнаковых чисел заданных в регистрах
HL и DE.





min
=====

HL = min ( HL, DE )

Функция возвращает в регистре HL минимальное значение от
двух 16-разрядных беззнаковых чисел заданных в регистрах
HL и DE.





mul
====

(DE,HL) = DE * BC

Функция перемножает беззнаковые 16-разрядные числа заданные в
регистрах DE и BC, и помещает результат в регистры DE и HL. В
регистре DE хранятся старшие биты результата. Функция
выполняется примерно за 800 тактов процессора. Смотри также
описание функции amul.





abs
====

HL = abs (HL)

Функция возвращает абсолютное значение от 16-разрядного числа
со знаком. Аргумент задаётся в регистре HL и результат
возвращается в регистре HL.


negate
=======

HL = 0 - HL

Функция вычитает 16-разрядное беззнаковое число, заданное в
регистре HL, из нуля. Результат помещается в регистр HL. Если
аргумент функции не равен нулю, то флаг C будет установлен.





randn
======

Вход:
DE = максимальное значение случайного числа
----
Выход:
HL = псевдослучайное число

Функция возвращает псевдослучайное число в заданном диапазоне.
Минимальное значение возвращаемого случайного числа -- 0.
Максимальное всегда меньше числа заданного в регистр DE.
Результат возвращается в регистре HL. Смотри также описание
функции rand.


rand
=====

Выход:
HL = 0..65535

Функция возвращает беззнаковое псевдослучайное число в
регистре HL. Возвращаемое число находится в диапазоне 0..65535.
Функция выполняется несколько быстрей функции randn. Выполнение
функции rand по времени примерно равно 3-м вызовам фунцкии
mul, в то время как время выполнения функции randn сопоставимо с
4-мя вызовами функции mul.


srand
=====

Вход:
DE = 0..65535

Функция устанавливает генератор случайных чисел. При установке
генератора одним значением генерируемая последовательность
псевдослучайных чисел будет всегда повторяться. Аргумент функции
передаётся в регистре DE.






wshl
=====

CF,HL = HL << A

Функция осуществляет поразрядный сдвиг "влево" 16-разрядного
беззнакового числа заданного в регистре HL. Число сдвигается на
количество разрядов указанное в регистре A. Младшие разряды
числа устанавливается в ноль. Старшие разряды сдвигаются в флаг
переноса. Результат возвращается в флаге переноса и регистре HL.





wshr
=====

CF,HL = HL >> A

Функция осуществляет поразрядный сдвиг "вправо" 16-разрядного
беззнакового числа заданного в регистре HL. Число сдвигается на
количество разрядов указанное в регистре A. Старшие разряды
числа устанавливается в ноль. Младшие разряды сдвигаются в флаг
переноса. Результат возвращается в флаге переноса и регистре HL.





sqrt
=====

A = sqrt (HL)

Функция вычисляет целочисленное значение квадратного корня
от беззнакового числа заданного в регистре HL, результат
возвращается в регистре A. Функция выполняется примерно за 470
тактов.


string.txt:


Библиотека предоставляет следующие функции:
===========================================

Определение типа символа:
isalnum, isalpha, isascii, isblank, isdigit, islower, isprint,
ispunct, isspace, isupper, isxdigit

Работа с массивами:
memcmp, memmove, swab

Работа со строками:
strcat, strchr, strcmp, strncmp, strcmpi, strncmpi, strcpy, strlen,
strncat, strncpy

Преобразования строк:
strreverse, strlower, strupper

Поиск подстроки:
strglob, strstr

Разбор строк:
strcspn, strpbrk, strrchr, strrpbrk, strrspnp, strsep, strspn, strspnp

Преобразования символов:
tolower, toupper

Преобразования чисел:
atow, htoa, wtoa, ltoa





isalnum
========

ZF = isalnum( A )

Функция устанавливает флаг Z если символ заданный в регистре A
является буквой или цифрой. Функция работает только с ASCII
символами с кодами 32-127 (с буквами латинского алфавита),
национальные алфавиты в текущей версии не поддерживаются.
Содержимое регистров A и HL при вызове функции сохраняется.





isalpha
========

ZF = isalpha( A )

Функция устанавливает флаг Z если символ заданный в регистре
A является буквой. Функция работает только с ASCII символами с
кодами 32-127 (с буквами латинского алфавита), национальные
алфавиты в текущей версии не поддерживаются. При вызове функции
содержимое регистров A и HL сохраняется.





isascii
========

ZF = isascii( A )

Функция устанавливает флаг Z если символ заданный в регистре A
является символом из ASCII набора (коды 0-127). При вызове
функции содержимое регистров A и HL сохраняется.





isblank
========

ZF = isblank( A )

Функция устанавливает флаг Z если символ заданный в регистре A
является пробелом или символом табуляции. Функция работает
только с ASCII символами с кодами 32-127 (с буквами латинского
алфавита), национальные алфавиты в текущей версии не
поддерживаются. При вызове функции содержимое регистров A и HL
сохраняется.





isdigit
========

ZF = isdigit( A )

Функция устанавливает флаг Z если символ заданный в регистре
A является цифрой. Функция работает только с ASCII символами с
кодами 32-127 (с буквами латинского алфавита), национальные
алфавиты в текущей версии не поддерживаются. При вызове функции
содержимое регистров A и HL сохраняется.





islower
========

ZF = islower( A )

Функция устанавливает флаг Z если символ заданный в регистре A
является строчной буквой. Функция работает только с ASCII
символами с кодами 32-127 (с буквами латинского алфавита),
национальные алфавиты в текущей версии не поддерживаются. При
вызове функции содержимое регистров A и HL сохраняется.





isprint
========

ZF = isprint( A )

Функция устанавливает флаг Z если символ заданный в регистре A
является печатным символом. Функция работает только с ASCII
символами с кодами 32-127 (с буквами латинского алфавита),
национальные алфавиты в текущей версии не поддерживаются. При
вызове функции содержимое регистров A и HL сохраняется.





ispunct
========

ZF = ispunct( A )

Функция устанавливает флаг Z если символ заданный в регистре A
печатный и одновременно ни алфавитно-цифровой, ни пробел.
Функция работает только с ASCII символами с кодами 32-127 (с
буквами латинского алфавита), национальные алфавиты в текущей
версии не поддерживаются. При вызове функции содержимое
регистров A и HL сохраняется.





isspace
========

ZF = isspace( A )

Функция устанавливает флаг Z если символ заданный в регистре A
является пробелом, символом табуляции, символом перевода строки
или символом конца листа (коды 0x20, 0x9, 0x0a, 0x0d и 0x0f).
Функция работает только с ASCII символами с кодами 32-127 (с
буквами латинского алфавита), национальные алфавиты в текущей
версии не поддерживаются. При вызове функции содержимое
регистров A и HL сохраняется.





isupper
========

ZF = isupper( A )

Функция устанавливает флаг Z, если символ заданный в регистре
A является заглавной буквой. Функция работает только с ASCII
символами с кодами 32-127 (с буквами латинского алфавита),
национальные алфавиты в текущей версии не поддерживаются. При
вызове функции содержимое регистров A и HL сохраняется.





isxdigit
========

ZF = isxdigit( A )

Функция устанавливает флаг Z, если символ заданный в регистре
A является шеснадцатеричной цифрой. Функция работает только с
ASCII символами с кодами 32-127 (с буквами латинского алфавита),
национальные алфавиты в текущей версии не поддерживаются. При
вызове функции содержимое регистров A и HL сохраняется.





memcmp
======

Вход:
DE = указатель на первый массив
HL = указатель на второй массив
BC = размер сравниваемых массивов
------
Выход:
F по результату, ZF==1 если массивы идентичны

Функция осуществляет побайтовое сравнение содержимого массивов
памяти заданных регистрами DE и HL. Длина массивов указывается
в регистре BC. По результату сравнения устанавливается флаговый
регистр. В частности, флаг Z будет установлен, если массивы
идентичны, иначе флаг Z будет сброшен. Флаги устанавливается
по результату сравнения первого несовпавшего символа обоих
строк следующим образом:

Результат Значения Мнемоника
сравнения флагов условия перехода
-------------------------------------------------
(DE) < (HL) C=1 C
(DE) >= (HL) C=0 NC






memmove
========

Вход:
DE = указатель массива приёмника
HL = указатель массива источника
BC = размер массивов в байтах

Функция перемещает массив памяти с адреса указанного
регистром HL по адресу указанному регистром DE. Длина массива
задаётся регистром BC. Функция корректно работает в том случае,
когда массивы источника и приёмника пересекаются.





strglob
========

Вход:
HL = указатель на строку текста
DE = указатель на строку маски
-------
Выход:
ZF=1 если строка соответствует маске

Функция осуществляет сравнение строки заданной регистром HL
со строкой маски заданной регистром DE. В случае, если строка
соответствует маске флаг Z будет установлен.

Маска может состоять из любых символов (кроме символа с
кодом 0). Некоторые символы интерпретируются особым образом:

* -- означает любое число
любых символов.

? -- означает один любой символ.






strstr
======

Вход:
HL = указатель на строку текста
DE = указатель на искомую строку
-------
Выход:
ZF==1 если подстрока найдена
HL = указатель на найденную подстроку

Функция осуществляет поиск первого вхождения строки заданной
регистром DE в строку заданную регистром HL. Если строка
заданная регистром DE входит в строку заданную регистром HL,
то флаг Z будет установлен и регистр HL будет содержать
указатель на искомую подстроку (часть строки, заданной
регистром HL). Если подстрока не найдена, то флаг Z будет
сброшен.





strlcpy
========

Вход:
DE = указатель на строку приёмник
HL = указатель на строку источник
BC = максимальный размер строки приёмника в байтах
-------
Выход:
HL = указатель на завершающий 0 строки приёмника

Функция копирует строку заданную регистром HL по адресу
заданному регистром DE. Копируется не большее число символов,
чем задано в регистре BC с учётом завершающего нуля.
Таким образом, строка приёмник всегда будет иметь завершающий 0
в конце, а из копируемой строки может быть скопировано только
BC-1 первых символов.

В регистре HL возвращается указатель на последний символ в
массиве приемнике, это всегда завершающий символ с кодом 0.





strlcat
=======

?╚╧─:
DE = ╒╦┴┌┴╘┼╠╪ ╬┴ ╙╘╥╧╦╒ ╨╥╔г═╬╔╦
HL = ╒╦┴┌┴╘┼╠╪ ╬┴ ╙╘╥╧╦╒ ╔╙╘╧▐╬╔╦
BC = ═┴╦╙╔═┴╠╪╬┘╩ ╥┴┌═┼╥ ╙╘╥╧╦╔ ╨╥╔г═╬╔╦┴
-------
?┘╚╧─:
HL = ╒╦┴┌┴╘┼╠╪ ╬┴ ┌┴╫┼╥█┴└▌╔╩ 0 ╙╘╥╧╦╔ ╨╥╔г═╬╔╦┴

ц╒╬╦├╔╤ ╨╥╧╔┌╫╧─╔╘ ╙╠╔╤╬╔┼ ╙╘╥╧╦ ╨╒╘г═ ─╧╨╧╠╬┼╬╔╤ ╙╘╥╧╦╔
╒╦┴┌┴╬╬╧╩ ╥┼╟╔╙╘╥╧═ HL ╙╘╥╧╦╧╩ ╒╦┴┌┴╬╬╧╩ ╥┼╟╔╙╘╥╧═ DE, ╦╧╘╧╥┴╤
┌┴╨╔╙┘╫┴┼╘╙╤ ╫ ╦╧╬┼├ ╙╘╥╧╦╔ ╒╦┴┌┴╬╬╧╩ ╥┼╟╔╙╘╥╧═ HL. э┴╦╙╔═┴╠╪╬┘╩
╥┴┌═┼╥ ╙╘╥╧╦╔ ╬┴┌╬┴▐┼╬╔╤ ╒╦┴┌┘╫┴╘╙╤ ╫ ╥┼╟╔╙╘╥┼ BC. ы ╙╘╥╧╦┼
╬┴┌╬┴▐┼╬╔╤ ┬╒─┼╘ ─╧┬┴╫╠┼╬╧ ╙╘╧╠╪╦╧ ╙╔═╫╧╠╧╫, ▐╘╧ ╥┴┌═┼╥
╥┼┌╒╠╪╘╔╥╒└▌┼╩ ╙╘╥╧╦╔ ╙ ╒▐г╘╧═ ┌┴╫┼╥█┴└▌┼╟╧ ╬╒╠╤ ╬┼ ╨╥┼╫┘╙╔╘
▐╔╙╠╧ ┌┴─┴╬╬╧┼ ╫ ╥┼╟╔╙╘╥┼ BC. ?┼┌╒╠╪╘╔╥╒└▌┴╤ ╙╘╥╧╦┴ ╫╙┼╟─┴ ┬╒─┼╘
┌┴╫┼╥█┼╬┴ ╙╔═╫╧╠╧═ ╙ ╦╧─╧═ 0. ? ╥┼╟╔╙╘╥┼ HL ╫╧┌╫╥┴▌┴┼╘╙╤
╒╦┴┌┴╘┼╠╪ ╬┴ ╨╧╙╠┼─╬╔╩ ╙╔═╫╧╠ ╙╘╥╧╦╔ ╬┴┌╬┴▐┼╬╔╤ (┌┴╫┼╥█┴└▌╔╩ 0).





strcat
=======

Вход:
DE = указатель на строку приёмник
HL = указатель на строку источник
-------
Выход:
HL = указатель на завершающий 0 строки приёмника

Функция производит копирование строки указанной регистром HL в
конец строки указанной регистром DE (происходит объединение
строк). Полученная строка будет всегда завершаться символом с
кодом 0. В регистре HL возвращается указатель на последний
символ строки-приемника (это всегда завершающий 0).





strcpy
=======

Вход:
DE = указатель на строку приёмник
HL = указатель на строку источник
-------
Выход:
HL = указатель на завершающий 0 строки приёмника

Функция копирует строку заданную регистром HL по адресу
заданному регистром DE. Копируются все символы, включая
завершающий нуль. В регистре HL возвращается указатель на
последний символ в строке-приемнике (завершающий 0).

Функция может некорректно работать в случае, если строка приёмник
и строка источник пересекаются. Смотрите функцию memmove для
копиривания пересекающихся областей памяти.

Функция способна переполнить область памяти предназначенную
для строки назначения. Смотрите функции strncpy, strlcpy для
копирования с контролем длины.





strncpy
========

Вход:
DE = указатель на массив приёмник
HL = указатель на строку источник
BC = размер массива приёмника в байтах
-------
Выход:
HL = указатель на последний символ строки приёмника

Функция копирует строку заданную регистром HL по адресу
заданному регистром DE. Копируется не большее число символов,
чем задано в регистре BC.

Если размер строки источника меньше, чем задано в регистре BC,
то массив приёмник будет заполнен до конца символами с кодом 0.

В случае, если длина, без учета завершающего нуля, строки
заданной регистром HL превышает или равна значению переданному в
регистре BC, то строка заданная регистром DE не будет иметь
завершающего нуля.

В регистре HL возвращается указатель на последний символ в
массиве приемнике, это не обязательно символ с кодом 0 (в случае
переполнения строки).





strncat
=======

Вход:
DE = указатель на строку приёмник
HL = указатель на строку источник
BC = максимальное количество копируемых символов
-------
Выход:
HL = указатель на завершающий 0 строки приёмника

Функция производит слияние строк путём дополнения строки
указанной регистром HL строкой указанной регистром DE, которая
записывается в конец строки указанной регистром HL. Будет
скопировано не больше начальных символов, из строки заданной
регистром DE, чем указано в регистре BC. В регистре HL
возвращается указатель на последний символ строки назначения.

Смотрите функцию strlcat для объединения строк с контролем
длины результирующей строки.





strlen
=======

Вход:
HL = указатель на строку
------
Выход:
HL, BC = длина строки

Функция возвращает длину строки без учета завершающего нуля в
регистрах BC и HL. Адрес строки передается в регистре HL.





strchr
=======

Вход:
A = код искомого символа
HL = указатель на строку
------
Выход:
ZF==1 если символ найден
HL = указатель на найденный символ

Функция осуществляет поиск символа заданного регистром A, в
строке заданной регистром HL. В случае успешного нахождения
символа флаг Z будет установлен, а регистр HL будет содержать
адрес найденного символа.

Функция ведет поиск от начала строки к концу (в сторону
увеличения адреса). Смотри функцию strrchr для поиска в обратном
направлении.





strcmp
=======

Вход:
DE = указатель на первую строку
HL = указатель на вторую строку
-------
Выход:
F по результату

Функция сравнивает строки указанные регистрами DE и HL,
результат возвращается в регистре флагов. В случае, если строки
идентичны флаг Z будет установлен. Сравнение выполняется по коду
символа и может быть несправедливым для национальных алфавитов.
Флаги устанавливаются по результату сравнения первого несовпавшего
символа следующим образом:

Результат Значения Мнемоника
сравнения флагов условия перехода
-------------------------------------------------
(DE) < (HL) C=1 C
(DE) >= (HL) C=0 NC


strncmp
=======

Вход:
DE = указатель на первую строку
HL = указатель на вторую строку
BC = максимальный размер строки в байтах
-------
Выход:
F по результату

Функция сравнивает строки указанные регистрами DE и HL,
результат возвращается в регистре флагов. Сравнивается
не больше символов чем указано в регистре BC, если первые
символы строк в количестве указанном в регистре BC равны,
то считается, что строки идентичны. Флаги устанавливаются
по результату сравнения точно также, как и в результате
выполнения функции strcmp.





strcmpi
=======

Вход:
DE = указатель на первую строку
HL = указатель на вторую строку
-------
Выход:
F по результату

Функция сравнивает строки указанные регистрами DE и HL,
результат возвращается в регистре флагов. Сравнение производится
без учёта регистра символов. Сравнение выполняется по коду
символа и может быть несправедливым для национальных алфавитов.
Флаги устанавливаются по результату сравнения точно также, как и
в результате выполнения функции strcmp.


strncmpi
=======

Вход:
DE = указатель на первую строку
HL = указатель на вторую строку
BC = максимальный размер строки в байтах
-------
Выход:
F по результату

Функция сравнивает строки указанные регистрами DE и HL,
результат возвращается в регистре флагов. Сравнивается не больше
символов чем указано в регистре BC, если первые символы строк в
количестве указанном в регистре BC равны, то считается, что
строки идентичны. Сравнение производится без учёта регистра
символов. Сравнение выполняется по коду символа и может быть
несправедливым для национальных алфавитов. Флаги
устанавливаются по результату сравнения точно также, как и в
результате выполнения функции strcmp.





strreverse
===========

Вход:
HL = указатель на строку

Функция переворачивает строку задом-наперёд. Самый первый
символ становится самым последним и наоборот. Завершающего
строку нуля это не касается. Указатель на строку передаётся
в регистре HL.





strlower
=========

Вход:
HL = указатель на строку

Функция переводит строку заданную регистром HL в нижний
регистр символов. Функция работает только с ASCII символами с
кодами 32-127 (с буквами катинского алфавита). Национальные
алфавиты в текущей версии не поддерживаются.





strupper
=========

Вход:
HL = указатель на строку

Функция переводит строку заданную регистром HL в верхний
регистр символов. Функция работает только с ASCII символами с
кодами 32-127 (с буквами катинского алфавита). Национальные
алфавиты в текущей версии не поддерживаются.





strcspn
========

Вход:
HL = указатель на строку текста
DE = указатель на строку искомых символов
-------
Выход:
BC, HL = количество подходящих символов

Функция подсчитывает количество символов от начала строки
заданной регистром HL, не входящих во множество символов
заданных регистром DE.

Для подсчёта символов входящих в множество заданных существует
фунцкия strspn. Для подсчёта символов с конца строки существуют
функции strrcspn и strrspn.





strpbrk
========

Вход:
HL = указатель на строку текста
DE = указатель на строку искомых символов
-------
Выход:
ZF=1 если символ найден
HL = указатель на найденный символ

Функция ведён поиск в строке заданной регистором HL любого из
символов заданных регистром DE. В случае, если поиск заведшён
успешно, флаг Z будет установлен и регистр HL будет содержать
указатель на этот символ.

Поиск ведётся в прямом напрявлении, с начала строки. Для
поиска в обратном направлении, с конца строки, смотрите функцию
strrpbrk.





strrchr
=======

Вход:
A = код искомого символа
HL = указатель на строку
------
Выход:
ZF==1 если символ найден
HL = указатель на найденный символ

Функция осуществляет поиск символа заданного регистром A, в
строке заданной регистром HL. В случае успешного нахождения
символа флаг Z будет установлен, а регистр HL будет содержать
адрес найденного символа.

Функция ведет поиск в обратном направлении, от конца строки к
началу (в сторону уменьшения адреса). Смотри функцию strchr для
поиска в прямом направлении.





strrpbrk
========

Вход:
HL = указатель на строку текста
DE = указатель на строку искомых символов
-------
Выход:
ZF=1 если символ найден
HL = указатель на найденный символ

Функция ведён поиск в строке заданной регистором HL любого из
символов заданных регистром DE. В случае, если поиск заведшён
успешно, флаг Z будет установлен и регистр HL будет содержать
указатель на этот символ.

Поиск ведётся в обратном напрявлении, с конца строки. Для
поиска в прямом направлении, с начала строки, смотрите функцию
strpbrk.





strrspnp
=========

Вход:
HL = указатель на строку текста
DE = указатель на строку искомых символов
-------
Выход:
ZF==1 если символ найден
HL = указатель на найденный символ

Фунцкия осуществляет поиск в строке заданной регистром HL
любого символа отсутствующего в множестве символов заданных
регистром DE. Если такой символ (отсутствующий в строке
задаваемой регистром DE) будет найден, то флаг Z будет
установлен и регистр HL будет указывать на этот символ. В
противном случае флаг Z будет сброшен.

Поиск осуществляется в обратном направлении, с конца строки.
Для поиска символа в прямом направлении, с начала строки,
смотрите функцию strspnp.





strsep
=======

Вход:
HL = указатель на строку текста
DE = указатель на строку-массив разделителей
------
ZF==1 если токен найден
HL = указатель на слово
DE = указатель на следующую за словом строку

Функция осуществляет поиск в строке, заданной регистром HL,
слов, разделённых символами заданными регистром DE. Слова состоят
из символов не являющихся разделителями. После того, как найдено
слово, символ разделителя, следующий за ним, заменяется на
символ с кодом 0. В регистре HL возвращается указатель на начало
найденного слова, а в регистре DE указатель на символ, следующий
за завершающим слово нулём, что позволяет при последовательных
вызовах фунцкии strsep извлечь из строки все слова. Исходная
строка при этом будет разрушена. В случае, если заданная строка
текста состоит только из разделителей флаг Z будет сброшен.

Функция осуществляет просмотр строки в прямом направлении, от
начала к концу. Существует функция strrsep, которая
просматривает строку в обратном направлении, от конце к началу
строки.

Пример использования функции, который выводит все слова
разделённые пробелами или символами пунктуации:

ld hl, string ; исходная строка текста
loop:
ld de, delimiters ; строка разделителей
call strsep
jr nz, endloop ; больше слов нет

push de ; продолжение строки
call printhl ; вывод слова по адресу HL
call prnewln ; перевод строки
pop hl
jr loop
endloop:
ret

delimiters:
db 0x09, " ,.;:?!", 0
string:
db "слово1,слово2 слово3.слово4?слово5", 0






strspn
======

Вход:
HL = указатель на строку
DE = указатель на строку-массив разделителей
-------
BC, HL = количество символов

Функция подсчитывает количество символов от начала строки
заданной регистром HL, входящих во множество символов
заданных регистром DE.

Для подсчёта символов не входящих в множество заданных существует
фунцкия strcspn. Для подсчёта символов с конца строки существуют
функции strrspn и strrcspn.





strspnp
=======

Вход:
HL = указатель на строку текста
DE = указатель на строку-массив разделителей
------
Выход:
ZF==1 если отсутствующий символ найден
HL = указатель на символ отсутствующий в заданном массиве

Функция осуществляет поиск в строке, заданной регистром HL,
любого символа отсутствующего в множестве заданном строкой DE.
В случае, если такой символ найден, флаг Z будет установлен
и регистр HL будет содержать адрес этого символа.








swab
====

Вход:
HL = массив источник
DE = массив приёмник
BC = размер массивов

Функция swab копирует число байтов заданное в регистре BC из
массива источника в массив приёмник, при этом соседние байты
чётные и нечётные (по счёту) байты меняются местами. То-есть,
если в массиве-источнике содержалась строка "12345678", то
после применения функции массив-приёмник будет содержать
строку "21436587".





tolower
========

A = tolower( A )

Символ заданный в регистре A переводится в нижний регистр и
возвращается в регистре A. Функция работает только с ASCII
символами с кодами 32-127 (с буквами латинского алфавита),
национальные алфавиты в текущей версии не поддерживаются.





toupper
========

A = toupper( A )

Символ заданный в регистре A переводится в верхний регистр и
возвращается в регистре A. Функция работает только с ASCII
символами с кодами 32-127 (с буквами латинского алфавита),
национальные алфавиты в текущей версии не поддерживаются.





atow
=====

Вход:
HL = указатель на строку
-----
Выход:
HL = число или указатель на ошибочный символ
DE = указатель на конечный символ
CF=1 -- признак ошибки

Функция преобразует строку, адрес которой передаётся в
регистре HL, в число. Строка должна содержать беззнаковое
целое число в диапазоне 0..65535 записанное в десятичной
системе счисления. Ведущие пробелы игнорируются, а
преобразование заканчивается на первом нецифровом символе.
Число должно состоять минимум из одного цифрового символа.
В случае успешного преобразования в регистре HL возвращается
двоичный эквиэвалент числа, регистр DE будет указывать на символ
строки следующий за числом, а флаг переноса будет сброшен. В
случае, если корректное преобразование строки в число
невозможно, флаг переноса будет установлен, а регистр HL будет
указывать на ошибочный символ.





htoa
=====

Вход:
A = число 0..255
HL = указатель на строку (минимум 3 байта)
----
Выход:
HL = указатель на конец строки

Функция записывает безнаковое число заданное в регистре A в
строку заданную регистром HL, в шестнадцатеричной системе
счисления. Будет записано 2 цифры (ведущий ноль присутствует)
и символ с кодом 0 заканчивающий строку. Таким образом, HL
должен указывать на строку с минимальной длиной в 3 байта.
По завершению функции регистр HL будет указывать на последний
символ строки (завершающий 0).





wtoa
=====

Вход:
BC = число 0..65535
HL = указатель на строку (минимум 6 байт)
------
Выход:
HL = указатель на 0 завершающий строку.

Функция записывает беззнаковое число, заданное в регистре BC,
в строку заданную регистром HL, в десятичной системе счисления.
Ведущие нули не записываются. Может быть записано до 6-и байт,
включая символ с кодом 0 заканчивающий строку. В регистре HL
возвращается указатель на последний символ строки (код 0).





ltoa
=====

Вход:
HL = указатель на строку (минимум 11 байт)
(DE,BC) = 32-разрядное число
-----
Выход:
HL = указатель на последний символ строки

Функция записывает 32-разрядное беззнаковое число в строку, в
десятичной системе счисления. Ведущие нули не записываются.
Число задаётся в регистрах DE и BC (в DE старшие разряды),
указатель на строку задаётся регистром HL. Может быть записано
до 11-и байт, включая символ с кодом 0 заканчивающий строку. В
регистре HL возвращается указатель на последний символ строки
(код 0).
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1535
Joined: 07 Apr 2007, 01:08
Group: Registered users

Postby fk0 » 27 Dec 2011, 23:22

DimkaM wrote:дохера места сжирает, ежли с иара выдёргивать.


ruki.sys не знаю правда в каком месте. Выдерни из хайтека если что.

TS-Labs wrote:фк0: объясни чем плохи асмовые вставки на сях? Я например чотко вижу что придется пилить множество риалтаймовых процедур на асме. Я не понимаю что в этом плохого?


Realtime != ассемблер. Скорей наоборот. Ассемблер отсутстие мозгов в голове не заменяет. Realtime всего лишь гарантированное время реакции, а не спортивно максимально быстрое, при посредственном всём остальном.

Что плохого? А то, что они объективно не нужны. За тебя эту работу сделали и лучше, чем ты это сделаешь сходу. Типично, но не факт (в частности, опенсоурсные libc для AVR вполне достойные, а IAR и hitech ещё то говно).

jdigreze wrote:Вот же ж на-Cи-льник то!


Хороший насильник типично умеет и на асме неплохо (только асм конкретного проца давно забыл). А вот наоборот -- не факт.
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1535
Joined: 07 Apr 2007, 01:08
Group: Registered users

Postby TS-Labs » 28 Dec 2011, 00:45

fk0 wrote: частности, опенсоурсные libc для AVR вполне достойные, а IAR и hitech ещё то говно

libc AVR: имеется в виду гцц под авр?
IAR и хайтек: тут ты про з80 или про авр?

Вопрос: вот есть сферический в вакууме хайтек под з80. Есть в нем принтф. Компилим говнокод для спека, требуется вывести символы в чюдо-текстмод. Что делать в таком случае?

fk0 wrote:За тебя эту работу сделали и лучше, чем ты это сделаешь сходу.

Дебаг в асме компилированного гцц-ом си под авр показал наличие офигительных просеров оптимизации. Например num8 = num32 >> 24; компилится в mov r27, r26 : mov r26, r25: mov r25, r24 : mov r27,0 , и r24 с понтом содержит старшие 8 бит из р24:р27. Могу нотарильно заскриншотить ) И результат других регов не юзается.
TS-Labs
 
Posts: 1150
Joined: 19 Apr 2010, 10:10
Location: Wildest West
Group: Registered users

Postby fk0 » 28 Dec 2011, 01:18

Спор ни о чём. Непонятен тип num8, непонятен уровень оптимизации и т.п. "ваш C -- говно, любители пишут на ассемблере..." Только вы на ассемблере и писать-то не умеете тоже, как и на C. XXX -- говно. Ну сделай лучше. Пиздеть каждый может.
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1535
Joined: 07 Apr 2007, 01:08
Group: Registered users

Postby TS-Labs » 28 Dec 2011, 02:36

Уровень оптимизации максимальный. Нум8 - U8, num32 - U32.
Вернусь к возне с юсб драйвером - заскриншочу. Охуеешь, инфа 100%.
ЗЫ. Поднастрой детекторы, чтоб понимать, когда я просто пытаюсь обменяться технической инфой, и даже не пытаюсь что-либо доказать, просто привожу факты.
TS-Labs
 
Posts: 1150
Joined: 19 Apr 2010, 10:10
Location: Wildest West
Group: Registered users

PreviousNext

Return to Coding

Who is online

Users browsing this forum: No registered users and 1 guest

cron