Важная информация

User Tag List

Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 19 из 19

Тема: Поделитесь парой процедур (печать, преобразование в число)

  1. #11
    Master Аватар для DenisGrachev
    Регистрация
    15.04.2011
    Адрес
    г. Новосибирск
    Сообщений
    741
    Спасибо Благодарностей отдано 
    39
    Спасибо Благодарностей получено 
    211
    Поблагодарили
    44 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от STD Посмотреть сообщение
    процедурой, которая переводит текстовую строку, в которой написано число, в собственно число. Те текст "32000" в число 32000.
    А для какой цели? Если для счёта в игре, то я использую такую штуку от автора AGD. Счёт храниться как строка и печатаешь его как строку, а для добавления используется addScore.

    Код:
    score  defb "000000"
    
    addScore  ld a,(hl)           ; current value of digit.
              add a,b             ; add points to this digit.
              ld (hl),a           ; place new digit back in string.
              cp 58               ; more than ASCII value '9'?
              ret c               ; no - relax.
              sub 10              ; subtract 10.
              ld (hl),a           ; put new character back in string.
    uscor0    dec hl              ; previous character in string.
              inc (hl)            ; up this by one.
              ld a,(hl)           ; what's the new value?
              cp 58               ; gone past ASCII nine?
              ret c               ; no, scoring done.
              sub 10              ; down by ten.
              ld (hl),a           ; put it back
              jp uscor0           ; go round again.
    Т.е. когда нужно добавит счёта, например 5 очков, делаем так:

    Код:
           ld hl,score+5
           ld b,5
           call addScore
    Когда нужно реализовать hiScore, просто сравниваем два набора строк, например так:

    Код:
    checkHiScore
            xor a
            ld (HI_SCORE_FLAG),a
                                     ;cp two sets of ASCII
            ld ix,score
            ld hl,hScore
            ld b,6                          ;5 digits only, the 6th one is always 0
    chilp	ld a,(ix+0)			;new score byte
    	cp (hl)				;cp old score byte
    	ret c				;if carry set old score is higher
    	jr nz,newsc			;nc & nz means new score is higher
    	inc ix	
    	inc hl
    	djnz chilp
    	ret				;reaching here means hi & low score equal
    newsc   ld hl,score                     ;ok new score is higher than old hi score
            ld de,hScore                   ;new high score, so ldir it in place
    	ld bc,6
            ldir
            ;set hi score flag
            ld a,1
            ld (HI_SCORE_FLAG),a
            ret
    Последний раз редактировалось DenisGrachev; 29.07.2016 в 10:38.

  2. #12
    Veteran Аватар для Destr
    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,802
    Спасибо Благодарностей отдано 
    249
    Спасибо Благодарностей получено 
    113
    Поблагодарили
    87 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от DenisGrachev Посмотреть сообщение
    Счёт храниться как строка
    А чем плох неупакованый (или даже упакованый) BCD ?
    Как я понял со строкой этой то просто так к ней ну скажем 314 не прибавишь?

  3. #13
    Member
    Регистрация
    14.03.2016
    Адрес
    г. Псков
    Сообщений
    48
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    2 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А для какой цели?
    Для того, что бы можно было описывать сцены игры и передавать необходимые параметры движку просто текстовым файлом. Я сделал первую версию движка, где команды котируются одним байтом (типа 01 - открыть окно + байты параметров, 02 - ждать нажатие любой клавиши, 03 - вывести спрайт и тд) и нашел редактор (нотепад++), в котором можно помимо текста вводить и печатать и любые однобайтные символы, но набрав 4-5 сцен понял, что хотя это и работает, но дико потом нечитаемо. Поэтому сейчас переделываю движок, что он обрабатывал тектовые файлы типа:
    OPWIN 5,5,10,5
    PAUS 300
    TEXT Вы вошли в пещеру, где протекает подземная река.
    PUTSPR 10,10,7,6,30000
    ....

  4. #14
    Guru Аватар для SAM style
    Регистрация
    28.02.2005
    Адрес
    Великий Новгород
    Сообщений
    2,055
    Спасибо Благодарностей отдано 
    10
    Спасибо Благодарностей получено 
    218
    Поблагодарили
    92 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от STD Посмотреть сообщение
    Для того, что бы можно было описывать сцены игры и передавать необходимые параметры движку просто текстовым файлом. Я сделал первую версию движка, где команды котируются одним байтом (типа 01 - открыть окно + байты параметров, 02 - ждать нажатие любой клавиши, 03 - вывести спрайт и тд) и нашел редактор (нотепад++), в котором можно помимо текста вводить и печатать и любые однобайтные символы, но набрав 4-5 сцен понял, что хотя это и работает, но дико потом нечитаемо. Поэтому сейчас переделываю движок, что он обрабатывал тектовые файлы типа:
    OPWIN 5,5,10,5
    PAUS 300
    TEXT Вы вошли в пещеру, где протекает подземная река.
    PUTSPR 10,10,7,6,30000
    ....
    Определил кучу макросов с параметрами, которые при компиляции выдают байт-код и сидишь, пользуешь их. В 3-4 раза место экономится по сравнению с текстовым вариантом:
    Код:
    MACRO tRaiseHP id,prc
    db 6,24,id,prc
    ENDM
    
    ...
    
    tNpcAni 0,c00drink
    tRaiseHP 0,64
    tWaitNPC 0
    tEnd
    Все любят гипножабу

  5. #15
    Member
    Регистрация
    14.03.2016
    Адрес
    г. Псков
    Сообщений
    48
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    2 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну, у меня все равно 90% объема приходится на текст описания локаций и игровой ситуации, так что экономить на предварительной компиляции команд движка смысла нет, а вот простота правки сцен при текстовом описании всех необходимых команд привлекает.

  6. #16
    Super Moderator Аватар для Alex Rider
    Регистрация
    07.02.2008
    Адрес
    г. Рязань
    Сообщений
    2,908
    Спасибо Благодарностей отдано 
    29
    Спасибо Благодарностей получено 
    89
    Поблагодарили
    31 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Печать 42 символов в строке, которую я заоптимизировал по скорости как смог. Печатает с маской и, кажется, с переносом на следующую строку.
    Код:
    write:                   ; in:
                             ;      hl - screen addr
                             ;      a' - shift
                             ;      hl' - text address (with no control data)
    
    
    
    
    .loop:
            exx
            ld a,(hl)
            inc hl
            and a
            ret z
            exx
            call out_char_42
            jr .loop
    
    
    out_char_42:                            ;
                                            ; in
                                            ;       hl = screen addr
                                            ;       a = char code
                                            ;       a' = shift count
                                            ; out
                                            ;       hl = screen addr of next char
                                            ;       a' = shift count of next char
    font_high_address:                      EQU $ + 2
            ld e,a
            ld d,#00                        ; high font address
            ex af
            and a
            jp z,no_shift                   ; в a - не код, а смещение!
            ld c,a
            ex af
            ld a,c
            neg
            sub print_loop_length + 2
            ld (shift_instruction_displacement),a
            sla c
            ld b,high Tables.shift_table
            ld a,(bc)
            ld (left_place_mask),a
            ld (left_clear_mask),a
            inc c
            ld a,(bc)
            ld (right_place_mask),a
            ld (right_clear_mask),a
            ld b,9
            jp print_loop_entry_point
            rrca
            rrca
            rrca
            rrca
            rrca
            rrca
            rrca
            rrca
    print_loop_start:
            ld c,a
    left_place_mask:                        equ $ + 1
            and 0
            xor (hl)
    left_clear_mask:                       equ $ + 1
            and 0
            xor (hl)
            ld (hl),a
            inc l
            ld a,c
    right_place_mask:                       equ $ + 1
            and 0
            xor (hl)
    right_clear_mask:                       equ $ + 1
            and 0
            xor (hl)
            ld (hl),a
            dec l
            inc h
    print_loop_entry_point:
            ld a,(de)
            inc d
    print_loop_end:
            djnz $
    nex_pos_calc:
            ld a,h
            sub 8
            ld h,a
            ex af                   ; restore hl!!!
            add a,6
            cp 8
            jp nc,1F
            ex af
            ret
    1:      and 7
            ex af
            inc l
            ret nz
            ld a,h
            add a,8
            ld h,a
            ret
    
    
    no_shift:
            ex af
            ex de,hl
            ld c,#03
    
    
            ld a,(de)
            and c
            or (hl)
            ld (de),a
            inc h
            inc d
            ld a,(de)
            and c
            or (hl)
            ld (de),a
            inc h
            inc d
            ld a,(de)
            and c
            or (hl)
            ld (de),a
            inc h
            inc d
            ld a,(de)
            and c
            or (hl)
            ld (de),a
            inc h
            inc d
            ld a,(de)
            and c
            or (hl)
            ld (de),a
            inc h
            inc d
            ld a,(de)
            and c
            or (hl)
            ld (de),a
            inc h
            inc d
            ld a,(de)
            and c
            or (hl)
            ld (de),a
            inc h
            inc d
            ld a,(de)
            and c
            or (hl)
            ld (de),a
            inc h
            inc d
            ex de,hl
            jp nex_pos_calc
    
    
    
    
    print_loop_length:                      equ print_loop_end - print_loop_start
    shift_instruction_displacement:         equ print_loop_end + 1
    
    
    
    
    at_char_42:
                                    ; in
                                    ;       b = row, c = col (in 6-pix chars)
                                    ; out
                                    ;       hl = screen addr
                                    ;       a' = shift_count
    
    
    
    
            ld a,b
            call SYSTEM.GET_SCREEN_ADDRESS
            ld a,c
            add a,a
            add a,c
            ld c,a
            srl a
            srl a
            add a,l
            ld l,a
            ld a,c
            and #03
            add a,a
            ex af
            ret
    
    
    
    
    at_pix_42:
                                    ; in
                                    ;       b = row (in shar rows), c = col (in pixels)
                                    ; out
                                    ;       hl = screen addr
                                    ;       a' = shift_count
            ld a,b
            call SYSTEM.GET_SCREEN_ADDRESS
            ld a,c
            srl a
            srl a
            srl a
            add a,l
            ld l,a
            ld a,c
            and #07
            ex af
            ret
    UPD:
    Код:
    GET_SCREEN_ADDRESS              EQU #0e9e
    UPD2: Это не фантастика оптимизации, но все равно шучтро работает. Пока читал свое сообщение заметил, что при текущем смещении более 4 пикселей относительно границ знакоместа неплохо бы крутить символ влево.
    Последний раз редактировалось Alex Rider; 31.07.2016 в 02:04.
    ZX Evolution Rev C + ZXM-SoundCard Extreme + NeoGS.

  7. #16
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #17
    Veteran Аватар для Destr
    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,802
    Спасибо Благодарностей отдано 
    249
    Спасибо Благодарностей получено 
    113
    Поблагодарили
    87 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    STD, Очень даже ТРУ ссыль
    По себе скажу - офигеть как пересмотришь свой подход, если окажусь прав (или неправ) - отпишись (тут на форуму).
    Если поленился изучить что и как там - бог тебе судья...

    - - - Добавлено - - -

    Твой движок (предполагаемый, как ты его описал) - легко может быть реализован на базе статьи.
    (спасибо Vitamin`у, он молодец, это мы лохи...)

    P.S. Вообще, эта статья прям рекомендация лучших собаководов! (реклама 90-х, тут для поднятия духа, тогда все в рекламу верили).
    Хорошо написана, и если не поленится и изучить, то можно написать свой компилятор-интерпретатор/та что угодно! Невзирая на уровни (ну конечно нулевое кольцо не обойти, но ведь задачи такие не ставятся).
    Последний раз редактировалось Destr; 31.07.2016 в 03:01.

  9. #18
    Member
    Регистрация
    14.03.2016
    Адрес
    г. Псков
    Сообщений
    48
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    2 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Destr, спасибо за тру ссыль, нереально интересно, обязательно всю прочитаю, но такого космоса в моей проге не требуется, никаких текстовых расчетов там нет. Вчера на база процедуры из библиотеки Andrew я уже сделал свою и все даже заработало 8). Если кому-то понадобится - как-то так:
    Код:
    ;===========================================================
    ;БЛОК ОБРАБОТКИ ТЕКУЩЕЙ СЦЕНЫ
    ;(РАСПОЗНАНИЯ УПРАВЛЯЮЩИХ КОДОВ)
    ;===========================================================
    
    
    ;Распознание кода WWN - Work WiNdow
    ;Установка параметров текущего окна
    OSN00	ld  hl,(POZIC) : ld  a,(hl) 
    		cp  "W" : jr nz,OSN01
    		inc hl  : ld  a,(hl) 
    		cp  "W" : jr nz,OSN01
    		inc hl  : ld  a,(hl) 
    		cp  "N" : jr nz,OSN01
    			call COD00	;Вызываем процедуру обработки команды WWN
    			inc hl		;Переводим указатель на симлов перевода строки
    			inc hl		;Переводим указатель на следующий код
    			ld  (POZIC),hl 
                  jp  OSN00		;В начало цикла обработки кодов
    
    
    ;Распознание кода WCL - Window CLear
    OSN01	ld  hl,(POZIC) : ld  a,(hl)
    		..................
    		..................
    
    
    ;===========================================================
    ;БЛОК ОБРАБОТЧИКОВ РАСПОЗНАННЫХ КОДОВ
    ;===========================================================
    
    ;-------------- COD ##00 ---------------
    ;ПРОЦЕДУРА УСТАНОВКИ ПАРАМЕТРОВ
    ;ПРОИЗВОЛЬНОГО ТЕКУЩЕГО ОКНА
    
    COD00	inc hl       ;перешли на пробел после команды WWN
    		inc hl       ;перешли на 1ую цифру 1ого преобразованного числа
    
    		ld   a,2		; Указали подпрограмме конвертации, что число
    		ld   (RAZR),a	; состоит из двух символов
    		call CONV		; Вызываем конвертацию текста в число
    		ld   (COLW),a	;СОХРАНИЛИ X КООРД ОКНА
           
    		inc  hl		;перешли на 1ую цифру второго числа
    		call CONV
    		ld   (ROWW),a	;СОХРАНИЛИ Y КООРД ОКНА
    		..........................
    		.........................
    		ret
    
    
    ;===========================================================
    ;ПРОЦЕДУРА КОНВЕРТАЦИИ ТЕКСТА В ЧИСЛО
    ;===========================================================
    ; на входе в HL - адрес первого символа в преобразумом числе
    ;              в RAZR - разрядность преобразуемого числа (длина строки 5,4,3,2 или 1) 
    
    CONV		ld bc,0		; Очистили переменную с
     		ld (CONVR),bc 	; результатом преобразования
    
    		ld a,(RAZR)		;
    		cp 5         		;
    		jr z,CNV5    	; в засисимости от разрядности
    		cp 4			; преобразуемого числа
    		jr z,CNV4		; будет вызывать подпрограмму
    		cp 3			; преобразования каждого разряда
    		jr z,CNV3		;
    		cp 2			;
    		jr z,CNV2		;
    		cp 1			;
    		jr z,CNV1		;
    
    CNV5		ld bc,10000
    		call CNVOSN
    
    CNV4		ld bc,1000
    		call CNVOSN
    
    CNV3		ld bc,100
    		call CNVOSN
    
    CNV2   	ld bc,10
    		call CNVOSN
    
    CNV1 	ld bc,1
    		call CNVOSN
    		ret			;ВЫХОД ИЗ ПРОЦЕДУРЫ
    
    CNVOSN	push hl 
    		ld  a,(hl) 		;ВЗЯЛИ ЦИФРУ ИЗ ТЕКСТА
    		sub 48     		;ПОЛУЧИЛИ ЕЕ ЗНАЧЕНИЕ
    		ld  e,a    		;В de ПОЛУЧИЛИ ЦИРФУ
    		ld  d,0    		;ИЗ ТЕКСТА
    		ld  h,b    		;В hl ПОЛУЧИЛИ МНОЖИ-
    		ld  l,c			;ТЕЛЬ РАЗРЯДА из ВС
    		call 12457 		;МНОЖИМ de НА hl 
           		ld  de,(CONVR)
           		add hl,de
           		ld  (CONVR),hl
           		pop hl
           		inc hl    
           		ret
    RAZR   defb 0
    CONVR  defb 0,0
    
    ; На выходе в переменной CONV будет результат - число преобразовааное из текста
    ; в HL будет адрес, следующего байта за преобразованным числом,
    ; если это было не последнее число в команде, то HL удет указывать на символ ","
    ; между числами, если последний - то на байт "перевода строки".

  10. #19
    Veteran Аватар для Destr
    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,802
    Спасибо Благодарностей отдано 
    249
    Спасибо Благодарностей получено 
    113
    Поблагодарили
    87 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от STD Посмотреть сообщение
    но такого космоса в моей проге не требуется
    Тут цимес в том что не принцип ЧТО делается, а именно КАК это делается (организация анализа и прочее).
    В общем дерзай у вдруг внезапно увидишь какая это тема!
    (я например несколько раз перечитывал, а потом вдруг глаза открылись что такой подход применим в очень широком поле деятельности, и вообще профессиональная штука, это не IF-THEN какой-нибудь, это совсем другой уровень!).

Страница 2 из 2 ПерваяПервая 12

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 19
    Последнее: 25.10.2021, 08:54
  2. Пара процедур для новой игры SLIP'a
    от newart в разделе Программирование
    Ответов: 34
    Последнее: 29.03.2014, 17:54
  3. Библиотека нужных процедур для написания демо
    от GM BIT в разделе Программирование
    Ответов: 297
    Последнее: 14.02.2014, 08:47
  4. Число проданных копий
    от alone в разделе Игры
    Ответов: 9
    Последнее: 21.03.2013, 22:48
  5. Быстро вывести число 0-255 на экран
    от Aprisobal в разделе Программирование
    Ответов: 7
    Последнее: 26.01.2005, 08:05

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •