Schneider / Amstrad CPC Forum

Amstrad / Schneider CPC => Programmierung => Topic started by: cpcman on 27. November 2018, 10:41:44

Title: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 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
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: HAL6128 on 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
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 28. November 2018, 11:14:52
Danke für die Info.

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

Gruss
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: Devilmarkus on 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
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 28. November 2018, 13:14:41
Danke für die Hilfe.

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

Danke.
Gruss
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: Devilmarkus on 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...
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 28. November 2018, 14:35:34
Danke.

Funktioniert wunderbar.

Gruss
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: Devilmarkus on 28. November 2018, 15:06:44
Ja, manchmal hilft auch einfach erstmal Ausprobieren  :kaffee:
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 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
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: Devilmarkus on 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.
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 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
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 29. November 2018, 11:04:49
Habe den Fehler gefunden.
Hatte eine Routine vergessen.

Gruss
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 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
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: Devilmarkus on 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:

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.
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 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
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: Devilmarkus on 29. November 2018, 14:44:34
So zB?

Quote from: cpcman on 09. November 2018, 22:09:02

public static void copy_40_c0()
  asm inline (Indirections.Values())
  {
    ld de,#c000
    ld hl,#4000
    ld bc,#4000
    ldir
  }


Nur umgekehrt?
Und statt der "Von-Adresse" ein Label verwenden für den Code, der dort hin kopiert werden soll....
Und statt der Länge ein End-Label minus Label von dem Code, der kopiert werden soll...
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 29. November 2018, 15:24:02
Dieses funktioniert nicht im ROM .
Warum nicht, wollte nur ein Byte nach &4003 kopieren.
Die Speicherstelle &4003 zeigt mit "print peek(&4003) "0" an.

Gruss

------------------------------
.rsxscr
  ld hl,&4003
  ld (hl),127
  ret 
-----------------------------


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
JP rsxscr
;--------------------------------------
;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 im 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)
  ret

.rsxscr
  ld hl,&4003
  ld (hl),127
  ret             
list
end
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: Devilmarkus on 29. November 2018, 17:46:55
Schau mal hier...
http://www.cantrell.org.uk/david/tech/cpc/cpc-firmware/highkern.htm
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 30. November 2018, 08:48:06
Hallo, guten Tag.

Kannst du mir bitte helfen die Daten nach &4000 zu  übertragen und mit Call &400 starten?
Bitte mal ein Muster erstellen.

Danke.
Gruss


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

defb 1 ;rom type ... background
defb 1 ;mark 1
defb 1 ;version 1
defb 1 ;modification 1

defw name_table
jp initialise_rom ;power-up/reset entry
jp rsxscr4    ;double height printing

.name_table
defb "PEBI","E"+&80   ;bad name
defb "RSXSCR","4"+&80     ;double,@a$
defb 0

.initialise_rom
push de:push hl ;save de/hl
call print_string; print power-up message
defb 13,10
defb "rom screen"
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)
ret

.prog_table
DEFB &CD, &73, &40, &C9, &21, &FE, &FF, &ED, &5B, &71, &40
DEFB &19, &01, &00, &C0, &71, &23, &70, &21, &FC, &FF, &ED
DEFB &5B, &71, &40, &19, &01, &00, &00, &71, &23, &70, &21
DEFB &FC, &FF, &ED, &5B, &71, &40, &19, &4E, &23, &46, &21
DEFB &00, &40, &B7, &ED, &42, &DA, &70, &40, &21, &FE, &FF
DEFB &ED, &5B, &71, &40, &19, &E5, &21, &FE, &FF, &ED, &5B
DEFB &71, &40, &19, &5E, &23, &56, &EB, &23, &44, &4D, &E1
DEFB &71, &23, &70, &21, &FE, &FF, &ED, &5B, &71, &40, &19
DEFB &5E, &23, &56, &EB, &36, &81, &21, &FC, &FF, &ED, &5B
DEFB &71, &40, &19, &5E, &23, &56, &13, &72, &2B, &73, &C3
DEFB &20, &40, &C9, &00, &00, &2A, &71, &40, &E5, &ED, &73
DEFB &71, &40, &21, &FC, &FF, &39, &F9, &CD, &04, &40, &2A
DEFB &71, &40, &F9, &E1, &22, &71, &40, &C9

.rsxscr4

call &b906
push af      ;enable lower rom
............................
        ...........................
pop af
call &b90c   ;restore lower rom state

ret
list
end
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: Devilmarkus on 30. November 2018, 13:55:48
Das ist das JavaCPC Expansion ROM:
Klar: Die Befehle zum Datei laden / speichern und andere Befehle sind natürlich speziell für den JavaCPC geschrieben, der hat eine Port-Erweiterung.
Aber die Befehle zum Kopieren / Schreiben vom Bildschirm solltest du dir ansehen.
Dort verwende ich Firmware-Calls, wie ich dir in meiner letzten Antwort schon verlinkt hatte.
Da stehen die CALLs drin, die du brauchst...


NOLIST
ORG &C000
;JavaCPC Expansion ROM

WRITE "JAVACPC.ROM" ; ROM schreiben
WRITE ASROM "JAVACPC.ROM",6 ; ROM schreiben

DB 1                        ;1=KENNUNG FUER HINTERGRUND-ROM
DB 1                        ;MARK NUMBER
DB 0                        ;VERSION NUMBER
DB 1                        ;MODIFICATION LEVEL


DW RSX_TABLE                ;ZWEI-BYTE-ZEIGER AUF DIE NAMENS-TABELLE
JP INITROUTINE              ;WIRD BEIM EINSCHALTEN DES RECHNERS ANGESPRUNGEN
JP Copy
JP Paste
JP Bank
JP Show
JP Hide
JP Online
JP Offline
JP Font1
JP Font2
JP Font3
JP Font4
JP Font5
JP Font6
JP Font7
JP Font8
JP Font9
JP Quit
JP Green
JP Grey
JP Grey
JP Color
JP Color
JP Digitracker
JP Assembler
JP Clear
JP Bigger
JP Smaller
JP Size
JP Screenshot
JP SaveDsk
JP MakeDsk
JP Scanlines
JP Scanlinesoff
JP Infomessage
JP Infomessage
JP Infofsmessage
JP setink
JP resetink
JP cddir
JP getdir
JP loadfile
JP bassave
JP mkdir
JP deletefile
JP deletefile
JP turboon
JP turbooff
JP z80on
JP z80off
JP showlogo
JP hextype
JP texttype
JP assemble
JP LOOPFLIP


RSX_TABLE: ;HIER BEGINT DIE NAMENS-TABELLE.
DB "JAVARO","M"+&80          ;DER NAME DER INIT ROUTINE
DB "COP","Y"+#80
DB "PAST","E"+#80
DB "BAN","K"+#80
DB "SHO","W"+#80
DB "HID","E"+#80
DB "ONLIN","E"+#80
DB "OFFLIN","E"+#80
DB "FONT","1"+#80
DB "FONT","2"+#80
DB "FONT","3"+#80
DB "FONT","4"+#80
DB "FONT","5"+#80
DB "FONT","6"+#80
DB "FONT","7"+#80
DB "FONT","8"+#80
DB "FONT","9"+#80
DB "QUI","T"+#80
DB "GREE","N"+#80
DB "GRE","Y"+#80
DB "GRA","Y"+#80
DB "COLOU","R"+#80
DB "COLO","R"+#80
DB "DIGITRACKE","R"+#80
DB "ASSEMBLE","R"+#80
DB "CLEA","R"+#80
DB "BIGGE","R"+#80
DB "SMALLE","R"+#80
DB "SIZ","E"+#80
DB "SCREENSHO","T"+#80
DB "SAVEDS","K"+#80
DB "MAKEDS","K"+#80
DB "SCANLINE","S"+#80
DB "SCANLINESOF","F"+#80
DB "INF","O"+#80
DB "HEL","P"+#80
DB "FSINF","O"+#80
DB "IN","K"+#80
DB "RESINK","S"+#80
DB "C","D"+#80
DB "CA","T"+#80
DB "LOA","D"+#80
DB "SAV","E"+#80
DB "M","D"+#80
DB "DE","L"+#80
DB "DELET","E"+#80
DB "TURB","O"+#80
DB "TURBOOF","F"+#80
DB "Z80TURB","O"+#80
DB "Z80TURBOOF","F"+#80
DB "LOG","O"+#80
DB "TYP","E"+#80
DB "HEXTYP","E"+#80
DB "ASSEMBL","E"+#80
DB "FLI","P"+#80
DB 0

;;CP 0
;;jp z, ARG0
;;CP 1
;;jp z,ARG1
;;CP 2
;;jp z,ARG2
;;...
;;ARG0, ARG1, ARG2 sind dann Labels, die jeweils
;;0, 1, 2... Argumente entgegennehmen
INITROUTINE
PUSH HL
PUSH BC

LD bc, &FEFE ; Emu Checker Port
IN a,(c)
CP &A0 ; JavaCPC
JR z,EMU_OK
EMU_ERROR
LD HL,ERROR_MESSAGE ; Zeiger auf Fehler-Text
CALL MESSPRI

POP BC
POP HL

SCF
CCF ; Carry loeschen, Initialisierung fehlgeschlagen
RET
EMU_OK
LD HL,PROMT_MESSAGE ;ZEIGER AUF PROMT-TEXT
CALL MESSPRI        ;TEXT AUSGEBEN

POP BC
POP HL

SCF ;Carry setzen, ROM erfolgreich initialisiert
RET ;FERTIG

PROMT_MESSAGE
DB " JavaCPC exp. ROM v1.5 - |INFO for info",13,10
DB " JavaCPC IFS v1.1    - |FSINFO for info",13,10,10,0
ERROR_MESSAGE
DB " ***JavaCPC not found***",13,10,10,0
INFO_MESSAGE
;;DB "JavaCPC expansion ROM 1.5 by Devilmarkus"
;; DB "                                        "
DB "|SHOW - open printer console            "
DB "|HIDE - hide printer console            "
DB "|ONLINE - sets printer online           "
DB "|OFFLINE - sets printer offline         "
DB "|CLEAR - clears printer console content "
DB "|BIGGER - increases fontsize of printer "
DB "|SMALLER - decreases fontsize           "
DB "|SIZE,[size] - sets fontsize in pt      "
DB "|FONT1 - |FONT9 - sets printerfont      "
DB "|QUIT - quits JavaCPC emulator          "
DB "|GREEN - emulates greenmonitor          "
DB "|GRAY / |GREY - emulates graymonitor    "
DB "|COLOR / |COLOUR - colourmonitor        "
DB "|DIGITRACKER - Prodatron's Digitracker  "
DB "|ASSEMBLER - Launch Z80 Assembler       "
DB "|SCREENSHOT - Takes screenshot          "
DB "|SAVEDSK - save actual DSK in DF0       "
DB "|MAKEDSK - creates a data formatted DSK "
DB "|SCANLINES/OFF- en-/dis-ables scanlines "
DB "|FLIP - Do a flipscreen (Space quits)   "
DB "|INK,<0-31>,<R>,<G>,<B> - Def. new color"
DB "|RESINKS - Restores palette             "
DB "|TURBO,|TURBOOFF,|Z80TURBO,Z80TURBOOFF  ",13,0


INFOFS_MESSAGE
;;DB "JavaCPC Internal Filesystem v1.1        "
;;DB "                                        "
DB "  1) RSX Command |CD                    "
DB "     |CD,",34,"<drive:/ or /User/>",34," - set DIR"
DB "     |CD,",34,"<folder>",34," - select folder     "
DB "     |CD,",34,"..",34," - 1 folder up             "
DB "  2) Other commands                     "
DB "     |CAT - Show directory contents     "
DB "     |MD,",34,"<DIRNAME>",34," - Create directory "
DB "     |TYPE,",34,"<FILENAME>",34," - Show textfile "
DB "     |HEXTYPE,",34,"<FILENAME>",34,"- Show hexdump"
DB "     |ASSEMBLE,",34,"<FILENAME>",34,"- Assemble   "
DB "     |DEL,",34,"<FILENAME>",34," - Erase file     "
DB "      1 wildchar allowed! *.bin or file*"
DB "     |LOAD,",34,"<FILENAME>",34,"<,start> - Load  "
DB "     |SAVE,",34,"<NAME>",34," - Save BASIC program"
DB "     |SAVE,",34,"<NAME>",34,",start,length<,run>  "
DB "     - Save BINARY program              "
DB "  3) Informations                       "
DB "     |SAVE can also save SNA or DSK.    "
DB "     Just add the required fileextension"
DB "     |LOAD can load SNA and DSK. For DSK"
DB "     add the drive no:                  "
DB "     |LOAD,",34,"FILENAME.DSK",34,",0-3           ",13,0


Bank:
LD A,(IX+0)
AND 7
OR #C0
LD B,#7F
OUT (C),A
RET
list
Copy:
LD A,(IX+0)
AND 7
OR #C0
LD B,#7F
OUT (C),A
LD DE,&BF00
LD HL,copycode
LD BC,copycode_end-copycode
LDIR
CALL &BF00
ret
copycode:
CALL &B903
LD DE,&4000
LD HL,&C000
LD BC,&4000
LDIR
CALL &B900
RET
copycode_end:
nolist

Paste:
LD A,(IX+0)
AND 7
OR #C0
LD B,#7F
OUT (C),A
JP SCRPaste
RET
Show:
LD A,&fe
LD BC,&FF00
OUT (C),A
RET
Hide:
LD A,&ff
LD BC,&FF00
OUT (C),A
RET
Online:
LD A,&fb
LD BC,&FF00
OUT (C),A
RET
Offline:
LD A,&fa
LD BC,&FF00
OUT (C),A
RET

Font1:
LD A,&e0
LD BC,&FF00
OUT (C),A
RET
Font2:
LD A,&e1
LD BC,&FF00
OUT (C),A
RET
Font3:
LD A,&e2
LD BC,&FF00
OUT (C),A
RET
Font4:
LD A,&e3
LD BC,&FF00
OUT (C),A
RET
Font5:
LD A,&e4
LD BC,&FF00
OUT (C),A
RET
Font6:
LD A,&e5
LD BC,&FF00
OUT (C),A
RET
Font7:
LD A,&e6
LD BC,&FF00
OUT (C),A
RET
Font8:
LD A,&e7
LD BC,&FF00
OUT (C),A
RET
Font9:
LD A,&e8
LD BC,&FF00
OUT (C),A
RET
Quit:
LD A,&ef
LD BC,&FF00
OUT (C),A
RET
Green:
LD A,&d2
LD BC,&FF00
OUT (C),A
RET
Grey:
LD A,&d3
LD BC,&FF00
OUT (C),A
RET
Color:
LD A,&d0
LD BC,&FF00
OUT (C),A
RET
Digitracker:
LD A,&d1
LD BC,&FF00
OUT (C),A
RET
Assembler:
LD A,&d4
LD BC,&FF00
OUT (C),A
RET
Clear:
LD A,&fc
LD BC,&FF00
OUT (C),A
RET
Bigger:
LD A,&df
LD BC,&FF00
OUT (C),A
RET
Smaller:
LD A,&de
LD BC,&FF00
OUT (C),A
RET
Size:
LD A,(IX+0)
LD BC,&fF01
OUT (C),A
RET
Screenshot:
LD A,&d5
LD BC,&FF00
OUT (C),A
RET
SaveDsk:
LD A,&d6
LD BC,&FF00
OUT (C),A
RET
Scanlines:
LD A,&d7
LD BC,&FF00
OUT (C),A
RET
Scanlinesoff:
LD A,&d8
LD BC,&FF00
OUT (C),A
RET
MakeDsk:
LD A,&d9
LD BC,&FF00
OUT (C),A
RET

resetInk:
LD A,10
LD BC,&ff10
OUT (C),A
RET
setInk:
LD A,(IX+0)
LD BC,&ff40
OUT (C),A
LD A,(IX+2)
LD BC,&ff30
OUT (C),A
LD A,(IX+4)
LD BC,&ff20
OUT (C),A
LD A,(IX+6)
LD BC,&ff50
OUT (C),A
RET
Infomessage:
ld a,1
call &bc0e
LD HL,INFO_MESSAGE ;ZEIGER AUF PROMT-TEXT
CALL MESSPRI        ;TEXT AUSGEBEN

showlogo:

LD A,&dd
LD BC,&FF00
OUT (C),A
ret
Infofsmessage:
ld a,1
call &bc0e
LD HL,INFOFS_MESSAGE ;ZEIGER AUF PROMT-TEXT
CALL MESSPRI        ;TEXT AUSGEBEN
jp showlogo

MESSPRI ;HL=ZEIGER             ;GIBT TEXTE AUS
LD A,(HL):OR A:RET Z
INC HL
CALL &BB5A
JR MESSPRI
SCRPaste:
XOR A,A
LD HL,&4000
LD DE,&C000

LOOP
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI

LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI

DEC A
JP NZ,LOOP
RET
.getdir
ld bc,&fff4
ld a,1
out (c),a
ld a,255
out (c),a
call &bd19
call &bd19
call &bd19
jp wait2
ret

.cddir
CP 1
jp nz,return
ld L,(IX+0)
ld H,(IX+1)
ld bc,&fff4
ld a,0
out (c),a
jp rsxprint
ret

.texttype
CP 1
jp nz,return
ld L,(IX+0)
ld H,(IX+1)
ld bc,&fff4
ld a,10
out (c),a
jp rsxprint
ret
.hextype
CP 1
jp nz,return
ld L,(IX+0)
ld H,(IX+1)
ld bc,&fff4
ld a,9
out (c),a
jp rsxprint
ret

.assemble
CP 1
jp nz,return
ld L,(IX+0)
ld H,(IX+1)
ld bc,&fff4
ld a,15
out (c),a
jp rsxprint2
ret
.mkdir
CP 1
jp nz,return
ld L,(IX+0)
ld H,(IX+1)
ld bc,&fff4
ld a,5
out (c),a
jp rsxprint
ret

.deletefile
CP 1
jp nz,return
ld L,(IX+0)
ld H,(IX+1)
ld bc,&fff4
ld a,6
out (c),a
jp rsxprint
ret

.turboon
ld bc,&fff4
ld a,11
out (c),a
ld a,255
out (c),a
ret

.turbooff
ld bc,&fff4
ld a,12
out (c),a
ld a,255
out (c),a
ret
.z80on
ld bc,&fff4
ld a,13
out (c),a
ld a,255
out (c),a
ret

.z80off
ld bc,&fff4
ld a,14
out (c),a
ld a,255
out (c),a
ret

.bassave
CP 1
JP z,savebas
CP 3
JP z,savebin
CP 4
JP z,savebinstart
jp return
.savebas
ld L,(IX+0)
ld H,(IX+1)
ld bc,&fff4
ld a,4
out (c),a
jp rsxprint2
ret
.savebin
ld L,(IX+0)
ld H,(IX+1)
ld bc,&fff4
ld a,30
out (c),a
ld a,h
out (c),a
ld a,31
out (c),a
ld a,l
out (c),a
ld L,(IX+2)
ld H,(IX+3)
ld bc,&fff4
ld a,20
out (c),a
ld a,h
out (c),a
ld a,21
out (c),a
ld a,l
out (c),a
ld bc,&fff4
ld a,8
out (c),a
ld L,(IX+4)
ld H,(IX+5)
jp rsxprint2
ret
.savebinstart
ld L,(IX+0)
ld H,(IX+1)
ld bc,&fff4
ld a,40
out (c),a
ld a,h
out (c),a
ld a,41
out (c),a
ld a,l
out (c),a
ld L,(IX+2)
ld H,(IX+3)
ld bc,&fff4
ld a,30
out (c),a
ld a,h
out (c),a
ld a,31
out (c),a
ld a,l
out (c),a
ld L,(IX+4)
ld H,(IX+5)
ld bc,&fff4
ld a,20
out (c),a
ld a,h
out (c),a
ld a,21
out (c),a
ld a,l
out (c),a
ld bc,&fff4
ld a,8
out (c),a
ld L,(IX+6)
ld H,(IX+7)
jp rsxprint2
ret

.loadfile
ld L,(IX+0)
ld H,(IX+1)
CP 2
jp nz, loadfileb
ld bc,&fff4
ld a,20
out (c),a
ld a,h
out (c),a
ld a,21
out (c),a
ld a,l
out (c),a
ld a,2
out (c),a
ld L,(IX+2)
ld H,(IX+3)
ld bc,&fff4
ld a,2
out (c),a
jp rsxprint2
ret

.loadfileb
CP 1
jp nz,return
ld bc,&fff4
ld a,7
out (c),a
jp rsxprint2
ret
.rsxprint
call &bd19
call &bd19
call &bd19
ld B,(HL)
inc HL
ld E,(HL)
inc HL
ld D,(HL)
ld H,D
ld L,E
.looping
ld A,(HL)
inc HL
;call &BB5A
;---------------------------
push AF
push BC
push DE
push HL

push AF
ld BC,&FFF0
.wait
in a,(c)
cp &FF
jp nz,wait
pop AF

out (C),A

pop HL
pop DE
pop BC
pop AF
;---------------------------

dec B
jp nz,looping
ld bc,&fff4
call &bd19
call &bd19
call &bd19

.wait2
ld a,255
out (c),a
in a,(c)
cp &FF
jp z,wait2
cp &0
jp z,returnend
LD l,a
LD h,0
CALL &BB5A
call &bb09
CP 32
jp z,waitkey
CP 252
jp z,breakme
jp wait2
.breakme
LD BC,&fff0
LD a,2
OUT (C),a
jp wait2
.returnend
ret
.return
LD HL,syERROR_MESSAGE ;ZEIGER AUF PROMT-TEXT
CALL MESSPRI        ;TEXT AUSGEBEN

RET
ret
syERROR_MESSAGE
DB "Internal filesystem error",13,10,0
LIST:END

.rsxprint2
ld B,(HL)
inc HL
ld E,(HL)
inc HL
ld D,(HL)
ld H,D
ld L,E
.looping2
ld A,(HL)
inc HL
;call &BB5A
;---------------------------
push AF
push BC
push DE
push HL

push AF
ld BC,&FFF0
.wait3
in a,(c)
cp &FF
jp nz,wait3
pop AF

out (C),A

pop HL
pop DE
pop BC
pop AF
;---------------------------

dec B
jp nz,looping2
ld bc,&fff4
ld a,&ff
out (C),A
ret
.waitkey
call &bb18
jp wait2

LOOPFLIP
LD BC,$BC00 + 12
OUT (C),C
LD BC,$BD30
OUT (C),C
CALL VBL
HALT

CALL &bb09
CP 32
JP z,QUITFLIP


LD BC,$BC00 + 12
OUT (C),C
LD BC,$BD10
OUT (C),C
CALL VBL
HALT

JP LOOPFLIP
VBL
LD B,$F5
WAITVBL
IN A,(C)
RRA
JR NC,WAITVBL
RET
QUITFLIP
RET


Speziell für dich:
copycode:
CALL &B903
LD DE,&4000
LD HL,&C000
LD BC,&4000
LDIR
CALL &B900
RET


Welches sind CALL &B903 und &B900? Das steht auf der Webseite die ich verlinkt hatte.
Du kannst genauso kopieren, und bevor du ins ROM zurück switchest, dann CALL &4000 ausführen, also so schwer ist das ja nun nicht, oder?
Allerdings das ROM dann erst vor dem CALL ausschalten, weil kopieren willste ja aus dem ROM und da ins ROM schreiben nunmal nicht funktioniert, wird es dann ja aus dem ROM ins RAM geschrieben...
Deswegen hatte ich dir die Seite verlinkt, weil es dort gleich an oberster Stelle steht:
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 30. November 2018, 14:36:15
Danke für deine große Info. ist viel drin in deine Auskunft.

Ich suche bitte noch eine Routine für mein Programm, wie ich diese Daten , die sich im Programm befinden nach $4000 bringe:
------------------------------------
.prog_table   
   DEFB &CD, &73, &40, &C9, &21, &FE, &FF, &ED, &5B, &71, &40
   DEFB &19, &01, &00, &C0, &71, &23, &70, &21, &FC, &FF, &ED
   DEFB &5B, &71, &40, &19, &01, &00, &00, &71, &23, &70, &21
   DEFB &FC, &FF, &ED, &5B, &71, &40, &19, &4E, &23, &46, &21
   DEFB &00, &40, &B7, &ED, &42, &DA, &70, &40, &21, &FE, &FF
   DEFB &ED, &5B, &71, &40, &19, &E5, &21, &FE, &FF, &ED, &5B
   DEFB &71, &40, &19, &5E, &23, &56, &EB, &23, &44, &4D, &E1
   DEFB &71, &23, &70, &21, &FE, &FF, &ED, &5B, &71, &40, &19
   DEFB &5E, &23, &56, &EB, &36, &81, &21, &FC, &FF, &ED, &5B
   DEFB &71, &40, &19, &5E, &23, &56, &13, &72, &2B, &73, &C3
   DEFB &20, &40, &C9, &00, &00, &2A, &71, &40, &E5, &ED, &73
   DEFB &71, &40, &21, &FC, &FF, &39, &F9, &CD, &04, &40, &2A
   DEFB &71, &40, &F9, &E1, &22, &71, &40, &C9
----------------------------------

Die ich dann hier einbringen möchte:
---------------------------------------------
.rsxscr4
   
   call &b906
   push af      ;enable lower rom
   ............................>>> transportroutine nach &4000
   pop af
   call &b90c   ;restore lower rom state
-------------------------------------------------
Ich begreife das nicht mit der Adresse der Daten und wie eine transportroutine dafür aussieht.

Danke.
Gruss
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 30. November 2018, 16:19:07
Danke.
Habe die Routine gefunden bei dir im Code womit man den Datentransfer durchführen kann  von meinem Daten.

Ist es bei den ROMS üblich das Teile in den Bereich vom RAM Kopiert werden ?

Was ist der übliche RAM-Bereich dafür? &8000-&BFFF ?
Den Bereich &4000 - &7fff kann man ja nutzen für Grafik und dem erweiterten RAM zum einblenden.

Gruss
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: TFM on 30. November 2018, 16:32:46
Generell schau hier mal rein:
https://k1.spdns.de/Vintage/Schneider%20CPC/Das%20Schneider%20CPC%20Systembuch/index.html

Etwas spezieller hier:
https://k1.spdns.de/Vintage/Schneider%20CPC/Das%20Schneider%20CPC%20Systembuch/z90.htm#A
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 30. November 2018, 16:58:58
Danke für die Info.

Wie sieht bitte der ASM-Befel aus für "memory &8000" ?

Ich muss für meinen 2. Screen (4000 - 7fff)davon gebrauch machen , bevor das Programm gestartet wird vom ROM.

Danke.
Gruss
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 30. November 2018, 17:01:38
Was macht bei dir bitte der Befehlssatz:

Copy:
LD A,(IX+0)
AND 7
OR #C0
LD B,#7F
OUT (C),A
LD DE,&BF00
LD HL,copycode
LD BC,copycode_end-copycode
LDIR
CALL &BF00
ret
copycode:
CALL &B903
LD DE,&4000
LD HL,&C000
LD BC,&4000
LDIR
CALL &B900
RET
copycode_end:
nolist


Danke.
Gruss
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: Devilmarkus on 30. November 2018, 17:52:09
Quote from: cpcman on 30. November 2018, 16:58:58
Danke für die Info.

Wie sieht bitte der ASM-Befel aus für "memory &8000" ?

Ich muss für meinen 2. Screen (4000 - 7fff)davon gebrauch machen , bevor das Programm gestartet wird vom ROM.

Danke.
Gruss

Gar nicht....
Das gibt man im BASIC ein...
Maschinencode führt das aber eh auch ohne MEMORY &xxxx aus, weils dem Code Wumpe ist...
Du musst dann eben nur drauf achten, dass ein mögliches BASIC Programm dazu das MEMORY &3fff enthält...
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: Devilmarkus on 30. November 2018, 17:53:12
Quote from: cpcman on 30. November 2018, 17:01:38
Was macht bei dir bitte der Befehlssatz:

Copy:
LD A,(IX+0)
AND 7
OR #C0
LD B,#7F
OUT (C),A
LD DE,&BF00
LD HL,copycode
LD BC,copycode_end-copycode
LDIR
CALL &BF00
ret
copycode:
CALL &B903
LD DE,&4000
LD HL,&C000
LD BC,&4000
LDIR
CALL &B900
RET
copycode_end:
nolist


Danke.
Gruss


Festlegen der RAM-Bank, in die kopiert werden soll, dann von C000 nach 4000 in die RAM Bank kopieren...
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 30. November 2018, 19:19:13
Ich starte kein Basicprogramm sondern gehe gleich in die ASM-Routine mit einem Call.

Gruss
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 01. December 2018, 10:51:54
Wie müsse die ROMS beschaffen sein damit die auch über dem AMSDOS ab  08 laufen?

Bei meinem MIST-FPGA-Core muss ich meine selbst erstellten unter dem AMSDOS packen also bei 06 und tiefer.

Packe ich aber die 5 SYM-ROM bei 8-12 rein, funktioniert das SYMBOS auf dem MIST-FPGA.

Gruss
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: TFM on 02. December 2018, 00:59:36
Quote from: cpcman on 30. November 2018, 19:19:13
Ich starte kein Basicprogramm sondern gehe gleich in die ASM-Routine mit einem Call.

Gruss

Und den CALL machst Du von BASIC aus.
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: TFM on 02. December 2018, 01:01:17
Quote from: cpcman on 01. December 2018, 10:51:54
Wie müsse die ROMS beschaffen sein damit die auch über dem AMSDOS ab  08 laufen?

Bei meinem MIST-FPGA-Core muss ich meine selbst erstellten unter dem AMSDOS packen also bei 06 und tiefer.

Jedes ROM läuft an jeder Nummer, solange Du kein eigenes DOS schreibst oder die DOS Vektoren patchst.
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 02. December 2018, 12:25:13
Das ROM von Devilmarkus  kann ich auch über 07 packen und läuft dort einwandfrei.

Nur bei meinem ROM nicht , das funktioniert nur bis 06.

Gruss
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: Devilmarkus on 02. December 2018, 15:54:07
Setz doch mal im ROM Header die Version auf 0 statt auf 1...
Ich denke zwar nicht, dass das was Ändert, aber das fällt mir gerade als Unterschied auf...
Title: Re: Ein ROM erstellen "hallo welt" ?
Post by: cpcman on 04. December 2018, 08:48:46
Danke für die Info.

Deins läuft auch einwandfreei über 07. habe aber noch nicht herausgefunden warum.

Gruss