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.