From 49693f1543dc50b11b0f583e88e8751ed84f483f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 11 Jan 2020 19:22:33 +0100 Subject: [PATCH] more work towards Mega65 banking support --- Makefile | 1 + c64/aliases/,aliases_config.s | 9 ++- c64/aliases/,aliases_cpu.s | 67 +++++++++++++++---- c64/basic/basic_main_loop.s | 4 +- c64/basic/wedge_tape.s | 4 +- .../4000.mega65_kernal_1.s} | 8 ++- c64/kernal/iec/chkin_iec.s | 6 +- c64/kernal/iec/chrout_iec.s | 2 +- c64/kernal/iec/ckout_iec.s | 6 +- c64/kernal/iec/clrchn_iec.s | 2 +- c64/kernal/iec/iec_rx_byte.s | 2 +- c64/kernal/iec/load_iec.s | 8 +-- c64/kernal/iec/save_iec.s | 2 +- c64/kernal/iostack/f157.chrin.s | 8 +-- c64/kernal/iostack/f1ca.chrout.s | 6 +- c64/kernal/iostack/f20e.chkin.s | 8 +-- c64/kernal/iostack/f250.ckout.s | 8 +-- c64/kernal/iostack/f291.close.s | 4 +- c64/kernal/iostack/f34a.open.s | 4 +- c64/kernal/iostack/f4a5.load.s | 6 +- c64/kernal/iostack/f5ed.save.s | 2 +- c64/kernal/iostack/getin_real.s | 4 +- c64/kernal/screen/chrout_screen_crsr.s | 2 +- c64/kernal/screen/chrout_screen_ins.s | 2 +- c64/kernal/tape/load_tape_normal.s | 6 +- c64/kernal/tape/load_tape_turbo.s | 2 +- 26 files changed, 118 insertions(+), 65 deletions(-) rename c64/kernal/{jumptable/4000.internal_jumptable.s => banking/4000.mega65_kernal_1.s} (56%) diff --git a/Makefile b/Makefile index a6b3bbc0..84be09a2 100644 --- a/Makefile +++ b/Makefile @@ -18,6 +18,7 @@ SRCDIR_KERNAL = $(SRCDIR_COMMON) \ c64/kernal \ c64/kernal/,stubs \ c64/kernal/assets \ + c64/kernal/banking \ c64/kernal/iec \ c64/kernal/iec_fast \ c64/kernal/init \ diff --git a/c64/aliases/,aliases_config.s b/c64/aliases/,aliases_config.s index cfb0a39c..083bb394 100644 --- a/c64/aliases/,aliases_config.s +++ b/c64/aliases/,aliases_config.s @@ -100,8 +100,15 @@ -// Check that memory model configuration is correct +// Check that memory model and ROM layout configurations is correct { +#if ROM_LAYOUT_M65 && !CONFIG_CPU_M65_45GS02 + .error "Mega65 ROM layout requires CONFIG_CPU_M65_45GS02" +#endif +#if ROM_LAYOUT_M65 && !CONFIG_MB_MEGA_65 + .error "Mega65 ROM layout requires CONFIG_MB_MEGA_65" +#endif + .var selected = 0; #if CONFIG_MEMORY_MODEL_38K diff --git a/c64/aliases/,aliases_cpu.s b/c64/aliases/,aliases_cpu.s index 49a4a3e4..de385d39 100644 --- a/c64/aliases/,aliases_cpu.s +++ b/c64/aliases/,aliases_cpu.s @@ -1,3 +1,4 @@ + // // Provide pseudocommands (and other goodies) to make CPU optimizations easier // @@ -12,6 +13,10 @@ #define HAS_OPCODES_65CE02 #endif +#if CONFIG_CPU_M65_45GS02 + #define HAS_OPCODES_45GS02 +#endif + #if CONFIG_CPU_WDC_65816 #define HAS_OPCODES_65816 #endif @@ -36,22 +41,60 @@ } + // // Trick to skip a 2-byte instruction // - .pseudocommand skip_2_bytes_trash_nvz { .byte $2C } + +// +// Some additional 45GS02 instructions +// + +#if HAS_OPCODES_45GS02 + +.function byteLO(value) +{ + .return mod(value.getValue(), $100) +} + +.function byteHI(value) +{ + .return (value.getValue() - byteLO(value)) / $100 +} + +.pseudocommand rts_32 // XXX not tested yet +{ + .byte $F8, $F8, $60 +} + +.pseudocommand jmp_32 bank:address // XXX not tested yet +{ + .byte $F8, $F8, $4C, byteLO(address), byteHI(address), byteLO(bank), byteHI(bank) +} + +.pseudocommand jsr_32 bank:address // XXX not tested yet +{ + .var al = address.getValue(); + .var ah = bank.getValue(); + + .byte $F8, $F8, $20, byteLO(address), byteHI(address), byteLO(bank), byteHI(bank) +} + +#endif + + + // // Some additional 65CE02 instructions // - #if HAS_OPCODES_65CE02 .pseudocommand dew addr @@ -71,11 +114,11 @@ #endif + // // Stack manipulation - some CPUs will leave .A unchanged, some will use it as temporary storage, so consider .A trashed // - .pseudocommand phx_trash_a { #if HAS_OPCODES_65C02 @@ -117,12 +160,12 @@ } + // // Branches with far offsets, substitutes by Bxx + JMP for CPUs not supporting the instruction // - -.pseudocommand bcs_far dst +.pseudocommand bcs_16 dst { #if HAS_OPCODES_65CE02 .var offset = mod($10000 + dst.getValue() - *, $10000) @@ -134,7 +177,7 @@ __l: #endif } -.pseudocommand bcc_far dst +.pseudocommand bcc_16 dst { #if HAS_OPCODES_65CE02 .var offset = mod($10000 + dst.getValue() - *, $10000) @@ -146,7 +189,7 @@ __l: #endif } -.pseudocommand beq_far dst +.pseudocommand beq_16 dst { #if HAS_OPCODES_65CE02 && XXX_DISABLED // XXX causes problems with XEMU, investigate why .var offset = mod($10000 + dst.getValue() - *, $10000) @@ -158,7 +201,7 @@ __l: #endif } -.pseudocommand bne_far dst +.pseudocommand bne_16 dst { #if HAS_OPCODES_65CE02 && XXX_DISABLED // XXX causes problems with XEMU, investigate why .var offset = mod($10000 + dst.getValue() - *, $10000) @@ -170,7 +213,7 @@ __l: #endif } -.pseudocommand bmi_far dst +.pseudocommand bmi_16 dst { #if HAS_OPCODES_65CE02 .var offset = mod($10000 + dst.getValue() - *, $10000) @@ -182,7 +225,7 @@ __l: #endif } -.pseudocommand bpl_far dst +.pseudocommand bpl_16 dst { #if HAS_OPCODES_65CE02 .var offset = mod($10000 + dst.getValue() - *, $10000) @@ -194,7 +237,7 @@ __l: #endif } -.pseudocommand bvc_far dst +.pseudocommand bvc_16 dst { #if HAS_OPCODES_65CE02 .var offset = mod($10000 + dst.getValue() - *, $10000) @@ -206,7 +249,7 @@ __l: #endif } -.pseudocommand bvs_far dst +.pseudocommand bvs_16 dst { #if HAS_OPCODES_65CE02 .var offset = mod($10000 + dst.getValue() - *, $10000) diff --git a/c64/basic/basic_main_loop.s b/c64/basic/basic_main_loop.s index 238a9c07..af6fa6d3 100644 --- a/c64/basic/basic_main_loop.s +++ b/c64/basic/basic_main_loop.s @@ -76,11 +76,11 @@ rsl_l1: #if CONFIG_DOS_WEDGE cmp #$40 // '@' - beq_far wedge_dos + beq_16 wedge_dos #endif #if CONFIG_TAPE_WEDGE cmp #$1F // left arrow - beq_far wedge_tape + beq_16 wedge_tape #endif #endif diff --git a/c64/basic/wedge_tape.s b/c64/basic/wedge_tape.s index df781320..1503f3c4 100644 --- a/c64/basic/wedge_tape.s +++ b/c64/basic/wedge_tape.s @@ -12,11 +12,11 @@ wedge_tape: sta CURLIN+1 // in case of error do not print line number cpx #$02 - bne_far do_SYNTAX_error + bne_16 do_SYNTAX_error lda BUF+1 cmp #$4C // 'L' - bne_far do_SYNTAX_error + bne_16 do_SYNTAX_error // Execute 'arrow + L' diff --git a/c64/kernal/jumptable/4000.internal_jumptable.s b/c64/kernal/banking/4000.mega65_kernal_1.s similarity index 56% rename from c64/kernal/jumptable/4000.internal_jumptable.s rename to c64/kernal/banking/4000.mega65_kernal_1.s index 7ac1ee32..4887c883 100644 --- a/c64/kernal/jumptable/4000.internal_jumptable.s +++ b/c64/kernal/banking/4000.mega65_kernal_1.s @@ -1,11 +1,13 @@ #if (ROM_LAYOUT_M65 && SEGMENT_KERNAL_1) +// +// Definitions for communication with Mega65 segment KERNAL_1 +// + // XXX this is for testing only - sed - sed - rts + rts_32 #endif // ROM layout diff --git a/c64/kernal/iec/chkin_iec.s b/c64/kernal/iec/chkin_iec.s index 80742876..f2f094dc 100644 --- a/c64/kernal/iec/chkin_iec.s +++ b/c64/kernal/iec/chkin_iec.s @@ -14,18 +14,18 @@ chkin_iec: lda LAT, Y cmp #$01 - beq_far chkin_file_not_input + beq_16 chkin_file_not_input // Send TALK + TKSA first lda FAT,Y jsr TALK - bcs_far chkinout_device_not_present + bcs_16 chkinout_device_not_present lda LAT, Y ora #$60 jsr TKSA - bcs_far chkinout_device_not_present + bcs_16 chkinout_device_not_present jmp chkin_set_device diff --git a/c64/kernal/iec/chrout_iec.s b/c64/kernal/iec/chrout_iec.s index 59263d27..c40b1804 100644 --- a/c64/kernal/iec/chrout_iec.s +++ b/c64/kernal/iec/chrout_iec.s @@ -9,7 +9,7 @@ chrout_iec: lda SCHAR jsr JCIOUT - bcc_far chrout_done_success + bcc_16 chrout_done_success jmp chrout_done_fail diff --git a/c64/kernal/iec/ckout_iec.s b/c64/kernal/iec/ckout_iec.s index 7f2e882e..389ee058 100644 --- a/c64/kernal/iec/ckout_iec.s +++ b/c64/kernal/iec/ckout_iec.s @@ -13,18 +13,18 @@ ckout_iec: // Fail if the file is open for reading (secondary address 0) lda LAT, Y - beq_far ckout_file_not_output + beq_16 ckout_file_not_output // Send LISTEN + SECOND first lda FAT,Y jsr LISTEN - bcs_far chkinout_device_not_present + bcs_16 chkinout_device_not_present lda LAT, Y ora #$60 jsr SECOND - bcs_far chkinout_device_not_present + bcs_16 chkinout_device_not_present jmp ckout_set_device diff --git a/c64/kernal/iec/clrchn_iec.s b/c64/kernal/iec/clrchn_iec.s index ea4e5a6d..85801050 100644 --- a/c64/kernal/iec/clrchn_iec.s +++ b/c64/kernal/iec/clrchn_iec.s @@ -23,7 +23,7 @@ clrchn_iec: jsr iec_check_devnum_oc // If it was IEC device - send UNLSN first - bcc_far UNLSN + bcc_16 UNLSN rts diff --git a/c64/kernal/iec/iec_rx_byte.s b/c64/kernal/iec/iec_rx_byte.s index 06fb768e..eb4fc393 100644 --- a/c64/kernal/iec/iec_rx_byte.s +++ b/c64/kernal/iec/iec_rx_byte.s @@ -16,7 +16,7 @@ iec_rx_dispatch: lda IECPROTO cmp #$01 - beq_far jiffydos_rx_byte + beq_16 jiffydos_rx_byte // FALLTROUGH diff --git a/c64/kernal/iec/load_iec.s b/c64/kernal/iec/load_iec.s index 82976a67..321072cf 100644 --- a/c64/kernal/iec/load_iec.s +++ b/c64/kernal/iec/load_iec.s @@ -30,7 +30,7 @@ load_iec: // Check file name lda FNLEN - beq_far kernalerror_FILE_NAME_MISSING + beq_16 kernalerror_FILE_NAME_MISSING // Display SEARCHING FOR + filename jsr lvs_display_searching_for @@ -106,12 +106,12 @@ load_iec: #if CONFIG_IEC_JIFFYDOS cmp #$01 - beq_far jiffydos_load // branch if JiffyDOS + beq_16 jiffydos_load // branch if JiffyDOS #endif #if CONFIG_IEC_DOLPHINDOS cmp #$02 - beq_far dolphindos_load // branch if DolphinDOS + beq_16 dolphindos_load // branch if DolphinDOS #endif #endif @@ -149,7 +149,7 @@ load_iec_loop: phx_trash_a jsr udtim_keyboard jsr STOP - bcs_far load_break_error + bcs_16 load_break_error plx_trash_a !: // Check for EOI - if so, this was the last byte diff --git a/c64/kernal/iec/save_iec.s b/c64/kernal/iec/save_iec.s index 73feeee3..59e3bfa2 100644 --- a/c64/kernal/iec/save_iec.s +++ b/c64/kernal/iec/save_iec.s @@ -16,7 +16,7 @@ save_iec: // Check file name lda FNLEN - beq_far kernalerror_FILE_NAME_MISSING + beq_16 kernalerror_FILE_NAME_MISSING // Display SAVING jsr lvs_display_saving diff --git a/c64/kernal/iostack/f157.chrin.s b/c64/kernal/iostack/f157.chrin.s index 27216162..f9d43402 100644 --- a/c64/kernal/iostack/f157.chrin.s +++ b/c64/kernal/iostack/f157.chrin.s @@ -20,17 +20,17 @@ CHRIN: lda DFLTN // Try $00 - keyboard - beq_far chrin_keyboard + beq_16 chrin_keyboard // XXX Try $03 - screen // cmp #$03 - // beq_far chrin_screen + // beq_16 chrin_screen #if HAS_RS232 // Try $02 - RS-232 cmp #$02 - beq_far chrin_rs232 + beq_16 chrin_rs232 #endif // HAS_RS232 @@ -40,7 +40,7 @@ chrin_getin: // jump entry for GETIN // Try IEC devices jsr iec_check_devnum_oc - bcc_far chrin_iec + bcc_16 chrin_iec #endif // CONFIG_IEC diff --git a/c64/kernal/iostack/f1ca.chrout.s b/c64/kernal/iostack/f1ca.chrout.s index 810b535e..e52f0e84 100644 --- a/c64/kernal/iostack/f1ca.chrout.s +++ b/c64/kernal/iostack/f1ca.chrout.s @@ -28,16 +28,16 @@ CHROUT: lda DFLTO cmp #$03 // screen - beq_far chrout_screen + beq_16 chrout_screen #if HAS_RS232 cmp #$02 - beq_far chrout_rs232 + beq_16 chrout_rs232 #endif #if CONFIG_IEC jsr iec_check_devnum_oc - bcc_far chrout_iec + bcc_16 chrout_iec #endif // FALLTROUGH diff --git a/c64/kernal/iostack/f20e.chkin.s b/c64/kernal/iostack/f20e.chkin.s index da373edc..965bb970 100644 --- a/c64/kernal/iostack/f20e.chkin.s +++ b/c64/kernal/iostack/f20e.chkin.s @@ -23,7 +23,7 @@ CHKIN: txa jsr find_fls - bcs_far chkinout_file_not_open + bcs_16 chkinout_file_not_open // Now we have table index in Y @@ -38,19 +38,19 @@ CHKIN: #if HAS_RS232 cmp #$02 - beq_far chkin_rs232 + beq_16 chkin_rs232 #endif // HAS_RS232 #if CONFIG_IEC jsr iec_check_devnum_oc - bcc_far chkin_iec + bcc_16 chkin_iec #endif // CONFIG_IEC cmp #$03 // screen - only legal one left - bne_far chkinout_device_not_present + bne_16 chkinout_device_not_present chkin_set_device: lda FAT,Y diff --git a/c64/kernal/iostack/f250.ckout.s b/c64/kernal/iostack/f250.ckout.s index f51c8bbe..32fe73b1 100644 --- a/c64/kernal/iostack/f250.ckout.s +++ b/c64/kernal/iostack/f250.ckout.s @@ -23,7 +23,7 @@ CKOUT: txa jsr find_fls - bcs_far chkinout_file_not_open + bcs_16 chkinout_file_not_open // Now we have table index in Y @@ -38,19 +38,19 @@ CKOUT: #if HAS_RS232 cmp #$02 - beq_far ckout_rs232 + beq_16 ckout_rs232 #endif // HAS_RS232 #if CONFIG_IEC jsr iec_check_devnum_oc - bcc_far ckout_iec + bcc_16 ckout_iec #endif // CONFIG_IEC cmp #$03 // screen - only legal one left - bne_far chkinout_device_not_present + bne_16 chkinout_device_not_present ckout_set_device: lda FAT,Y diff --git a/c64/kernal/iostack/f291.close.s b/c64/kernal/iostack/f291.close.s index 0a4803c7..7a31ea5a 100644 --- a/c64/kernal/iostack/f291.close.s +++ b/c64/kernal/iostack/f291.close.s @@ -25,12 +25,12 @@ CLOSE: #if HAS_RS232 cmp #$02 - beq_far close_rs232 + beq_16 close_rs232 #endif #if CONFIG_IEC jsr iec_check_devnum_oc - bcc_far close_iec + bcc_16 close_iec #endif // FALLTROUGH diff --git a/c64/kernal/iostack/f34a.open.s b/c64/kernal/iostack/f34a.open.s index d9a843e8..67c373c1 100644 --- a/c64/kernal/iostack/f34a.open.s +++ b/c64/kernal/iostack/f34a.open.s @@ -60,14 +60,14 @@ open_has_space: #if HAS_RS232 cmp #$02 - beq_far open_rs232 + beq_16 open_rs232 #endif #if CONFIG_IEC jsr iec_check_devnum_oc - bcc_far open_iec + bcc_16 open_iec #endif diff --git a/c64/kernal/iostack/f4a5.load.s b/c64/kernal/iostack/f4a5.load.s index c2233541..66850933 100644 --- a/c64/kernal/iostack/f4a5.load.s +++ b/c64/kernal/iostack/f4a5.load.s @@ -43,17 +43,17 @@ LOAD: #if CONFIG_TAPE_NORMAL cmp #$01 - beq_far load_tape_normal + beq_16 load_tape_normal #endif #if CONFIG_TAPE_TURBO cmp #$07 - beq_far load_tape_turbo + beq_16 load_tape_turbo #endif #if CONFIG_IEC jsr iec_check_devnum_lvs - bcc_far load_iec + bcc_16 load_iec #endif jmp lvs_illegal_device_number diff --git a/c64/kernal/iostack/f5ed.save.s b/c64/kernal/iostack/f5ed.save.s index bd3eb912..57ef482c 100644 --- a/c64/kernal/iostack/f5ed.save.s +++ b/c64/kernal/iostack/f5ed.save.s @@ -25,7 +25,7 @@ SAVE: #if CONFIG_IEC jsr iec_check_devnum_lvs - bcc_far save_iec + bcc_16 save_iec #endif jmp lvs_illegal_device_number diff --git a/c64/kernal/iostack/getin_real.s b/c64/kernal/iostack/getin_real.s index fd2d60c0..01f29026 100644 --- a/c64/kernal/iostack/getin_real.s +++ b/c64/kernal/iostack/getin_real.s @@ -16,13 +16,13 @@ getin_real: lda DFLTN // Try $00 - keyboard - beq_far getin_keyboard + beq_16 getin_keyboard #if HAS_RS232 // Try $02 - RS-232 cmp #$02 - beq_far getin_rs232 + beq_16 getin_rs232 #endif // HAS_RS232 diff --git a/c64/kernal/screen/chrout_screen_crsr.s b/c64/kernal/screen/chrout_screen_crsr.s index 13f22bd0..9a076b44 100644 --- a/c64/kernal/screen/chrout_screen_crsr.s +++ b/c64/kernal/screen/chrout_screen_crsr.s @@ -33,7 +33,7 @@ chrout_screen_CRSR_RIGHT: jsr screen_get_clipped_PNTR cpy #39 - beq_far screen_advance_to_next_line + beq_16 screen_advance_to_next_line iny !: diff --git a/c64/kernal/screen/chrout_screen_ins.s b/c64/kernal/screen/chrout_screen_ins.s index dd1e60b6..f191564c 100644 --- a/c64/kernal/screen/chrout_screen_ins.s +++ b/c64/kernal/screen/chrout_screen_ins.s @@ -14,7 +14,7 @@ chrout_screen_INS: // Not space, we cannot insert anything - bne_far chrout_screen_done + bne_16 chrout_screen_done chrout_screen_ins_possible: diff --git a/c64/kernal/tape/load_tape_normal.s b/c64/kernal/tape/load_tape_normal.s index 1b77bf5f..ec06918a 100644 --- a/c64/kernal/tape/load_tape_normal.s +++ b/c64/kernal/tape/load_tape_normal.s @@ -92,7 +92,7 @@ load_tape_normal_header: lda (TAPE1),y cmp #$05 - beq_far tape_load_error // end of tape mark, nothing to load + beq_16 tape_load_error // end of tape mark, nothing to load cmp #$01 beq !+ @@ -125,10 +125,10 @@ load_tape_normal_payload: jsr tape_normal_pilot_data ldy #$00 // no data size limit jsr tape_normal_get_data - bcs_far tape_load_error + bcs_16 tape_load_error jsr lvs_check_EAL - bne_far tape_load_error // amount of data read does not match header info + bne_16 tape_load_error // amount of data read does not match header info jmp tape_load_success diff --git a/c64/kernal/tape/load_tape_turbo.s b/c64/kernal/tape/load_tape_turbo.s index 2ce2a528..e85999e9 100644 --- a/c64/kernal/tape/load_tape_turbo.s +++ b/c64/kernal/tape/load_tape_turbo.s @@ -132,7 +132,7 @@ load_tape_turbo_loop: // Verify the checksum cpx PRTY - beq_far tape_load_success + beq_16 tape_load_success jmp tape_load_error