일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- GOG
- 슈퍼패미컴
- 게임기어
- PC엔진
- 모빌슈트
- Game Gear
- mobilesuit
- 게임보이
- YS
- 티스토리챌린지
- fpga
- ps4
- 3DS
- 이스
- MSX
- snes
- 메트로이드
- 슈퍼마리오
- Apple II
- 건담
- 패미컴
- 오블완
- 컨트롤러
- mister
- ensemble
- 앙상블
- PSP
- 닌텐도 스위치
- analogue
- 메가드라이브
- Today
- Total
Just a Blog
MSX 실기와 OCM 클론(MiSTer MSX 코어)에서 BASIC 실행 차이 두번째 분석 본문
이전 글에서 언급한 MSX 실기(X-II 및 에뮬레이터)와 OCM 클론(MiSTer MSX 코어, IQ 3000 큐티)에서 BASIC 실행의 차이에 대한 추가 분석 내용이다.
(업데이트: 신규 추가 분석에 대한 내용은 이곳에 실었다)
1. 신규 OCM BIOS 적용 SD 이미지를 사용하여 'COLOR_SPRITE()' 예제 코드 실행
MiSTer의 MSX 코어에서 KdL의 새로운 바이오스팩을 적용하여 SD 이미지를 만들고 실행했더니, 이전 글에서 언급한 'COLOR_SPRITE()' 예제 코드가 실기와 똑같이 동작했다.
다만 실행 차이가 발생했던 프로그램을 실행한 뒤 중단하고 이 프로그램을 시작하면 이전과 동일한 현상이 발생하는데, 뒤에서 언급하겠지만 그 현상은 VRAM 메모리가 유지되면서 발행하는 문제로 보인다.
2. 'ON SPRITE GOSUB' / 'SPRITE ON' 사용 이상 동작 프로그램 추가 분석
관련된 MSX 자료를 살펴보았고 소스 코드도 자세히 뜯어 보았다. 다시 분석해 봐도 'SPRITE ON' 실행 후 스프라이트 충돌과 상관없이 거의 바로 'ON SPRITE GOSUB'문이 지정한 번지로 분기가 발생했다.
앞선 예제 코드와 이 문제의 프로그램이 다른 점은 이 프로그램이 SPRITE를 설정할 때 BASIC의 SPRITE 관련 명령어를 사용하지 않고 SCREEN 1에서 'VPOKE' 명령어로 VRAM의 3800H 주소와 2000H에 직접 데이터를 집어 넣는다는 것이다.
이렇게 하면 베이직 프로그램이 종료되어도 VRAM 메모리가 그대로 유지되는 것인지, 이후 앞서 설명한 'COLOR_SPRITE()' 예제 프로그램을 로드(LOAD)하여 실행해도 비정상적으로 스프라이트 충돌 상황이 재현된다.
X-II의 설명서를 보면 SPRITE의 사용법으로 'SPRITE$()'를 이용하는 방법이 소개되어 있다. 이것을 보고 'SPRITE$()'를 이용해 스프라이트를 만들면 'ON SPRITE GOSUB' 및 'SPRITE ON'이 MiSTer MSX 코어에서 어떻게 동작할지 궁금해졌다. 'msx.org'의 'SPRITE$()' 예제 코드를 변형하여 아래와 같은 코드를 만들고 MiSTer MSX 코어에서 실행해 보았다.
10 COLOR 15, 1, 7: SCREEN 1,0
20 B$="": C$=""
25 X=50: Y=100
30 FOR I=0 TO 7: READ A: B$=B$+CHR$(A): NEXT
35 FOR J=0 TO 7: READ D: C$=C$+CHR$(D): NEXT
40 SPRITE$(0)=B$
45 SPRITE$(1)=C$
47 ON SPRITE GOSUB 100: SPRITE ON
50 PUT SPRITE 0, (100, 100), 7, 0
55 PUT SPRITE 1, (X, Y), 15, 0
60 S=STICK(0): X=X+7*((S=7 AND X>5)-(S=3 AND X<220))
65 GOTO 50
80 DATA 24, 60, 126, 255, 36, 36, 66, 129
90 DATA 24, 60, 126, 255, 36, 36, 66, 129
100 PRINT "COLLISION": END
결과는... 정상적이었다. 좌우 방향키로 스프라이트 하나를 움직여 둘을 겹치게 하면 그때 'ON SPRITE GOSUB'에 지정된 주소로 분기가 일어나 "COLLISION"을 출력하며 종료한다.
이를 바탕으로 기존 코드에서 'VPOKE'로 스프라이트를 만들던 것을 'SPRITE$()' 구문을 사용하여 스프라이트를 만들도록 고쳤더니 MiSTer MSX 코어에서도 동작한다. 이로서, 'VPOKE'를 통해 VRAM에 직접 스프라이트를 생성하는 방식이 MiSTer MSX 코어 등의 OCM 클론에서 정상적으로 동작하지 않음에 대한 심증이 굳어졌다. 다만 그 원인이 FPGA 구현에 있는지, BIOS에 있는지, BASIC 동작에 있는지는 감을 못 잡겠다.
(추가)
1. OCM 클론 VDP의 SPRITE 담당부 VHDL 소스 일부 (출처: https://github.com/MiSTer-devel/MSX_MiSTer)
2. VDP 스프라이트 처리 관련 기술정보 (출처: MSX2-Technical-Handbook)