Autor Thema: Ein ROM erstellen "hallo welt" ?  (Gelesen 14314 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-3
Ein ROM erstellen "hallo welt" ?
« am: 27. November 2018, 10:41:44 »
Hallo, guten Tag.

Wie kann man bitte ein ROM erstellen wie im  Titel und dann mit dem "|welt" starten ?
Ich habe zwar darüber etwas gelesen , versteh es aber nicht.

Ich möchte einmal die Grundprinzipien kennen lernen bis es lauffähig wird und was
man dabei beachten muss.

Ich suche nichts kompliziertes, sondern einen sanften Aufbau.

Danke.
Gruss

Offline HAL6128

  • CPC 464
  • **
  • Beiträge: 60
  • Liked: 30
  • Karma: +12/-0
Re: Ein ROM erstellen "hallo welt" ?
« Antwort #1 am: 27. November 2018, 21:27:41 »
Hier findest Du eine gute Anleitung zum Thema (auf Englisch):
http://www.cantrell.org.uk/david/tech/cpc/CWTA-writing-ROMs.html

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-3
Re: Ein ROM erstellen "hallo welt" ?
« Antwort #2 am: 28. November 2018, 11:14:52 »
Danke für die Info.

Muss jetzt nur den Assembler finden für den Code.

Gruss

Offline Devilmarkus

  • Administrator
  • CPC 464+
  • *****
  • Beiträge: 1135
  • Liked: 376
  • Karma: +40/-0
Re: Ein ROM erstellen "hallo welt" ?
« Antwort #3 am: 28. November 2018, 12:16:35 »
JavaCPC assembliert den Code....
Allerdings sind im Source 2 ASCII Symbol Fehler... Deswegen kann JavaCPC damit nichts anfangen.
Diese Zeilen einfach neu schreiben, dann geht es, vermutlich ist bei der Umwandlung in HTML ein Fehler eingeschlichen...
Es steht an 2 Stellen mindestens statt einer 1 (Eins) ein l (kleines L)

Hier der korrigierte Code:
;--------------------------------------
;Amstrad ROM
;
;By R.A.Waddilove
;--------------------------------------
WRITE "CWTAROM.BIN"
NOLIST
LIMIT &FFFF
ORG &C000
;--------------------------------------
;Reserves 32 bytes for workspace:
;0-17 used by DOUBLE
;--------------------------------------
;ROM Prefix
;--------------------------------------
DEFB 1 ;ROM type ... background
DEFB 1 ;mark 1
DEFB 1 ;version 1
DEFB 1 ;modification 1
;--------------------------------------
;Command table
;--------------------------------------
DEFW name_table
JP initialise_ROM ;power-up/reset entry
JP help ;help screen
JP double    ;double height printing
;--------------------------------------
;Name table
;--------------------------------------
.name_table
DEFB "CWTA RO","M"+&80   ;bad name
DEFB 'HEL',"P'+&80       ;HELP
DEFB "DOUBL","E"+&80     ;DOUBLE,@a$
DEFB 0
;---------------------------------------
;Power-up/Reset intialisation
;AF,BC corrupted
;---------------------------------------
.initialise_ROM
PUSH DE:PUSH HL ;save DE/HL
CALL print_string; print power-up message
DEFB 13,10
DEFB "Computing with the Amstrad ROM"
DEFB 13,10,10
DEFB 0
POP HL:POP DE ;restore HL/DE
AND A
LD BC,32:SBC HL,BC ;grab 32 bytes from top of memory
SCF
RET
;--------------------------------------
;General string print subroutine
;AF,HL corrupted
;--------------------------------------
.print_string
POP HL ;get string address
. sp_loop
LD A,(HL):CALL &BB5A ;print character
INC HL
OR A ;done?
JR NZ,sp_loop
JP (HL)
;---------------------------------------
; HELP
; Print syntax and function of commands
; AF,HL corrupted
;--------------------------------------
.help
CALL print_string
DEFB "Computing with the Amstrad ROM",10, 13
DEFB "HELP - list all commands", 10, 13
DEFB "DOUBLE,@a$ - double height print", 10, 13
DEFB "Names can be prefixed with CWTA", 10, 13
DEFB 7,0
RET
;--------------------------------------
;DOUBLE
; Double height print
; AF,BC,DE,HI corrupted
;--------------------------------------
.double
DEC A
JP NZ,help ;one parameter?
LD L,(IX+0)
LD H,(IX+1)  ;HL points to string descriptor
LD A,(HL)    ;A=length
AND A:RETZ   ;abort if 0
LD (IY+17),A ;workspace+17=length
INC HL: LD E,(HL)
INC HL: LD D,(HL) ;DE=address
.loop1
PUSH DE
LD A,(DE)    ;get character
CALL &BBA5   ;HL=data address
CALL &B906:
PUSH AF      ;enable lower ROM
PUSH IY:
POP DE       ;DE=workspace
LD B,8       ;copy data to workspace
.loop2
LD A,(HL)
LD (DE),A:INC DE
LD (DE),A:INC DE
INC HL
DJNZ loop2
POP AF
CALL &B90C   ;restore lower ROM state
LD A,255     ;define top half of character
PUSH IY
POP HL
CALL &BBA8
LD A,254     ;define bottom half of character
PUSH IY
POP HL
LD DE,8:ADD HL,DE
CALL &BBA8
CALL print_string ;print big character
DEFB 255,8,10,254,11,0
POP DE:INC DE ;next character
DEC (IY+17):JR NZ,loop1 ;all done?
RET
list
END
« Letzte Änderung: 28. November 2018, 12:20:32 von Devilmarkus »
http://cpcwiki.de
Dein Deutsches CPCWiki!

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-3
Re: Ein ROM erstellen "hallo welt" ?
« Antwort #4 am: 28. November 2018, 13:14:41 »
Danke für die Hilfe.

Wie kann man jetzt bitte aus der Bin ein ROm machen?

Danke.
Gruss

Offline Devilmarkus

  • Administrator
  • CPC 464+
  • *****
  • Beiträge: 1135
  • Liked: 376
  • Karma: +40/-0
Re: Ein ROM erstellen "hallo welt" ?
« Antwort #5 am: 28. November 2018, 13:35:17 »
Von .bin in .rom umbenennen?

Tipp: Im JavaCPC Assembler als erste Zeile den Code eingeben:

noheader

Dann wird kein Amsdos Header geschrieben, bei "WRITE"

Hats doch nen Header: JavaCPC kann das ROM auch mit Header korrekt lesen...
Ansonsten mit nem Hex-Editor den Header entfernen...
http://cpcwiki.de
Dein Deutsches CPCWiki!

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-3
Re: Ein ROM erstellen "hallo welt" ?
« Antwort #6 am: 28. November 2018, 14:35:34 »
Danke.

Funktioniert wunderbar.

Gruss

Offline Devilmarkus

  • Administrator
  • CPC 464+
  • *****
  • Beiträge: 1135
  • Liked: 376
  • Karma: +40/-0
Re: Ein ROM erstellen "hallo welt" ?
« Antwort #7 am: 28. November 2018, 15:06:44 »
Ja, manchmal hilft auch einfach erstmal Ausprobieren  :kaffee:
http://cpcwiki.de
Dein Deutsches CPCWiki!

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-3
Re: Ein ROM erstellen "hallo welt" ?
« Antwort #8 am: 28. November 2018, 17:12:25 »
Ich kann noch nicht herausfinden, welches der Kern dort vom funktionierenden ROM ist.

Wo kann ich genau meine eigene "|welt" Routine plazieren?
Bzw die dort jetzt drin liegende Routine herausnehmen und meine dort hineinpacken.

Danke.
Gruss

Offline Devilmarkus

  • Administrator
  • CPC 464+
  • *****
  • Beiträge: 1135
  • Liked: 376
  • Karma: +40/-0
Re: Ein ROM erstellen "hallo welt" ?
« Antwort #9 am: 28. November 2018, 17:56:14 »
Dies hier ist der "ROM-Header" -> Daran erkennt der CPC, dass es sich um ein ROM handelt:

;--------------------------------------
;ROM Prefix
;--------------------------------------
DEFB 1 ;ROM type ... background
DEFB 1 ;mark 1
DEFB 1 ;version 1
DEFB 1 ;modification 1

Danach kannst deinen Code schreiben.
Wichtig ist, dass du keine Lese/Schreib Routinen im RAM hast, weil es ja im ROM stattfindet, solch einen Code sollte das ROM also erst ins RAM kopieren und dort dann ausführen.
http://cpcwiki.de
Dein Deutsches CPCWiki!

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-3
Re: Ein ROM erstellen "hallo welt" ?
« Antwort #10 am: 29. November 2018, 09:05:16 »
Hallo, guten Tag.

Habe hier mal etwas zusammengestellt : RSXADD

Wenn ich es einlade,  bleibt das Programm stehen und kann keine  Tasteneingabe machen.

noheader
write "rsxadd.com"
nolist
limit &ffff
org &c000
;--------------------------------------
;reserves 32 bytes for workspace:
;0-17 used by double
;--------------------------------------
;rom prefix
;--------------------------------------
defb 1 ;rom type ... background
defb 1 ;mark 1
defb 1 ;version 1
defb 1 ;modification 1

.kl_log_ext equ &bcd1

ld hl,work_space
ld bc,jump_table
jp kl_log_ext

.work_space       
defs 4

.jump_table
defw name_table           
                   
jp rsx_add       

.name_table
defb "rsxad","d"+&80     

defb 0                     

.rsx_add
    ld hl,23
    ld de,345
   
    add  hl,de      ; funktion dieser rsx: addiere [1] + [2] -> [3]
    ex   de,hl      ; ergebnis nach de
     
    ret             

Danke.
Gruss
« Letzte Änderung: 29. November 2018, 09:09:16 von cpcman »

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-3
Re: Ein ROM erstellen "hallo welt" ?
« Antwort #11 am: 29. November 2018, 11:04:49 »
Habe den Fehler gefunden.
Hatte eine Routine vergessen.

Gruss

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-3
Re: Ein ROM erstellen "hallo welt" ?
« Antwort #12 am: 29. November 2018, 11:06:58 »
Wie kann ich jetzt bitte was auf den Screen schreiben?
Dieses ist die kleine RSX-Routine:
----------------------
.rsx_scr
  ld hl,&c000
  ld (hl),255
  ret 
----------------------       

Ich wollte an Adresse &c000 255 schreiben.

Wie funktioniert das jetzt mit den RAM/ROM-Umschalten?

Danke.
Gruss

noheader
write "rsxscr.rom"
nolist
limit &ffff
org &c000

;--------------------------------------
;reserves 32 bytes for workspace:
;0-17 used by double
;--------------------------------------
;rom prefix
;--------------------------------------
defb 1 ;rom type ... background
defb 1 ;mark 1
defb 1 ;version 1
defb 1 ;modification 1
;--------------------------------------
;command table
;--------------------------------------
defw name_table
jp initialise_rom ;power-up/reset entry
;--------------------------------------
;name table
;--------------------------------------
.name_table
defb "rsxsc","r"+&80       
defb 0   
;---------------------------------------
;power-up/reset intialisation
;af,bc corrupted
;---------------------------------------
.initialise_rom
push de:push hl ;save de/hl
call print_string; print power-up message
defb 13,10
defb "rsxscr rom"
defb 13,10,10
defb 0
pop hl:pop de ;restore hl/de
and a
ld bc,32:sbc hl,bc ;grab 32 bytes from top of memory
scf
ret

.print_string
pop hl ;get string address
. sp_loop
ld a,(hl):call &bb5a ;print character
inc hl
or a ;done?
jr nz,sp_loop
jp (hl)

.rsx_scr
  ld hl,&c000
  ld (hl),255
  ret             
list
end

Offline Devilmarkus

  • Administrator
  • CPC 464+
  • *****
  • Beiträge: 1135
  • Liked: 376
  • Karma: +40/-0
Re: Ein ROM erstellen "hallo welt" ?
« Antwort #13 am: 29. November 2018, 12:56:41 »
Kopier die Routine irgendwo ins RAM (ZB an &4000) und ruf sie dort auf...
Das schrieb ich aber schon:

Wichtig ist, dass du keine Lese/Schreib Routinen im RAM hast, weil es ja im ROM stattfindet, solch einen Code sollte das ROM also erst ins RAM kopieren und dort dann ausführen.
« Letzte Änderung: 29. November 2018, 13:01:47 von Devilmarkus »
http://cpcwiki.de
Dein Deutsches CPCWiki!

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-3
Re: Ein ROM erstellen "hallo welt" ?
« Antwort #14 am: 29. November 2018, 14:13:13 »
Wie schreibt man denn eine ASM-Routine ins ROM die dann zb nach $4000 kopiert wird ?
und dann aufgerufen wird.


Danke.
Gruss