Hier ist ein Sammelthread für Fragen rund ums ROM für den MEGA65.
Hallo Besucher, der Thread wurde 980 mal aufgerufen und enthält 4 Antworten
letzter Beitrag von BruderJo am
MEGA65 - Fragen zum ROM
- Snoopy
- Erledigt
-
-
Wenn man sich mit dem mitgelieferten Code beim Filehoster als MEGA65-Besitzer registriert hat, dann kann man dort das aktuelle ROM herunterladen.
-
Hoffentlich gehört meine Frage zur dem ROM-Thread
Ich stöbere mit dem Monitor im Mega65 Kernel v920377.
Zur "jmp_far" Kernel-Routine hätte ich Erklärungsbedarf. Einsprung ist $FF71
Code- jmp_far:
- ; 1 MAP memory
- ; 2 load registers
- ; 3 jump far (by RTI)
- . 03D5 FC 03 00 PHW $0003 ; push word stack (jump address)
- . 03D8 A5 05 LDA $05 ; Status Reg to stack
- . 03DA 48 PHA
- . 03DB A5 02 LDA $02 ; Bank
- . 03DD 30 0E BMI $03ED ; Bit7 set? -> $03ed dann nix um-mappen
- . 03DF 29 0F AND #$0F ; Bits 0..3 maskieren, lower section
- . 03E1 09 E0 ORA #$E0 ; bits 4..7 fuer lower section setzen
- . 03E3 AA TAX ; nach X
- . 03E4 A3 83 LDZ #$83 ; ????? sollte das nicht ORA #$??,TAZ
- . 03E6 A9 00 LDA #$00 ; offset = 0 fuer lower
- . 03E8 A8 TAY ; ... und upper
- . 03E9 20 8D 03 JSR $038D ; set environment
- ; set environment (map werte speichern)
- ;. 038D 8D 1C 01 STA $011C
- ;. 0390 8E 1D 01 STX $011D
- ;. 0393 8C 1E 01 STY $011E
- ;. 0396 9C 1F 01 STZ $011F
- . 03EC 5C MAP ; map it
- . 03ED *A5 06 LDQ $06 ; load CPU registers from ZP
- . 03F1 EA NOP
- . 03F2 40 RTI ; pop flags & PC from stack
egal, welcher Wert im Z-Register steht, er wird bei $03E4 mit #$83 überschrieben. (LDZ #$83)
Kann mir jemand diese Logik erklären?
-
Kann mir jemand diese Logik erklären?
Das war nicht immer so. Im späteren original C65-ROM von Commodore sah jmp_far so aus:
Code: Original Commodore C65-ROM- F267 6006 jmp_far_code ;Enter with all data in $02-$09 and
- 6007 ; bank/adrhi/adrlo/status in a/x/y/z
- 6008
- =03D5 6009 jmp_far = *-dlcode_begin+ram_code
- 6010
- F267 FC 0003 6011 phd pc_hi ;Push JMP address & uP status as if interrupt
- F26A A5 05 6012 lda s_reg
- F26C 48 6013 pha
- F26D A5 02 6014 lda bank ;Want to JMP to which bank?
- F26F 30 0F 6015 bmi 10$ ; Use current configuration (environment)
- F271 29 0F 6016 and #$0f ; Configure lower section ($2000-$7FFF) [910710]
- F273 09 E0 6017 ora #$e0 ; memory bank/offset for lower section
- F275 AA 6018 tax ; (leave RAM-0, this code, at $0-$1FFF)
- F276 09 F0 6019 ora #$f0 ; Configure upper section ($8000-$FFFF)
- F278 4B 6020 taz ; memory bank/offset for upper section
- F279 A9 00 6021 lda #0 ; (16-bit offset- _far does not relocate)
- F27B A8 6022 tay
- F27C 20 038D 6027 jsr set_environment ; [910710]
- F27F 5C 6028 aug ; MAP it
- 6029
- F280 A5 06 6030 10$ lda a_reg
- F282 A6 07 6031 ldx x_reg
- F284 A4 08 6032 ldy y_reg
- F286 AB 0009 6033 ldz z_reg ; ????
- F289 EA 6034 nop ; release interrupts (caller must be prepared for them!)
- F28A 40 6035 rti ; go to it
- 6036
- 6037
- F28B 6038 dlcode_end
Bei meinem BASIC 65.EX ROM 220605 habe ich das so umgesetzt:
Code: BASIC 65.EX (220605)- ; Enter with all data in $02-$09 and
- ; bank/adrhi/adrlo/status in a/x/y/z
- *********************************
- 03d5 jmp_far = *-dlcode_begin+ram_code
- *********************************
- f290 fc 03 00 phw pc_hi ;Push JMP address & uP status as if interrupt
- f293 a5 05 lda s_reg
- f295 48 pha
- f296 a5 02 lda bank ;Want to JMP to which bank?
- f298 30 11 bmi 10$ ;Use current configuration (environment)
- f29a 29 0f and #$0f ;Configure lower section ($2000-$7FFF)
- f29c 09 e0 ora #$e0 ;memory bank/offset for lower section
- f29e aa tax ;(leave RAM-0, this code, at $0-$1FFF)
- f29f a9 b0 lda #$b0 ;I/O & kernal (offset depends on bank)
- f2a1 05 02 ora bank
- f2a3 4b taz
- f2a4 a9 00 lda #0 ;A = 0
- f2a6 a8 tay ;Y = 0
- f2a7 20 8d 03 jsr set_environment
- f2aa 5c aug ;MAP it
- f2ab 42 42 a5 06 10$ ldq a_reg ;load A,X,Y,Z
- f2af ea nop ;interrupt enable status depends on s_reg
- f2b0 40 rti ;go to it
- **********
- f2b1 dlcode_end
- **********
Das MEGA-Team (hier BitShifter) haben dann das Z-Register bei jmp_far fix mit $83 belegt. Soweit ich mich richtig erinnere (ist schon paar Tage her ) , war die Motivitation dafür, dass man von BASIC aus mit SYS und über die jmp_far-Kernelroutine nicht Kernel und I/O ausblenden können soll. Das ist in der Hinsicht "sicherer", gerade wenn Interrupts und so im Spiel sind. Also quasi zum Schutz des Anwenders/Programmierers hat man an der Stelle das System etwas "eingeschränkt". Es gab dazu auch Diskussionen, aber es wurde halt dann so entschieden.
Code: ROM 920377- ; Enter with all data in $02-$09 and
- ; bank/adrhi/adrlo/status in a/x/y/z
- *********************************
- 03d5 jmp_far = *-dlcode_begin+ram_code
- *********************************
- f280 fc 03 00 phw pc_hi ;Push JMP address & uP status as if interrupt
- f283 a5 05 lda s_reg
- f285 48 pha
- f286 a5 02 lda bank ;Want to JMP to which bank?
- f288 30 0e bmi 10$ ;Use current configuration (current_map)
- f28a 29 0f and #$0f ;Configure lower section ($2000-$7FFF)
- f28c 09 e0 ora #$e0 ;memory bank/offset for lower section
- f28e aa tax ;(leave RAM-0, this code, at $0-$1FFF)
- f28f a3 83 ldz #$83 ;I/O & kernal (offset = $30000)
- f291 a9 00 lda #0 ;A = 0
- f293 a8 tay ;Y = 0
- f294 20 8d 03 jsr store_current_map
- f297 5c aug ;MAP it
- f298 42 42 a5 06 10$ ldq a_reg ;load A,X,Y,Z
- f29c ea nop ;interrupt enable status depends on s_reg
- f29d 40 rti ;go to it
- **********
- f29e dlcode_end
- **********
-
Hallo Snoopy,
ganz dolle Dank für die erleuchtende Antwort.
Die C65 Quellen hatte ich zum Vergleich genommen. Deshalb kam mir das Fragment vom Mega65 so komisch vor.
Ich baue mir meine Library mal zusammen und teste, wenn ich soweit bin, ob ich die ROM Routine nehme oder eine eigene einbaue.
Dein Vergleich mit $B0 macht Sinn. So wird das Basic-Rom auch gemappt.
Zur Info: meine Library soll die Runtime für einen P-Code Interpreter bilden und da brauche ich solche Aufrufe in den Kernel oder Basic.