Welcome to Schneider / Amstrad CPC Forum. Please login or sign up.

28. March 2024, 20:25:16

Login with username, password and session length

Shoutbox

TFM

2024-01-15, 17:06:57
Momentan billige Farbbänder auf Ebay für PCW

Devilmarkus

2023-07-09, 10:37:40
Zweiter 👋😂🤣

TFM

2023-06-13, 14:21:49
Sommerloch!

TFM

2023-05-30, 17:00:20
Erster ;-)

Recent

Members
Stats
  • Total Posts: 11,654
  • Total Topics: 1,328
  • Online today: 103
  • Online ever: 1,724
  • (16. January 2020, 00:18:45)
Users Online
Users: 1
Guests: 97
Total: 98

97 Guests, 1 User
Rennert

Ein ROM erstellen "hallo welt" ?

Started by cpcman, 27. November 2018, 10:41:44

Previous topic - Next topic

0 Members and 2 Guests are viewing this topic.

cpcman

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

HAL6128


cpcman

Danke für die Info.

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

Gruss

Devilmarkus

#3
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
https://cpcwiki.de
Dein Deutsches CPCWiki!

cpcman

Danke für die Hilfe.

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

Danke.
Gruss

Devilmarkus

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...
https://cpcwiki.de
Dein Deutsches CPCWiki!

cpcman


Devilmarkus

Ja, manchmal hilft auch einfach erstmal Ausprobieren  :kaffee:
https://cpcwiki.de
Dein Deutsches CPCWiki!

cpcman

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

Devilmarkus

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.
https://cpcwiki.de
Dein Deutsches CPCWiki!

cpcman

#10
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

cpcman

Habe den Fehler gefunden.
Hatte eine Routine vergessen.

Gruss

cpcman

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

Devilmarkus

#13
Kopier die Routine irgendwo ins RAM (ZB an &4000) und ruf sie dort auf...
Das schrieb ich aber schon:

Quote from: Devilmarkus on 28. November 2018, 17:56:14
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.
https://cpcwiki.de
Dein Deutsches CPCWiki!

cpcman

Wie schreibt man denn eine ASM-Routine ins ROM die dann zb nach $4000 kopiert wird ?
und dann aufgerufen wird.


Danke.
Gruss