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
amstradcpc/symbifacerommanager.txt · Zuletzt geändert: 2013/05/25 17:49 von octoate
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0