Page 95 - 22-0722 EBOOK
P. 95

cli           ;prevent INTs
                       mov   al,1    ;demo by sending 1-11
                                                                call  dly64  ;slow it down here too
                                                                call  dly64
                       mov   cx,11
                                                                pop   ax
              loopy:
                                                                sti          ;enable INTs
                       call  Byt2bit ;split 1 byte to 10 bits
                                                                iret         ;exit INT subroutine
                       mov   ah,al   ;save al in ah
                       mov   al,08h  ;set al's bit 3 hi
                                                       pulse2   endp
                       out   ppi_port1_b,al ;P1B3=hi =>DAT=hi
                                                       ;**********************************************

                       out   ppi_port1_c,al ;P1C3=hi =>CLK=hi
                       jmp   $+2     ;I/O delay

                                                       ;display code in al on 8255(2) Port2B LEDs
                       call  Req2Snd ;8088 asks to send data
                       mov   al,ah   ;retrieve al
                                                       showcode proc
                                                                push  ax
                       call  SndHdat ;send data in al (1-11)
                       call  showcode ;display data in al
                                                                out   ppi_port2_b,al ;show code
                       inc   al      ;next data to send
                                                                call  dly250 ;approx. 3x250-ms delay
                                                                call  dly250
                       loop  loopy   ;repeat for 11 cycles
                       sti           ;allow INTs
                                                                call  dly250

                                                                mov   al,0
              loopv:                 ;to exit program
                                                                out   ppi_port2_b,al ;to turn off LEDs
                                                                call  dly250
                       mov   al,0F0h ;enter this endless loop
                       call  showcode ;& light upper-4 LEDs
                                                                pop   ax
                                                                ret
                       jmp   loopv

                                                       showcode endp
                                                       ;**********************************************
              main     endp
              ; *********************************************



              kbd_isr  proc  ;interrupt service routine (ISR)
                                                       ;request to send data to PIC16F627A
                                                       Req2Snd  proc
              ;activated by INT 5Fh on 8259's pin 25
                       cli           ;disable INTs
                                                       ;start with CLK=DAT=hi (Idle State)
                                                       ;end with CLK=hi & DAT=lo (Startbit)
              ;save registers
                       push  ax
                                                                cli           ;prevent INTs
                                                                push  ax
                       push  bx
                       push  di
                                                                call  wta7hi  ;wait until CLK=hi
                                                                call  wta4hi  ;wait until DAT=hi
                       push  si
              ;read 11 bits from 8255(1) Port1A
                                                       ;bring CLK->lo for >= 50 us
                                                                call  clc3lo  ;make P1C3=lo
                       in    al,ppi_port1_a
                       jmp   $+2     ;I/O delay
                                                                call  dly63us ;delay for about 100 us
                       mov   si,HEAD ;addr: last data stored
                                                                call  dly20us
                       mov   bl,byte ptr[si]
                                                                call  dly20us
                       mov   bh,0



                    ภาพที่ ๘  ซอฟต์แวร์การรับ-ส่งข้อมูลแบบอนุกรมของแผงวงจรไมโครคอนโทรลเลอร์ 8088 (ต่อ)
              ;Page 5/8 of Fig.8
                                                       ;Page 6/8 of Fig.8


              ;send Startbit by bringing DAT=lo & CLK=hi
                                                                call  wta7lo  ;wait until CLK=lo
                       call  clb3lo  ;DAT (P1B3)=lo
                                                                inc   si      ;next bit to send
                                                                loop  loop10
                       jmp   $+2     ;delay about 10 us

                       jmp   $+2
                       jmp   $+2
                                                       ;wait for ACK bit from PIC16F627A
                       call  stc3hi  ;DAT=lo, CLK (P1C3)->hi
                                                                call  wta4lo  ;wait for DAT line->lo
                       jmp   $+2     ;I/O delay                   out   ppi_port2_b,al
                                                                call  wta4hi  ; //  //  DAT  // ->hi
                       pop   ax
                       sti           ;enable INTs               pop   si
                       ret                                      pop   di
              Req2Snd  endp                                     pop   cx
              ;**********************************************            pop   bx
                                                                pop   ax
                                                                sti           ;allow INTs
              ;extract 8 bits from al & calculate Parity bit   วารสารราชบััณฑิิตยสภา
                                                                ret
              Byt2bit  proc              ปีีที่่� ๔๖ ฉบัับัที่่� ๓  กัันยายน-ธัันวาคม ๒๕๖๔
                       cli           ;prevent INTs     SndHdat  endp
                       push  ax      ;ah = right-shifted al
             ศาสตราจารย์์กิิตติคุุณ ดร.มงคุล เดชนคุรินทร์  ;**********************************************   85
                       push  bx      ;bh=Parity bit, bl=01h

                       push  cx                        ;wait for P1A4 (DAT) line to go hi
                       push  di                        wta4hi   proc
                       mov   ah,al   ;save original al in ah            push  ax
                       mov   bl,01h  ;ref byte for comparing   ;release DAT line by making P1B3 hi
                       mov   bh,01h  ;odd parity                mov   al,08h
                       mov   di,dat0 ;addr of dat0              out   ppi_port1_b,al
                       mov   cx,8                               jmp   $+2     ;I/O delay
              loop8:   mov   al,ah   ;get shifted al from ah   a4lo:    in    al,ppi_port1_a
                                                                ret
                       loop  loop8
                       and   al,bl   ;select only bit0 of al            jmp   $+2     ;I/O delay

                                                       wta4hi   endp
                       xor   bh,al   ;new Parity bit            and   al,10h  ;check bit 4 of P1A
              ;save Parity bit and assign Stopbit
                                                       ;**********************************************
                       mov   byte ptr[di],al ;save al’s bit0            cmp   al,00h  ;bit a4=lo ?

                       mov   byte ptr[di],bh ;odd parity
                       shr   ah,1    ;next higher bit to test            je    a4lo
                                                       ;wait for P1A4 (DAT) line to go lo
                       inc   di
                       inc   di      ;addr: next extractd bit            pop   ax
                                                       wta4lo   proc
                       mov   byte ptr[di],1  ;Stopbit = 1
                       loop  loop8                              ret
                                                                push  ax
                                                       wta4hi   endp
                       pop   di                        ;release DAT line by making P1B3 hi
              ;save Parity bit and assign Stopbit      ;**********************************************
                       pop   cx                                 mov   al,08h

                       mov   byte ptr[di],bh ;odd parity
                       pop   bx                                 out   ppi_port1_b,al
                       inc   di                        ;wait for P1A4 (DAT) line to go lo
                       pop   ax                                 jmp   $+2     ;I/O delay
                       mov   byte ptr[di],1  ;Stopbit = 1   wta4lo   proc
                       sti           ;allow INTs       a4hi:    in    al,ppi_port1_a
                                                                push  ax
                       ret                                      jmp   $+2     ;I/O delay
                       pop   di                        ;release DAT line by making P1B3 hi
              Byt2bit  endp                                     and   al,10h  ;check bit 4 of P1A
                       pop   cx                                 mov   al,08h
              ;**********************************************            cmp   al,10h  ;bit a4=hi ?
                       pop   bx
                                                                out   ppi_port1_b,al
                                                                je    a4hi
                       pop   ax                                 jmp   $+2     ;I/O delay
              ;serially send data in al to PIC16F627A            pop   ax
                       sti           ;allow INTs       a4hi:    in    al,ppi_port1_a
              SndHdat  proc                                     ret
                       ret                                      jmp   $+2     ;I/O delay
              ;use this proc after Req2Snd             wta4lo   endp
              Byt2bit  endp                                     and   al,10h  ;check bit 4 of P1A
                       cli           ;prevent INTs     ;**********************************************
              ;**********************************************
                                                                cmp   al,10h  ;bit a4=hi ?
                       push  ax
                                                                je    a4hi
                       push  bx                        ;wait for P1A7 (CLK) line to go hi
              ;serially send data in al to PIC16F627A            pop   ax
                       push  cx                        wta7hi   proc
              SndHdat  proc                                     ret
                       push  di                                 push  ax
              ;use this proc after Req2Snd             wta4lo   endp
                       push  si                        ;release CLK line by making P1C3 hi
                       cli           ;prevent INTs     ;**********************************************
              ;send 8 work data bits + Parity bit + Stopbit            mov   al,08h
                       push  ax

                       mov   si,dat0 ;addr of 1st bit            out   ppi_port1_c,al
                       push  bx                        ;wait for P1A7 (CLK) line to go hi
                       mov   cx,10                              jmp   $+2     ;I/O delay
                       push  cx                        wta7hi   proc
                       call  wta7lo  ;wait until CLK=lo   a7lo:    in    al,ppi_port1_a
                       push  di                                 push  ax
              loop10:                                           jmp   $+2     ;I/O delay
                       push  si                        ;release CLK line by making P1C3 hi
                       call  wta7hi  ;wait until CLK=hi            and   al,80h  ;check bit 7 of P1A
                                                                mov   al,08h
              ;send 8 work data bits + Parity bit + Stopbit
                       jmp   $+2     ;delay for about 10 us            cmp   al,00h  ;bit a7=lo ?
                                                                out   ppi_port1_c,al
                       mov   si,dat0 ;addr of 1st bit
                       jmp   $+2                                je    a7lo
                       mov   cx,10                              jmp   $+2     ;I/O delay
                       jmp   $+2                                pop   ax
                       call  wta7lo  ;wait until CLK=lo   a7lo:    in    al,ppi_port1_a
                       mov   al,byte ptr[si] ;current bit            ret
              loop10:                                           jmp   $+2     ;I/O delay
                       shl   al,1    ;shift bit0 to bit1   wta7hi   endp
                                                                and   al,80h  ;check bit 7 of P1A
                       call  wta7hi  ;wait until CLK=hi
                       shl   al,1    ;to bit2          ;**********************************************
                                                                cmp   al,00h  ;bit a7=lo ?
                       jmp   $+2     ;delay for about 10 us
                       shl   al,1    ;to bit3
                       jmp   $+2                                je    a7lo
                       out   ppi_port1_b,al ;put bit on P1B3
                       jmp   $+2                                pop   ax
                       jmp   $+2     ;I/O delay
                       mov   al,byte ptr[si] ;current bit            ret

                       shl   al,1    ;shift bit0 to bit1   wta7hi   endp
                         shl   al,1    ;to bit2        ;**********************************************
                    ภาพที่ ๘  ซอฟต์แวร์การรับ-ส่งข้อมูลแบบอนุกรมของแผงวงจรไมโครคอนโทรลเลอร์ 8088 (ต่อ)
                       shl   al,1    ;to bit3
                       out   ppi_port1_b,al ;put bit on P1B3
                       jmp   $+2     ;I/O delay

              ;Page 7/8 of Fig.8                       ;Page 8/8 of Fig.8


                    ภาพที่ ๘  ซอฟต์แวร์การรับ-ส่งข้อมูลแบบอนุกรมของแผงวงจรไมโครคอนโทรลเลอร์ 8088 (ต่อ)
              ;wait for P1A7 (CLK) line to go lo       dly63us  proc           ;time delay about 63 us
              wta7lo   proc                                     push  cx
                       push  ax                                  mov   cx,0010h ;delay value
              ;release CLK line by making P1C3 hi      reptw:   loop  reptw    ;count down CX
              ;Page 7/8 of Fig.8
                                                       ;Page 8/8 of Fig.8
                       mov   al,08h                             pop   cx

                       out   ppi_port1_c,al                     ret
              ;wait for P1A7 (CLK) line to go lo       dly63us  proc           ;time delay about 63 us
                       jmp   $+2     ;I/O delay        dly63us  endp
              wta7lo   proc                                     push  cx
              a7hi:    in    al,ppi_port1_a            ;**********************************************
                       push  ax                                 mov   cx,0010h ;delay value
                       jmp   $+2     ;I/O delay
              ;release CLK line by making P1C3 hi      reptw:   loop  reptw    ;count down CX
                       and   al,80h  ;check bit 7 of P1A   dly1ms   proc           ;time delay about 1 ms
                       mov   al,08h
                                                                pop   cx
                       cmp   al,80h  ;bit a7=hi ?               push  cx
                       out   ppi_port1_c,al                     ret
                       je    a7hi                               mov   cx,0100h ;delay value
                       jmp   $+2     ;I/O delay        dly63us  endp
                       pop   ax                        reptx:   loop  reptx    ;count down CX
              a7hi:    in    al,ppi_port1_a            ;**********************************************
                       ret                                      pop   cx
                       jmp   $+2     ;I/O delay
              wta7lo   endp                                     ret
                       and   al,80h  ;check bit 7 of P1A   dly1ms   proc           ;time delay about 1 ms
                ภาพท่� ๘  ซอฟตั์แวร์การรับ-ส่งข้้อมูลแบบอนีุ้กรมข้องแผงวงจรไมโครคอนี้โทรลเลอร์ 8088 (ตั่อ)
                                                       dly1ms   endp
              ;**********************************************
                                                                push  cx
                       cmp   al,80h  ;bit a7=hi ?
                                                       ;**********************************************
                       je    a7hi                               mov   cx,0100h ;delay value
              ;set bit 3 of P1B (release DAT line)
                       pop   ax                        reptx:   loop  reptx    ;count down CX
              stb3hi   proc                            dly64    proc           ;time delay about 64 ms
                       ret                                      pop   cx
                       push  ax                                 push  cx
              wta7lo   endp                                     ret
                       mov   al,08h  ;make P1B3 line hi            mov   cx,4000h ;delay value
              ;**********************************************
                                                       dly1ms   endp
                       out   ppi_port1_b,al            repty:   loop  repty    ;count down CX
                                                       ;**********************************************
                       jmp   $+2     ;I/O delay                 pop   cx
              ;set bit 3 of P1B (release DAT line)
                       pop   ax                                 ret
              stb3hi   proc                            dly64    proc           ;time delay about 64 ms
                       ret                             dly64    endp
                       push  ax                                 push  cx
              stb3hi   endp                            ;**********************************************
                                                                mov   cx,4000h ;delay value
                       mov   al,08h  ;make P1B3 line hi
              ;**********************************************
                       out   ppi_port1_b,al            repty:   loop  repty    ;count down CX
                                                       dly250   proc          ;time delay about 250 ms
                       jmp   $+2     ;I/O delay                 pop   cx
              ;clear bit 3 of P1B (put DAT=lo)                  push  cx
                       pop   ax                                 ret
              clb3lo   proc                                     mov   cx,0FFFFh ;delay value
                       ret                             dly64    endp
              stb3hi   endp                            ;**********************************************
              ;**********************************************
                                                       dly250   proc          ;time delay about 250 ms
              ;clear bit 3 of P1B (put DAT=lo)                  push  cx
              clb3lo   proc                                     mov   cx,0FFFFh ;delay value
   90   91   92   93   94   95   96   97   98   99   100