지난번까지 기본적인 뱅킹 라이브러리와 관련 툴을 만들었는데요.
조금씩 개선하면서 진행중입니다.
기본 C 라이브러리에서 빠져있던 getenv(), setenv() 함수를 DOS2 기준으로 쓸수 있도록 추가되었습니다.
현재 뱅킹 툴로 소스 빌드를 하면,
로딩 프로그램(*.COM)과 별도의 뱅크에 로드되는 코드(*.OVL)가 생기는데,
로더가 구동시 같은 디렉토리에 존재하는 OVL을 읽을수 있도록 했습니다.
(이때 getenv()가 필수가 되지요.)
계획되었던 뱅크간 공유 메모리용 함수들도 만들었습니다.
요건 간단하게 malloc(), free() 같은 기존 함수에 wrapper로 구현했습니다.
메모리 영역 9000H~ 부터가 공유 힙이 되는 것이지요.
참고로, 뱅크 내의 코드에서 malloc()을 쓰는 경우는 해당 뱅크 메모리(0000H~7FFFH)가 사용됩니다.
뱅크간 함수로 파라미터 전달은 기본적으로 스택이 쓰입니다.
큰 메모리를 포인터만 전달하거나, 공유용으로 쓸때만 이 영역이 사용되는 것이고요.
다음은, ISR(인터럽트 서비스 루틴) 처리인데...
일단 0038H의 Z80 인터럽트 벡터는 DOS2와 메인 BIOS가 서로 다르게 세팅해서 사용하고 있기 때문에
이걸 직접 수정하면 안됩니다.
메인 BIOS에서 제공하는 KEYI 훅과, 타이머용 TIMI 훅을 쓰도록 만들었습니다.
(사실 타이머는 VDP의 V Sync 인터럽트지요.)
실제로 훅 동작시에는 이미 Page0가 메인 BIOS로 변경이 되는데요. (DOS2에 의해)
유저 ISR이나 메모리를 Page0에서 쓸수도 있으니,
기본적으로 슬롯 세팅 및 뱅크 전환도 함께 되도록 구현할 생각입니다.
ISR의 뱅크 위치와 상관없이 구동 되도록 합니다.
아직은 간단한 카운트만 하는 ISR(외부 인터럽트 및 타이머 인터럽트)이 동작하는지 테스트했습니다.
최종적으로는 외부 ISR은 8개정도, 타이머 ISR은 1개를 등록하도록 만들 생각입니다.
아래 스크린샷을 보세요.
DOS2 환경 변수를 몇개 출력해보았고,
9000H~ 에 위치하는 공유 버퍼를 할당 받은 것도 표시해보았습니다.
(뱅크1에서 한개, 뱅크2에서 한개 할당했네요.)
맨 아래쪽 라인에서는,
0CE1, 0CE0, 0CE0 세개의 카운터가 올라가는 것을 출력하는 중인데요.
왼쪽은 메인 BIOS의 JIFFY 값,
중앙은 유저의 외부 ISR의 카운터
오른쪽은 유저의 타이머 ISR의 카운터 입니다.