ZXNet эхоконференция «code.zx»


тема: "String" --> #Word



от: Eugene Palenock
кому: Valerij Kozhevnikoff
дата: 24 Mar 2001

Привет, Valerij!

23 Мар 01 01:30, Valerij Kozhevnikoff -> All:

VK> Киньте кто-нить плюшку, делающую сабж.
VK> Типа имеем текстом строку "32768" - надо получить число #8000.
VK> Я тут попробовал -- как-то громоздко получается...

Hу типа сейчас напишу... Тут могут быть глюки, поскольку
это прямо тут сочинялось. Hо общяя идея надеюсь понятна...

LD HL,адрес стринга
LD B,длина стринга
LD DE,s_tmp ;адрес буфера на 5 байт
LD LX,B

M1 LD A,(HL)
SUB 30h
LD (DE),A
INC HL
INC DE
DJNZ M1

Подготовка. Hикаких проверок от дураков тут не делается.
Внимательнее с кол-вом цифр и наличием не цифр среди них

;1
DEC DE
LD A,(DE)
LD H,0
LD L,A
DEC LX
RET Z

Преобразование единиц.

;10
DEC DE
LD A,(DE)
AND A
JR Z,C2Z
PUSH DE
PUSH HL
LD HL,0
LD DE,10
C2 ADD HL,DE
DEC A
JR NZ,C2
POP DE
ADD HL,DE
POP DE
C2Z DEC LX
RET Z

Вообще это не оптимально всё написалось, но если несколько
разных направлений оптимизации, поэтому не буду...

;100
DEC DE
LD A,(DE)
AND A
JR Z,C3Z
PUSH DE
PUSH HL
LD HL,0
LD DE,100
C3 ADD HL,DE
DEC A
JR NZ,C3
POP DE
ADD HL,DE
POP DE
C3Z DEC LX
RET Z

;1000
DEC DE
LD A,(DE)
AND A
JR Z,C4Z
PUSH DE
PUSH HL
LD HL,0
LD DE,1000
C4 ADD HL,DE
DEC A
JR NZ,C4
POP DE
ADD HL,DE
POP DE
C4Z DEC LX
RET Z

;10000
DEC DE
LD A,(DE)
AND A
JR Z,C5Z
PUSH DE
PUSH HL
LD HL,0
LD DE,10000
C5 ADD HL,DE
DEC A
JR NZ,C2
POP DE
ADD HL,DE
POP DE
C5Z RET

от: Wladimir Bulchukey
кому: Valerij Kozhevnikoff
дата: 25 Mar 2001
Приветствую, Valerij!

23 Мар 01 01:30, Valerij Kozhevnikoff -> All:

VK> Киньте кто-нить плюшку, делающую сабж.
VK> Типа имеем текстом строку "32768" - надо получить число
VK> #8000. Я тут попробовал -- как-то громоздко получается...

LD DE,STRING ; адрес строки
LD BC,STRIN1-STRING ; длина строки
XOR A
CALL #2ABB
LD B,#1D
RST #28
DEFB #3B,#38
CALL #2DA2
RET ; числовое 16-битное значение строки в BC
;-
STRING DEFM "32768" ; любое строковое представление числа
; 0...65535
STRIN1
END

С наилучшими -
Wlodek. mailto: wlblack@chat.ru http://www.wlodeks.boom.ru
[ZX] [Golyanovo] [Радио "Ретро" 72.92 МГц]

от: Valerij Kozhevnikoff
кому: Wladimir Bulchukey
дата: 25 Mar 2001
Здравствуй, Wladimir!

25 Мар 01 00:36, Wladimir Bulchukey -> Valerij Kozhevnikoff:

VK>> Киньте кто-нить плюшку, делающую сабж.
VK>> Типа имеем текстом строку "32768" - надо получить число
VK>> #8000. Я тут попробовал -- как-то громоздко получается...

WB> LD DE,STRING ; адрес строки
WB> LD BC,STRIN1-STRING ; длина строки
WB> XOR A
WB> CALL #2ABB
WB> LD B,#1D
WB> RST #28
WB> DEFB #3B,#38
WB> CALL #2DA2
WB> RET ; числовое 16-битное значение строки в BC
WB> ;-
WB> STRING DEFM "32768" ; любое строковое представление числа
WB> ; 0...65535
WB> STRIN1
WB> END

Вот! Калькулятор рулез! Hи байта врагу!
А похожей плюшки делающей обратное действие у тебя не найдется?


WBR, Jason.

[Team Obituary][Team Friday 13th][Team Злобные Маньяки][Team Огромные Топоры]

от: Oleg Grigoriev
кому: Valerij Kozhevnikoff
дата: 25 Mar 2001

Пусть враги твои, Valerij, умрут без сыновей!

23 March 2001 at 01:30, Valerij Kozhevnikoff => All:

VK> Киньте кто-нить плюшку, делающую сабж.
VK> Типа имеем текстом строку "32768" - надо получить число #8000.
VK> Я тут попробовал -- как-то громоздко получается...

элементарно всё получается.
в сумматор загоняется первая цифра, умножается на десять, добавляется
вторая, умножается на десять, добавляется третья... и так до полного
удовлетворения. :)

[ WBR, Oleg. ]
[ 19:57 25 March XXXVI A.S. ]

от: Oleg Grigoriev
кому: EP & WB
дата: 25 Mar 2001

Пусть враги твои, EP, умрут без сыновей!

25 March 2001 at 00:36, Wladimir Bulchukey => Valerij Kozhevnikoff:

я хренею... :(

на входе - de указывает на стриг, оканчивающийся нулём, на выходе в hl -
число.

ld hl, #0000

loop ld a, (de)
or a
ret z
add hl, hl
ld b, h
ld c, l
add hl, hl
add hl, hl
add hl, bc
sub #30
ld c, a
ld b, #00
add hl, bc
jp loop

[ WBR, Oleg. ]
[ 20:23 25 March XXXVI A.S. ]

от: Kirill Frolov
кому: Valerij Kozhevnikoff
дата: 26 Mar 2001
Hемедленно нажми на RESET, Valerij!

24 Mar 01 02:06, Eugene Palenock wrote to Valerij Kozhevnikoff:

VK>> Киньте кто-нить плюшку, делающую сабж.
VK>> Типа имеем текстом строку "32768" - надо получить число #8000.
VK>> Я тут попробовал -- как-то громоздко получается...

; de=строка цифр с нулём с конце -> hl=двоичное число
; проверок на корректность входных данных и на
; переполнение не производится!

atoi: ld hl, 0

nextc: ld a, (de)
or a
ret z

inc de
add hl, hl
ld c, l
ld b, h
add hl, hl
add hl, bc
add hl, hl
ld b, 0
ld c, a
add hl, bc
jr nextc

от: Eugene Palenock
кому: Valerij Kozhevnikoff
дата: 26 Mar 2001

Привет, Valerij!

25 Мар 01 15:12, Valerij Kozhevnikoff -> Eugene Palenock:

VK>>> Я тут попробовал -- как-то громоздко получается...
EP>> это прямо тут сочинялось. Hо общяя идея надеюсь понятна...
VK> Угу. У меня примерно то же самое получилось.
VK> А нужно чтобы памяти занимало поменьше.

65 байт у тебя нету ??? Можно ведь так сделать:

=== Hачало Windows Clipboard ===
LD HL,адрес стринга
LD B,длина стринга

LD DE,M5
LD LX,B
M1 LD A,(HL)
SUB 30h
LD (DE),A
INC HL
INC DE
DJNZ M1
DEC DE
LD A,(DE)
LD H,0
LD L,A
DEC LX
RET Z
LD BC,10
CALL M2
LD C,100
CALL M2
LD BC,1000
CALL M2
LD BC,10000
CALL M2
M2 DEC DE
LD A,(DE)
AND A
JR Z,M3
M4 ADD HL,BC
DEC A
JR NZ,M4
M3 DEC LX
RET NZ
POP AF
RET
M5 DEFS 5,0

=== Конец Windows Clipboard ===

С уважением, Евгений.

от: Wladimir Bulchukey
кому: Valerij Kozhevnikoff
дата: 26 Mar 2001
Приветствую, Valerij!

25 Мар 01 15:21, Valerij Kozhevnikoff -> Wladimir Bulchukey:

VK> А похожей плюшки делающей обратное действие у тебя не
VK> найдется?

; вход: BC = число

CALL #2D2B
CALL #361F
CALL #2BF1

; выход: на этом месте DE = адрес начала строки символов
; BC = длина строки.

С наилучшими -
Wlodek. mailto: wlblack@chat.ru http://www.wlodeks.boom.ru
[ZX] [Golyanovo] [Радио "Ретро" 72.92 МГц]

от: Wladimir Bulchukey
кому: Oleg Grigoriev
дата: 28 Mar 2001
Приветствую, Oleg!

25 Мар 01 20:56, Oleg Grigoriev -> EP & WB:

OG> я хренею... :(

OG> на входе - de указывает на стриг, оканчивающийся нулём,
OG> на выходе в hl - число.

OG> ld hl, #0000

OG> loop ld a, (de)
OG> or a
OG> ret z
OG> add hl, hl
OG> ld b, h
OG> ld c, l
OG> add hl, hl
OG> add hl, hl
OG> add hl, bc
OG> sub #30
OG> ld c, a
OG> ld b, #00
OG> add hl, bc
OG> jp loop

Что ж, помножили сложением на 8 да прибавили удвоенное исходное -
умножили на 10. :)
А калькулятор - штука полезная, вообще-то. В том примере
строка символов может содержать любое, не обязательно целое,
число и даже выражение. Если результат в конце не запихивать в BC,
можно таких дел натворить! :)
А хренеть, кстати, следует от отсутствия в твоем примере INC DE ;-)))))) .

С наилучшими -
Wlodek. mailto: wlblack@chat.ru http://www.wlodeks.boom.ru
[ZX] [Golyanovo] [Радио "Ретро" 72.92 МГц]

от: Wladimir Bulchukey
кому: Kirill Frolov
дата: 28 Mar 2001
Приветствую, Kirill!

26 Мар 01 19:17, Kirill Frolov -> Wladimir Bulchukey:

WB>> RST #28

KF> У тебя есть дока по функциям rst 28 ?

=== Cut ===

#00 - jump true
#01 - exchange
#02 - delete
#03 - subtract (вычитание; X-Y)
#04 - mult (умножение; X*Y)
#05 - div (деление; Y/X)
#06 - to-power (возведение в степень; X^Y)
#07 - or
#08 - no-&-no
#09 - no-l-eq
#0A - no-gr-eq
#0B - nos-eql
#0C - no-gtr
#0D - no-less
#0E - nos-eql
#0F - add (сложение; X+Y)
#10 - str-&-no
#11 - str-l-eq
#12 - str-gr-eq
#13 - strs-negl
#14 - str-gtr
#15 - str-less
#16 - str-gtr
#17 - strs-add
#18 - val$ (рекурсия; только через fp-calc-2)
#19 - usr-s
#1A - read-in
#1B - neg
#1C - code
#1D - val (рекурсия; только через fp-calc-2)
#1E - len
#1F - sin
#20 - cos
#21 - tan
#22 - asn
#23 - acs
#24 - atn
#25 - ln
#26 - exp
#27 - int
#28 - sqr
#29 - sgn
#2A - abs
#2B - peek
#2C - int(Y+0.5)
#2D - user-no
#2E - str$
#2F - chr$
#30 - not
#31 - duplicate
#33 - jump
#34 - stk-data
#35 - djnz
#36 - less-0
#37 - greater-0
#38 - end-calc (завершение работы с калькулятором)
#39 - get-argt
#3A - trunc
#3B - fp-calc-2 (вторичный вызов калькулятора - рекурсия)
#3C - e-to-fp
#3D - restack (Y целое -> Y в плавающей форме)
#86 и далее - series-06
#A0 - 0 (константа; занесение в стек константы)
#A1 - 1
#A2 - 1/2
#A3 - PI/2
#C0 и далее - st-mem-0
#E0 и далее - get-mem-0

=== Cut ===

С наилучшими -
Wlodek. mailto: wlblack@chat.ru http://www.wlodeks.boom.ru
[ZX] [Golyanovo] [Радио "Ретро" 72.92 МГц]

от: Valerij Kozhevnikoff
кому: Oleg Grigoriev
дата: 28 Mar 2001
Здравствуй, Oleg!

25 Мар 01 20:56, Oleg Grigoriev -> EP & WB:

OG> на входе - de указывает на стриг, оканчивающийся нулём, на выходе в hl -
OG> число.

Почти работает =)

OG> ld hl, #0000

OG> loop ld a, (de)
OG> or a
OG> ret z
OG> add hl, hl
OG> ld b, h
OG> ld c, l
OG> add hl, hl
OG> add hl, hl
OG> add hl, bc
OG> sub #30 ;KF0 этот sub потерял.
OG> ld c, a
OG> ld b, #00
OG> add hl, bc
OG> jp loop ;а inc de тут Пушкин сделает?


WBR, Jason.

[Team Obituary][Team Friday 13th][Team Злобные Маньяки][Team Огромные Топоры]

от: Kirill Frolov
кому: Valerij Kozhevnikoff
дата: 29 Mar 2001
Hемедленно нажми на RESET, Valerij!

27 Mar 01 21:04, Valerij Kozhevnikoff wrote to Eugene Palenock:

VK> Гхм. Зря я хвалил калькулятор. От нецифровых символов его плющит, а
VK> с их ловилкой оно весит тоже примерно столько.

Сюда и я и Ruiner писали один и тот-же нормальный алгоритм -- неужели не
видел?
Фильтровать элементарно!

; de=decimal in string --> hl=binary number; cf=1, de=illegal char. if
error

atoi: ld hl, 0
ld а, (de)
jr firstc

nextc: ld a, (de)
or a
ret z

firstc: sub '0'
ret c
cp 10
ccf
ret c
inc de
add hl, hl
ret c
ld c, l
ld b, h
add hl, hl
ret c
add hl, hl
ret c
add hl, bc
ret c
ld c, a
ld b, 0
add hl, bc
jr nc, nextc
ret

Это так много?




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Избранное - История с фантазией, Парадокс двадцать первого века, Выдержка из обезличенной переписки.
Hardware - О новой четырехканальной звуковой карте - DMA Sound.
Chat - рассуждения о хакерах

В этот день...   18 августа