PDA

Просмотр полной версии : Глубоко задумался над процедурой...или обращение в Вселенскому Разуму



Orionsoft
12.02.2007, 21:56
которая бы делала следующее:
на входе 35 байт (280 бит )
младший бит находится в 7 разряде первого (из 35) байта

необходимо процесс который :

последовательно переберёт 280 битную последовательность
если текущщий бит = 0 то записать номер (слово) этого бита в адрес выходных данных

т.е. если в 280 битовой последовательности все биты в нуле то на выходе было б 280 слов от нулевого до 280-ого


:eek: :v2_jawdr:

SAM style
12.02.2007, 22:05
А что делать, когда бит=1
Something like thizzz?


ld hl,OutPut
ld de,0
exx
ld hl,Input
ld b,35
lab1 ld a,(hl)
ld c,8
lab2 rla
exx
jr c,lab3
ld (hl),e
inc hl
ld (hl),d
inc hl
lab3 inc de
exx
dec c
jr nz,lab2
inc hl
djnz lab1
ret

Orionsoft
12.02.2007, 22:59
А что делать, когда бит=1
Something like thizzz?

если бит = 1 то ничего , а как пройдёт последовательность и все =1 записать AAFF например

Orionsoft
12.02.2007, 23:04
да , нужна и процедура которая делает из результата всё наоборот :v2_blink:

Orionsoft
12.02.2007, 23:18
правильно я раскомментил ?


ld hl,OutPut
ld de,0 ; счётчик бит ( 0-260 )
exx
ld hl,Input
ld b,35 ; счётчик байт
lab1 ld a,(hl)
ld c,8 ; счётчик бит в байте
lab2 rla : 7 бит в Carry
exx
jr c,lab3 ; если Carry =0 ( установлен ) то
ld (hl),e ; иначе записывем текущий номер бита в результат
inc hl ; +1 адрес результата
ld (hl),d
inc hl ; +1 адрес результата

lab3 inc de ; увеличиваем счётчик бит
exx
dec c ; уменьшаем 8 битовый проход
jr nz,lab2 ; биты еще остались ?

inc hl ; перешли к следующему байту последовательности
djnz lab1

ret

SAM style
12.02.2007, 23:26
правильно я раскомментил ?
Всё почти так и есть.
Только тут:


jr c,lab3 ; если Carry = 1 ( установлен ) то блок пропускается, иначе...

Orionsoft
12.02.2007, 23:30
" Этюды " - рулят ! :v2_clapp:

Orionsoft
13.02.2007, 13:35
а процедура наоборот делающая ?
если не трудно :rolleyes:

SAM style
13.02.2007, 17:36
Вход - список номеров выключеных байт (словами, по 2 байта). Список заканчивается словом #FFFF.


ld hl,Output ; сначала устанавливаем все биты
ld b,35
lab0 ld (hl),#FF
inc hl
djnz lab0
ld hl,Input
lab1 ld e,(hl) ; берём номер бита
inc hl
ld d,(hl)
inc hl
ld a,d ; если он #FFFF - выход
and e
inc a
ret z
push hl
ld a,e ; вычисляем маску для этого бита
and 7
ld c,#7F
jr z,lab3
lab2 rrc c
dec a
jr nz,lab2
lab3 ld a,d ; вычисляем адрес байта, в котором этот бит находится
rra
rr e
rra
rr e
rra
rr e
ld d,0
ld hl,OutPut
add hl,de
ld a,(hl) ; сбрасываем бит
and c
ld (hl),a
pop hl
jr lab1 ; переходим к следующему номеру

Можно ещё одну придумать, побыстрее, но только если список будет упорядоченым - от меньшего к большему.

Orionsoft
13.02.2007, 18:50
За что люблю спектрум - самая добрая платформа =)
SAMstyle :v2_cheer: