Agon Light 및 기타 Agon 플랫폼 개정판은 Zilog eZ80 프로세서를 기반으로 합니다. eZ80은 원래 Z80의 64KB와 비교하여 16MB의 메모리를 지원하는 24비트 주소 공간을 갖습니다. eZ80에는 두 가지 작동 모드가 있습니다. 표준 Z80 모드는 16비트 레지스터를 사용하여 64k 메모리 주소를 쉽게 처리할 수 있지만 64k 이상의 메모리에 액세스하려면 "뱅킹"을 사용해야 합니다. 그리고 ADL(address data long) 작동 모드는 레지스터를 24비트로 확장하여 전체 주소 공간에 쉽게 액세스할 수 있도록 합니다.
고급 프로그래밍 언어를 고려할 때 Z80에 사용 가능한 수는 있지만 메모리가 64k로 제한되거나 더 큰 메모리에 액세스하기 위한 어색한 뱅크 전환 방법이 있습니다.
C 프로그래밍 언어를 고려하면 사용 가능한 Z80 C 컴파일러가 많이 있습니다. 현재까지 Agon 커뮤니티는 다음 두 가지에 중점을 두었습니다.
eZ80 ADL 코드를 생성할 수 있는 Zilog ZDS II 개발 환경입니다 . 이것은 Agon 개발자가 사용하는 원래 도구 세트이지만 비공개 소스이고 Windows에서만 실행되며 데이터 C89 표준만 지원합니다.
8비트 컴퓨터에서 널리 사용되는 SDCC(소형 장치 C 컴파일러)를 Agon에 적용하는 것은 Agon 컴퓨터에 있는 많은 사람들의 초점이었습니다. 이것은 Z80용으로 좋은 컴파일러이지만 Z80만 지원하고 ADL 모드는 지원하지 않습니다.
대안으로 CEdev C/C++ 툴체인은 ADL 코드를 생성할 수 있는 오픈 소스 컴파일러입니다. TI-84 Plus CE 계산기(eZ80 프로세서 기반)를 대상으로 하며 합리적인 규모의 커뮤니티를 보유하고 있습니다. CEdev는 LLVM 컴파일러 및 fasmg 어셈블러의 eZ80 버전을 기반으로 합니다. 24비트 포인터, 24비트 정수, 32비트 Long, 16비트 Short 및 32비트 부동 소수점을 사용하여 ADL 코드를 생성합니다. C 및 C++ 프로그램을 위한 상당히 광범위한 라이브러리도 있습니다(아직 ISO와 호환되지는 않지만).
AgDev는 Agon 플랫폼의 기능 세트와 하드웨어 설계를 수용하기 위해 CEdev를 수정하려는 노력의 결과입니다. 그 결과 Agon의 다른 옵션에 비해 더 강력하고 C++를 지원하는 툴체인이 탄생했습니다.
릴리스 빌드를 다운로드하거나 소스에서 직접 빌드하세요. 선택한 디렉터리에 빌드를 배치합니다.
그런 다음 PATH
에서 /bin
폴더를 찾을 수 있는지 확인하세요. Windows를 사용하는 경우 이 가이드를 따르거나 대신 cedev.bat를 실행하고 거기에서 명령을 실행할 수 있습니다. Linux에서는 터미널 창에서 export PATH=/<insert path here>/bin:$PATH
실행합니다.
이는 원래 CE 도구 체인과 동일한 접근 방식을 따릅니다(CEdev 시작 페이지 하단 참조). .bin
파일 생성 시 중지되도록 빌드 프로세스가 수정되었습니다. 이것은 Agon Light 실행 파일입니다.
나는 다음을 사용하는 것이 좋습니다:
깨끗하게 하다 V=1로 설정
make clean
명령을 사용하면 이전 컴파일 결과를 삭제하여 강제로 다시 컴파일할 수 있습니다.
빌드 프로세스는 다음 단계를 거칩니다.
ez80-clang
사용하여 .c 소스 파일을 LLVM 비트코드(.bc)로 컴파일
ez80-link
사용하여 LLVM 비트코드 연결. 여기에는 링크 시간 최적화가 포함됩니다.
ez80-clang
이용한 소스 프로그램용 eZ80 어셈블리 코드(.src) 생성
fasmg
사용하여 생성된 어셈블리 코드(3단계)를 라이브러리 및 컴파일러 런타임과 어셈블하고 연결 - 여기에는 특정 메모리 위치를 대상으로 하는 실행 파일 빌드가 포함됩니다. 이는 조정이 필요한 빌드 프로세스의 주요 부분입니다.
Zilog 애플리케이션 노트 "asm.pdf에서 C 호출"을 참조하세요.
IX 레지스터와 스택만 호출된 함수에 의해 보존되어야 합니다.
인수는 C 프로토타입에 해당하는 마지막에서 처음으로 푸시됩니다. eZ80에서는 실제 크기에 관계없이 항상 3바이트가 스택에 푸시됩니다. 그러나 어셈블리 함수는 푸시된 유효한 바이트만 사용하도록 주의해야 합니다. 예를 들어 short 유형을 사용하는 경우 스택에 푸시된 값의 상위 바이트에는 임의의 데이터가 포함됩니다. 이 표에는 호출된 함수 내에서 sp를 기준으로 한 위치가 나열되어 있습니다. sp + [0,2]
에는 반환 주소가 포함되어 있습니다.
C/C++ 유형 | 크기 | 스택 위치 |
---|---|---|
숯 | 1바이트 | sp + [3] |
짧은 | 2바이트 | sp + [3,4] |
정수 | 3바이트 | sp + [3,5] |
긴 | 4바이트 | sp + [3,6] |
오래 오래 | 8바이트 | sp + [3,10] |
뜨다 | 4바이트 | sp + [3,6] |
더블 | 4바이트 | sp + [3,6] |
바늘 | 3바이트 | sp + [3,5] |
eZ80은 리틀 엔디안입니다. 즉, 최하위 바이트가 먼저 저장됩니다.
이 표에는 함수의 반환 값에 사용되는 레지스터가 나열되어 있습니다. 유형의 부호는 사용된 레지스터에 영향을 주지 않지만 반환되는 값에는 영향을 미칠 수 있습니다. LSB는 표현식의 가장 오른쪽에 있는 레지스터에 있습니다. 예를 들어 E:UHL
레지스터 L
LSB를 저장한다는 것을 나타냅니다.
C/C++ 유형 | 반품등록 |
---|---|
숯 | 에이 |
짧은 | HL |
정수 | UHL |
긴 | E:UHL |
오래 오래 | BC:우데:UHL |
뜨다 | E:UHL |
더블 | E:UHL |
바늘 | UHL |
ISO와 호환되지 않습니다!
다음으로 구성됩니다:
파일 IO:
fopen()
, freopen(),
fclose()
fputc()
, fputs()
fgetc()
, ungetc()
, fgets()
feof()
, ferror()
, fflush()
fread()
, fwrite()
fseek()
, rewind()
, ftell()
clearerr()
remove()
표준 입력/표준 출력 IO:
putchar()
, puts()
getchar()
, gets_s()
포맷된 출력
printf()
(및 vprintf()
)
sprintf()
(및 vsprintf()
)
snprintf()
(및 vsnprintf()
)
형식화된 입력
scanf()
sscanf()
여기에는 stdint
등과 같은 다른 것들이 있지만 대부분 일반 표준 라이브러리에 대한 기대와 일치해야 합니다. 주로.
stdio
리디렉션 stdout
또는 stderr
에서 freopen()
사용하여 출력을 리디렉션할 수 있습니다.
putchar()
- 출력이 리디렉션되지 않는 한 outchar()
로 출력합니다. 이 경우 출력은 fputc()
로 리디렉션됩니다.
puts()
- putchar()
호출
printf()
(및 vprintf()
) - nanoprintf.c
에서 putchar()
호출하는 npf_putc_std()
호출합니다.
fputc()
- outchar()
호출 시 stdout
에서 호출되지 않는 한 mos_fputc()
호출합니다. - 함수 호출 루프의 위험이 없도록 putchar()
호출을 방지합니다.
stdin
에서 freopen()
사용하여 입력을 리디렉션할 수 있습니다.
getchar()
- 문자를 가져오기 위해 inchar()
호출하고 문자를 에코하기 위해 outchar()
호출합니다(출력이 리디렉션된 경우에도). 출력이 리디렉션되지 않은 경우 fgetc()
호출하고 문자를 에코하지 않습니다.
gets_s()
- 입력이 리디렉션되지 않은 경우 getchar()
호출합니다(라인은 CR로 종료됩니다). 입력의 fgets()
호출이 리디렉션되었습니다(라인이 CR/LF 쌍으로 종료됨).
scanf()
- uscan.c
에서 getchar()
호출합니다(업데이트가 필요하지 않음).
fgetc()
- inchar()
를 호출하고 outchar()
로 에코할 때 stdin에서 호출되지 않는 한 mos_fgetc()
호출합니다. - 함수 호출 루프의 위험이 없도록 getchar()
호출을 방지합니다.
fopen
에 의해 반환되고 작업이 수행될 파일을 나타내기 위해 파일 IO 루틴에 전달되는 파일 핸들에 대한 포인터인 FILE *
가 필요합니다.
기타 관련 파일:
stdio.h
- 다양한 기능과 FILE
에 대한 형식 정의를 정의하는 일반 헤더 파일
files.c
- stdout, stderr, stdin을 포함한 파일 핸들에 대한 저장소를 인스턴스화합니다.
다음과 같은 표준 파일 핸들이 정의됩니다.
stdout
- 기본 출력
stderr
- 오류 메시지의 기본 출력
stdin
- 기본 입력
MOS는 입력/출력 리디렉션을 구현하지 않으므로 기본적으로 모두 콘솔을 사용합니다.
명령줄 처리에는 두 가지 옵션을 사용할 수 있습니다.
main 함수가 다음과 같이 정의된 경우 자동으로 포함됩니다.
int 메인( int argc, char* argv[] )
공백을 구분 기호로 사용하여 명령줄을 분할합니다. 명령줄 옵션은 정상적으로 argv[]
배열에서 사용할 수 있습니다.
애플리케이션 makefile에 다음이 포함된 경우 선택적으로 포함됩니다.
LDHAS_ARG_PROCESSING = 1
이는 지원합니다
큰따옴표로 인용하기
입력/출력 리디렉션
>out_file.txt
- stdout을 out_file.txt
로 리디렉션하여 새 파일을 만듭니다.
>>out_file.txt
- stdout을 out_file.txt
로 리디렉션하고 파일 끝에 추가합니다.
<in_file.txt
- stdin을 in_file.txt
에서 리디렉션합니다.
MOS 명령에 대한 최신 문서는 Agon Console8 문서를 참조하세요.
MOS(기계 운영 체제)는 Agon 파일 시스템 및 마우스와 같은 일부 하드웨어 주변 장치에 대한 인터페이스를 제공합니다. Z80 측에서 액세스할 수 있는 대규모 SYSVAR
구조체의 시스템 변수에 대한 정보를 유지합니다. 일반적으로 C 코드는 다음과 같이 초기화된 이 구조체에 대한 포인터를 선언합니다.
정적 휘발성 SYSVAR* sv; sv = vdp_vdu_init();
자세한 내용은 <mos_api.h>
참조하세요.
VDU 명령에 대한 최신 문서는 Agon Console8 문서를 참조하세요.
VDP(비디오 디스플레이 프로세서)는 MOS로부터 텍스트 스트림을 받아 텍스트/그래픽 터미널처럼 작동합니다. 텍스트 스트림에는 다음이 포함될 수 있습니다.
일반 텍스트
디스플레이를 제어하고 그래픽/사운드/등 명령을 보내는 이스케이프 시퀀스/명령
명령을 보낸 결과 MOS가 결과를 반환하면 이는 SYSVAR
에 저장되며 명령에 대한 응답으로 직접 반환되지 않습니다. 응답은 비동기식입니다. 결과가 반환되었는지 확인하려면 다음을 수행하세요.
SYSVAR
의 vdp_pflags
0으로 설정
VDU 명령 실행
vdp_pflags
의 관련 비트가 설정될 때까지 기다립니다. 비트 마스크는 <mos_api.h>
를 참조하세요.
다음을 통해 명령을 보낼 수 있습니다.
putch()
- 단일 문자(C 표준 라이브러리의 일부가 아님)
mos_puts()
- 다중 문자열
이 두 가지 출력은 모두 MOS/VDP로 직접 출력됩니다. STDIO 라이브러리의 일부가 아니며 CR/LF 변환 또는 리디렉션이 적용되지 않습니다.
AgDev에는 많은 VDU 명령에 대한 편의 기능이 제공됩니다. 예를 들어 화면 MODE를 3으로 변경하려면 C는 vdp_mode(3);
putch(22); putch(3);
와 동일하게 22,3
단일 바이트로 출력에 보냅니다. putch(22); putch(3);
이러한 함수 목록은 <vdp_vdu.h>
참조하세요. 키보드 처리와 관련된 추가 기능은 <vdp_key.h>
에 있습니다.