LAB‎ > ‎

Lab 16

1) [프로그램 1]을 실행하면서 관찰하시오
- 버튼 두개를 여러가지로 눌러본다

2) [프로그램 1]을 모든 IRQ에 대해서 동일한 속도로 처리를 시작할 수 있도록 수정하시오.
- 지금은 IRQ1을 먼저 확인하므로 IRQ2를 처리하는 것은 언제나 조금 늦다.
- 힌트: JMP *@JUMP_TABLE 을 활용

3) [프로그램 2]를 실행하면서 관찰하시오.
- INT 는 SW Trap으로서 EX 레지스터로 판별한다.
- 여기서는 INT 5만 처리하고 나머지는 무시하였다.
- 처리가 끝나고 EX를 0으로 바꾸는 것을 잊지 않아야 한다. 이는 인터럽트 처리 후 EOI를 보내는 것과 유사한 개념이다.

4) [프로그램 2]를 모든 EX에 대해서 동일한 속도로 처리를 시작할 수 있도록 수정하시오.

5) [프로그램 3]을 실행하고 관찰하시오.
- 7Segment IO의 DMA 버전임

+++++++++++++++++++++++++++++++++++
[프로그램 1]
// V09 two buttons
//$DEV SIMPLE-BUTTON 20
//$DEV SIMPLE-BUTTON 25
IO_BRIDGE EQU 0
PIC_IRR EQU 96
PIC_ISR EQU 97
PIC_CMD EQU 98
PIC_IMR EQU 99
SIMPLE_INT START 0
  LD   A P_IHENTRY // initialize IH register
LD IH A
LOOP    
COB
JMP  LOOP
        
ORG  10
IHENTRY IN PIC_ISR
MOV C A
LD  A =1
CMP A C
SKZ
JMP NEXT_CASE
LD  A BUTTON_COUNT
INC A
ST A BUTTON_COUNT
JMP OUT_RESULT
NEXT_CASE LD  A =2
CMP A C
SKZ
JMP OUT_RESULT
LD  A BUTTON_COUNT
DEC A
ST A BUTTON_COUNT
OUT_RESULT
OUT IO_BRIDGE
INT_END LD  A PIC_EOI
     OUT PIC_CMD
IRET
P_IHENTRY  BOX  IHENTRY
        
PIC_MASKON BOX 100
PIC_MASKOFF BOX 200
PIC_MASKSET BOX 300
PIC_ICL BOX 997
PIC_ICE BOX 998
PIC_EOI  BOX  999
BUTTON_COUNT BOX 0

+++++++++++++++++++++++++++++++++++
[프로그램 2]
// V09 two buttons
//$DEV SIMPLE-BUTTON 20
//$DEV SIMPLE-BUTTON 25
IO_BRIDGE EQU 0
PIC_IRR EQU 96
PIC_ISR EQU 97
PIC_CMD EQU 98
PIC_IMR EQU 99
SIMPLE_INT START 0
  LD   A P_IHENTRY // initialize IH register
LD IH A
LOOP    
INT 5
COB
INT 7
JMP  LOOP
        
ORG  10
IHENTRY
CLR C
MOV X EX
CMP X C
SKZ
JMP HANDLE_TRAP // if EX is not 0
IN PIC_ISR // handle IRQ
MOV C A
LD  A =1
CMP A C
SKZ
JMP NEXT_CASE
LD  A BUTTON_COUNT
INC A
ST A BUTTON_COUNT
JMP OUT_RESULT
NEXT_CASE LD  A =2
CMP A C
SKZ
JMP OUT_RESULT
LD  A BUTTON_COUNT
DEC A
ST A BUTTON_COUNT
OUT_RESULT
OUT IO_BRIDGE
INT_END LD  A PIC_EOI
     OUT PIC_CMD
IRET
HANDLE_TRAP
LD A #5
CMP X A
SKZ // if EX==5
JMP EX_END
CLR A #5
ST A BUTTON_COUNT
OUT IO_BRIDGE
EX_END CLR EX
IRET
P_IHENTRY  BOX  IHENTRY
        
PIC_MASKON BOX 100
PIC_MASKOFF BOX 200
PIC_MASKSET BOX 300
PIC_ICL BOX 997
PIC_ICE BOX 998
PIC_EOI  BOX  999
BUTTON_COUNT BOX 0

+++++++++++++++++++++++++++++++++++
[프로그램 3]
// V09 SEG IO, DMA
//$DEV SEVEN-SEGMENT-D 10 10 1
IO_BRIDGE EQU 0
PIC_IRR EQU 96
PIC_ISR EQU 97
PIC_CMD EQU 98
PIC_IMR EQU 99
MMIO_BASE EQU 100
MMIO_SEG_DATA EQU MMIO_BASE+10 // IO Address for 7 segments
MMIO_SEG_STATE EQU MMIO_BASE+11
MMIO_SEG_CMD EQU MMIO_BASE+12
MMIO_SEG_DMASRC EQU MMIO_BASE+13
MMIO_SEG_DMADST EQU MMIO_BASE+14
////////// Init segment & System Stack //////////
ORG 0
INIT // set PSR to current segment
LD A P_IHENTRY
MOV IH A
JMP IO_BOUND_TASK
COB // will not come back here
P_IHENTRY BOX IHENTRY
// Command for 7 segments
SEG_WRITE BOX 0100
SEG_ON BOX 0200
SEG_OFF BOX 0300
SEG_ON_ALL BOX 0992
SEG_OFF_ALL BOX 0993
SEG_DMA_WRITE BOX 0991
SEG_DMA_READ BOX 0994
SEG_DMA_RESET BOX 0999
MASK_READY BOX 0009 // Mask bits 
SEG_DMA_READY BOX 0301
////////// System segmnt - Interrupt Handler, System library //////////
ORG 200
IHENTRY IN PIC_ISR
MOV C A
LD  A =1
CMP A C
SKZ
JMP NEXT_CASE
JMP INT_END
NEXT_CASE LD  A =2
CMP A C
SKZ
JMP INT_END
// Handle IRQ2
INT_END LD  A PIC_EOI
     OUT PIC_CMD
IRET
// Commands for PIC(Programmerble Interrupt Handler)
PIC_MASKON BOX 100
PIC_MASKOFF BOX 200
PIC_MASKSET BOX 300
PIC_ICL BOX 997
PIC_ICE BOX 998
PIC_EOI  BOX  999
BUTTON_COUNT BOX 0
IO_BOUND_TASK
LD A SEG_ON_ALL // Turn on all 7 segment displays
ST A MMIO_SEG_CMD
LD A COUNT
MOV D2 A
LOOP1
LD A P_MSG1
ST A MMIO_SEG_DMASRC
CLR A // 7segment 장치의 buffer 주소는 0에서 시작
ST A MMIO_SEG_DMADST
LD A MSG_LENG
ST A MMIO_SEG_DATA
LD A SEG_DMA_WRITE
ST A MMIO_SEG_CMD
WAIT_LOOP1 COB // Halt
LD A SEG_DMA_READY
MOV D0 A
LD A MMIO_SEG_STATE
CMP A D0
SKZ // if DMA interrupt is raised & device state is ready
JMP WAIT_LOOP1
LD A P_MSG2
ST A MMIO_SEG_DMASRC
CLR // 7segment 장치의 buffer 주소는 0에서 시작
ST A MMIO_SEG_DMADST
LD A MSG_LENG
ST A MMIO_SEG_DATA
LD A SEG_DMA_WRITE
ST A MMIO_SEG_CMD
WAIT_LOOP2 COB // Halt
LD A SEG_DMA_READY
MOV D0 A
LD A MMIO_SEG_STATE
CMP A D0
SKZ // if DMA interrupt is raised & device state is ready
JMP WAIT_LOOP2
DEC D2
SKZ
JMP LOOP1
COB
COUNT BOX 2
MSG_LENG BOX 10
P_MSG1 BOX MSG1
MSG1 BOX 0b00111111 //0
BOX 0b00000110 //1
BOX 0b01011011 //2
BOX 0b01001111 //3
BOX 0b01100110 //4
BOX 0b01101101 //5
BOX 0b01111101 //6
BOX 0b00000111 //7
BOX 0b01111111 //8
BOX 0b01101111 //9
P_MSG2 BOX MSG2
MSG2 BOX 0b01101111 //9
BOX 0b01111111 //8
BOX 0b00000111 //7
BOX 0b01111101 //6
BOX 0b01101101 //5
BOX 0b01100110 //4
BOX 0b01001111 //3
BOX 0b01011011 //2
BOX 0b00000110 //1
BOX 0b00111111 //0
Comments