#include "P16C73.inc"
org 0x0000
goto Start ; Скок към началото на програмата
org 0x0020
RegA equ 0x20 ; Входна стойност A
ResL equ 0x21 ; Младши байт на резултата
ResH equ 0x22 ; Старши байт на резултата
PtrMas equ 0x23 ; Указател към масива Masiv
PtrRes equ 0x24 ; Указател към масива Results
Masiv equ 0x30 ; Масив с входни стойности
Results equ 0x40 ; Масив за запис на резултатите
Izraz
movf RegA, W ; Зареждаме A в W
movwf ResL ; Записваме в ResL
clrf ResH ; Нулираме ResH
rlf ResL, 1 ; Умножаваме по 2
rlf ResH, 1
bcf STATUS, C
rlf ResL, 1 ; Умножаваме по 4
rlf ResH, 1
bcf STATUS, C
rlf ResL, 1 ; Умножаваме по 8
rlf ResH, 1
movf RegA, W ; Зареждаме A в W
subwf ResL, 1 ; A ? 8 – A = A ? 7
btfss STATUS, C
decf ResH, 1
movlw 57
addwf ResL, 1 ; Добавяме 57
btfsc STATUS, C
incf ResH, 1
movlw 250
subwf ResL, 1 ; Изваждаме 250
btfss STATUS, C
decf ResH, 1
return ; Връщаме се
SaveResult
movf PtrRes, W ; Зареждаме указателя
movwf FSR ; Поставяме го във FSR
movf ResL, W
movwf INDF ; Записваме младшия байт
incf PtrRes, F ; Увеличаваме PtrRes
movf PtrRes, W
movwf FSR
movf ResH, W
movwf INDF ; Записваме старшия байт
incf PtrRes, F ; Увеличаваме PtrRes
return
Start
movlw Results
movwf PtrRes ; Инициализираме указателя за резултати
movlw 15
movwf RegA ; Пример 1 : A = 15
call Izraz
call SaveResult
movlw 170
movwf RegA ; Пример 2 : A = 170
call Izraz
call SaveResult
movlw 10
movwf Masiv ; Входна стойност 1
movlw 20
movwf Masiv+ 1 ; Входна стойност 2
movlw 30
movwf Masiv+ 2 ; Входна стойност 3
movlw 40
movwf Masiv+ 3 ; Входна стойност 4
movlw 50
movwf Masiv+ 4 ; Входна стойност 5
movlw 100
movwf Masiv+ 5 ; Входна стойност 6
movlw 170
movwf Masiv+ 6 ; Входна стойност 7
movlw Masiv
movwf PtrMas ; Указател към Masiv
movlw 7
Loop
movf PtrMas, W ; Копира стойността на PtrMas в работния регистър W
movwf FSR ; Зарежда FSR с адреса от PtrMas
movf INDF, W ; Зарежда W с данните от адреса, посочен от FSR
movwf RegA ; Записва стойността от W в RegA
call Izraz ; Извиква подпрограма Izraz за изчисляване на израза
call SaveResult ; Извиква подпрограма SaveResult за записване на резултата
incf PtrMas, F ; Увеличава PtrMas, за да сочи към следващия елемент от масива
decfsz
Count , F
; Намалява брояча
, ако резултатът е
0 , прескача следващия ред
goto Loop ; Връща се в началото на цикъла, ако брояча не е станал 0
goto
End ; Безкраен цикъл
I2luY2x1ZGUgIlAxNkM3My5pbmMiCgogICAgICAgIG9yZyAgICAgMHgwMDAwCiAgICAgICAgZ290byAgICBTdGFydCAgICAgICAgICA7INCh0LrQvtC6INC60YrQvCDQvdCw0YfQsNC70L7RgtC+INC90LAg0L/RgNC+0LPRgNCw0LzQsNGC0LAKCiAgICAgICAgb3JnICAgICAweDAwMjAKClJlZ0EgICAgZXF1ICAgICAweDIwICAgICAgICAgICAgOyDQktGF0L7QtNC90LAg0YHRgtC+0LnQvdC+0YHRgiBBClJlc0wgICAgZXF1ICAgICAweDIxICAgICAgICAgICAgOyDQnNC70LDQtNGI0Lgg0LHQsNC50YIg0L3QsCDRgNC10LfRg9C70YLQsNGC0LAKUmVzSCAgICBlcXUgICAgIDB4MjIgICAgICAgICAgICA7INCh0YLQsNGA0YjQuCDQsdCw0LnRgiDQvdCwINGA0LXQt9GD0LvRgtCw0YLQsApQdHJNYXMgIGVxdSAgICAgMHgyMyAgICAgICAgICAgIDsg0KPQutCw0LfQsNGC0LXQuyDQutGK0Lwg0LzQsNGB0LjQstCwIE1hc2l2ClB0clJlcyAgZXF1ICAgICAweDI0ICAgICAgICAgICAgOyDQo9C60LDQt9Cw0YLQtdC7INC60YrQvCDQvNCw0YHQuNCy0LAgUmVzdWx0cwpDb3VudCAgIGVxdSAgICAgMHgyNSAgICAgICAgICAgIDsg0JHRgNC+0Y/RhwpNYXNpdiAgIGVxdSAgICAgMHgzMCAgICAgICAgICAgIDsg0JzQsNGB0LjQsiDRgSDQstGF0L7QtNC90Lgg0YHRgtC+0LnQvdC+0YHRgtC4ClJlc3VsdHMgZXF1ICAgICAweDQwICAgICAgICAgICAgOyDQnNCw0YHQuNCyINC30LAg0LfQsNC/0LjRgSDQvdCwINGA0LXQt9GD0LvRgtCw0YLQuNGC0LUKCkl6cmF6CiAgICAgICAgbW92ZiAgICBSZWdBLCBXICAgICAgICAgOyDQl9Cw0YDQtdC20LTQsNC80LUgQSDQsiBXCiAgICAgICAgbW92d2YgICBSZXNMICAgICAgICAgICAgOyDQl9Cw0L/QuNGB0LLQsNC80LUg0LIgUmVzTAogICAgICAgIGNscmYgICAgUmVzSCAgICAgICAgICAgIDsg0J3Rg9C70LjRgNCw0LzQtSBSZXNICgogICAgICAgIHJsZiAgICAgUmVzTCwgMSAgICAgICAgIDsg0KPQvNC90L7QttCw0LLQsNC80LUg0L/QviAyCiAgICAgICAgcmxmICAgICBSZXNILCAxCiAgICAgICAgYmNmICAgICBTVEFUVVMsIEMKICAgICAgICBybGYgICAgIFJlc0wsIDEgICAgICAgICA7INCj0LzQvdC+0LbQsNCy0LDQvNC1INC/0L4gNAogICAgICAgIHJsZiAgICAgUmVzSCwgMQogICAgICAgIGJjZiAgICAgU1RBVFVTLCBDCiAgICAgICAgcmxmICAgICBSZXNMLCAxICAgICAgICAgOyDQo9C80L3QvtC20LDQstCw0LzQtSDQv9C+IDgKICAgICAgICBybGYgICAgIFJlc0gsIDEKCiAgICAgICAgbW92ZiAgICBSZWdBLCBXICAgICAgICAgOyDQl9Cw0YDQtdC20LTQsNC80LUgQSDQsiBXCiAgICAgICAgc3Vid2YgICBSZXNMLCAxICAgICAgICAgOyBBID8gOCDigJMgQSA9IEEgPyA3CiAgICAgICAgYnRmc3MgICBTVEFUVVMsIEMKICAgICAgICBkZWNmICAgIFJlc0gsIDEKCiAgICAgICAgbW92bHcgICA1NwogICAgICAgIGFkZHdmICAgUmVzTCwgMSAgICAgICAgIDsg0JTQvtCx0LDQstGP0LzQtSA1NwogICAgICAgIGJ0ZnNjICAgU1RBVFVTLCBDCiAgICAgICAgaW5jZiAgICBSZXNILCAxCgogICAgICAgIG1vdmx3ICAgMjUwCiAgICAgICAgc3Vid2YgICBSZXNMLCAxICAgICAgICAgOyDQmNC30LLQsNC20LTQsNC80LUgMjUwCiAgICAgICAgYnRmc3MgICBTVEFUVVMsIEMKICAgICAgICBkZWNmICAgIFJlc0gsIDEKCiAgICAgICAgcmV0dXJuICAgICAgICAgICAgICAgICAgOyDQktGA0YrRidCw0LzQtSDRgdC1CgpTYXZlUmVzdWx0CiAgICAgICAgbW92ZiAgICBQdHJSZXMsIFcgICAgICAgOyDQl9Cw0YDQtdC20LTQsNC80LUg0YPQutCw0LfQsNGC0LXQu9GPCiAgICAgICAgbW92d2YgICBGU1IgICAgICAgICAgICAgOyDQn9C+0YHRgtCw0LLRj9C80LUg0LPQviDQstGK0LIgRlNSCiAgICAgICAgbW92ZiAgICBSZXNMLCBXCiAgICAgICAgbW92d2YgICBJTkRGICAgICAgICAgICAgOyDQl9Cw0L/QuNGB0LLQsNC80LUg0LzQu9Cw0LTRiNC40Y8g0LHQsNC50YIKICAgICAgICBpbmNmICAgIFB0clJlcywgRiAgICAgICA7INCj0LLQtdC70LjRh9Cw0LLQsNC80LUgUHRyUmVzCiAgICAgICAgbW92ZiAgICBQdHJSZXMsIFcKICAgICAgICBtb3Z3ZiAgIEZTUgogICAgICAgIG1vdmYgICAgUmVzSCwgVwogICAgICAgIG1vdndmICAgSU5ERiAgICAgICAgICAgIDsg0JfQsNC/0LjRgdCy0LDQvNC1INGB0YLQsNGA0YjQuNGPINCx0LDQudGCCiAgICAgICAgaW5jZiAgICBQdHJSZXMsIEYgICAgICAgOyDQo9Cy0LXQu9C40YfQsNCy0LDQvNC1IFB0clJlcwogICAgICAgIHJldHVybgoKU3RhcnQKICAgICAgICBtb3ZsdyAgIFJlc3VsdHMKICAgICAgICBtb3Z3ZiAgIFB0clJlcyAgICAgICAgICA7INCY0L3QuNGG0LjQsNC70LjQt9C40YDQsNC80LUg0YPQutCw0LfQsNGC0LXQu9GPINC30LAg0YDQtdC30YPQu9GC0LDRgtC4CgogICAgICAgIG1vdmx3ICAgMTUKICAgICAgICBtb3Z3ZiAgIFJlZ0EgICAgICAgICAgICA7INCf0YDQuNC80LXRgCAxOiBBID0gMTUKICAgICAgICBjYWxsICAgIEl6cmF6CiAgICAgICAgY2FsbCAgICBTYXZlUmVzdWx0CgogICAgICAgIG1vdmx3ICAgMTcwCiAgICAgICAgbW92d2YgICBSZWdBICAgICAgICAgICAgOyDQn9GA0LjQvNC10YAgMjogQSA9IDE3MAogICAgICAgIGNhbGwgICAgSXpyYXoKICAgICAgICBjYWxsICAgIFNhdmVSZXN1bHQKCiAgICAgICAgbW92bHcgICAxMAogICAgICAgIG1vdndmICAgTWFzaXYgICAgICAgICAgIDsg0JLRhdC+0LTQvdCwINGB0YLQvtC50L3QvtGB0YIgMQogICAgICAgIG1vdmx3ICAgMjAKICAgICAgICBtb3Z3ZiAgIE1hc2l2KzEgICAgICAgICA7INCS0YXQvtC00L3QsCDRgdGC0L7QudC90L7RgdGCIDIKICAgICAgICBtb3ZsdyAgIDMwCiAgICAgICAgbW92d2YgICBNYXNpdisyICAgICAgICAgOyDQktGF0L7QtNC90LAg0YHRgtC+0LnQvdC+0YHRgiAzCiAgICAgICAgbW92bHcgICA0MAogICAgICAgIG1vdndmICAgTWFzaXYrMyAgICAgICAgIDsg0JLRhdC+0LTQvdCwINGB0YLQvtC50L3QvtGB0YIgNAogICAgICAgIG1vdmx3ICAgNTAKICAgICAgICBtb3Z3ZiAgIE1hc2l2KzQgICAgICAgICA7INCS0YXQvtC00L3QsCDRgdGC0L7QudC90L7RgdGCIDUKICAgICAgICBtb3ZsdyAgIDEwMAogICAgICAgIG1vdndmICAgTWFzaXYrNSAgICAgICAgIDsg0JLRhdC+0LTQvdCwINGB0YLQvtC50L3QvtGB0YIgNgogICAgICAgIG1vdmx3ICAgMTcwCiAgICAgICAgbW92d2YgICBNYXNpdis2ICAgICAgICAgOyDQktGF0L7QtNC90LAg0YHRgtC+0LnQvdC+0YHRgiA3CgogICAgICAgIG1vdmx3ICAgTWFzaXYKICAgICAgICBtb3Z3ZiAgIFB0ck1hcyAgICAgICAgICA7INCj0LrQsNC30LDRgtC10Lsg0LrRitC8IE1hc2l2CiAgICAgICAgbW92bHcgICA3CiAgICAgICAgbW92d2YgICBDb3VudCAgICAgICAgICAgOyDQkdGA0L7Rj9GHCgpMb29wCiAgICAgICAgbW92ZiAgICBQdHJNYXMsIFcJCTsg0JrQvtC/0LjRgNCwINGB0YLQvtC50L3QvtGB0YLRgtCwINC90LAgUHRyTWFzINCyINGA0LDQsdC+0YLQvdC40Y8g0YDQtdCz0LjRgdGC0YrRgCBXCiAgICAgICAgbW92d2YgICBGU1IJCQkJOyDQl9Cw0YDQtdC20LTQsCBGU1Ig0YEg0LDQtNGA0LXRgdCwINC+0YIgUHRyTWFzCiAgICAgICAgbW92ZiAgICBJTkRGLCBXCQkJOyDQl9Cw0YDQtdC20LTQsCBXINGBINC00LDQvdC90LjRgtC1INC+0YIg0LDQtNGA0LXRgdCwLCDQv9C+0YHQvtGH0LXQvSDQvtGCIEZTUgogICAgICAgIG1vdndmICAgUmVnQQkJCTsg0JfQsNC/0LjRgdCy0LAg0YHRgtC+0LnQvdC+0YHRgtGC0LAg0L7RgiBXINCyIFJlZ0EKICAgICAgICBjYWxsICAgIEl6cmF6CQkJOyDQmNC30LLQuNC60LLQsCDQv9C+0LTQv9GA0L7Qs9GA0LDQvNCwIEl6cmF6INC30LAg0LjQt9GH0LjRgdC70Y/QstCw0L3QtSDQvdCwINC40LfRgNCw0LfQsAogICAgICAgIGNhbGwgICAgU2F2ZVJlc3VsdAkJOyDQmNC30LLQuNC60LLQsCDQv9C+0LTQv9GA0L7Qs9GA0LDQvNCwIFNhdmVSZXN1bHQg0LfQsCDQt9Cw0L/QuNGB0LLQsNC90LUg0L3QsCDRgNC10LfRg9C70YLQsNGC0LAKCiAgICAgICAgaW5jZiAgICBQdHJNYXMsIEYJCTsg0KPQstC10LvQuNGH0LDQstCwIFB0ck1hcywg0LfQsCDQtNCwINGB0L7Rh9C4INC60YrQvCDRgdC70LXQtNCy0LDRidC40Y8g0LXQu9C10LzQtdC90YIg0L7RgiDQvNCw0YHQuNCy0LAKICAgICAgICBkZWNmc3ogIENvdW50LCBGCQk7INCd0LDQvNCw0LvRj9Cy0LAg0LHRgNC+0Y/Rh9CwLCDQsNC60L4g0YDQtdC30YPQu9GC0LDRgtGK0YIg0LUgMCwg0L/RgNC10YHQutCw0YfQsCDRgdC70LXQtNCy0LDRidC40Y8g0YDQtdC0CiAgICAgICAgZ290byAgICBMb29wCQkJOyDQktGA0YrRidCwINGB0LUg0LIg0L3QsNGH0LDQu9C+0YLQviDQvdCwINGG0LjQutGK0LvQsCwg0LDQutC+INCx0YDQvtGP0YfQsCDQvdC1INC1INGB0YLQsNC90LDQuyAwCgpFbmQKICAgICAgICBnb3RvICAgIEVuZCAgICAgICAgICAgICA7INCR0LXQt9C60YDQsNC10L0g0YbQuNC60YrQuwogICAgICAgIGVuZAo=
stdout
#include "P16C73.inc"
org 0x0000
goto Start ; Скок към началото на програмата
org 0x0020
RegA equ 0x20 ; Входна стойност A
ResL equ 0x21 ; Младши байт на резултата
ResH equ 0x22 ; Старши байт на резултата
PtrMas equ 0x23 ; Указател към масива Masiv
PtrRes equ 0x24 ; Указател към масива Results
Count equ 0x25 ; Брояч
Masiv equ 0x30 ; Масив с входни стойности
Results equ 0x40 ; Масив за запис на резултатите
Izraz
movf RegA, W ; Зареждаме A в W
movwf ResL ; Записваме в ResL
clrf ResH ; Нулираме ResH
rlf ResL, 1 ; Умножаваме по 2
rlf ResH, 1
bcf STATUS, C
rlf ResL, 1 ; Умножаваме по 4
rlf ResH, 1
bcf STATUS, C
rlf ResL, 1 ; Умножаваме по 8
rlf ResH, 1
movf RegA, W ; Зареждаме A в W
subwf ResL, 1 ; A ? 8 – A = A ? 7
btfss STATUS, C
decf ResH, 1
movlw 57
addwf ResL, 1 ; Добавяме 57
btfsc STATUS, C
incf ResH, 1
movlw 250
subwf ResL, 1 ; Изваждаме 250
btfss STATUS, C
decf ResH, 1
return ; Връщаме се
SaveResult
movf PtrRes, W ; Зареждаме указателя
movwf FSR ; Поставяме го във FSR
movf ResL, W
movwf INDF ; Записваме младшия байт
incf PtrRes, F ; Увеличаваме PtrRes
movf PtrRes, W
movwf FSR
movf ResH, W
movwf INDF ; Записваме старшия байт
incf PtrRes, F ; Увеличаваме PtrRes
return
Start
movlw Results
movwf PtrRes ; Инициализираме указателя за резултати
movlw 15
movwf RegA ; Пример 1: A = 15
call Izraz
call SaveResult
movlw 170
movwf RegA ; Пример 2: A = 170
call Izraz
call SaveResult
movlw 10
movwf Masiv ; Входна стойност 1
movlw 20
movwf Masiv+1 ; Входна стойност 2
movlw 30
movwf Masiv+2 ; Входна стойност 3
movlw 40
movwf Masiv+3 ; Входна стойност 4
movlw 50
movwf Masiv+4 ; Входна стойност 5
movlw 100
movwf Masiv+5 ; Входна стойност 6
movlw 170
movwf Masiv+6 ; Входна стойност 7
movlw Masiv
movwf PtrMas ; Указател към Masiv
movlw 7
movwf Count ; Брояч
Loop
movf PtrMas, W ; Копира стойността на PtrMas в работния регистър W
movwf FSR ; Зарежда FSR с адреса от PtrMas
movf INDF, W ; Зарежда W с данните от адреса, посочен от FSR
movwf RegA ; Записва стойността от W в RegA
call Izraz ; Извиква подпрограма Izraz за изчисляване на израза
call SaveResult ; Извиква подпрограма SaveResult за записване на резултата
incf PtrMas, F ; Увеличава PtrMas, за да сочи към следващия елемент от масива
decfsz Count, F ; Намалява брояча, ако резултатът е 0, прескача следващия ред
goto Loop ; Връща се в началото на цикъла, ако брояча не е станал 0
End
goto End ; Безкраен цикъл
end