notes

/Home ....
....

svētdiena, 2012. gada 9. septembris

Assemblers uz MSX

Viss MSX spēļu zelta fonds, protams, ir radīts assemblerā. Tas nekur nav pazudis un aktīvi tiek lietots arī mūsdienās. Katru gadu notiek MSX saiets AAMSX , kurā labs kods var dabūt kādu balvu. Radītās prezentācijas un spēļuki izskatās aizvēsturiski, tomēr tiem ir savs "spīkera ģenerētās" mūzikas stils un 2D grafika 16 krāsās (nu varbūt var emulēt kādu no pēdējiem turbo modeļiem ar paplašinājumiem). Lai ko tādu radītu, visupirms jāatrod daudz brīvā laika...

Kā tad cilvēki rada šo kodu? Visupirms ir tāds GEN80.COM assemblers, kurš kompilē uz MSXDOS2 turpat uz emulētās MSX konsoles. Tādu variantu pats praksē neapskatīju, jo uz MSX darboties tā īsti produktīvi nav. Man vairāk simpatizē TASM universāls assemblers priekš visa veida Z80 mašīnām. Tas tad man arī izdevās un radīju pirmo assemblera kodu uz sava PC Windows:

.title HelloAsm

;
; Hello assembler ASM code for MSX
;
;  MSDOS:    TASM -80 -b HelloAsm.ASM HelloAsm.com
;  Then run HelloAsm.com on MSX-DOS1
;
; Date: 7 september 2012
;
;

.list

  .org $100

         ld de, message
         ld c, 9
         call 5
         ret

message .byte "Hello World of assembler!"
        .byte 13, 10
        .byte "$"

.end

Tālāk sekos apraksts par to kā varētos notikt programmēšana.
Internetā ievietoju failiņu, kas satur katalogu ar visu nepieciešamo (tikai logiem, linuxiem un makiem nē). To vajag lejuplādēt un atarhivēt pie sevis uz diska. Tur ir COMPILE.BAT paraugs, kuru startējot, ar TASM kompilatoru tiek kompilēts HelloAsm.ASM failiņš, lai iegūtu uz MSX konsoles izpildāmu moduli HelloAsm.COM.



Otrs kompilators tniASM, startējot COMPILE2.BAT, kompilē HelloAs2.ASM failiņu. Sintakse assembleriem atšķirīga, izvēle pašu ziņā kuru lietot.
Tāpat kā iepriekšējā rakstā par programmēšanu valodā C priekš MSX, ļoti ieteikšu uzinstalēt un lietot blueMSX emulatoru. Ātrs un daudzfunkcionāls.
Pievienojam to pašu minēto katalogu kā Disku A (obligāti jāuzmanās lai tā saturs nepārsniedz 720Kb). Neaizmirstam pielikt ķeksi pie "Reset After Insert".


Reboot un startējas sistēma (nodrošina MSXDOS.SYS, COMMAND.COM), tad AUTOEXEC.BAT startē mūsu programmu.



Tātad assemblera koda izstrāde turpmāk jāveic, ar Notepad modificējot  HelloAsm.ASM , tad COMPILE.BAT un visbeidzot, pēc pārslēgšanās uz emulatoru, jāuzklikšķina uz DiskA pogas, lai pievienotu to pašu disku un programma startēsies no jauna. Protams, ASM sintaksei noderētu kāds piemērotāks editors par Notepad.
Milzīgs pluss šeit ir blueMSX nodrošinātais Debugger-rīks. Šajā brīdī, kad programma beigusi darbu un sistēma aktīvi darbojas (tiek emulēta), varam apturēt (pauzēt programmu), uzstādīt breakpoint uz adreses 0100 (jo mūsu assemblerā tā ir sākuma adrese programmai, kur tā tiks ielādēta atmiņā), tad resumēt lai sistēma darbojas tālāk, komandrindā uzrakstīt HELLOASM un pēc enter "procesors apturēsies" mūsu programmas pašā sākumā. Teorētiski, protams.


Tādējādi laikam varam arī izķert kļūdas un, pats galvenais, programmēt vislabāk piemērotas programmas MSX limitētajiem resursiem. Tomēr, ja godīgi, assemblers ar mazu operāciju komplektu padara kodēšanu par mocībām, jo pamatā visa cīņa notiek ar vērtību saglabāšanu stekā, vai kur citur, jo tāpat visi reģistri aizņemti. Tagad saprotu kāpēc tiek rakstītas dažādas assembleru versijas, jo neviena tā īsti ērta nav, arī TASM. Kļūdu ķeršana ir gandrīz neiespējama, ja debug-rīks nav cieši saistīts ar programmas redaktoru. Tā var veselu dienu nocīnīties ar sīku nedokementētu kompilatora īpatnību.


Ir vēl tāda metode:
nokompilē .BIN ielādējamu failu, ko no beisika ielādē atmiņā (un startē, norādot R)
BLOAD "SOURCE.BIN"[,R],&H<starta_adrese>
Jebkurā brīdī startēt (vai uzkarināt) no beisika no jebkuras adreses (0...FFFF) mašīnkodu var ar
DEF USR =&H<starta_adrese>: A=USR(0) 
Tādējādi assemblers dara ātrās lietas, beisiks veic to, ko grūti realizēt assemblerā.

Pāris mēnešus vēlāk... MSX assemblera projektiņš ir radīts uz TASM bāzes, taisni kā pēc visa aprakstītā. MSX programmēšana ir cīņa ar VRAM, diska funkciju neesamību (vēl pirms MSDOS), nemitīgu 64Kb atmiņas pārklāšanos un trūkumu, kā arī problemātisku kļūdu izķeršanu. Bet nu kautkas no tā visa ir sanācis (2012.okt).


Nav komentāru:

Ierakstīt komentāru