........Выбрал второй, внутри таблицы, т. к. он компактнее.
Разве? убирай его из таблицы и везде перед (CALL TABLE) вместо (MOVF INDx,W) пиши (RLNCF INDx,W)
Про PCLATH тебя не зря предупреждают. До (ADDWF PCL,F) надо бы подгружать старший байт:
Код:
MOVLW HIGH TABLE
MOVWF PCLATH
Есть ещё некоторые нюансы, на которые тебе стоило бы обратить внимание:
Во-первых, не надо "прописывать" спецрегистры (типа: BSR EQU 0xFE0 .......), всё это есть в файле"18f4520.inc", и подключив его, ты таким образом одной строчкой разместил в этом месте всё его содержимое. Этот принцип важно понять и использовать. К примеру ты можешь все свои регистры, флаги, константы и прочие определения оформить в отдельном файле и просто подключить его в каком-то главном (типа main.asm), который станет картой всего твоего проекта. Рано или поздно вертикальный скроллинг всё равно заставит прийти к этому, но лучше как можно раньше начать привыкать к более грамотному оформлению проекта. Тогда будет гораздо легче/быстрее ориентироваться/перемещаться.
во-вторых, слишком много подробных комментов. Зачем описывать действия команд, если знаешь их наизусть.
Вместо нулей, единичек, двоек....... пиши имена W, F, Z ........
Разберись с необходимостью "очистки" флага Z (как и C/DC) перед той или иной арифметической операцией. Проработай этот момент в симуляторе.
Ну и стоило бы наверное изучить 18-е команды, пройтись по строчкам, можно много чего оптимизировать. Да и так лучше формируется/закрепляется навык, нежели когда просто получаешь готовое решение.
в 18-х кстати можно и через прямое чтение flash делать доступ к массиву.
саму таблицу в этом случае можно написать так:
Код:
TABLE_7IND
DB b'00000011',b'10011111',b'00100101',b'00001101',b'10011001'
DB b'01001001',b'01000001',b'00011111',b'00000001',b'00001001'
В этом случае отсутствует команда возврата (retlw) у каждого байта и соответственно массив сжимается в два раза.
А вот так можно оформить доступ:
Код:
;;;;
MOVF INDx,W
CALL L.7IND
;
;
;
L.7IND
ADDLW LOW TABLE_7IND
MOVWF TBLPTRL
;
MOVLW HIGH TABLE_7IND
MOVWF TBLPTRH
TBLRD*
MOVF TABLAT,W
RETURN
;;;;