Inhaltsverzeichnis
Symbiface 2 ROM Manager
Ihr habt ein Symbiface 2 für euren Amstrad CPC und wollt ohne den SymbOS ROM Manager eure ROMs im Symbiface direkt verwalten. Kein Problem: Mr.AMS hat einen kleinen ROM Manager entwickelt, den ein paar RSX in das BASIC des CPCs einhängt, mit denen es möglich ist, ROMs in das Symbiface 2 zu übertragen.
Befehle
Die nachfolgenden Befehle stehen nach dem Einbinden des ROMs zur Verfügung.
- |loadrom,<ROM Nummer>, „<Dateiname>„ - lädt die angegebene Datei in das SF2 in die entsprechende ROM Nummer
- |parkrom,<ROM Nummer>[,<ROM Nummer>[,<ROM Nummer>]] - parkt / entparkt die angegebenen ROM Nummern, sodass die entsprechenden ROMs nicht mehr bei Systemstart geladen werden
- |saverom,<ROM Nummer>, “<Dateiname>„ - speichert das ROM in die engegebene Datei
- |sf2minfo - gibt eine Hilfe zum ROM Manager und den Befehlen aus
Quellcode
- 1
write direct -1,3 ; write "sf2man.rom" org &c000 limit &ffff run 0 cas_in_open equ &bc77 cas_in_direct equ &bc83 cas_in_close equ &bc7a cas_out_open equ &bc8c cas_out_direct equ &bc98 cas_out_close equ &bc8f hi_kl_curr_selection equ &b912 hi_kl_rom_deselection equ &b918 hi_kl_rom_select equ &b90f hi_kl_ldir equ &b91b txt_output equ &bb5a space equ &b0c7 faradr equ &b0fd xinramlength equ xinramend-xinram db 1 db 0,1,0 defw rsxtbl jp init jp loadrom jp parkrom jp saverom jp sf2minfo .rsxtbl db "SF2Manage","r"+&80 db "LOADRO","M"+&80 ;!loadrom,romnr,"Dateiname" db "PARKRO","M"+&80 db "SAVERO","M"+&80 db "SF2MANAGERINF","O"+&80 db 0 .init push hl ld hl,initmsg .loopinit ld a,(hl):call txt_output cp 13:jr z,l1 inc hl:jr loopinit .l1 pop hl scf:ret .initmsg db " Symbiface II ROM Manager, ",164,"2008 Mr. AMS",10,13 .loadrom cp 2:jr z,if4 ;2 parameter uebergeben? ld hl,loadhelp:jp print0t ;sonst hilfetext ausgeben .if4 ld a,(&ae6c):ld e,a:ld a,(&ae6d):ld d,a:inc hl ;von de bis hl ld a,(&b071):ld l,a:ld a,(&b072):ld h,a ;geht der freie bereich im ram sub a ;Carry-Flag löschen sbc hl,de ld a,&08:cp h:jr nc,if1 ;weniger als 2048+256 byte frei? ld l,(ix+0):ld h,(ix+1):ld b,(hl) ;laenge das dateinamens in b push de:inc hl:ld e,(hl):inc hl:ld d,(hl):ex de,hl:pop de ;hl zeigt auf dateinamen push ix ;zeiger auf rsx-parameter sichern call cas_in_open ;datei öffnen jr nc,badcmd ;war erfolgreich? ld hl,&c000:call cas_in_direct ;rom wird in bildschirmspeicher kopiert jr nc,badcmd ;war erfolgreich? call cas_in_close ;datei schliessen pop ix ;zeiger auf rsx-parameter wiederherstellen ld bc,xinramlength:ld de,space:ld hl,xinram:ldir ;routine zum uebertragen des roms ins ram kopieren jp space ;und aufrufen ret .if1 ld hl,errmsg1 ;fehlermeldung bei zu wenig freiem speicher, dann ende .loop1 ld a,(hl):call txt_output:cp 13:ret z ; / inc hl:jr loop1 ; / .errmsg1 db "not enougth memory",10,13 ;/ .badcmd ld hl,bcmsg ;fehlermeldung "Bad command" .loop2 ld a,(hl):call txt_output:cp 13:ret z ; / inc hl:jr loop2 ; / .bcmsg db "Bad command",10,13 .loadhelp db 124,"LOADROM,rom,",34,"filename.ext",34,10,13,0 ;/ .xinram call hi_kl_curr_selection:push af ;aktuelles rom sichern di ld bc,&7f8e:out (c),c ;roms ausblenden ld bc,&df00:ld a,(ix+2):out (c),a ;rom zum beschreiben auswaehlen ld bc,&fd17:in a,(c) ;rom zum beschreiben einblenden ld bc,&4000:ld de,&4000:ld hl,&c000:ldir ;aus bildschirmspeicher ins rom kopieren ld bc,&fd17:out (c),c ;rom wieder ausblenden ld bc,&df00:pop af:out (c),a ;sf2rommanager wieder einblenden ei ret .xinramend nop .parkrom or a:jr nz,if2 ;wurden parameter uebergeben? ld hl,parkhelp:jp print0t ;sonst hilfetext ausgeben .if2 ld b,a ;zahl der zu parkenden roms in a ld hl,pinram:ld de,space:ld bc,pinramend-pinram:ldir ;routine zum roms parken ins ram kopieren jp space ;und aufrufen ret .pinram ld l,a ;zahl der zu parkenden roms nach l call hi_kl_curr_selection:push af ;aktuelles rom sichern di ld bc,&7f8e:out (c),c ;roms ausblenden ld bc,&fd17:in a,(c) ;rom zum bearbeiten einblenden ld b,l ;zahl der zu parkenden roms nach in schleifenzaehler .ploop push bc ld c,(ix):ld b,&df:out (c),c ;zu parkendes rom waehlen ld a,(&4000):xor &ff:ld (&4000),a pop bc:inc ix:inc ix:djnz ploop ld bc,&fd17:out (c),c ;rom wieder ausblenden ld bc,&df00:pop af:out (c),a ;sf2rommanager wieder einblenden ei ret .pinramend nop .parkhelp db 124,"PARKROM,rom[,rom[,rom[,...]]]",10,13,0 .saverom cp 2:jr z,if3 ;zwei parameter uebergeben? ld hl,savehelp:jp print0t ;sonst hilfetext ausgeben .if3 ld a,(&ae6c):ld e,a:ld a,(&ae6d):ld d,a:inc hl ;von de bis hl ld a,(&b071):ld l,a:ld a,(&b072):ld h,a ;geht der freie bereich im ram sub a ;Carry-Flag löschen sbc hl,de ld a,&08:cp h:jp nc,if1 ;weniger als 2048+256 byte frei? ld l,(ix+0):ld h,(ix+1):ld b,(hl) ;laenge das dateinamens in b push de:inc hl:ld e,(hl):inc hl:ld d,(hl):ex de,hl:pop de ;hl zeigt auf dateinamen push ix ;zeiger auf rsx-parameter sichern call cas_out_open ;datei öffnen jp nc,badcmd ;war erfolgreich? ld hl,sinram:ld de,space:ld bc,sinramend-sinram:ldir ;routine zum auslesen des roms verschieben pop ix ;zeiger auf rsx-parameter wiederherstellen call space ;und aufrufen ld a,%00000010 ;dateityp binär ungeschützt ld de,&4000 ;16 kb laenge ld hl,&c000 ;liegt ab &c000 im ram call cas_out_direct ;datei schreiben jp nc,badcmd ;fehler aufgetreten? call cas_out_close ;datei schliessen jp nc,badcmd ;fehler aufgetreten? ret .sinram call hi_kl_curr_selection:push af ;aktuelles rom sichern di ld bc,&7f8e:out (c),c ;roms ausblenden ld bc,&df00:ld a,(ix+2):out (c),a ;rom auswaehlen ld bc,&fd17:in a,(c) ;rom ab &4000 einblenden. ld bc,&4000:ld de,&c000:ld hl,&4000:ldir ;aus rom in Bildschirmspeicher kopieren ld bc,&fd17:out (c),c ;rom wieder ausblenden ld bc,&df00:pop af:out (c),a ;sf2rommanager wieder einblenden ei ret .sinramend nop .savehelp db 124,"SAVEROM,rom,",34,"filename.ext",34,10,13,0 .sf2minfo ld hl,loadhelp:call print0t ld hl,savehelp:call print0t ld hl,parkhelp:call print0t ld hl,copyright:jr print0t .copyright db 164," 2007 Alien Master System",0 .print0t ld a,(hl):or a:ret z ;text zu ende? call txt_output ;zeichen ausgeben inc hl ;naechstes zeichen jr print0t