Основные приемы поиска и исправления ошибок, страница 2

• выйти из симулятора-отладчика — <Q>, <E> и перейти в UE32;

• передать фокус окну с исходным текстом программы L_00.a85;

• найти строку с неверной командой. Для этого можно воспользоваться ближайшей меткой и командами Search или вести поиск непосредственно по ассемблерной строке.

• внести необходимые исправления в текст программы;

• сохранить программу;

• повторить трансляцию и компоновку нового текста программы.

В итоге мы наши ошибки:

RAM     EQU     0800H

ROM     EQU     0000H

LEN_RAM EQU     0800H

;              BUFFERS

TEXTSIZE        EQU     20H ; резерв. байтового пространства размером textsize

        DEFSEG  DATA1,CLASS=DATA,START=RAM

        SEG     DATA1

BUF1:   DS      TEXTSIZE-1

        DB      0

        SEG     DATA1

BUF2:   DS      TEXTSIZE-1

        DB      0

        SEG     DATA1

BUF3:   DS      TEXTSIZE-1

        DB      0

;       STACK

STACKSIZE            EQU        32

        DEFSEG  STACK,CLASS=DATA,START=RAM+LEN_RAM-STACKSIZE

        SEG     STACK

STACKR: DS      STACKSIZE

STPOINT EQU     S   -не Sа $            ;назнач.имени для STPOINT

;       FLAGS

        SEG     DATA1

PASS1    DS          1

;       MASKS FOR EXAPLES

MASK11  EQU     00000011B       ;

MASK12  EQU        01010000B             ;

        ;тело макрокоманды

INIT1        %MACRO               BU,SIM,SZ

        %LOCAL LOOP_INIT

        LXI  H,BU

               MVI         B,SZ

LOOP_INIT:

               MVI         M,SIM

               INX          H

               DCR        B

               JNZ         LOOP_INIT

        %ENDM

        SEG     IOSPACE,START=0

CS8155                  DS          1             ; COMMAND/STATUS REG OF 8155 IN I/O SPACE

PA8155                  DS          1             ; PORT A OF 8155 IN I/O SPACE

PB8155                  DS          1

PC8155                  DS          1             ; PORT C OF 8155 IN I/O SPACE

TL8155                   DS          1             ; TIMER LOW PART OF 8155 IN I/O SPACE

TH8155                   DS          1             ; TIMER HIGH PART OF 8155 IN I/O SPACE

               DEFSEG PA8355SEG,START=8,CLASS=IOSPACE

               SEG        PA8355SEG

PA8355          DS      1 ; PORT A OF 8355 IN I/O SPACE

PB8355                  DS          1 ; PORT B OF 8355 IN I/O SPACE

DA8355                  DS          1 ; DDR OF PORT A OF 8355 IN I/O SPACE

DB8355                  DS          1 ; DDR OF PORT B OF 8355 IN I/O SPACE

               ;

        ;PROGRAMM

        SEG     CODE,CLASS=CODE,START=ROM

               ;

PROG:   LXI     SP,STPOINT

        MVI     A,0     ;ALL INPUT

        OUT     DB8355

               DCR        A

        OUT     DA8355  ;ALL OUTPUT

; вызов макрокоманд с параметрами

               INIT1        STACKR,'.',STACKSIZE

        INIT1   BUF1,'1',TEXTSIZE-1

        INIT1   BUF2,'2',TEXTSIZE-1

        INIT1   BUF3,'3',TEXTSIZE-1

;

;       MAIN

;

;       INPUT TO PORT A 8355

        LXI     H,BUF1

        LXI     D,BUF1+TEXTSIZE-1

LOOPIN:

        IN      PB8355

        MOV     M,A

        INX     H

        CALL    DEQH

        JNZ     LOOPIN

;       DECODING

        LXI     H,BUF1

               CALL       KONSUM

               LXI          D,BUF2

               MVI         A,1

               STA         PASS1

LOOP1:

        MOV     A,M

               SUB        A-не SUB A,а ORA A

               JZ           ENDTEXT

               CALL       CODING

               STAX      D

               INX          H

               INX          D

               JMP        LOOPIN-не LOOPIN,а LOOP1

ENDTEXT:

        LDAX    D

               LDA        PASS1

               ORA        A

               MVI         A,0

               STA         PASS1

               JZ           HALT

PRODOLJ:

;       ONCE MORE

               LXI          H,BUF2

               LXI          D,BUF3

               JMP        LOOP1

;

HALT:

        LXI     H,BUF3

        CALL    KONSUM

;       OUTPUT FROM THE PORT B

        LXI     H,BUF2

        MVI     B,TEXTSIZE-1

LOOPOUT:

        MOV     A,M

        OUT     PA8355

        INX     H

        DCR     B

        JNZ     LOOPOUT

;

               HLT

DEQH:

;

; ПП выполняет сравнение (вычитание) E-L,

; если байты не равны, то выход,

; иначе продолжение сравнений D-H.

;     выход: Z=0, если DE = HL,

;            Z=0, если DE <> HL

;

        MOV     A,D

        SUB     H

        RNZ