Hello World of MSX czyli assembler starter

Szybki przepis na działający i prosty “Hello world” w assemblerze na komputery MSX (bo kolega z forum speccy.pl natrafił na jakiś sajgon tutorialowy).

Bierzemy edytor tekstu (notatnik – cokolwiek co zapisuje czysty plik tekstowy .txt) i kopiujemy sobie do tego edytora poniższy kod:

; This program prints "Hello world!" using BIOS function ($00a2).
;
; Save this as HELLO.ASM, then assembly with PASMO --BIN HELLO.ASM HELLO.BIN 
; Then after transfering to floppy disk load from MSX-BASIC with: BLOAD "HELLO.BIN",R
 
CHPUT:	EQU $00A2		; Set the address of character output routine of main Rom BIOS
				; Assuming main Rom is already selected (0000h ~ 7FFFh) under MSX-Basic
CHGMOD: EQU $005F		; BIOS routine to print character to screen

	MAIN 
 
	org 	$C000		

; BLOAD header mandatory to include

	DB 	$FE		; Binary file ID
	DW 	Beginadr	; begin address
	DW 	Endadr		; end address
	DW 	Runadr		; program execution address (for ,R option)

Beginadr:
Runadr:
				; Program code entry point
	LD 	A,1 			; screen mode (0,1,2,3)
	CALL 	CHGMOD		; CALL CHGMOD change mode

	LD	HL,Hello	; Load the address of the label Hello into HL.
	CALL	Print		; Call the Print routine. 
	RET			; Back to MSX-BASIC environment if called from there.
 
Print:
	LD	A,(HL)		; Load the byte from memory at address pointed by HL into A
	AND	A		; Compare it Same as CP 0 but faster.
	RET	Z		; If the result is zero, it means theend of string to print
	CALL	CHPUT		; Call the routine to display a character.
	INC	HL		; Increment the HL value so we move to the next char to print
	JR	Print		; Jump to begin of Print routine to print next character.
 
Hello:				; text to print pointer
	DB "Tooloud says Hello MSXworld!",0	; Zero indicates the end of text.
Endadr: 

	END 

2. zapisujemy plik jako plik tekstowy bez udziwnień nazywając go roboczo HELLO.ASM.

3. uruchamiamy z linii poleceń (z katalogu z naszym plikiem – zakładając, że mamy np. crossassembler pasmo ze ścieżką systemową dostępu):

pasmo --bin HELLO.ASM HELLO.BIN

W wyniku powstanie plik HELLO.BIN z prawidłowym nagłówkiem dla tego typu plików w MSX DOS.

Dlatego te DB i DW na początku kodu: plik .bin w MSXDOS potrzebuje 7bajtowego nagłówka, $FE jest pierwszym bajtem (identyfikatorem pliku), potem znaczniki kodu (startadr, endadr, runadr) i tyle. Oczywiście – możesz mieć start i run kodu w tym samym miejscu, jak w przykładzie powyżej.

Co dalej? Przydało by sie uruchomić ten program, który właśnie skompilowaliśmy.

Jak nagrać na dyskietkę? Długi temat, ale już go poruszałem. To może tym razem będziemy leniwi i uruchomimy sobie ten program w emulatorze, np. fMSX. Wcześniej zrobimy sobie obraz dyskietki programem Disk Manager (linkuję do wersji 0.17 – w tej chwili najnowszej).

File -> New, przeciągamy plik HELLO.BIN, zapisujemy obraz dyskietki jako plik .dsk – no banał.

Co dalej? Emulatorek, żeby było najprościej to fMSX (ale można inny, o czym już też pisałem tutaj), wybrałem MSX1 jako hardware). Wybieramy plik .dsk do załadowania jako wirtualna dyskietka w stacji A:

Potem pozostaje nam załadować i uruchomić nasz plik HELLO.BIN właściwym dla MSX BASIC poleceniem.

Ja pozwoliłem sobie dla ilustracji najpierw na polecenie FILES, które odpowiada poleceniom znamym z DOSa czy UNIXa/LINUXa czyli DIR czy LS. Plik jest, można go odpalić:

BLOAD”HELLO.BIN”,R

BLOAD = binary LOAD, a to R na końcu to polecenie uruchomienia tego pliku wg wartości nagłówka czyli nasze magiczne liczby na początku.

57 bajtowy plik .BIN, z czego 7 to nagłówek, 28 to napis, a pozostałe 22 bajty to kod 🙂

PS. do uruchomienia tego kodu z cartu trzeba niestety zmienić nagłówek i w sumie… dodać jeszcze jeden kod, ale to temat na inny wpis.