LAB‎ > ‎

Lab 18

1) [프로그램]을 실행시켜 보시오. 
- 여러 줄로 구성된 7SEGIO에 출력하는 예제이다.
- 7SEGIO 버퍼의 주소는 0부터 11로 한줄짜리 일 때와 동일하다.

2) 다음 프로그램을 여러 주소에 로딩해서 실행해보고 문제를 설명하시오.
2번지
- 2000번지
- 996번지
  ORG 0
 SGMT 
CMP B C
SKZ
JMP NOTEQ
LD A DATA1
JMP PRINT
NOTEQ LD A DATA2
PRINT OUT
COB
DATA1 BOX 1234
DATA2 BOX U(5678)   // Unsigned value
3) 위 프로그램을 어느 곳에 넣어도(Relocation) 잘 동작하도록 하시오. 이 때 아래 조건을 활용한다.
- 5번지에 주소값 1000이 들어 있다.
- 데이터는 1000번지 부터 고정 배치 된다.
               ORG 5
               BOX 1000

               ORG 1000
DATA1    BOX 1234
DATA2    BOX U(5678)



/////////////////////////////////////////////////////////////////
[프로그램]

// Multirow Segment IO
//$DEV SEVEN-SEGMENT-D 10 4 3
IO_BRIDGEEQU0
PIC_IRREQU96
PIC_ISREQU97
PIC_CMDEQU98
PIC_IMREQU99
MMIO_BASEEQU100
SEG_DATAEQU10// IO Address for 7 segments
SEG_STATEEQU11
SEG_CMDEQU12
SEG_DMASRCEQU13
SEG_DMADSTEQU14
ORG0
INIT// set PSR to current segment
LDA P_IH_ENTRY
MOVIH A
JMPMULTIROW_SEG_IO
COB// will not come back here
P_IH_ENTRYBOXIH_ENTRY
// Command for 7 segments
SEG_WRITEBOX100
SEG_ONBOX200
SEG_OFFBOX300
SEG_ON_ALLBOX992
SEG_OFF_ALLBOX993
SEG_DMA_WRITEBOX991
SEG_DMA_READBOX994
SEG_DMA_RESETBOX999
MASK_READYBOX9// Mask bits
SEG_DMA_READYBOX301
ORG200
IH_ENTRYSGMT// PC, ST, PSR are saved in iRTN, iST, iPSR
// Interrupt Mask is ON in PSR
// set PSR to current segment
SWAPA SP// A를 SP에 저장
// A는 인터럽트 걸린 프로그램에서 사용 중일 수 있으므로 보존해야 함
// SP는 iSP에 저장되어 있고으므로 손상되어도 됨
LDA S_STACK_BTM// 시스템스택포인터를 A에 읽어옴
SWAPA SP// A를 복원하면서 동시에 SP를 세팅
// PUSHALL 하기 전에 visible register(SP 제외)를 손상하면 안됨
PUSHALL// save context info(visible registers) of interrupted program
MOVA SP
STA CONTEXT
// find out reason
CLRC
MOVX EX
CMPX C
SKZ// if EX is zero
JMPHANDLE_EXCEPTION
INPIC_ISR// Device interrupt
MOVX A
JMP*@IRQ_JUMP_TABLE
IH_EOIRTN
LDA PIC_EOI
OUTPIC_CMD
IH_RTNLDA CONTEXT
MOVSP A
POPALL// restore context info
IRET// restore PC, ST, PSR from iRTN, iST, iPSR
S_STACK_BTMBOX2000// Segment 1
CONTEXTRESBOX1// Starting addr of visible registers of the current task
// Commands for PIC(Programmable Interrupt Handler)
PIC_MASKONBOX100
PIC_MASKOFFBOX200
PIC_MASKSETBOX300
PIC_ICLBOX997
PIC_ICEBOX998
PIC_EOIBOX999
HANDLE_EXCEPTION
CLREX
JMP
*@EXCEPTION_JUMP_TABLE
HANDLE_IRQ1// IRQ 1: DMA인터럽트를 처리하여 DMAFLAG를 세팅
SGMTSEG_DMA_READY/1000
LDA SEG_DMA_READY
SGMT
MOVD0 A
INSEG_STATE
CMPA D0
SKZ
JMPIH_EOIRTN
LDA #1// set flag
STA DMAFLAG
LDA PIC_EOI
OUTPIC_CMD
JMPIH_RTN// Do nothing here
DMAFLAGBOX0
HANDLE_TRAP5// EX 5: DMAFLAG를 확인하여 R 레지스터 값으로 점프
LDA DMAFLAG
CLRC
CMPA C
SKNE
JMPIH_RTN
CLRA
STA DMAFLAG// reset dma flag
LDA P_CURR_CTX
MOVB A
CLRX
STCTX@%0
MOVA R
STA CURR_CTX_PC
LDCTX@%0
JMPIH_RTN
P_CURR_CTXBOXCURR_CTX_PC
CURR_CTX_PCRESBOX1
CURR_CTX_PSRRESBOX1
CURR_CTX_SPRESBOX1
IRQ_JUMP_TABLE
BOXIH_EOIRTN// IRQ 0
BOXHANDLE_IRQ1// IRQ 1: DMA인터럽트를 처리하여 DMAFLAG를 세팅
BOXIH_EOIRTN// IRQ 2
BOXIH_EOIRTN// IRQ 3
BOXIH_EOIRTN// IRQ 4
BOXIH_EOIRTN// IRQ 5
BOXIH_EOIRTN// IRQ 6
BOXIH_EOIRTN// IRQ 7
BOXIH_EOIRTN// IRQ 8
BOXIH_EOIRTN// IRQ 9
EXCEPTION_JUMP_TABLE
BOXIH_RTN// EX 0
BOXIH_RTN// EX 1: SWITCH_TASK between TID 0 & TID 1
BOXIH_RTN// EX 2: Finish Task
BOXIH_RTN// EX 3
BOXIH_RTN// EX 4
BOXHANDLE_TRAP5// EX 5: DMAFLAG를 확인하여 R 레지스터 값으로 점프
BOXIH_RTN// EX 6
BOXIH_RTN// EX 7
BOXIH_RTN// EX 8
BOXIH_RTN// EX 9
// Exception number 범위 끝까지 …
MULTIROW_SEG_IO
LDA SEG_ON_ALL// Turn on all 7 segment displays
OUTSEG_CMD
CLRX
LOOP1
LDA @MSG_TABLE// request DMA IO
OUTSEG_DMASRC
CLRA// 7segment 장치의 buffer 주소는 0에서 시작
OUTSEG_DMADST
LDA MSG_LENG
OUTSEG_DATA
LDA SEG_DMA_WRITE
OUTSEG_CMD
WAIT_LOOP1SETRTNNEAR NEXT_IO
INT5// check dma flag
// still have problem between INT and COB
COB
JMPWAIT_LOOP1
NEXT_IO
INCX
LDA COUNT
CMPA X
SKZ
JMPLOOP1
COB// Finish here
COUNTBOX3
MSG_LENGBOX12
MSG_TABLEBOXCONV_COUNT00
BOXCONV_COUNT10
BOXCONV_COUNT20
CONV_COUNT00BOX0b00000110//1
BOX0b00000110//1
BOX0b00000110//1
BOX0b00000110//1
CONV_COUNT01BOX0b01011011//2
BOX0b01011011//2
BOX0b01011011//2
BOX0b01011011//2
CONV_COUNT02BOX0b01001111//3
BOX0b01001111//3
BOX0b01001111//3
BOX0b01001111//3
CONV_COUNT10BOX0b01100110//4
BOX0b01100110//4
BOX0b01100110//4
BOX0b01100110//4
CONV_COUNT11BOX0b01101101//5
BOX0b01101101//5
BOX0b01101101//5
BOX0b01101101//5
CONV_COUNT12BOX0b01111101//6
BOX0b01111101//6
BOX0b01111101//6
BOX0b01111101//6
CONV_COUNT20BOX0b00000111//7
BOX0b00000111//7
BOX0b00000111//7
BOX0b00000111//7
CONV_COUNT21BOX0b01111111//8
BOX0b01111111//8
BOX0b01111111//8
BOX0b01111111//8
CONV_COUNT22BOX0b01101111//9
BOX0b01101111//9
BOX0b01101111//9
BOX0b01101111//9
Comments