From cbc12eaa77542e9b1ad27e20a6dcf8be0e8b3b59 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 25 Sep 2020 15:29:04 +0200 Subject: [PATCH 01/51] attempt to workaround some problems on MEGA65 real hardware --- bin/mega65.rom | Bin 131072 -> 131072 bytes bin/mega65_pxlfont.rom | Bin 131072 -> 131072 bytes src/,,config_mega65.s | 4 ++-- src/kernal/interrupts/hw_entry_nmi.s | 6 ++++++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/bin/mega65.rom b/bin/mega65.rom index 5366bfa02483d4b9464fd344aa2a370fc0589c00..b5b722dbb008d2d9b56cb5a874197f9996c035c0 100644 GIT binary patch delta 3862 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 OpO*DhZ27l;f%<<9QnR)I delta 3664 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 OpO*DhZ27l;f%<<9QnR)I delta 3664 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 Date: Sun, 27 Sep 2020 11:35:40 +0200 Subject: [PATCH 02/51] more work on SDCARD support, documentation fixes --- doc/Protocol-DolphinDOS.md | 2 +- src/aliases/,aliases_hardware_m65.s | 7 ++ src/dos_m65/m65_sdcard.s | 163 +++++++++++++++++++--------- 3 files changed, 119 insertions(+), 53 deletions(-) diff --git a/doc/Protocol-DolphinDOS.md b/doc/Protocol-DolphinDOS.md index 776cf55c..cd95e738 100644 --- a/doc/Protocol-DolphinDOS.md +++ b/doc/Protocol-DolphinDOS.md @@ -21,7 +21,7 @@ Timing is no more strict than standard IEC protocol - I have checked using VICE Detection happens after `OPEN` (0xF0 - 0xFF) or `REOPEN` (0x60 - 0x6F) IEC command is sent from the controller and is very simple. -The CIA2 port B has to be set for reading (interrupts for the port are disabled by writing $7F to $DD0D). The controller constantly reads (not sure if there is a countdown or timeout in the original DolphinDOS ROM, countdoown started from $20 seems more than enough) the CIA2 interrupt control and port B registers; when ICR reads $10 (again - not sure if just the bit is checked, or the whole register), bus controller assumes the receiver talks the DolphinDOS protocol. +The CIA2 port B has to be set for reading (interrupts for the port are disabled by writing $7F to $DD0D). The controller constantly reads (not sure if there is a countdown or timeout in the original DolphinDOS ROM, countdown started from $20 seems more than enough) the CIA2 interrupt control and port B registers; when ICR reads $10 (again - not sure if just the bit is checked, or the whole register), bus controller assumes the receiver talks the DolphinDOS protocol. Note: detection only works under ATN, should be performed before the controller performs a turnover to listener! diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s index b05afa32..6f545945 100644 --- a/src/aliases/,aliases_hardware_m65.s +++ b/src/aliases/,aliases_hardware_m65.s @@ -38,6 +38,13 @@ !addr SD_ADDR = $D681 ; 4 bytes !addr SD_ERRCODE = $D6DA + ; SD card sector buffer, $FFFD6E00 + + !set SD_SECBUF_0 = $00 + !set SD_SECBUF_1 = $6E + !set SD_SECBUF_2 = $FD + !set SD_SECBUF_3 = $0F + ; DMAgic !addr DMA_ADDRLSBTRIG = $D700 diff --git a/src/dos_m65/m65_sdcard.s b/src/dos_m65/m65_sdcard.s index e0f474a1..9ca80a71 100644 --- a/src/dos_m65/m65_sdcard.s +++ b/src/dos_m65/m65_sdcard.s @@ -12,15 +12,15 @@ !addr CARD_IS_SDHC = $80 ; $00 = SD, $80 = SDHC !addr CARD_SIZE = $81 ; 4 bytes !addr CARD_SECNUM = $85 ; 4 bytes - sector number +!addr CARD_BUFPNT = $89 ; 4 bytes - pointer to hardware sector buffer ; Temporary data XXX addresses are temporary -!addr TMP_STEP = $89 ; 4 bytes -!addr TMP_RETRIES = $8D ; 1 byte +!addr TMP_STEP = $8D ; 4 bytes +!addr TMP_RETRIES = $8E ; 1 byte - -; XXX hardware address SD_SECTORBUF = 0xffd6e00L; +!addr CARD_BUF = $8100 ; 512 bytes, up to $82FF ; External entry points: @@ -31,9 +31,22 @@ m65_sdcard_init: + ; Initialize most important variables + lda #$00 sta CARD_IS_SDHC + lda #SD_SECBUF_0 + sta CARD_BUFPNT+0 + lda #SD_SECBUF_1 + sta CARD_BUFPNT+1 + lda #SD_SECBUF_2 + sta CARD_BUFPNT+2 + lda #SD_SECBUF_3 + sta CARD_BUFPNT+3 + + ; Reset the card + jsr m65_sdcard_reset ; Try to read first sector to see if card is operable @@ -72,28 +85,6 @@ m65_sdcard_init_sdhc: lda #$80 sta CARD_IS_SDHC - ; Prepare data for determining card size - put $00200000 to TMP_STEP and CARD_SECNUM - - ; SDHC claims 32GB limit, and reading from beyond that might cause - ; trouble. However, 32bits x 512byte sectors = 16TB addressable. - ; It thus seems that the top byte of the address may not be safe to use, - ; or at least the top few bits. - - ; XXX this should be initialized to 0 in a loop - ; XXX is it needed for anything - - lda #$00 - sta CARD_SECNUM+0 - sta TMP_STEP+0 - sta CARD_SECNUM+1 - sta TMP_STEP+1 - sta CARD_SECNUM+2 - sta TMP_STEP+2 - - lda #$02 - sta CARD_SECNUM+3 - sta TMP_STEP+3 - bra m65_sdcard_init_getsize m65_sdcard_init_sdsc: @@ -103,23 +94,6 @@ m65_sdcard_init_sdsc: lda #$40 ; use byte addressing sta SD_CTL - ; Prepare data for determining card size - put $00200000 to TMP_STEP and CARD_SECNUM - - ; XXX this should be initialized to 0 in a loop - ; XXX is it needed for anything - - lda #$00 - sta CARD_SECNUM+0 - sta TMP_STEP+0 - sta CARD_SECNUM+1 - sta TMP_STEP+1 - sta CARD_SECNUM+3 - sta TMP_STEP+3 - - lda #$02 - sta CARD_SECNUM+2 - sta TMP_STEP+2 - ; FALLTROUGH m65_sdcard_init_getsize: @@ -152,6 +126,8 @@ m65_sdcard_init_getsize: +; ------------------------------------- + @@ -178,7 +154,6 @@ m65_sdcard_readsector_sdhc: bra m65_sdcard_readsector_read - m65_sdcard_readsector_sdsc: ; multiply sector number by 512 lda #$00 @@ -201,32 +176,77 @@ m65_sdcard_readsector_sdsc: ; multiply sector number by 512 m65_sdcard_readsector_read: - ; Wait till card is ready - - - - - - ; Set number of retries lda #$0A sta TMP_RETRIES - ; XXX + ; FALLTROUGH +m65_sdcard_readsector_try_loop: + ; Wait till card is ready + jsr m65_sdcard_readsector_wait + bcs m65_sdcard_readsector_fail + + ; Read command + + lda #$02 + sta SD_CTL + + ; Wait for command completion + + jsr m65_sdcard_readsector_wait + bcs m65_sdcard_readsector_fail + lda SD_CTL + and #$67 + bne m65_sdcard_readsector_copy_data + jsr m65_sdcard_reset + dec TMP_RETRIES + bne m65_sdcard_readsector_try_loop + ; FALLTROUGH m65_sdcard_readsector_fail: sec rts +m65_sdcard_readsector_copy_data: + + ; XXX this should be a separate routine + ; XXX use DMAgic for this + + phz + phx + + ldx #$00 + ldz #$00 + +@RL1: + lda [CARD_BUFPNT],z + sta CARD_BUF,x + inc CARD_BUFPNT+1 + lda [CARD_BUFPNT],z + sta CARD_BUF+$100,x + dec CARD_BUFPNT+1 + + inz + inx + bne @RL1 + + ; Restore registers and quit + + plx + plz + + clc + rts + @@ -235,6 +255,40 @@ m65_sdcard_readsector_fail: +; ------------------------------------- + + +m65_sdcard_readsector_wait: + + ; Wait till card is ready + + lda SD_CTL + ; Sometimes we see this result, i.e., sdcard.vhdl thinks it is done, + ; but sdcardio.vhdl thinks not. This means a read error. + cmp #$01 + beq m65_sdcard_readsector_wait_fail + tax + and #$40 + bne m65_sdcard_readsector_wait_fail + txa + and #$03 + bne m65_sdcard_readsector_wait + + clc + rts + +m65_sdcard_readsector_wait_fail: + + sec + rts + + + + + +; ------------------------------------- + + @@ -268,6 +322,8 @@ m65_sdcard_read: +; ------------------------------------- + m65_sdcard_reset: @@ -296,6 +352,9 @@ m65_sdcard_reset: +; ------------------------------------- + + m65_sdcard_wait_16000_usec: ; Uses VIC-II raster register; wait time is not exactly precise, but should be From 5704a8d4cd74d14df179714d56dce77908b2a4da Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 27 Sep 2020 16:36:17 +0200 Subject: [PATCH 03/51] more work on SD card support --- Makefile | 2 + src/,,config_mega65.s | 2 + src/aliases/,aliases_config.s | 13 + src/basic/init/initmsg_m65.s | 22 ++ src/basic/init/initmsg_real.s | 2 + src/dos_m65/,aliases_dos.s | 40 ++- src/dos_m65/cmdrdos/,check_nonlgpl3.s | 4 + src/dos_m65/dos_init.s | 5 +- src/dos_m65/m65_sdcard.s | 380 ------------------------- src/dos_m65/sdcard/sdcard_init.s | 136 +++++++++ src/dos_m65/sdcard/sdcard_readsector.s | 154 ++++++++++ src/dos_m65/sdcard/sdcard_reset.s | 32 +++ src/dos_m65/sdcard/sdcard_wait.s | 26 ++ 13 files changed, 429 insertions(+), 389 deletions(-) create mode 100644 src/dos_m65/cmdrdos/,check_nonlgpl3.s delete mode 100644 src/dos_m65/m65_sdcard.s create mode 100644 src/dos_m65/sdcard/sdcard_init.s create mode 100644 src/dos_m65/sdcard/sdcard_readsector.s create mode 100644 src/dos_m65/sdcard/sdcard_reset.s create mode 100644 src/dos_m65/sdcard/sdcard_wait.s diff --git a/Makefile b/Makefile index 1f57c808..6cd4d894 100644 --- a/Makefile +++ b/Makefile @@ -35,6 +35,8 @@ SRCDIR_BASIC = $(SRCDIR_COMMON) \ SRCDIR_DOS_M65 = $(SRCDIR_COMMON) \ src/dos_m65 \ + # src/dos_m65/cmdrdos \ + src/dos_m65/sdcard SRCDIR_KERNAL = $(SRCDIR_COMMON) \ src/kernal \ diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index 95856675..823fb077 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -94,6 +94,8 @@ ; --- Built-in DOS configuration +;; #CONFIG# CMDRDOS NO ; do not change, DOS is not implemented yet + ;; #CONFIG# UNIT_SDCARD 0 ; do not change, DOS is not implemented yet ;; #CONFIG# UNIT_FLOPPY 0 ; do not change, DOS is not implemented yet ;; #CONFIG# UNIT_RAMDISK 0 ; do not change, DOS is not implemented yet diff --git a/src/aliases/,aliases_config.s b/src/aliases/,aliases_config.s index f6cd8a46..db5b2380 100644 --- a/src/aliases/,aliases_config.s +++ b/src/aliases/,aliases_config.s @@ -241,6 +241,13 @@ +; Check that internal DOS configuration is correct + +!ifdef CONFIG_CMDRDOS { !ifndef CONFIG_MB_M65 { + !error "CONFIG_CMDRDOS requires CONFIG_MB_M65" +} } + + ; Check that startup banner configuration is correct !set counter = 0 @@ -415,6 +422,12 @@ +; Handle non-LGPL3 code + +!ifdef CONFIG_CMDRDOS { !set HAS_NOLGPL3_WARN = 1 } + + + ; Determine if we need space-savings in BASIC code !ifndef CONFIG_MB_M65 { diff --git a/src/basic/init/initmsg_m65.s b/src/basic/init/initmsg_m65.s index baedbe52..40d9a782 100644 --- a/src/basic/init/initmsg_m65.s +++ b/src/basic/init/initmsg_m65.s @@ -59,9 +59,18 @@ INITMSG_end: jsr initmsg_bytes_free +!ifdef HAS_NOLGPL3_WARN { + + lda #str_nonlgpl3_warn + jmp STROUT + +} else { + ldx #$09 ldy #$00 jmp plot_set +} INITMSG_main_banner: @@ -99,3 +108,16 @@ INITMSG_revision: lda #rom_revision_basic_string jmp STROUT + + + +!ifdef HAS_NOLGPL3_WARN { + +str_nonlgpl3_warn: + + !byte $0D, $0D, $0D, $0D + !pet "build contains non-lgpl3 code" + !byte $0D + !pet " *** do not distribute ***" + !byte $0D, $0D, $00 +} diff --git a/src/basic/init/initmsg_real.s b/src/basic/init/initmsg_real.s index b470d316..2fea1804 100644 --- a/src/basic/init/initmsg_real.s +++ b/src/basic/init/initmsg_real.s @@ -106,3 +106,5 @@ initmsg_real: } } + +!ifdef HAS_NOLGPL3_WARN { !error "HAS_NOLGPL3_WARN not implemented" diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 93cad552..954435dd 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -2,17 +2,41 @@ ; Memory locations for the DOS ; +; NOTES: +; - DOS zeropage is mirrored at $8000 +; - starting from $8000, 16KB RAM is available (starting from $10000 in C65 address space) +; - additional 16KB RAM is reserved for DOS too ($14000-$17FFF), and can be banked-in if needed + + + ; ; Page 0 ; - !addr MAGICSTR = $00 ; magic string; if not matching, DOS considered non-functional + !addr MAGICSTR = $00 ; magic string; if not matching, DOS considered non-functional - !addr UNIT_SDCARD = $05 - !addr UNIT_FLOPPY = $06 - !addr UNIT_RAMDISK = $07 + ; General DOS configuration - ; NOTES: - ; - DOS zeropage is mirrored at $8000 - ; - starting from $8000, 16KB RAM is available (starting from $10000 in C65 address space) - ; - additional 16KB RAM is reserved for DOS too ($14000-$17FFF), and can be banked-in if needed + !addr UNIT_SDCARD = $05 + !addr UNIT_FLOPPY = $06 + !addr UNIT_RAMDISK = $07 + + ; SD/SDHC card variables + + !addr CARD_INIT_DONE = $08 ; $80 - init done, $00 - init not done + !addr CARD_IS_SDHC = $09 ; $00 = SD, $80 = SDHC + !addr CARD_SIZE = $0A ; 4 bytes + !addr CARD_SECNUM = $0E ; 4 bytes - sector number + + !addr CARD_TMP_STEP = $12 ; 4 bytes + !addr CARD_TMP_RETRIES = $16 ; 1 byte + + !addr CARD_BUFPNT = $FC ; 4 bytes - pointer to hardware sector buffer XXX replace copy routines with DMAgic + + + + ; + ; High memory + ; + + !addr CARD_BUF = $8100 ; 512 bytes, up to $82FF - buffer for reading/writing data diff --git a/src/dos_m65/cmdrdos/,check_nonlgpl3.s b/src/dos_m65/cmdrdos/,check_nonlgpl3.s new file mode 100644 index 00000000..a5e16f82 --- /dev/null +++ b/src/dos_m65/cmdrdos/,check_nonlgpl3.s @@ -0,0 +1,4 @@ + +!ifndef HAS_NOLGPL3_WARN { + !error "No LGPL3 incompatible warning issued" +} diff --git a/src/dos_m65/dos_init.s b/src/dos_m65/dos_init.s index 8cc6e213..5654e923 100644 --- a/src/dos_m65/dos_init.s +++ b/src/dos_m65/dos_init.s @@ -26,6 +26,9 @@ dos_INIT: lda #CONFIG_UNIT_RAMDISK sta UNIT_RAMDISK - ; XXX initialize drivers, etc. + ; Mark SD card as not initialized + + lda #$00 + sta CARD_INIT_DONE rts diff --git a/src/dos_m65/m65_sdcard.s b/src/dos_m65/m65_sdcard.s deleted file mode 100644 index 9ca80a71..00000000 --- a/src/dos_m65/m65_sdcard.s +++ /dev/null @@ -1,380 +0,0 @@ - -; -; MEGA65 SD/SDHC card support -; - -; Based on https://github.com/MEGA65/mega65-libc/blob/master/cc65/src/sdcard.c - - - -; Permanent values XXX addresses are temporary - -!addr CARD_IS_SDHC = $80 ; $00 = SD, $80 = SDHC -!addr CARD_SIZE = $81 ; 4 bytes -!addr CARD_SECNUM = $85 ; 4 bytes - sector number -!addr CARD_BUFPNT = $89 ; 4 bytes - pointer to hardware sector buffer - - -; Temporary data XXX addresses are temporary - -!addr TMP_STEP = $8D ; 4 bytes -!addr TMP_RETRIES = $8E ; 1 byte - -!addr CARD_BUF = $8100 ; 512 bytes, up to $82FF - - -; External entry points: -; - m65_sdcard_init -; - m65_sdcard_readsector - - - -m65_sdcard_init: - - ; Initialize most important variables - - lda #$00 - sta CARD_IS_SDHC - - lda #SD_SECBUF_0 - sta CARD_BUFPNT+0 - lda #SD_SECBUF_1 - sta CARD_BUFPNT+1 - lda #SD_SECBUF_2 - sta CARD_BUFPNT+2 - lda #SD_SECBUF_3 - sta CARD_BUFPNT+3 - - ; Reset the card - - jsr m65_sdcard_reset - - ; Try to read first sector to see if card is operable - - lda #$00 - sta SD_ADDR+0 - sta SD_ADDR+1 - sta SD_ADDR+2 - sta SD_ADDR+3 - - jsr m65_sdcard_read - bcc m65_sdcard_init_operable - - ; XXX if we are here, mark card as not operable and quit - -m65_sdcard_init_operable: - - ; Work out if this is SD or SDHC card - SD cards can't read at non-sector aligned addresses - - lda #$02 - sta SD_ADDR+0 - lda #$00 - sta SD_ADDR+1 - sta SD_ADDR+2 - sta SD_ADDR+3 - - jsr m65_sdcard_read - - lda SD_CTL - beq m65_sdcard_init_sdsc - - ; FALLTROUGH - -m65_sdcard_init_sdhc: - - lda #$80 - sta CARD_IS_SDHC - - bra m65_sdcard_init_getsize - -m65_sdcard_init_sdsc: - - lda #$00 - sta CARD_IS_SDHC - lda #$40 ; use byte addressing - sta SD_CTL - - ; FALLTROUGH - -m65_sdcard_init_getsize: - - ; Work out size of SD card in a safe way - ; (binary search of sector numbers is NOT safe for some reason. - ; It frequently reports bigger than the size of the card) - - lda #$00 - sta CARD_SECNUM+0 - sta CARD_SECNUM+1 - sta CARD_SECNUM+2 - sta CARD_SECNUM+3 - - ; step = 16*2048 - - sta TMP_STEP+0 - sta TMP_STEP+2 - sta TMP_STEP+3 - lda #$08 - sta TMP_STEP+1 - - ; XXX finish the implementation - - - - - - - - - -; ------------------------------------- - - - - - - - -m65_sdcard_readsector: ; XXX reads sector CARD_SECNUM - - ; Set read address, depending on card type - - bit CARD_IS_SDHC - bpl m65_sdcard_readsector_sdsc - -m65_sdcard_readsector_sdhc: - - lda CARD_SECNUM+0 - sta SD_ADDR+0 - lda CARD_SECNUM+1 - sta SD_ADDR+1 - lda CARD_SECNUM+2 - sta SD_ADDR+2 - lda CARD_SECNUM+3 - sta SD_ADDR+3 - - bra m65_sdcard_readsector_read - -m65_sdcard_readsector_sdsc: ; multiply sector number by 512 - - lda #$00 - sta SD_ADDR+0 - clc - lda CARD_SECNUM+0 - rol - sta SD_ADDR+1 - lda CARD_SECNUM+1 - rol - sta SD_ADDR+2 - lda CARD_SECNUM+2 - rol - sta SD_ADDR+3 - bcs m65_sdcard_readsector_fail ; branch if sector number too large for SD card - lda CARD_SECNUM+3 - bne m65_sdcard_readsector_fail ; branch if sector number too large for SD card - - ; FALLTROUGH - -m65_sdcard_readsector_read: - - ; Set number of retries - - lda #$0A - sta TMP_RETRIES - - ; FALLTROUGH - -m65_sdcard_readsector_try_loop: - - ; Wait till card is ready - - jsr m65_sdcard_readsector_wait - bcs m65_sdcard_readsector_fail - - ; Read command - - lda #$02 - sta SD_CTL - - ; Wait for command completion - - jsr m65_sdcard_readsector_wait - bcs m65_sdcard_readsector_fail - - - lda SD_CTL - and #$67 - bne m65_sdcard_readsector_copy_data - - jsr m65_sdcard_reset - dec TMP_RETRIES - bne m65_sdcard_readsector_try_loop - - ; FALLTROUGH - -m65_sdcard_readsector_fail: - - sec - rts - -m65_sdcard_readsector_copy_data: - - ; XXX this should be a separate routine - ; XXX use DMAgic for this - - phz - phx - - ldx #$00 - ldz #$00 - -@RL1: - lda [CARD_BUFPNT],z - sta CARD_BUF,x - inc CARD_BUFPNT+1 - lda [CARD_BUFPNT],z - sta CARD_BUF+$100,x - dec CARD_BUFPNT+1 - - inz - inx - bne @RL1 - - ; Restore registers and quit - - plx - plz - - clc - rts - - - - - - - - - -; ------------------------------------- - - -m65_sdcard_readsector_wait: - - ; Wait till card is ready - - lda SD_CTL - ; Sometimes we see this result, i.e., sdcard.vhdl thinks it is done, - ; but sdcardio.vhdl thinks not. This means a read error. - cmp #$01 - beq m65_sdcard_readsector_wait_fail - tax - and #$40 - bne m65_sdcard_readsector_wait_fail - txa - and #$03 - bne m65_sdcard_readsector_wait - - clc - rts - -m65_sdcard_readsector_wait_fail: - - sec - rts - - - - - -; ------------------------------------- - - - - - -m65_sdcard_read: - - ; Trigger read - - lda #$02 - sta SD_CTL - - ; Wait for result - - ldx #90 -@1: - jsr m65_sdcard_wait_16000_usec - lda SD_CTL - and #$03 - beq @2 - dex - bne @1 - - ; Read failed - - sec - rts -@2: - ;; Success - - clc - rts - - - -; ------------------------------------- - - - -m65_sdcard_reset: - - ldx #$40 - stx SD_CTL - ldy #$00 - sty SD_CTL - iny ; $01 - sty SD_CTL - - ; Wait till SD card resets -@3: - lda SD_CTL - and #$03 - bne @3 - - ; For SDHC card set appropriate mode - - bit CARD_IS_SDHC - bpl @4 - inx ; $41 - stx SD_CTL -@4: - rts - - - -; ------------------------------------- - - -m65_sdcard_wait_16000_usec: - - ; Uses VIC-II raster register; wait time is not exactly precise, but should be - ; a good approximation - - phx - pha - - ldx #$FF - - ; XXX wait below is same as in KKERNAL, wait_x_lines - consider importing and reusing - lda VIC_RASTER -@w1: - cmp VIC_RASTER - beq @w1 - lda VIC_RASTER - dex - bne @w1 - - pla - plx - - rts diff --git a/src/dos_m65/sdcard/sdcard_init.s b/src/dos_m65/sdcard/sdcard_init.s new file mode 100644 index 00000000..c67fdc08 --- /dev/null +++ b/src/dos_m65/sdcard/sdcard_init.s @@ -0,0 +1,136 @@ + +; +; Initialize memory card, determine it's type and size +; + +; Based on https://github.com/MEGA65/mega65-libc/blob/master/cc65/src/sdcard.c + + + +; XXX finish the routine + + +sdcard_init: + + ; Initialize most important variables + + lda #$00 + sta CARD_IS_SDHC + + lda #SD_SECBUF_0 + sta CARD_BUFPNT+0 + lda #SD_SECBUF_1 + sta CARD_BUFPNT+1 + lda #SD_SECBUF_2 + sta CARD_BUFPNT+2 + lda #SD_SECBUF_3 + sta CARD_BUFPNT+3 + + ; Reset the card + + jsr sdcard_reset + + ; Try to read first sector to see if card is operable + + lda #$00 + sta SD_ADDR+0 + sta SD_ADDR+1 + sta SD_ADDR+2 + sta SD_ADDR+3 + + jsr sdcard_init_read + bcc sdcard_init_operable + + ; XXX if we are here, mark card as not operable and quit + +sdcard_init_operable: + + ; Work out if this is SD or SDHC card - SD cards can't read at non-sector aligned addresses + + lda #$02 + sta SD_ADDR+0 + lda #$00 + sta SD_ADDR+1 + sta SD_ADDR+2 + sta SD_ADDR+3 + + jsr sdcard_init_read + + lda SD_CTL + beq sdcard_init_sdsc + + ; FALLTROUGH + +sdcard_init_sdhc: + + lda #$80 + sta CARD_IS_SDHC + + bra sdcard_init_getsize + +sdcard_init_sdsc: + + lda #$00 + sta CARD_IS_SDHC + lda #$40 ; use byte addressing + sta SD_CTL + + ; FALLTROUGH + +sdcard_init_getsize: + + ; Work out size of SD card in a safe way + ; (binary search of sector numbers is NOT safe for some reason. + ; It frequently reports bigger than the size of the card) + + lda #$00 + sta CARD_SECNUM+0 + sta CARD_SECNUM+1 + sta CARD_SECNUM+2 + sta CARD_SECNUM+3 + + ; step = 16*2048 + + sta CARD_TMP_STEP+0 + sta CARD_TMP_STEP+2 + sta CARD_TMP_STEP+3 + lda #$08 + sta CARD_TMP_STEP+1 + + ; XXX finish the implementation + + + + +; +; Helper routines +; + + +sdcard_init_read: + + ; Trigger read + + lda #$02 + sta SD_CTL + + ; Wait for result + + ldx #90 +@1: + jsr sdcard_wait_16000_usec + lda SD_CTL + and #$03 + beq @2 + dex + bne @1 + + ; Read failed + + sec + rts +@2: + ;; Success + + clc + rts diff --git a/src/dos_m65/sdcard/sdcard_readsector.s b/src/dos_m65/sdcard/sdcard_readsector.s new file mode 100644 index 00000000..1f20ae9b --- /dev/null +++ b/src/dos_m65/sdcard/sdcard_readsector.s @@ -0,0 +1,154 @@ + +; +; Reads the sector from the SD card +; + +; Based on https://github.com/MEGA65/mega65-libc/blob/master/cc65/src/sdcard.c + + +; XXX provide documentation + + +sdcard_readsector: + + ; XXX check if card initialized and operable + + ; Set read address, depending on card type + + bit CARD_IS_SDHC + bpl sdcard_readsector_sdsc + +sdcard_readsector_sdhc: + + lda CARD_SECNUM+0 + sta SD_ADDR+0 + lda CARD_SECNUM+1 + sta SD_ADDR+1 + lda CARD_SECNUM+2 + sta SD_ADDR+2 + lda CARD_SECNUM+3 + sta SD_ADDR+3 + + bra sdcard_readsector_read + +sdcard_readsector_sdsc: ; multiply sector number by 512 + + lda #$00 + sta SD_ADDR+0 + clc + lda CARD_SECNUM+0 + rol + sta SD_ADDR+1 + lda CARD_SECNUM+1 + rol + sta SD_ADDR+2 + lda CARD_SECNUM+2 + rol + sta SD_ADDR+3 + bcs sdcard_readsector_fail ; branch if sector number too large for SD card + lda CARD_SECNUM+3 + bne sdcard_readsector_fail ; branch if sector number too large for SD card + + ; FALLTROUGH + +sdcard_readsector_read: + + ; Set number of retries + + lda #$0A + sta CARD_TMP_RETRIES + + ; FALLTROUGH + +sdcard_readsector_try_loop: + + ; Wait till card is ready + + jsr sdcard_readsector_wait + bcs sdcard_readsector_fail + + ; Read command + + lda #$02 + sta SD_CTL + + ; Wait for command completion + + jsr sdcard_readsector_wait + bcs sdcard_readsector_fail + + + lda SD_CTL + and #$67 + bne sdcard_readsector_copy_data + + jsr sdcard_reset + dec CARD_TMP_RETRIES + bne sdcard_readsector_try_loop + + ; FALLTROUGH + +sdcard_readsector_fail: + + sec + rts + + +; +; Helper routines +; + +sdcard_readsector_copy_data: + + ; XXX this should be a separate routine + ; XXX use DMAgic for this + + phz + phx + + ldx #$00 + ldz #$00 + +@1: + lda [CARD_BUFPNT],z + sta CARD_BUF,x + inc CARD_BUFPNT+1 + lda [CARD_BUFPNT],z + sta CARD_BUF+$100,x + dec CARD_BUFPNT+1 + + inz + inx + bne @1 + + ; Restore registers and quit + + plx + plz + + clc + rts + +sdcard_readsector_wait: + + ; Wait till card is ready + + lda SD_CTL + ; Sometimes we see this result, i.e., sdcard.vhdl thinks it is done, + ; but sdcardio.vhdl thinks not. This means a read error. + cmp #$01 + beq sdcard_readsector_wait_fail + tax + and #$40 + bne sdcard_readsector_wait_fail + txa + and #$03 + bne sdcard_readsector_wait + + clc + rts + +sdcard_readsector_wait_fail: + + sec + rts diff --git a/src/dos_m65/sdcard/sdcard_reset.s b/src/dos_m65/sdcard/sdcard_reset.s new file mode 100644 index 00000000..29b22610 --- /dev/null +++ b/src/dos_m65/sdcard/sdcard_reset.s @@ -0,0 +1,32 @@ + +; +; Resets the SD card +; + +; Based on https://github.com/MEGA65/mega65-libc/blob/master/cc65/src/sdcard.c + + + +sdcard_reset: + + ldx #$40 + stx SD_CTL + ldy #$00 + sty SD_CTL + iny ; $01 + sty SD_CTL + + ; Wait till SD card resets +@1: + lda SD_CTL + and #$03 + bne @1 + + ; For SDHC card set appropriate mode + + bit CARD_IS_SDHC + bpl @2 + inx ; $41 + stx SD_CTL +@2: + rts diff --git a/src/dos_m65/sdcard/sdcard_wait.s b/src/dos_m65/sdcard/sdcard_wait.s new file mode 100644 index 00000000..59f89cb7 --- /dev/null +++ b/src/dos_m65/sdcard/sdcard_wait.s @@ -0,0 +1,26 @@ + + + +sdcard_wait_16000_usec: + + ; Uses VIC-II raster register; wait time is not exactly precise, but should be + ; a good approximation + + phx + pha + + ldx #$FF + + ; XXX wait below is same as in KKERNAL, wait_x_lines - consider importing and reusing + lda VIC_RASTER +@1: + cmp VIC_RASTER + beq @1 + lda VIC_RASTER + dex + bne @1 + + pla + plx + + rts From ff98d2c5c21ebad975f30174f393b4b3ca9f49de Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 27 Sep 2020 16:57:39 +0200 Subject: [PATCH 04/51] protected against distributing file with non-LGPL3 content --- src/basic/assets/str_nolgpl3_warn.s | 15 +++++++++++++++ src/basic/init/initmsg_m65.s | 13 ------------- src/basic/init/initmsg_real.s | 2 +- tools/release.cc | 13 ++++++++++++- 4 files changed, 28 insertions(+), 15 deletions(-) create mode 100644 src/basic/assets/str_nolgpl3_warn.s diff --git a/src/basic/assets/str_nolgpl3_warn.s b/src/basic/assets/str_nolgpl3_warn.s new file mode 100644 index 00000000..88bf8fa9 --- /dev/null +++ b/src/basic/assets/str_nolgpl3_warn.s @@ -0,0 +1,15 @@ +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# * * #IGNORE + + + +!ifdef HAS_NOLGPL3_WARN { + +str_nonlgpl3_warn: + + !byte $0D, $0D, $0D, $0D + !pet "build contains non-lgpl3 code" + !byte $0D + !pet " *** do not distribute ***" + !byte $0D, $0D, $00 +} diff --git a/src/basic/init/initmsg_m65.s b/src/basic/init/initmsg_m65.s index 40d9a782..f0fa4b64 100644 --- a/src/basic/init/initmsg_m65.s +++ b/src/basic/init/initmsg_m65.s @@ -108,16 +108,3 @@ INITMSG_revision: lda #rom_revision_basic_string jmp STROUT - - - -!ifdef HAS_NOLGPL3_WARN { - -str_nonlgpl3_warn: - - !byte $0D, $0D, $0D, $0D - !pet "build contains non-lgpl3 code" - !byte $0D - !pet " *** do not distribute ***" - !byte $0D, $0D, $00 -} diff --git a/src/basic/init/initmsg_real.s b/src/basic/init/initmsg_real.s index 2fea1804..d3f53ac8 100644 --- a/src/basic/init/initmsg_real.s +++ b/src/basic/init/initmsg_real.s @@ -107,4 +107,4 @@ initmsg_real: } -!ifdef HAS_NOLGPL3_WARN { !error "HAS_NOLGPL3_WARN not implemented" +!ifdef HAS_NOLGPL3_WARN { !error "HAS_NOLGPL3_WARN not implemented" } diff --git a/tools/release.cc b/tools/release.cc index 76fdd1e0..3bf52b82 100644 --- a/tools/release.cc +++ b/tools/release.cc @@ -70,7 +70,8 @@ const std::vector STR_SNAPSHOT = { 0x28, 0x44, 0x45, 0x56, 0x45, 0x4C, 0x00 }; const std::vector STR_DOSDATE = { 0x4F, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58 }; -const std::string STR_DEV = "DEV."; +const std::string STR_DEV = "DEV."; +const std::string STR_BLOCK = "DO NOT DISTRIBUTE"; // // Command and enviroment line settings @@ -357,6 +358,16 @@ void ROMFile::readSrcFile() if (!srcFile.good()) ERROR(std::string("unable to read ROM file '") + srcFileNamePath + "'"); srcFile.close(); + + // Check if it is OK to distribute the file + + for (size_t idx = 0; idx < srcFileContent.size() - STR_BLOCK.size(); idx++) + { + if (memcmp(&srcFileContent[idx], STR_BLOCK.c_str(), STR_BLOCK.size()) == 0) + { + ERROR(std::string("not allowed to distribute ROM file '") + srcFileNamePath + "'"); + } + } } void ROMFile::readDstFile() From 32a73bb5f8d1dda5eb37aa25804af3a334600363 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 28 Sep 2020 19:10:54 +0200 Subject: [PATCH 05/51] more work on SD card support --- src/dos_m65/sdcard/sdcard_helpers.s | 66 +++++++++++++++++++++ src/dos_m65/sdcard/sdcard_readsector.s | 38 +----------- src/dos_m65/sdcard/sdcard_writesector.s | 78 +++++++++++++++++++++++++ 3 files changed, 147 insertions(+), 35 deletions(-) create mode 100644 src/dos_m65/sdcard/sdcard_helpers.s create mode 100644 src/dos_m65/sdcard/sdcard_writesector.s diff --git a/src/dos_m65/sdcard/sdcard_helpers.s b/src/dos_m65/sdcard/sdcard_helpers.s new file mode 100644 index 00000000..d53a2c8e --- /dev/null +++ b/src/dos_m65/sdcard/sdcard_helpers.s @@ -0,0 +1,66 @@ + +; +; Various helper routines for SD card support +; + +; Based on https://github.com/MEGA65/mega65-libc/blob/master/cc65/src/sdcard.c + + + +; +; Sets read/write address +; +; Input: CARD_SECNUM, CARD_IS_SDHC +; Output: Carry set = error +; Preserves: .X, .Y, .Z +; + +sdcard_set_addr: + + bit CARD_IS_SDHC + bpl sdcard_set_addr_sdsc + +sdcard_set_addr_sdhc: + + lda CARD_SECNUM+0 + sta SD_ADDR+0 + lda CARD_SECNUM+1 + sta SD_ADDR+1 + lda CARD_SECNUM+2 + sta SD_ADDR+2 + lda CARD_SECNUM+3 + sta SD_ADDR+3 + + ; FALLTROUGH + +sdcard_set_addr_done: + + clc + rts + +sdcard_set_addr_sdsc: + + ; Multiply sector number by 512 + + lda #$00 + sta SD_ADDR+0 + clc + lda CARD_SECNUM+0 + rol + sta SD_ADDR+1 + lda CARD_SECNUM+1 + rol + sta SD_ADDR+2 + lda CARD_SECNUM+2 + rol + sta SD_ADDR+3 + bcs sdcard_set_addr_fail ; branch if sector number too large for SD card + lda CARD_SECNUM+3 + beq sdcard_set_addr_done ; do not branch if sector number too large for SD card + + ; FALLTROUGH + +sdcard_set_addr_fail: + + sec + rts diff --git a/src/dos_m65/sdcard/sdcard_readsector.s b/src/dos_m65/sdcard/sdcard_readsector.s index 1f20ae9b..8fe2194d 100644 --- a/src/dos_m65/sdcard/sdcard_readsector.s +++ b/src/dos_m65/sdcard/sdcard_readsector.s @@ -13,41 +13,10 @@ sdcard_readsector: ; XXX check if card initialized and operable - ; Set read address, depending on card type + ; Set read address - bit CARD_IS_SDHC - bpl sdcard_readsector_sdsc - -sdcard_readsector_sdhc: - - lda CARD_SECNUM+0 - sta SD_ADDR+0 - lda CARD_SECNUM+1 - sta SD_ADDR+1 - lda CARD_SECNUM+2 - sta SD_ADDR+2 - lda CARD_SECNUM+3 - sta SD_ADDR+3 - - bra sdcard_readsector_read - -sdcard_readsector_sdsc: ; multiply sector number by 512 - - lda #$00 - sta SD_ADDR+0 - clc - lda CARD_SECNUM+0 - rol - sta SD_ADDR+1 - lda CARD_SECNUM+1 - rol - sta SD_ADDR+2 - lda CARD_SECNUM+2 - rol - sta SD_ADDR+3 - bcs sdcard_readsector_fail ; branch if sector number too large for SD card - lda CARD_SECNUM+3 - bne sdcard_readsector_fail ; branch if sector number too large for SD card + jsr sdcard_set_addr + bcs sdcard_readsector_fail ; FALLTROUGH @@ -100,7 +69,6 @@ sdcard_readsector_fail: sdcard_readsector_copy_data: - ; XXX this should be a separate routine ; XXX use DMAgic for this phz diff --git a/src/dos_m65/sdcard/sdcard_writesector.s b/src/dos_m65/sdcard/sdcard_writesector.s new file mode 100644 index 00000000..851f6d44 --- /dev/null +++ b/src/dos_m65/sdcard/sdcard_writesector.s @@ -0,0 +1,78 @@ + +; +; Writes the sector to the SD card +; + +; Based on https://github.com/MEGA65/mega65-libc/blob/master/cc65/src/sdcard.c + + +; XXX finish, provide documentation + + +sdcard_writesector: + + ; XXX check if card initialized and operable + + lda SD_CTL + and #$03 + bne sdcard_writesector ; XXX add a timer here + + ; End reset + + lda #$01 + sta SD_CTL + + ; Set write address + + jsr sdcard_set_addr + + + + + + + + jsr sdcard_writesector_copy_data + + + + + + + + + + +; +; Helper routines +; + +sdcard_writesector_copy_data: + + ; XXX use DMAgic for this + + phz + phx + + ldx #$00 + ldz #$00 + +@1: + lda CARD_BUF,x + sta [CARD_BUFPNT],z + inc CARD_BUFPNT+1 + lda CARD_BUF+$100,x + sta [CARD_BUFPNT],z + dec CARD_BUFPNT+1 + + inz + inx + bne @1 + + ; Restore registers and quit + + plx + plz + + clc + rts From 7452d683aa12b304f5b13d68a8eac51d9e2f6548 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 2 Oct 2020 17:58:08 +0200 Subject: [PATCH 06/51] more work on SD card support --- src/aliases/,aliases_hardware_m65.s | 26 +++++++++++++++++++++ src/dos_m65/sdcard/sdcard_helpers.s | 29 ++++++++++++++++++++++-- src/dos_m65/sdcard/sdcard_readsector.s | 30 +++---------------------- src/dos_m65/sdcard/sdcard_writesector.s | 22 +++++++++++++++++- 4 files changed, 77 insertions(+), 30 deletions(-) diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s index 6f545945..8a03c46e 100644 --- a/src/aliases/,aliases_hardware_m65.s +++ b/src/aliases/,aliases_hardware_m65.s @@ -66,4 +66,30 @@ !set __SID_R2_OFFSET = $20 ; right SID 2, $D420 !set __SID_L1_OFFSET = $40 ; left SID 1, $D440 !set __SID_L2_OFFSET = $60 ; left SID 2, $D460 + + + + ; SD card commands + ; + ; XXX command codes taken from XEMU emulator, to be updated when official documentation exists + + !set CARD_CMD_RESET = $00 ; reset SD card + !set CARD_CMD_RESET_FL = $10 ; reset with flags, XXX what's this? + !set CARD_CMD_END_RESET = $01 ; end reset + !set CARD_CMD_END_RESET_FL = $11 ; end reset with flags + !set CARD_CMD_READ = $02 ; read sector + !set CARD_CMD_WRITE = $03 ; write sector + !set CARD_CMD_WRITE_1 = $04 ; multi-sector write, 1st sector + !set CARD_CMD_WRITE_2 = $05 ; multi-sector write + !set CARD_CMD_WRITE_3 = $06 ; multi-sector write, last sector + !set CARD_CMD_FLUSH = $0C + !set CARD_CMD_SDHC_OFF = $40 ; for older cores only? + !set CARD_CMD_SDHC_ON = $41 ; for older cores only? + ; XXX $44, $45 - completely unclear to me + !set CARD_CMD_MAP_BUF = $81 + !set CARD_CMD_UNMAP_BUF = $82 + !set CARD_CMD_FILL_ON = $83 + !set CARD_CMD_FILL_OFF = $84 + !set CARD_CMD_SELECT_INT = $C0 ; select internal slot + !set CARD_CMD_SELECT_EXT = $C1 ; select external slot } diff --git a/src/dos_m65/sdcard/sdcard_helpers.s b/src/dos_m65/sdcard/sdcard_helpers.s index d53a2c8e..94acd3db 100644 --- a/src/dos_m65/sdcard/sdcard_helpers.s +++ b/src/dos_m65/sdcard/sdcard_helpers.s @@ -54,13 +54,38 @@ sdcard_set_addr_sdsc: lda CARD_SECNUM+2 rol sta SD_ADDR+3 - bcs sdcard_set_addr_fail ; branch if sector number too large for SD card + bcs sdcard_helper_fail ; branch if sector number too large for SD card lda CARD_SECNUM+3 beq sdcard_set_addr_done ; do not branch if sector number too large for SD card ; FALLTROUGH -sdcard_set_addr_fail: +sdcard_helper_fail: sec rts + + +; +; Wait till card is ready +; +; Input: none +; Output: Carry set = error +; Preserves: .Y, .Z + +sdcard_wait_ready: + + lda SD_CTL + ; Sometimes we see this result, i.e., sdcard.vhdl thinks it is done, + ; but sdcardio.vhdl thinks not. This means a read error. + cmp #$01 + beq sdcard_helper_fail + tax + and #$40 + bne sdcard_helper_fail + txa + and #$03 + bne sdcard_wait_ready + + clc + rts diff --git a/src/dos_m65/sdcard/sdcard_readsector.s b/src/dos_m65/sdcard/sdcard_readsector.s index 8fe2194d..14c595e7 100644 --- a/src/dos_m65/sdcard/sdcard_readsector.s +++ b/src/dos_m65/sdcard/sdcard_readsector.s @@ -16,7 +16,7 @@ sdcard_readsector: ; Set read address jsr sdcard_set_addr - bcs sdcard_readsector_fail + bcs sdcard_readsector_fail ; FALLTROUGH @@ -33,7 +33,7 @@ sdcard_readsector_try_loop: ; Wait till card is ready - jsr sdcard_readsector_wait + jsr sdcard_wait_ready bcs sdcard_readsector_fail ; Read command @@ -43,7 +43,7 @@ sdcard_readsector_try_loop: ; Wait for command completion - jsr sdcard_readsector_wait + jsr sdcard_wait_ready bcs sdcard_readsector_fail @@ -96,27 +96,3 @@ sdcard_readsector_copy_data: clc rts - -sdcard_readsector_wait: - - ; Wait till card is ready - - lda SD_CTL - ; Sometimes we see this result, i.e., sdcard.vhdl thinks it is done, - ; but sdcardio.vhdl thinks not. This means a read error. - cmp #$01 - beq sdcard_readsector_wait_fail - tax - and #$40 - bne sdcard_readsector_wait_fail - txa - and #$03 - bne sdcard_readsector_wait - - clc - rts - -sdcard_readsector_wait_fail: - - sec - rts diff --git a/src/dos_m65/sdcard/sdcard_writesector.s b/src/dos_m65/sdcard/sdcard_writesector.s index 851f6d44..f6ef24ae 100644 --- a/src/dos_m65/sdcard/sdcard_writesector.s +++ b/src/dos_m65/sdcard/sdcard_writesector.s @@ -17,7 +17,7 @@ sdcard_writesector: and #$03 bne sdcard_writesector ; XXX add a timer here - ; End reset + ; End reset XXX should this be done for sector reading too? lda #$01 sta SD_CTL @@ -25,12 +25,20 @@ sdcard_writesector: ; Set write address jsr sdcard_set_addr + bcs sdcard_writesector_fail + ; FALLTROUGH +sdcard_writesector_write: + ; Set number of retries + lda #$0A + sta CARD_TMP_RETRIES + ; FALLTROUGH +sdcard_writesector_try_loop: jsr sdcard_writesector_copy_data @@ -43,6 +51,18 @@ sdcard_writesector: + + + +sdcard_writesector_fail: + + sec + rts + + + + + ; ; Helper routines ; From 9432d27face4be0b92eb869c28a6bcff12a3a787 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 3 Oct 2020 19:38:14 +0200 Subject: [PATCH 07/51] small cleanup --- src/dos_m65/sdcard/sdcard_init.s | 4 ++-- src/dos_m65/sdcard/sdcard_readsector.s | 2 +- src/dos_m65/sdcard/sdcard_reset.s | 8 ++++---- src/dos_m65/sdcard/sdcard_writesector.s | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/dos_m65/sdcard/sdcard_init.s b/src/dos_m65/sdcard/sdcard_init.s index c67fdc08..9ed9878d 100644 --- a/src/dos_m65/sdcard/sdcard_init.s +++ b/src/dos_m65/sdcard/sdcard_init.s @@ -72,7 +72,7 @@ sdcard_init_sdsc: lda #$00 sta CARD_IS_SDHC - lda #$40 ; use byte addressing + lda #CARD_CMD_SDHC_OFF ; $40 - use byte addressing sta SD_CTL ; FALLTROUGH @@ -111,7 +111,7 @@ sdcard_init_read: ; Trigger read - lda #$02 + lda #CARD_CMD_READ ; $02 sta SD_CTL ; Wait for result diff --git a/src/dos_m65/sdcard/sdcard_readsector.s b/src/dos_m65/sdcard/sdcard_readsector.s index 14c595e7..023bf1b8 100644 --- a/src/dos_m65/sdcard/sdcard_readsector.s +++ b/src/dos_m65/sdcard/sdcard_readsector.s @@ -38,7 +38,7 @@ sdcard_readsector_try_loop: ; Read command - lda #$02 + lda #CARD_CMD_READ ; $02 sta SD_CTL ; Wait for command completion diff --git a/src/dos_m65/sdcard/sdcard_reset.s b/src/dos_m65/sdcard/sdcard_reset.s index 29b22610..244233bf 100644 --- a/src/dos_m65/sdcard/sdcard_reset.s +++ b/src/dos_m65/sdcard/sdcard_reset.s @@ -9,11 +9,11 @@ sdcard_reset: - ldx #$40 + ldx #CARD_CMD_SDHC_OFF ; $40 stx SD_CTL - ldy #$00 + ldy #CARD_CMD_RESET ; $00 sty SD_CTL - iny ; $01 + ldy #CARD_CMD_END_RESET ; $01 sty SD_CTL ; Wait till SD card resets @@ -26,7 +26,7 @@ sdcard_reset: bit CARD_IS_SDHC bpl @2 - inx ; $41 + ldx #CARD_CMD_SDHC_ON ; $41 stx SD_CTL @2: rts diff --git a/src/dos_m65/sdcard/sdcard_writesector.s b/src/dos_m65/sdcard/sdcard_writesector.s index f6ef24ae..180f198f 100644 --- a/src/dos_m65/sdcard/sdcard_writesector.s +++ b/src/dos_m65/sdcard/sdcard_writesector.s @@ -17,9 +17,9 @@ sdcard_writesector: and #$03 bne sdcard_writesector ; XXX add a timer here - ; End reset XXX should this be done for sector reading too? + ; End reset XXX is this needed? should this be done for sector reading too? - lda #$01 + lda #CARD_CMD_END_RESET ; $01 sta SD_CTL ; Set write address From b8aadaa88020d088e4222d850b7c66ae20fbfd2f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 4 Oct 2020 13:42:57 +0200 Subject: [PATCH 08/51] documented how to create hybrid ROM --- Makefile | 14 ++++++++++++++ bin/{README.txt => README.md} | 10 ++++------ doc/Hybrid-build.md | 13 +++++++++++++ 3 files changed, 31 insertions(+), 6 deletions(-) rename bin/{README.txt => README.md} (67%) create mode 100644 doc/Hybrid-build.md diff --git a/Makefile b/Makefile index 6cd4d894..3ebae77f 100644 --- a/Makefile +++ b/Makefile @@ -201,6 +201,20 @@ updatebin: @$(TOOL_RELEASE) -i ./build -o ./bin $(patsubst build/%,%,$(REL_TARGET_LIST)) @cp build/chargen_openroms.rom bin/chargen_openroms.rom +# Rules - external blobs + +kernal: + @echo + @echo Please copy \'kernal\' file from the original ROM set to the \'open-roms\' directory + @echo + @exit 1 + +basic: + @echo + @echo Please copy \'basic\' file from the original ROM set to the \'open-roms\' directory + @echo + @exit 1 + # Rules - tools $(DIR_ACME) $(SRC_ACME): diff --git a/bin/README.txt b/bin/README.md similarity index 67% rename from bin/README.txt rename to bin/README.md index 806e59cf..19580681 100644 --- a/bin/README.txt +++ b/bin/README.md @@ -2,12 +2,12 @@ Follow these rules, or bad things will happen! -- Don't mix ROMs for different platforms - use generic BASIC with generic KERNAL, Ultimate64 BASIC with Ultimate64 KERNAL, etc. +* Don't mix ROMs for different platforms - use generic BASIC with generic KERNAL, Ultimate64 BASIC with Ultimate64 KERNAL, etc. -- Don't mix these ROMs with any other ROMs; exceptions: +* Don't mix these ROMs with any other ROMs; exceptions: - kernal_hybrid.rom, which is meant to be used (and has to be used) with the original BASIC ROM; - however, this hybrid ROM cannot be distributed due to legal/copyright reasons + however, this hybrid ROM cannot be distributed due to legal/copyright reasons; see [here](./../doc/Hybrid-build.md) for instruction how to create it - chargen_*.rom - these ones are fully interchangeable @@ -22,6 +22,4 @@ Have fun! ------ -PXL font was created by Retrofan, we got a permission to include it with Open ROMs under GNU Lesser General Public License 3.0, see: - -- https://www.forum64.de/index.php?thread/84000-neuer-c64-systemfont-auch-plus4-c128-atari/&postID=1493383#post1493383 +PXL font was created by Retrofan, we got a permission to include it with Open ROMs under GNU Lesser General Public License 3.0, see [here](https://www.forum64.de/index.php?thread/84000-neuer-c64-systemfont-auch-plus4-c128-atari/&postID=1493383#post1493383). diff --git a/doc/Hybrid-build.md b/doc/Hybrid-build.md new file mode 100644 index 00000000..6c9cf601 --- /dev/null +++ b/doc/Hybrid-build.md @@ -0,0 +1,13 @@ + +The C64 ROM is typically distributed in 2 files 8 KB each, one called *kernal*, one *basic*. This might be misleading, as the C64 Kernal takes about 6.5 KB, and the BASIC about 9.5 KB - some parts of BASIC is therefore placed in the *kernal* file. This is the main reason you can't easily use the Open ROMs Kernal file with original C64 BASIC. + +But it is still possible to combine them: +* copy the *kernal* file to the *open-roms* main directory +* from the Linux command line type `make test_hybrid` - this will crate the hybrid Kernal file, *open-roms/bin/kernal_hybrid.rom*, and launch VICE emulator with it + +Sorry, no Windows support (but it should work under *Windows Subsystem for Linux* if GCC and libpng devel packages are installed), and no macOS support (I don't have a machine to test). + +Please note, that it is illegal to distribute such a hybrid ROM: + +* it contains proprietary Commodore/Microsoft code +* it contains LGPL 3 licensed Open ROMs code combined with code not available under compatible license From 44e2498a8c738f11d2e70a396dea058e90e16211 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 4 Oct 2020 14:45:39 +0200 Subject: [PATCH 09/51] added a way to create Ultimate64 based hybrid ROM --- Makefile | 21 +++++++++++++++++++++ bin/README.md | 4 ++-- doc/Hybrid-build.md | 4 +++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 3ebae77f..79ca47a1 100644 --- a/Makefile +++ b/Makefile @@ -471,6 +471,18 @@ build/kernal_hybrid.rom: kernal $(DIR_GEN)/OUTK_x.BIN build/symbols_hybrid.vs: $(DIR_GEN)/KERNAL_combined.vs @sort $(DIR_GEN)/KERNAL_combined.vs | uniq | grep -v "__" > $@ +build/kernal_hybrid_u64.rom: kernal $(DIR_U64)/OUTK_x.BIN + @echo + @echo $(HYBRID_WARNING) + @echo + (dd if=kernal bs=1140 count=1 skip=0 ; \ + echo " > HYBRID ROM, DON'T DISTRIBUTE <" ; \ + dd if=kernal bs=1 count=58 skip=1176 ; \ + cat $(DIR_U64)/OUTK_x.BIN) > $@ + +build/symbols_hybrid_u64.vs: $(DIR_U64)/KERNAL_combined.vs + @sort $(DIR_U64)/KERNAL_combined.vs | uniq | grep -v "__" > $@ + # Rules - MEGA65 platform specific build/padding_64_KB: @@ -563,6 +575,15 @@ test_hybrid: build/kernal_hybrid.rom build/symbols_hybrid.vs @echo $(HYBRID_WARNING) @echo +test_hybrid_u64: build/kernal_hybrid_u64.rom build/symbols_hybrid_u64.vs + @echo + @echo $(HYBRID_WARNING) + @echo + x64 -kernal build/kernal_hybrid_u64.rom -moncommands build/symbols_hybrid_u64.vs -1 $(TESTTAPE) -8 $(TESTDISK) + @echo + @echo $(HYBRID_WARNING) + @echo + test_m65: build/mega65.rom m65 -b ../mega65-core/bin/mega65r1.bit -k ../mega65-core/bin/KICKUP.M65 -R build/mega65.rom -4 diff --git a/bin/README.md b/bin/README.md index 19580681..b2c0799b 100644 --- a/bin/README.md +++ b/bin/README.md @@ -6,8 +6,8 @@ Follow these rules, or bad things will happen! * Don't mix these ROMs with any other ROMs; exceptions: - - kernal_hybrid.rom, which is meant to be used (and has to be used) with the original BASIC ROM; - however, this hybrid ROM cannot be distributed due to legal/copyright reasons; see [here](./../doc/Hybrid-build.md) for instruction how to create it + - kernal_hybrid\*.rom, which is meant to be used (and has to be used) with the original BASIC ROM; + however, these hybrid ROMs cannot be distributed due to legal/copyright reasons; see [here](./../doc/Hybrid-build.md) for instruction how to create them - chargen_*.rom - these ones are fully interchangeable diff --git a/doc/Hybrid-build.md b/doc/Hybrid-build.md index 6c9cf601..f3d54552 100644 --- a/doc/Hybrid-build.md +++ b/doc/Hybrid-build.md @@ -3,7 +3,9 @@ The C64 ROM is typically distributed in 2 files 8 KB each, one called *kernal*, But it is still possible to combine them: * copy the *kernal* file to the *open-roms* main directory -* from the Linux command line type `make test_hybrid` - this will crate the hybrid Kernal file, *open-roms/bin/kernal_hybrid.rom*, and launch VICE emulator with it +* from the Linux command line type `make test_hybrid` on `make test_hybrid_u64` (for Ultimate 64 based Kernal build- this will crate the hybrid Kernal file, *open-roms/bin/kernal_hybrid.rom* or *open-roms/bin/kernal_hybrid_u64.rom*, and launch VICE emulator with it + +Unfortunately, some features will be lost this way - for example, the Open ROMs DOS Wedge is BASIC based, so it won't be available in the hybrid ROM. Sorry, no Windows support (but it should work under *Windows Subsystem for Linux* if GCC and libpng devel packages are installed), and no macOS support (I don't have a machine to test). From 79c094dce5160a732cfa080a506793ae7f314556 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 4 Oct 2020 18:04:32 +0200 Subject: [PATCH 10/51] reset-related fixes --- src/kernal/board_m65/mega65_hypervisor_reset.s | 15 ++++++++++----- src/kernal/init/fce2.hw_entry_reset.s | 18 +++++++++++++----- src/kernal/interrupts/hw_entry_nmi.s | 4 ---- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/kernal/board_m65/mega65_hypervisor_reset.s b/src/kernal/board_m65/mega65_hypervisor_reset.s index 64bc98eb..db451919 100644 --- a/src/kernal/board_m65/mega65_hypervisor_reset.s +++ b/src/kernal/board_m65/mega65_hypervisor_reset.s @@ -3,8 +3,6 @@ ; Reset (hardware initialization) to be used when Open ROMs is used under hypervisor -; XXX size-optimize this; share code with regular reset - m65_hypervisor_reset: @@ -13,6 +11,9 @@ m65_hypervisor_reset: sei ; disable the interrupts, as fast as possible cld ; Kernal is not designed to operate in decimal mode + lda #$00 + sta NMINV+1 ; soft-disable custom NMI interrupt handler + ; Do not reset the stack (see, ldx #$FF, txs) - we need to know where to return jsr m65_reset_part ; init MEGA65 specific hardware, shutdown VIC-IV, clear native mode mark @@ -20,9 +21,7 @@ m65_hypervisor_reset: stx VIC_SCROLX jsr IOINIT_skip_DOS ; better not to initialize DOS under hypervisor, risk of incompatibility - jsr JRAMTAS - jsr JRESTOR - jsr JCINT + jsr m65_reset_common ; RAMTAS, RESTOR, CINT ; Restore hypervisor memory mapping and quit @@ -42,3 +41,9 @@ m65_hypervisor_reset: cli rts + +m65_reset_common: + + jsr JRAMTAS + jsr JRESTOR + jmp JCINT diff --git a/src/kernal/init/fce2.hw_entry_reset.s b/src/kernal/init/fce2.hw_entry_reset.s index 41c21683..8cd79829 100644 --- a/src/kernal/init/fce2.hw_entry_reset.s +++ b/src/kernal/init/fce2.hw_entry_reset.s @@ -16,6 +16,9 @@ hw_entry_reset: cld ; required for all CPUs - due to possibility of manual call + lda #$00 + sta NMINV+1 ; soft-disable custom NMI interrupt handler + !ifdef HAS_OPCODES_65CE02 { see ; disable extended stack @@ -49,6 +52,15 @@ hw_entry_reset: ; Initialising IO is obviously required. Also indicated by c64 prg p269. jsr JIOINIT +!ifdef CONFIG_MB_M65 { + + jsr m65_reset_common ; RAMTAS, RESTOR, CINT + + clc + jsr M65_MODESET ; on MEGA65 go to native mode by default + +} else { + ; Setting up the screen and testing ram is obviously required ; also affirmed by p269 of c64 prg jsr JRAMTAS ; called RANTAM on Codebase64 wiki @@ -59,12 +71,8 @@ hw_entry_reset: ; "Compute's Mapping the 64" p236 jsr JCINT - -!ifdef CONFIG_MB_M65 { - - clc - jsr M65_MODESET ; on MEGA65 go to native mode by default } + ; What do we do when finished? A C64 jumps into the BASIC ROM cli ; allow interrupts to happen diff --git a/src/kernal/interrupts/hw_entry_nmi.s b/src/kernal/interrupts/hw_entry_nmi.s index 006eb69d..6c541344 100644 --- a/src/kernal/interrupts/hw_entry_nmi.s +++ b/src/kernal/interrupts/hw_entry_nmi.s @@ -15,16 +15,12 @@ hw_entry_nmi: ; Call interrupt routine (only if initialised) pha -!ifndef CONFIG_MB_M65 { ; XXX temporarily disabled for MEGA65, seems to cause crash during startup - to be investigated - lda NMINV+1 ; consider zeropage NMI address as uninitialized vector beq @1 ; this allows safer interrupt vector modifications pla jmp (NMINV) @1: -} - ; Vector not initialized - call default interrupt routine pla jmp default_nmi_handler From 219916aa4e8c2209cab8baf431c2b9bc7d1e44c2 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 5 Oct 2020 19:47:22 +0200 Subject: [PATCH 11/51] more work towards SD card support --- src/dos_m65/sdcard/sdcard_helpers.s | 2 ++ src/dos_m65/sdcard/sdcard_writesector.s | 29 ++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/dos_m65/sdcard/sdcard_helpers.s b/src/dos_m65/sdcard/sdcard_helpers.s index 94acd3db..053af35f 100644 --- a/src/dos_m65/sdcard/sdcard_helpers.s +++ b/src/dos_m65/sdcard/sdcard_helpers.s @@ -75,6 +75,8 @@ sdcard_helper_fail: sdcard_wait_ready: + ; XXX if card does not get ready, try to reset it + lda SD_CTL ; Sometimes we see this result, i.e., sdcard.vhdl thinks it is done, ; but sdcardio.vhdl thinks not. This means a read error. diff --git a/src/dos_m65/sdcard/sdcard_writesector.s b/src/dos_m65/sdcard/sdcard_writesector.s index 180f198f..b355c4b4 100644 --- a/src/dos_m65/sdcard/sdcard_writesector.s +++ b/src/dos_m65/sdcard/sdcard_writesector.s @@ -42,23 +42,50 @@ sdcard_writesector_try_loop: jsr sdcard_writesector_copy_data + ; Wait till card is ready + jsr sdcard_wait_ready + bcs sdcard_writesector_fail + ; Write command + lda #CARD_CMD_WRITE ; $03 + sta SD_CTL + ; Wait for command completion + jsr sdcard_wait_ready + bcs sdcard_writesector_fail + ; Check result + lda SD_CTL + and #$67 + bne sdcard_writesector_verify + ; Write failed - retry + jsr sdcard_reset + dec CARD_TMP_RETRIES + bne sdcard_writesector_try_loop - + ; FALLTROUGH sdcard_writesector_fail: sec rts +sdcard_writesector_verify: + + ; There is a bug in the SD controller; you have to read between writes, + ; or it gets really upset + + ; XXX + + + + From 2b9e8650ded0770064bc135853c6e3cc08716b84 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 6 Oct 2020 23:59:30 +0200 Subject: [PATCH 12/51] various Ultimate 64 improvements --- src/,,config_ultimate64.s | 4 ++-- src/aliases/,aliases_hardware.s | 8 ++++++++ src/basic/assets/startup_banner.s | 14 +++++++++++++- src/basic/basic_commands_01/cmd_fast_slow.s | 18 ++++++++++++++---- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/,,config_ultimate64.s b/src/,,config_ultimate64.s index edd352c7..e295751d 100644 --- a/src/,,config_ultimate64.s +++ b/src/,,config_ultimate64.s @@ -61,8 +61,8 @@ ;; #CONFIG# KEY_REPEAT_DEFAULT NO ;; #CONFIG# KEY_REPEAT_ALWAYS NO ;; #CONFIG# KEY_FAST_SCAN YES -;; #CONFIG# JOY1_CURSOR YES -;; #CONFIG# JOY2_CURSOR YES +;; #CONFIG# JOY1_CURSOR NO +;; #CONFIG# JOY2_CURSOR NO ;; #CONFIG# PROGRAMMABLE_KEYS YES diff --git a/src/aliases/,aliases_hardware.s b/src/aliases/,aliases_hardware.s index 5b6d5167..ada42e87 100644 --- a/src/aliases/,aliases_hardware.s +++ b/src/aliases/,aliases_hardware.s @@ -71,6 +71,14 @@ !addr VIC_CLKRATE = $D030 ; C128 only } } +!ifdef CONFIG_MB_U64 { + + ; Ultimate 64 registers + + !addr U64_TURBOBIT = $D030 ; 0 = 1 MHz + badlines, 1 = settings from menu + !addr U64_TURBOCTL = $D031 ; bit 0-3 = CPU speed (index), bit 7 = disable badlines, $FF = not available +} + ; SID registers !addr __SID_BASE = $D400 ; base address of the chip diff --git a/src/basic/assets/startup_banner.s b/src/basic/assets/startup_banner.s index e45e5ca8..26e20ccb 100644 --- a/src/basic/assets/startup_banner.s +++ b/src/basic/assets/startup_banner.s @@ -16,7 +16,7 @@ !pet "open roms generic build" } else ifdef CONFIG_BRAND_TESTING { !pet "open roms testing build" -} else ifdef CONFIG_BRAND_ULTIMATE_64 { +} else ifdef CONFIG_MB_U64 { !pet "open roms for ultimate 64" } @@ -43,9 +43,21 @@ rainbow_logo: !set SET_COLOR_3 = $1E !set SET_COLOR_4 = $9F +!ifdef CONFIG_MB_U64 { + + !byte SET_COLOR_1, $B8, $B8, $B8, $B8, $B8, $B8, $B8, $0D + !byte SET_COLOR_2, $B8, $B8, $B8, $B8, $B8, $B8, $B8, $0D + !byte SET_COLOR_3, $B8, $B8, $B8, $B8, $B8, $B8, $B8, $0D + !byte SET_COLOR_4, $B8, $B8, $B8, $B8, $B8, $B8, $B8, $0D + !byte SET_COLOR_0, $00 + +} else { + !byte SET_COLOR_1, $12, $A4, $A4, $A4, $A4, $A4, $A4, $A4, $0D !byte SET_COLOR_2, $12, $A4, $A4, $A4, $A4, $A4, $A4, $0D !byte SET_COLOR_3, $12, $A4, $A4, $A4, $A4, $A4, $0D !byte SET_COLOR_4, $12, $A4, $A4, $A4, $A4, $92 !byte SET_COLOR_0, $00 } + +} diff --git a/src/basic/basic_commands_01/cmd_fast_slow.s b/src/basic/basic_commands_01/cmd_fast_slow.s index 8789c50a..3faff194 100644 --- a/src/basic/basic_commands_01/cmd_fast_slow.s +++ b/src/basic/basic_commands_01/cmd_fast_slow.s @@ -9,17 +9,27 @@ } else ifdef CONFIG_MB_U64 { - ; Command implementation for Ultimate 64 - SuperCPU compatible way should be enough + ; Command implementation for Ultimate 64 cmd_slow: - sta SCPU_SPEED_NORMAL + lda #$00 ; for U64_TURBOCTL - badlines, 1MHz + sta SCPU_SPEED_NORMAL ; any value will do + + ; FALLTROUGH + +cmd_slow_fast_common: + + sta U64_TURBOBIT ; only bit 0 matters + sta U64_TURBOCTL rts cmd_fast: - sta SCPU_SPEED_TURBO - rts + lda #$0F ; for U64_TURBOCTL - badlines, 48MHz + sta SCPU_SPEED_TURBO ; any value will do + + bne cmd_slow_fast_common ; bramnch always } else ifdef CONFIG_PLATFORM_COMMODORE_64 { From 166cfabf826ba0db71a595f98e071c55018d53a8 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 7 Oct 2020 15:10:48 +0200 Subject: [PATCH 13/51] Ultimate 64 tape improvements --- bin/README.md | 10 +++++-- src/,,config_generic.s | 4 +-- src/aliases/,aliases_ram_lowmem.s | 2 +- src/kernal/assets/kernal_messages.s | 15 ++++------ src/kernal/board_m65/mega65_imports.s | 2 +- src/kernal/tape/tape_common.s | 5 +--- src/kernal/tape/tape_common_screen.s | 40 ++++++++++++++++++++------- 7 files changed, 47 insertions(+), 31 deletions(-) diff --git a/bin/README.md b/bin/README.md index b2c0799b..11d7e890 100644 --- a/bin/README.md +++ b/bin/README.md @@ -1,7 +1,6 @@ Follow these rules, or bad things will happen! - * Don't mix ROMs for different platforms - use generic BASIC with generic KERNAL, Ultimate64 BASIC with Ultimate64 KERNAL, etc. * Don't mix these ROMs with any other ROMs; exceptions: @@ -11,9 +10,14 @@ Follow these rules, or bad things will happen! - chargen_*.rom - these ones are fully interchangeable -- Don't mix ROMs from different builds/versions (again, CHARGEN is an exception). +* Don't mix ROMs from different builds/versions (again, CHARGEN is an exception). -- The generic ROM set should be compatible with any C64-compatible machine; platform-specific ROMs might not work on other platforms. +* The generic ROM set should be compatible with any C64-compatible machine; platform-specific ROMs might not work on other platforms. + + +For Ultimate 64 the following settinghs are recommended: + +* U64 Specific Settings -> Turbo Control -> U64 Turbo Registers Have fun! diff --git a/src/,,config_generic.s b/src/,,config_generic.s index 970f7cde..ba3b0c5d 100644 --- a/src/,,config_generic.s +++ b/src/,,config_generic.s @@ -71,8 +71,8 @@ ;; #CONFIG# KEY_REPEAT_DEFAULT NO ;; #CONFIG# KEY_REPEAT_ALWAYS NO ;; #CONFIG# KEY_FAST_SCAN YES -;; #CONFIG# JOY1_CURSOR YES -;; #CONFIG# JOY2_CURSOR YES +;; #CONFIG# JOY1_CURSOR NO +;; #CONFIG# JOY2_CURSOR NO ;; #CONFIG# PROGRAMMABLE_KEYS YES diff --git a/src/aliases/,aliases_ram_lowmem.s b/src/aliases/,aliases_ram_lowmem.s index 50f8edec..eafc56cb 100644 --- a/src/aliases/,aliases_ram_lowmem.s +++ b/src/aliases/,aliases_ram_lowmem.s @@ -121,7 +121,7 @@ !ifndef CONFIG_LEGACY_SCNKEY { !addr BITTS = $B4 ; -- NOT IMPLEMENTED -- } - !addr NXTBIT = $B5 ; -- NOT IMPLEMENTED -- + !addr NXTBIT = $B5 ; -- NOT IMPLEMENTED -- [!] also used by tape routine, we use it only for Ultimate 64 turbo handling !ifndef CONFIG_LEGACY_SCNKEY { !addr RODATA = $B6 ; -- NOT IMPLEMENTED -- } diff --git a/src/kernal/assets/kernal_messages.s b/src/kernal/assets/kernal_messages.s index 5c816750..7504e91d 100644 --- a/src/kernal/assets/kernal_messages.s +++ b/src/kernal/assets/kernal_messages.s @@ -19,9 +19,8 @@ !ifdef HAS_TAPE { !addr __MSG_KERNAL_PRESS_PLAY = __msg_kernalplay - __msg_kernal_first !addr __MSG_KERNAL_FOUND = __msg_kernalfound - __msg_kernal_first -!ifdef CONFIG_MB_M65 { -!addr __MSG_KERNAL_OK_SEARCHING = __msg_kernaloksearching - __msg_kernal_first -} } +!addr __MSG_KERNAL_OK = __msg_kernalok - __msg_kernal_first +} !ifdef CONFIG_PANIC_SCREEN { !addr __MSG_KERNAL_PANIC = __msg_kernalpanic - __msg_kernal_first @@ -70,14 +69,10 @@ __msg_kernalfound: !pet "found" !byte $80 + $20 ; end of string mark + space -!ifdef CONFIG_MB_M65 { - -__msg_kernaloksearching: +__msg_kernalok: !pet "ok" - !byte $0D, $0D - !pet "searchin" - !byte $80 + $47 ; end of string mark + 'G' -} } + !byte $80 + $0D ; end of string mark + return +} !ifdef CONFIG_PANIC_SCREEN { diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 5c093e5c..8f5a6e78 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -72,7 +72,7 @@ ;; #ALIAS# print_return = KERNAL_0.proxy_K1_print_return ;; #ALIAS# __MSG_KERNAL_PRESS_PLAY = KERNAL_0.__MSG_KERNAL_PRESS_PLAY -;; #ALIAS# __MSG_KERNAL_OK_SEARCHING = KERNAL_0.__MSG_KERNAL_OK_SEARCHING +;; #ALIAS# __MSG_KERNAL_OK = KERNAL_0.__MSG_KERNAL_OK ;; #ALIAS# __MSG_KERNAL_FOUND = KERNAL_0.__MSG_KERNAL_FOUND ;; #ALIAS# tape_normal_byte_store = KERNAL_0.tape_normal_byte_store diff --git a/src/kernal/tape/tape_common.s b/src/kernal/tape/tape_common.s index 761927e0..dec74dff 100644 --- a/src/kernal/tape/tape_common.s +++ b/src/kernal/tape/tape_common.s @@ -113,13 +113,10 @@ tape_prepare_reading: } ; CONFIG_TAPE_HEAD_ALIGN -!ifdef CONFIG_MB_M65 { - ; Display confirmation - ldx #__MSG_KERNAL_OK_SEARCHING + ldx #__MSG_KERNAL_OK jsr print_kernal_message -} ; Prepare for reading diff --git a/src/kernal/tape/tape_common_screen.s b/src/kernal/tape/tape_common_screen.s index a1636149..da8f04fe 100644 --- a/src/kernal/tape/tape_common_screen.s +++ b/src/kernal/tape/tape_common_screen.s @@ -19,15 +19,21 @@ tape_screen_on_motor_off: lda COLSTORE sta VIC_EXTCOL -!ifndef CONFIG_MB_M65 { - - jmp screen_on - -} else { +!ifdef CONFIG_MB_M65 { jsr M65_MODEGET +bcs screen_on ; MEGA65 native mode does not have badlines, no need to enable/disable screen rts + +} else ifdef CONFIG_MB_U64 { + + lda NXTBIT + sta U64_TURBOCTL ; restore turbo control settings + jmp screen_on + +} else { + + jmp screen_on } @@ -44,11 +50,7 @@ tape_screen_off_motor_on: lda VIC_EXTCOL sta COLSTORE -!ifndef CONFIG_MB_M65 { - - jsr screen_off - -} else { +!ifdef CONFIG_MB_M65 { jsr M65_MODEGET ; XXX optimize this @@ -56,6 +58,24 @@ tape_screen_off_motor_on: jsr screen_off @1: +} else ifdef CONFIG_MB_U64 { + + lda U64_TURBOCTL + sta NXTBIT + cmp #$FF + beq @1 ; branch if no turbo control available + + lda #$8F ; max speed, no badlines + sta U64_TURBOCTL + bne @2 ; branch always + +@1: + jsr screen_off +@2: + +} else { + + jsr screen_off } jmp tape_motor_on From 9a1f9c7209f5f0eb865e14edc2783290f7459d44 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 7 Oct 2020 15:45:20 +0200 Subject: [PATCH 14/51] U64/JiffyDOS - do not blank screen if one can disable badlines --- src/kernal/iec_fast/jiffydos_load.s | 41 ++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/kernal/iec_fast/jiffydos_load.s b/src/kernal/iec_fast/jiffydos_load.s index 5d05b8cd..7ff2392d 100644 --- a/src/kernal/iec_fast/jiffydos_load.s +++ b/src/kernal/iec_fast/jiffydos_load.s @@ -27,13 +27,30 @@ jiffydos_load: !ifdef CONFIG_IEC_JIFFYDOS_BLANK { +!ifdef CONFIG_MB_U64 { + + ; Check if turbo register is available + lda U64_TURBOCTL + cmp #$FF + beq @1 + + ; Store turbo register content, disable badlines + sta TBTCNT + lda #$80 + sta U64_TURBOCTL + bne @2 + + ; Normal flow - no turbo register +} + +@1: ; Preserve register with screen status (blank/visible) lda VIC_SCROLY sta TBTCNT ; Blank screen to make sure no sprite/badline will interrupt jsr screen_off - +@2: ; Preserve 3 lowest bits of CIA2_PRA XXX deduplicate this lda CIA2_PRA @@ -42,9 +59,12 @@ jiffydos_load: } else { +@1: ; Store previous sprite status in temporary variable jsr jiffydos_prepare sta TBTCNT +@2: + } ; A trick to shorten EAL update time @@ -148,15 +168,34 @@ jiffydos_load_end: !ifdef CONFIG_IEC_JIFFYDOS_BLANK { +!ifdef CONFIG_MB_U64 { + + ; Check if turbo register is available + lda U64_TURBOCTL + cmp #$FF + beq @3 + + ; Restore turbo register content + lda TBTCNT + sta U64_TURBOCTL + jmp @4 + + ; Normal flow - no turbo register +} + +@3: ; Restore screen state lda TBTCNT sta VIC_SCROLY +@4: } else { +@3: ; Re-enable sprites lda TBTCNT sta VIC_SPENA +@4: } ; Store last byte as unoptimized LOAD routine would From b965e035f92f7cd1c705824b30a87ec2f6f2b948 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 7 Oct 2020 16:02:07 +0200 Subject: [PATCH 15/51] documentation update, small Ultimate 64 code tweaks --- CONFIG.md | 2 +- src/basic/basic_commands_01/cmd_fast_slow.s | 3 +-- src/kernal/iec_fast/jiffydos_load.s | 8 +++---- src/kernal/iec_fast/jiffydos_prepare.s | 11 +++++----- src/kernal/iec_fast/jiffydos_preserve_bits.s | 23 ++++++++++++++++++++ 5 files changed, 33 insertions(+), 14 deletions(-) create mode 100644 src/kernal/iec_fast/jiffydos_preserve_bits.s diff --git a/CONFIG.md b/CONFIG.md index 064877d1..68fa3e88 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -139,7 +139,7 @@ Needs about 430 bytes in KERNAL segment. If unsure - enable. ### `IEC_JIFFYDOS_BLANK` -Causes screen blanking during JiffyDOS file loading to increase performance. +Causes screen blanking during JiffyDOS file loading to increase performance. On Ultimate 64 motherboard, if possible, screen blanking is substituted by disabling badlines. ## Tape deck diff --git a/src/basic/basic_commands_01/cmd_fast_slow.s b/src/basic/basic_commands_01/cmd_fast_slow.s index 3faff194..7b7adb86 100644 --- a/src/basic/basic_commands_01/cmd_fast_slow.s +++ b/src/basic/basic_commands_01/cmd_fast_slow.s @@ -20,7 +20,6 @@ cmd_slow: cmd_slow_fast_common: - sta U64_TURBOBIT ; only bit 0 matters sta U64_TURBOCTL rts @@ -29,7 +28,7 @@ cmd_fast: lda #$0F ; for U64_TURBOCTL - badlines, 48MHz sta SCPU_SPEED_TURBO ; any value will do - bne cmd_slow_fast_common ; bramnch always + bne cmd_slow_fast_common ; branch always } else ifdef CONFIG_PLATFORM_COMMODORE_64 { diff --git a/src/kernal/iec_fast/jiffydos_load.s b/src/kernal/iec_fast/jiffydos_load.s index 7ff2392d..04251a54 100644 --- a/src/kernal/iec_fast/jiffydos_load.s +++ b/src/kernal/iec_fast/jiffydos_load.s @@ -29,6 +29,8 @@ jiffydos_load: !ifdef CONFIG_MB_U64 { + ; XXX implement for non-blank mode, use jiffydos_prepare_no_preserve_bits + ; Check if turbo register is available lda U64_TURBOCTL cmp #$FF @@ -52,10 +54,7 @@ jiffydos_load: jsr screen_off @2: ; Preserve 3 lowest bits of CIA2_PRA XXX deduplicate this - - lda CIA2_PRA - and #%00000111 - sta C3PO + jsr jiffydos_preserve_bits } else { @@ -66,7 +65,6 @@ jiffydos_load: @2: } - ; A trick to shorten EAL update time ldy #$FF diff --git a/src/kernal/iec_fast/jiffydos_prepare.s b/src/kernal/iec_fast/jiffydos_prepare.s index 244fb5f0..cf939906 100644 --- a/src/kernal/iec_fast/jiffydos_prepare.s +++ b/src/kernal/iec_fast/jiffydos_prepare.s @@ -12,12 +12,11 @@ jiffydos_prepare: - ; We need to preserve 3 lowest bits of CIA2_PRA, they contain important - ; data - fortunately, the bits are never changed by external devices - ; Use C3PO for this, as afterwards we have to set there 0 nevertheless - lda CIA2_PRA - and #%00000111 - sta C3PO + jsr jiffydos_preserve_bits + + ; FALLTROUGH + +jiffydos_prepare_no_preserve_bits: ; Hide sprites; JiffyDOS timing regime is very strict, before transmitting ; anything we need to make sure nothing will steal the cycles diff --git a/src/kernal/iec_fast/jiffydos_preserve_bits.s b/src/kernal/iec_fast/jiffydos_preserve_bits.s new file mode 100644 index 00000000..8a18019d --- /dev/null +++ b/src/kernal/iec_fast/jiffydos_preserve_bits.s @@ -0,0 +1,23 @@ +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE + +; +; JiffyDOS transfer preparation routine +; + + +!ifdef CONFIG_IEC_JIFFYDOS { + + +jiffydos_preserve_bits: + + ; We need to preserve 3 lowest bits of CIA2_PRA, they contain important + ; data - fortunately, the bits are never changed by external devices + ; Use C3PO for this, as afterwards we have to set there 0 nevertheless + lda CIA2_PRA + and #%00000111 + sta C3PO + + rts +} From aa9a7ffcb503403b9e33c7184d84697a3656b108 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 7 Oct 2020 18:29:59 +0200 Subject: [PATCH 16/51] small tweaks --- bin/README.md | 3 +++ src/basic/assets/startup_banner.s | 26 +++++++++++++++---------- src/basic/init/initmsg_real.s | 6 +++--- src/dos_m65/sdcard/sdcard_readsector.s | 1 - src/dos_m65/sdcard/sdcard_writesector.s | 20 ++++++++++++++++++- 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/bin/README.md b/bin/README.md index 11d7e890..9c4bb983 100644 --- a/bin/README.md +++ b/bin/README.md @@ -14,14 +14,17 @@ Follow these rules, or bad things will happen! * The generic ROM set should be compatible with any C64-compatible machine; platform-specific ROMs might not work on other platforms. +
For Ultimate 64 the following settinghs are recommended: * U64 Specific Settings -> Turbo Control -> U64 Turbo Registers +
Have fun! +
------ diff --git a/src/basic/assets/startup_banner.s b/src/basic/assets/startup_banner.s index 26e20ccb..ecc667c4 100644 --- a/src/basic/assets/startup_banner.s +++ b/src/basic/assets/startup_banner.s @@ -39,25 +39,31 @@ rainbow_logo: !set SET_COLOR_0 = $05 !set SET_COLOR_1 = $1C - !set SET_COLOR_2 = $9E - !set SET_COLOR_3 = $1E - !set SET_COLOR_4 = $9F + !set SET_COLOR_2 = $81 + !set SET_COLOR_3 = $9E + !set SET_COLOR_4 = $1E + !set SET_COLOR_5 = $9F !ifdef CONFIG_MB_U64 { - !byte SET_COLOR_1, $B8, $B8, $B8, $B8, $B8, $B8, $B8, $0D - !byte SET_COLOR_2, $B8, $B8, $B8, $B8, $B8, $B8, $B8, $0D - !byte SET_COLOR_3, $B8, $B8, $B8, $B8, $B8, $B8, $B8, $0D - !byte SET_COLOR_4, $B8, $B8, $B8, $B8, $B8, $B8, $B8, $0D + !byte SET_COLOR_1, $B8, $B8, $B8, $B8, $B8, $B8, $0D + !byte SET_COLOR_2, $B8, $B8, $B8, $B8, $B8, $B8, $0D + !byte SET_COLOR_3, $B8, $B8, $B8, $B8, $B8, $B8, $0D + !byte SET_COLOR_4, $B8, $B8, $B8, $B8, $B8, $B8, $0D + !byte SET_COLOR_5, $B8, $B8, $B8, $B8, $B8, $B8, $0D !byte SET_COLOR_0, $00 + !set BANNER_SPACING = $09 + } else { !byte SET_COLOR_1, $12, $A4, $A4, $A4, $A4, $A4, $A4, $A4, $0D - !byte SET_COLOR_2, $12, $A4, $A4, $A4, $A4, $A4, $A4, $0D - !byte SET_COLOR_3, $12, $A4, $A4, $A4, $A4, $A4, $0D - !byte SET_COLOR_4, $12, $A4, $A4, $A4, $A4, $92 + !byte SET_COLOR_3, $12, $A4, $A4, $A4, $A4, $A4, $A4, $0D + !byte SET_COLOR_4, $12, $A4, $A4, $A4, $A4, $A4, $0D + !byte SET_COLOR_5, $12, $A4, $A4, $A4, $A4, $92 !byte SET_COLOR_0, $00 + + !set BANNER_SPACING = $0A } } diff --git a/src/basic/init/initmsg_real.s b/src/basic/init/initmsg_real.s index d3f53ac8..03305aed 100644 --- a/src/basic/init/initmsg_real.s +++ b/src/basic/init/initmsg_real.s @@ -60,7 +60,7 @@ initmsg_real: jsr STROUT ldx #$00 - ldy #$0A + ldy #BANNER_SPACING jsr plot_set lda # Date: Wed, 7 Oct 2020 23:29:54 +0200 Subject: [PATCH 17/51] start of JiffyDOS LOAD protocol support --- bin/README.md | 2 +- src/,,config_custom.s | 4 +++- src/kernal/iec_fast/jiffydos_load.s | 28 +++++++++++++++++++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/bin/README.md b/bin/README.md index 9c4bb983..19a5b8e1 100644 --- a/bin/README.md +++ b/bin/README.md @@ -16,7 +16,7 @@ Follow these rules, or bad things will happen!
-For Ultimate 64 the following settinghs are recommended: +For Ultimate 64 motherboard the following settings are recommended: * U64 Specific Settings -> Turbo Control -> U64 Turbo Registers diff --git a/src/,,config_custom.s b/src/,,config_custom.s index 5362fb5d..17fa482c 100644 --- a/src/,,config_custom.s +++ b/src/,,config_custom.s @@ -39,12 +39,14 @@ ;; #CONFIG# IEC YES ;; #CONFIG# IEC_DOLPHINDOS YES -;; #CONFIG# IEC_DOLPHINDOS_FAST YES +;; #CONFIG# IEC_DOLPHINDOS_FAST NO ;; #CONFIG# IEC_JIFFYDOS YES ;; #CONFIG# IEC_JIFFYDOS_BLANK NO ;; #CONFIG# IEC_BURST_CIA1 NO ; please keep disabled for now ;; #CONFIG# IEC_BURST_CIA2 NO ; please keep disabled for now +;; #CONFIG# IEC_JD_TEST NO ; temporary setting, for JiffyDOS development + ; --- Tape deck configuration diff --git a/src/kernal/iec_fast/jiffydos_load.s b/src/kernal/iec_fast/jiffydos_load.s index 04251a54..7f1f806f 100644 --- a/src/kernal/iec_fast/jiffydos_load.s +++ b/src/kernal/iec_fast/jiffydos_load.s @@ -19,6 +19,30 @@ jiffydos_load: + +!ifdef CONFIG_IEC_JD_TEST { + + ; XXX test implementation, not ready yet + + ; Switch to optimized LOAD protocol + jsr UNTLK + lda FA + jsr TALK + bcs jiffydos_load_error + lda #$61 + jsr TKSA + + ; XXX finish the implementation + + rts + +jiffydos_load_error: + + ; XXX finish the implementation + + +} else { + ; XXX implement JiffyDOS optimized LOAD protocol, this one is ineffective @@ -53,7 +77,7 @@ jiffydos_load: ; Blank screen to make sure no sprite/badline will interrupt jsr screen_off @2: - ; Preserve 3 lowest bits of CIA2_PRA XXX deduplicate this + ; Preserve 3 lowest bits of CIA2_PRA jsr jiffydos_preserve_bits } else { @@ -207,3 +231,5 @@ jiffydos_load_end: } } ; CONFIG_IEC_JIFFYDOS and not CONFIG_MEMORY_MODEL_60K + +} \ No newline at end of file From e4cf7f0aef10b58b052bb8512e0c09322873dc34 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 8 Oct 2020 17:07:42 +0200 Subject: [PATCH 18/51] Ultimate 64 banner tweak, updated binaries --- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes bin/mega65.rom | Bin 131072 -> 131072 bytes bin/mega65_pxlfont.rom | Bin 131072 -> 131072 bytes src/basic/assets/startup_banner.s | 34 +++++++++++++++--------------- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 4f9e17cb735058e97c778784ba17c5cfc67c2fdb..57c777649f313d88b742fec5a2805ca102b14662 100644 GIT binary patch delta 107 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 Y&xxKG)wuNauQRlD?xwb9M!Tu~4`{J_NdN!< delta 3128 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 diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index 5d7381c1c3cdb4f657ef67b0a97bef91c6137740..8cf7e144a652c520f6fa7c4fa0850f717ab648ae 100644 GIT binary patch delta 3949 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 diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index f278760c7d331aa7ebe6443b8fcc3ad39bb5c9e7..79ab55e28d43f8a0db1fd99514b0dc7621394c43 100644 GIT binary patch delta 4449 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 UsBTAxli`0q|AoL06aVb{KYGiRApigX delta 4476 zcmZ8k4OCP|mVW&n(0~K|M1)2`OCw4rqNte(&WOP{hSrqPWIU5-vYY1^v#m$Z4?U0iHo+aD9q6Q8*l3VWS) z6*)Nk`CV+SsC^}U&Yx?g6xU+MoU>x8ejg{Myw4OD$c$*j9UqfLnz`Aq=UR2+pUTTb z4IceV_%yDuz-VqP(C;k}3ru^BqA|SK@G04&ITw56E`Iqtl=K-%WuK2m9K$eVKWkiZ zvO&P-s}Z??p860jalIN<*Fk@^8g5oZFQmGYw3Q@>uy z-p7jB7Pfx{W-k12--5PHG`gd)pzT@E0olqu{Td2bT}TNE);Z1>Te_Y1lxSIVpy{5O zSMaWCl?&nTVpU1A1l)AmXvABZRFUA%q$k-Uzl1;jFiKbu86^BE+#ii*h===iY{V+n zb>vr3i?Nky{GFKB0nPg8y#KYt{))vNm-o@}Ds<#7eDW)m+)c;TlZAotZ7*^^-}K8B zt8;SJu3o+3*^Mh!F%0rJ35~)_x(4x)KIcvr?DVh0&OIzTJPazz@WND_fEM(r1j&!i z&P-77w|-QqPVDfHmG(QnAW1PBc*hLt zn?XAU^#XhiJ=qiURCdgCCyJRi(+7GXR{(yL8p3%Y7~pLo;hB8tYr3)h3jefpl`cd5 z9r!Ayzu$($J_Zd|)Cg>=lOKAynNW8?ubF_gScS;tqP*g-Rd`= zyF2;+df67LV|w}6P8!JJaETAUUFfSTW6R1}nJFt{t(>#kQ^xc-YdzVT9vTNrY4sjh zF!TL&7M8}KGvk=MkM<4Om~ytKj_K)y&Y*MY=&Se3f%0m46eF^_p{JXqF=d@KWYad^ zal@X?6Yc~}k1M34wT9>ttG4@&o5oe?*T3U-pT#fVH}n1+T_=CDHKfEwHc%du^Tjry zP6G#6x$Y~YN|c!o2+qHaiVvOLqvDwJ+UQv_YvH`)i}v>8Z?XODLR~4FlTc;jdd(wb z?ZU<6PHehfHBP|FIPWmWyP1wwJ=nWQ96~OV7`NrQ1V!eTC-f+jbuqoR7s_?LZAS$G z{k#u<94I+fWt6Cr+15c50TZZr({#4_m|jj0`svw57wY!Zn$DJ1A4B^UaEJ;wITN?$ zm3Uu=IY(}EK`4%Q6n9uP#nfDUQ?b>(#iCP#mQPUU5PEV3zxANhh;)jn*1D{&gsm8n zQN=YgKPsq3k3EF81jA-}oY!{J@hmV?7Jl1DR>l9akYTVCx^(eMZVrg_wIC

meCI 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 diff --git a/bin/mega65.rom b/bin/mega65.rom index b5b722dbb008d2d9b56cb5a874197f9996c035c0..f3fde96d9e237597fe0689ddb5144184d1209026 100644 GIT binary patch delta 3358 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 diff --git a/bin/mega65_pxlfont.rom b/bin/mega65_pxlfont.rom index 9afc3524fcd0862946d358e7538d4d63a3be4384..76afe45a03ddd93cdcd344dc8c53c79f43bd1464 100644 GIT binary patch delta 3358 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 diff --git a/src/basic/assets/startup_banner.s b/src/basic/assets/startup_banner.s index ecc667c4..b0f52cb6 100644 --- a/src/basic/assets/startup_banner.s +++ b/src/basic/assets/startup_banner.s @@ -37,31 +37,31 @@ startup_banner: rainbow_logo: - !set SET_COLOR_0 = $05 - !set SET_COLOR_1 = $1C - !set SET_COLOR_2 = $81 - !set SET_COLOR_3 = $9E - !set SET_COLOR_4 = $1E - !set SET_COLOR_5 = $9F + !set BANNER_COLOR_0 = $05 + !set BANNER_COLOR_1 = $1C + !set BANNER_COLOR_2 = $81 + !set BANNER_COLOR_3 = $9E + !set BANNER_COLOR_4 = $1E + !set BANNER_COLOR_5 = $9F !ifdef CONFIG_MB_U64 { - !byte SET_COLOR_1, $B8, $B8, $B8, $B8, $B8, $B8, $0D - !byte SET_COLOR_2, $B8, $B8, $B8, $B8, $B8, $B8, $0D - !byte SET_COLOR_3, $B8, $B8, $B8, $B8, $B8, $B8, $0D - !byte SET_COLOR_4, $B8, $B8, $B8, $B8, $B8, $B8, $0D - !byte SET_COLOR_5, $B8, $B8, $B8, $B8, $B8, $B8, $0D - !byte SET_COLOR_0, $00 + !byte BANNER_COLOR_1, $B8, $B8, $20, $20, $B8, $B8, $0D + !byte BANNER_COLOR_2, $B8, $B8, $20, $20, $B8, $B8, $0D + !byte BANNER_COLOR_3, $B8, $B8, $20, $20, $B8, $B8, $0D + !byte BANNER_COLOR_4, $B8, $B8, $20, $20, $B8, $B8, $0D + !byte $20, BANNER_COLOR_5, $B8, $B8, $B8, $B8, $0D + !byte BANNER_COLOR_0, $00 !set BANNER_SPACING = $09 } else { - !byte SET_COLOR_1, $12, $A4, $A4, $A4, $A4, $A4, $A4, $A4, $0D - !byte SET_COLOR_3, $12, $A4, $A4, $A4, $A4, $A4, $A4, $0D - !byte SET_COLOR_4, $12, $A4, $A4, $A4, $A4, $A4, $0D - !byte SET_COLOR_5, $12, $A4, $A4, $A4, $A4, $92 - !byte SET_COLOR_0, $00 + !byte BANNER_COLOR_1, $12, $A4, $A4, $A4, $A4, $A4, $A4, $A4, $0D + !byte BANNER_COLOR_3, $12, $A4, $A4, $A4, $A4, $A4, $A4, $0D + !byte BANNER_COLOR_4, $12, $A4, $A4, $A4, $A4, $A4, $0D + !byte BANNER_COLOR_5, $12, $A4, $A4, $A4, $A4, $92 + !byte BANNER_COLOR_0, $00 !set BANNER_SPACING = $0A } From 3b0f38e6b21ba9f205f33449ae73d0061c341b16 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 9 Oct 2020 16:34:40 +0200 Subject: [PATCH 19/51] more work on optimized JiffyDOS LOAD protocol --- src/kernal/iec_fast/jiffydos_load.s | 90 ++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/src/kernal/iec_fast/jiffydos_load.s b/src/kernal/iec_fast/jiffydos_load.s index 7f1f806f..1eef3b60 100644 --- a/src/kernal/iec_fast/jiffydos_load.s +++ b/src/kernal/iec_fast/jiffydos_load.s @@ -32,15 +32,103 @@ jiffydos_load: lda #$61 jsr TKSA + ; XXX flow below most likely takes too much time... + + ; Timing is critical, do not allow interrupts + sei + +!ifdef CONFIG_IEC_JIFFYDOS_BLANK { + +!ifdef CONFIG_MB_U64 { + + ; XXX implement for non-blank mode, use jiffydos_prepare_no_preserve_bits + + ; Check if turbo register is available + lda U64_TURBOCTL + cmp #$FF + beq @1 + + ; Store turbo register content, disable badlines + sta TBTCNT + lda #$80 + sta U64_TURBOCTL + bne @2 + + ; Normal flow - no turbo register +} + +@1: + ; Preserve register with screen status (blank/visible) + lda VIC_SCROLY + sta TBTCNT + + ; Blank screen to make sure no sprite/badline will interrupt + jsr screen_off +@2: + ; Preserve 3 lowest bits of CIA2_PRA + jsr jiffydos_preserve_bits + +} else { + +@1: + ; Store previous sprite status in temporary variable + jsr jiffydos_prepare + sta TBTCNT +@2: + +} + ; A trick to shorten EAL update time + ldy #$FF + + ; FALLTROUGH + +jiffydos_load_loop_esc: + + ; We are now in 'escape mode' - release DATA, wait till receiver releases CLK + jsr iec_release_clk_data + jsr iec_wait_for_clk_release + + ; Check DATA line + bmi jiffydos_load_check_status + + +panic $01 + ; XXX finish the implementation - rts + + + +jiffydos_load_check_status: + + ; Check if a device pulls CLK within the next 1100us (at least 1125 cycles, to be sure for NTSC) + ldx #$67 ; 2 cycles + + ; FALLTROUGH + +jiffydos_load_check_loop: + + lda CIA2_PRA ; 4 cycles + bvc jiffydos_load_end ; 2 cycles if not taken + dex ; 2 cycles + bne jiffydos_load_check_loop ; 3 cycles if taken + + ; FALLTROUGH jiffydos_load_error: + +panic $03 + ; XXX finish the implementation +jiffydos_load_end: + + +panic $FF + + ; XXX finish the implementation + + + } else { ; XXX implement JiffyDOS optimized LOAD protocol, this one is ineffective From 5c5c14f76a46d1fd9a24ca99f66e93033e2a4728 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 10 Oct 2020 16:21:41 +0200 Subject: [PATCH 20/51] for MEGA65 disabled FAST/SLOW commands in native mode --- doc/Extended-BASIC.md | 8 ++---- src/basic/,imports.s | 6 +++-- .../basic_commands_01/cmd__jumptable_01.s | 9 ------- src/basic/basic_commands_01/cmd_fast_slow.s | 26 +++++++++++++++++++ .../helper_ensure_legacy_mode_m65.s | 10 +++++++ src/basic/engine_runtime/do_error.s | 8 ++++++ src/kernal/board_m65/mega65_imports.s | 2 -- src/kernal/extapi_m65/mega65__jumptable.s | 6 ----- src/kernal/extapi_m65/mega65_modeset.s | 15 ++++++----- src/kernal/extapi_m65/mega65_slow_fast.s | 16 ------------ tools/generate_strings.cc | 4 ++- 11 files changed, 62 insertions(+), 48 deletions(-) create mode 100644 src/basic/basic_commands_01/helper_ensure_legacy_mode_m65.s delete mode 100644 src/kernal/extapi_m65/mega65_slow_fast.s diff --git a/doc/Extended-BASIC.md b/doc/Extended-BASIC.md index eeccfae3..09e7dd35 100644 --- a/doc/Extended-BASIC.md +++ b/doc/Extended-BASIC.md @@ -67,13 +67,9 @@ Saves the binary data from the given memory area. NOTE: for now syntax differs f Resets the machine. In direct mode asks for confirmation first. -### `FAST` (all) +### `FAST`, `SLOW` (all) -Tries to switch the machine to turbo mode - details differ depending on the configured machine / motherboard. - -### `SLOW` (all) - -Tries to switch the machine back to 1 MHz operation mode. +Tries to switch the machine to turbo mode (or back to 1MHz operation mode) - details differ depending on the configured machine / motherboard. On MEGA65 motherboard this is not available in native mode, it is not designed to run in 1MHz due to using compound CPU instructions. ### `OLD` (all) diff --git a/src/basic/,imports.s b/src/basic/,imports.s index 62a37c08..225c956f 100644 --- a/src/basic/,imports.s +++ b/src/basic/,imports.s @@ -29,11 +29,13 @@ ;; #ALIAS# SELDEV = KERNAL_0.SELDEV +; +; MEGA65 specific parts +; + ;; #ALIAS# map_end = KERNAL_0.map_end ;; #ALIAS# map_NORMAL = KERNAL_0.map_NORMAL ;; #ALIAS# M65_MODEGET = KERNAL_0.M65_MODEGET ;; #ALIAS# M65_MODESET = KERNAL_0.M65_MODESET -;; #ALIAS# M65_SLOW = KERNAL_0.M65_SLOW -;; #ALIAS# M65_FAST = KERNAL_0.M65_FAST ;; #ALIAS# M65_SETWIN_Y = KERNAL_0.M65_SETWIN_Y diff --git a/src/basic/basic_commands_01/cmd__jumptable_01.s b/src/basic/basic_commands_01/cmd__jumptable_01.s index 12152493..31ebb526 100644 --- a/src/basic/basic_commands_01/cmd__jumptable_01.s +++ b/src/basic/basic_commands_01/cmd__jumptable_01.s @@ -6,18 +6,9 @@ ; Jumptable for BASIC commands with tokens prefixed by $01 ; -!ifdef CONFIG_MB_M65 { - -!set ITEM_00 = M65_SLOW -!set ITEM_01 = M65_FAST - -} else { !set ITEM_00 = cmd_slow !set ITEM_01 = cmd_fast - -} - !set ITEM_02 = cmd_old ; NOTE! These commands are temporarily placed here, they should be a part of list 02! diff --git a/src/basic/basic_commands_01/cmd_fast_slow.s b/src/basic/basic_commands_01/cmd_fast_slow.s index 7b7adb86..891494fe 100644 --- a/src/basic/basic_commands_01/cmd_fast_slow.s +++ b/src/basic/basic_commands_01/cmd_fast_slow.s @@ -5,6 +5,32 @@ !ifdef CONFIG_MB_M65 { +; NOTE: In native mode the system should not run at 1 MHz speed - it's dangerous, +; as it uses compound instructions, which are not safe in 1MHz mode + +cmd_slow: ; set CPU speed to 1 MHz + + jsr helper_ensure_legacy_mode + + lda #$40 + bra cmd_slow_fast_common + + ; FALLTROUGH + +cmd_fast: ; set CPU speed to 40 MHz + + jsr helper_ensure_legacy_mode + + lda #$41 + + ; FALLTROUGH + +cmd_slow_fast_common: + + sta CPU_D6510 + rts + + ; For MEGA65 Kernal routines are called directly } else ifdef CONFIG_MB_U64 { diff --git a/src/basic/basic_commands_01/helper_ensure_legacy_mode_m65.s b/src/basic/basic_commands_01/helper_ensure_legacy_mode_m65.s new file mode 100644 index 00000000..c49b21d2 --- /dev/null +++ b/src/basic/basic_commands_01/helper_ensure_legacy_mode_m65.s @@ -0,0 +1,10 @@ +;; #LAYOUT# M65 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE + + +helper_ensure_legacy_mode: + + jsr M65_MODEGET + +bcc do_LEGACY_MODE_ONLY_error + + rts diff --git a/src/basic/engine_runtime/do_error.s b/src/basic/engine_runtime/do_error.s index baf57e47..acfafcea 100644 --- a/src/basic/engine_runtime/do_error.s +++ b/src/basic/engine_runtime/do_error.s @@ -52,6 +52,14 @@ do_kernal_error: ; .A = KERNAL error code, also almost mat ; Error messages specific to Open ROMs BASIC dialect +!ifdef CONFIG_MB_M65 { + +do_LEGACY_MODE_ONLY_error: + !byte $E6 +do_NATIVE_MODE_ONLY_error: + !byte $E6 +} + do_MEMORY_CORRUPT_error: !byte $E6 diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 8f5a6e78..b74001ec 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -9,8 +9,6 @@ ;; #ALIAS# CHROUT = KERNAL_0.proxy_K1_CHROUT ;; #ALIAS# STOP = KERNAL_0.STOP -;; #ALIAS# M65_SLOW = KERNAL_0.M65_SLOW -;; #ALIAS# M65_FAST = KERNAL_0.M65_FAST ;; #ALIAS# M65_MODEGET = KERNAL_0.M65_MODEGET ;; #ALIAS# M65_SETWIN_XY = KERNAL_0.M65_SETWIN_XY ;; #ALIAS# M65_SETWIN_WH = KERNAL_0.M65_SETWIN_WH diff --git a/src/kernal/extapi_m65/mega65__jumptable.s b/src/kernal/extapi_m65/mega65__jumptable.s index c20b1b4f..301226a2 100644 --- a/src/kernal/extapi_m65/mega65__jumptable.s +++ b/src/kernal/extapi_m65/mega65__jumptable.s @@ -14,12 +14,6 @@ M65_JMODEGET: M65_JISMODESET: jsr M65_MODESET -M65_JSLOW: - jsr M65_SLOW - -M65_JFAST: - jsr M65_FAST - M65_JSELDEV: jsr SELDEV diff --git a/src/kernal/extapi_m65/mega65_modeset.s b/src/kernal/extapi_m65/mega65_modeset.s index 153a58a8..52a04236 100644 --- a/src/kernal/extapi_m65/mega65_modeset.s +++ b/src/kernal/extapi_m65/mega65_modeset.s @@ -25,13 +25,15 @@ m65_mode64: jsr viciv_shutdown jsr vicii_init - ; Reenable interrupts + ; Switch CPU speed back to normal + + lda #$40 + sta CPU_D6510 + + ; Reenable interrupts and quit cli - - ; Switch CPU speed back to slow and quit - - jmp M65_SLOW + rts m65_mode65: @@ -42,7 +44,8 @@ m65_mode65: ; Switch CPU speed to fast - jsr M65_FAST + lda #$41 + sta CPU_D6510 ; Set the magic string to mark native mode diff --git a/src/kernal/extapi_m65/mega65_slow_fast.s b/src/kernal/extapi_m65/mega65_slow_fast.s deleted file mode 100644 index 8e91796c..00000000 --- a/src/kernal/extapi_m65/mega65_slow_fast.s +++ /dev/null @@ -1,16 +0,0 @@ -;; #LAYOUT# M65 KERNAL_0 #TAKE -;; #LAYOUT# * * #IGNORE - - -M65_SLOW: ; set CPU speed to 1 MHz - - lda #$40 - +skip_2_bytes_trash_nvz - - ; FALLTROUGH - -M65_FAST: ; set CPU speed to 40 MHz - - lda #$41 - sta CPU_D6510 - rts diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index 43d95f34..65690641 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -276,7 +276,9 @@ const StringEntryList GLOBAL_Errors = { ListType::STRINGS_BASIC, "errors", { true, true, true, true, "EV7_28", "NOT IMPLEMENTED" }, // this message actually differs from the CBM one { false, false, false, false, "EV7_29", "FILE READ" }, // not used for now // STD M65 U64 X16 --- error strings specific to Open ROMs, not present in CBM BASIC dialects - { true, true, true, true, "EOR_2A", "MEMORY CORRUPT" }, + { true, true, true, true, "EOR_2A", "MEMORY CORRUPT" }, + { false, true, false, false, "EOR_2B", "NATIVE MODE ONLY" }, + { false, true, false, false, "EOR_2C", "LEGACY MODE ONLY" }, } }; // BASIC errors - miscelaneous strings From 4eb0923f9c9b36bf0b00926544cd6f2f92571e18 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 11 Oct 2020 11:45:13 +0200 Subject: [PATCH 21/51] VIC initialization fixes --- src/kernal/board_m65/mega65_viciv_shutdown.s | 4 ++++ src/kernal/init/e5a0.vicii_init.s | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/kernal/board_m65/mega65_viciv_shutdown.s b/src/kernal/board_m65/mega65_viciv_shutdown.s index e53b6f0e..0a4492a5 100644 --- a/src/kernal/board_m65/mega65_viciv_shutdown.s +++ b/src/kernal/board_m65/mega65_viciv_shutdown.s @@ -23,6 +23,10 @@ viciv_shutdown: sta VIC_CTRLA ; enable C64 character set sta VIC_CTRLB ; disable extended resolution and attributes + lda VIC_CTRLC + and #%00101000 ; disable fast mode and various VIC-IV extensions + sta VIC_CTRLC + ; Reenable hot registers jsr viciv_hotregs_on diff --git a/src/kernal/init/e5a0.vicii_init.s b/src/kernal/init/e5a0.vicii_init.s index 1657e714..d4637ce4 100644 --- a/src/kernal/init/e5a0.vicii_init.s +++ b/src/kernal/init/e5a0.vicii_init.s @@ -35,11 +35,12 @@ vicii_init: ; Disable C128 extra keys - just to be sure they will not interfere with anything - stx VIC_XSCAN + stx VIC_XSCAN ; store $FF ; Disable the C128 2MHz mode, it prevents VIC-II display from working correctly - stx VIC_CLKRATE + inx + stx VIC_CLKRATE ; store $00 } } ; Set up default IO values From 121f49b763466bcbada13adf7225d81537ea890a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 11 Oct 2020 11:56:16 +0200 Subject: [PATCH 22/51] improved C128 hardware handling --- src/aliases/,aliases_config.s | 7 +++++++ src/kernal/init/e5a0.vicii_init.s | 12 ------------ src/kernal/init/fda3.ioinit.s | 14 +++++++++++++- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/aliases/,aliases_config.s b/src/aliases/,aliases_config.s index db5b2380..2e47a455 100644 --- a/src/aliases/,aliases_config.s +++ b/src/aliases/,aliases_config.s @@ -269,6 +269,13 @@ ; +; Handle platform/mothjerboard configuration + + +!ifdef PLATFORM_COMMODORE_64 { !ifndef CONFIG_MB_M65 { !ifndef CONFIG_MB_U64 { + !set HAS_128_POSSIBILITY = 1 +} } } + ; Handle CPU configuration diff --git a/src/kernal/init/e5a0.vicii_init.s b/src/kernal/init/e5a0.vicii_init.s index d4637ce4..43876303 100644 --- a/src/kernal/init/e5a0.vicii_init.s +++ b/src/kernal/init/e5a0.vicii_init.s @@ -31,18 +31,6 @@ vicii_init: dex bpl @1 -!ifndef CONFIG_MB_M65 { !ifndef CONFIG_MB_U64 { - - ; Disable C128 extra keys - just to be sure they will not interfere with anything - - stx VIC_XSCAN ; store $FF - - ; Disable the C128 2MHz mode, it prevents VIC-II display from working correctly - - inx - stx VIC_CLKRATE ; store $00 -} } - ; Set up default IO values ; - [CM64] page 129 - VIC_SCROLY ; - [CM64] pages 140-144 - VIC_SCROLX diff --git a/src/kernal/init/fda3.ioinit.s b/src/kernal/init/fda3.ioinit.s index e2243c7f..204b963a 100644 --- a/src/kernal/init/fda3.ioinit.s +++ b/src/kernal/init/fda3.ioinit.s @@ -62,7 +62,7 @@ IOINIT_skip_DOS: stx CIA1_PRA ; $DC00 ; - ; Now silence the SID chip(s), depending on the configuration - we want them silent ASAP + ; Silence the SID chip(s), depending on the configuration - we want them silent ASAP ; lda #$00 @@ -135,6 +135,18 @@ IOINIT_skip_DOS: stx CIA1_DDRB ; $DC03 stx CIA2_DDRB ; $DD03 ; XXX this port is used for RS-232, value here is most likely wrong! +!ifdef HAS_128_POSSIBILITY { + + ; Disable C128 extra keys - just to be sure they will not interfere with anything + + stx VIC_XSCAN ; store $FF + + ; Disable the C128 2MHz mode, it prevents VIC-II display from working correctly + + inx + stx VIC_CLKRATE ; store $00 +} + !ifdef CONFIG_KEYBOARD_C65_OR_CAPS_LOCK { lda #$02 From 47b9676ca9c370b8e0415eebd91c235ed90e69e5 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 11 Oct 2020 20:56:30 +0200 Subject: [PATCH 23/51] changed CPU speed handling for MEGA65 --- src/kernal/board_m65/mega65_iec_slow_fast.s | 45 +++++++++++++++++++ src/kernal/board_m65/mega65_viciv_init.s | 6 +-- .../board_m65/mega65_viciv_setctrl_AC.s | 18 ++++++++ src/kernal/board_m65/mega65_viciv_shutdown.s | 8 +--- src/kernal/errors.s | 4 ++ src/kernal/extapi_m65/mega65_modeset.s | 6 +-- src/kernal/iec/iec_return.s | 10 +++++ src/kernal/iec/iec_rx_byte.s | 19 +++++++- src/kernal/iec/iec_tx_byte.s | 15 ++++++- src/kernal/iec_fast/dolphindos_load.s | 13 +++++- src/kernal/iec_fast/jiffydos_load.s | 14 +++++- .../screen_m65/mega65_screen_tables_misc.s | 6 +-- 12 files changed, 142 insertions(+), 22 deletions(-) create mode 100644 src/kernal/board_m65/mega65_iec_slow_fast.s create mode 100644 src/kernal/board_m65/mega65_viciv_setctrl_AC.s diff --git a/src/kernal/board_m65/mega65_iec_slow_fast.s b/src/kernal/board_m65/mega65_iec_slow_fast.s new file mode 100644 index 00000000..310df6e3 --- /dev/null +++ b/src/kernal/board_m65/mega65_iec_slow_fast.s @@ -0,0 +1,45 @@ +;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Checks if system is in MEGA65 native mode; if so, switches CPU speed to fast/slow - for IEC routines; +; Alters only status bits, all remaining registers preserved +; + +!ifdef CONFIG_IEC { + + +m65_iec_slow: + + jsr M65_MODEGET + bcs m65_iec_fast_slow_done + + ; Switch CPU speed + + pha + lda VIC_CTRLB + and #%10111111 + bra m65_iec_fast_slow_common + +m65_iec_fast: + + jsr M65_MODEGET + bcs m65_iec_fast_slow_done + + pha + lda VIC_CTRLB + ora #%01000000 + + ; FALLTROUGH + +m65_iec_fast_slow_common: + + sta VIC_CTRLB + pla + + ; FALLTROUGH + +m65_iec_fast_slow_done: + + rts +} diff --git a/src/kernal/board_m65/mega65_viciv_init.s b/src/kernal/board_m65/mega65_viciv_init.s index 91c2131c..e73f635a 100644 --- a/src/kernal/board_m65/mega65_viciv_init.s +++ b/src/kernal/board_m65/mega65_viciv_init.s @@ -17,10 +17,10 @@ viciv_init: lda #$00 sta MISC_EMU - ; Set misc VIC-IV flags + ; Set VIC-IV CTRL registers - lda #%01000000 ; enable C65 character set - sta VIC_CTRLA + lda #%01000000 ; enable C65 character set + jsr mega65_viciv_setctrl_AC ; also initialize remaining CTRLA / CTRLC bits; CTRLB will be set by screen editor ; Disable hot registers diff --git a/src/kernal/board_m65/mega65_viciv_setctrl_AC.s b/src/kernal/board_m65/mega65_viciv_setctrl_AC.s new file mode 100644 index 00000000..c49f31de --- /dev/null +++ b/src/kernal/board_m65/mega65_viciv_setctrl_AC.s @@ -0,0 +1,18 @@ +;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Helper routine for setting VIC-IV control registers A and C +; + + +mega65_viciv_setctrl_AC: + + sta VIC_CTRLA + + lda VIC_CTRLC + and #%01101000 + ora #%01000000 ; make C65/C128 fast modes switch to max MEGA65 CPU speed + sta VIC_CTRLC + + rts diff --git a/src/kernal/board_m65/mega65_viciv_shutdown.s b/src/kernal/board_m65/mega65_viciv_shutdown.s index 0a4492a5..38cc0067 100644 --- a/src/kernal/board_m65/mega65_viciv_shutdown.s +++ b/src/kernal/board_m65/mega65_viciv_shutdown.s @@ -20,12 +20,8 @@ viciv_shutdown: ; Set misc VIC-IV flags lda #%00000000 - sta VIC_CTRLA ; enable C64 character set - sta VIC_CTRLB ; disable extended resolution and attributes - - lda VIC_CTRLC - and #%00101000 ; disable fast mode and various VIC-IV extensions - sta VIC_CTRLC + sta VIC_CTRLB ; disable extended resolution and attributes, disable 3.5 MHz mode + jsr mega65_viciv_setctrl_AC ; enable C64 character set, initialize remaining CTRLA / CTRLC bits ; Reenable hot registers diff --git a/src/kernal/errors.s b/src/kernal/errors.s index 5c021764..917317d7 100644 --- a/src/kernal/errors.s +++ b/src/kernal/errors.s @@ -90,5 +90,9 @@ kernalerror_TOP_MEM_RS232: lda #K_ERR_TOP_MEM_RS232 +!ifdef CONFIG_MB_M65 { + ; If in native mode, switch back to fast mode + jsr m65_iec_fast +} sec rts diff --git a/src/kernal/extapi_m65/mega65_modeset.s b/src/kernal/extapi_m65/mega65_modeset.s index 52a04236..4dec329c 100644 --- a/src/kernal/extapi_m65/mega65_modeset.s +++ b/src/kernal/extapi_m65/mega65_modeset.s @@ -25,7 +25,7 @@ m65_mode64: jsr viciv_shutdown jsr vicii_init - ; Switch CPU speed back to normal + ; Switch CPU speed to normal lda #$40 sta CPU_D6510 @@ -42,9 +42,9 @@ m65_mode65: sei - ; Switch CPU speed to fast + ; Switch CPU speed to normal; VIC-IV register will be used to set the maximum one - lda #$41 + lda #$40 sta CPU_D6510 ; Set the magic string to mark native mode diff --git a/src/kernal/iec/iec_return.s b/src/kernal/iec/iec_return.s index 4bf64b30..bf9972f7 100644 --- a/src/kernal/iec/iec_return.s +++ b/src/kernal/iec/iec_return.s @@ -20,9 +20,16 @@ iec_return_success: ; BSOUR is certainly not valid anymore lda #$00 sta C3PO + ; Restore registers +ply_trash_a +plx_trash_a + +!ifdef CONFIG_MB_M65 { + ; If in native mode, switch back to fast mode + jsr m65_iec_fast +} + ; Report success clc rts @@ -31,12 +38,15 @@ iec_return_DEVICE_NOT_FOUND: ; Set IEC line to normal idle state jsr iec_set_idle + ; BSOUR is certainly not valid anymore lda #$00 sta C3PO + ; Restore registers +ply_trash_a +plx_trash_a + ; Report error jmp kernalerror_DEVICE_NOT_FOUND } diff --git a/src/kernal/iec/iec_rx_byte.s b/src/kernal/iec/iec_rx_byte.s index 32d1deea..fc565c85 100644 --- a/src/kernal/iec/iec_rx_byte.s +++ b/src/kernal/iec/iec_rx_byte.s @@ -16,6 +16,11 @@ iec_rx_dispatch: +!ifdef CONFIG_MB_M65 { + ; If in native mode, switch to 1 MHz + jsr m65_iec_slow +} + lda IECPROTO cmp #IEC_JIFFY +beq jiffydos_rx_byte @@ -27,6 +32,11 @@ iec_rx_dispatch: iec_rx_byte: +!ifdef CONFIG_MB_M65 { !ifndef CONFIG_IEC_JIFFYDOS { + ; If in native mode, switch to 1 MHz + jsr m65_iec_slow +} } + ; Store .X and .Y on the stack - preserve them +phx_trash_a +phy_trash_a @@ -60,7 +70,7 @@ iec_rx_byte: ; For DolphinDOS just fetch the byte from parallel port lda CIA2_PRB pha - jmp iec_rx_acknowledge + +bra iec_rx_acknowledge iec_rx_no_dolphindos: @@ -124,7 +134,7 @@ iec_rx_clk_wait2: jsr kernalstatus_EOI pla - jmp iec_rx_end + +bra iec_rx_end @2: ; More bits? dex @@ -150,6 +160,11 @@ iec_rx_acknowledge: iec_rx_end: +!ifdef CONFIG_MB_M65 { + ; If in native mode, switch back to fast mode + jsr m65_iec_fast +} + +ply_trash_a +plx_trash_a lda TBTCNT diff --git a/src/kernal/iec/iec_tx_byte.s b/src/kernal/iec/iec_tx_byte.s index 785859b7..586bda40 100644 --- a/src/kernal/iec/iec_tx_byte.s +++ b/src/kernal/iec/iec_tx_byte.s @@ -18,6 +18,12 @@ iec_tx_dispatch: php ; preserve C flag for EOI indication + +!ifdef CONFIG_MB_M65 { + ; If in native mode, switch to 1 MHz + jsr m65_iec_slow +} + lda IECPROTO cmp #IEC_JIFFY bne @1 @@ -34,6 +40,11 @@ iec_tx_dispatch: iec_tx_byte: +!ifdef CONFIG_MB_M65 { !ifndef CONFIG_IEC_JIFFYDOS { + ; If in native mode, switch to 1 MHz + jsr m65_iec_slow +} } + ; Store .X and .Y on the stack - preserve them +phx_trash_a +phy_trash_a @@ -84,7 +95,7 @@ iec_tx_common: jsr iec_pull_clk_release_data_oneshot ; Finish the flow - jmp iec_tx_common_finalize + +bra iec_tx_common_finalize iec_tx_no_dolphindos: @@ -122,7 +133,7 @@ iec_tx_common_sendbit: ; Bit is 0 jsr iec_release_clk_pull_data - jmp iec_tx_common_bit_is_sent + +bra iec_tx_common_bit_is_sent @4: ; Bit is 1 jsr iec_release_clk_data diff --git a/src/kernal/iec_fast/dolphindos_load.s b/src/kernal/iec_fast/dolphindos_load.s index 4b3487fa..7a8edd07 100644 --- a/src/kernal/iec_fast/dolphindos_load.s +++ b/src/kernal/iec_fast/dolphindos_load.s @@ -27,6 +27,11 @@ dolphindos_load: ora #BIT_CIA2_PRA_DAT_OUT sta TBTCNT ; pull DATA } + +!ifdef CONFIG_MB_M65 { + ; If in native mode, switch to 1 MHz + jsr m65_iec_slow +} ; FALLTROUGH dolphindos_load_loop: @@ -80,7 +85,7 @@ dolphindos_load_loop: sta IECPROTO ; End of load loop - jmp load_iec_loop_end + +bra load_iec_loop_end dolphindos_load_no_eoi: @@ -103,12 +108,16 @@ dolphindos_load_no_eoi: iny bne dolphindos_load_loop inc EAL+1 - jmp dolphindos_load_loop + +bra dolphindos_load_loop !ifndef CONFIG_IEC_DOLPHINDOS_FAST { dolphindos_load_end: +!ifdef CONFIG_MB_M65 { + ; If in native mode, switch back to fast mode + jsr m65_iec_fast +} ; Update EAL clc jsr iec_update_EAL_by_Y diff --git a/src/kernal/iec_fast/jiffydos_load.s b/src/kernal/iec_fast/jiffydos_load.s index 1eef3b60..fc339414 100644 --- a/src/kernal/iec_fast/jiffydos_load.s +++ b/src/kernal/iec_fast/jiffydos_load.s @@ -80,6 +80,10 @@ jiffydos_load: ; A trick to shorten EAL update time ldy #$FF +!ifdef CONFIG_MB_M65 { + ; If in native mode, switch to 1 MHz + jsr m65_iec_fast +} ; FALLTROUGH jiffydos_load_loop_esc: @@ -180,6 +184,10 @@ jiffydos_load_end: ; A trick to shorten EAL update time ldy #$FF +!ifdef CONFIG_MB_M65 { + ; If in native mode, switch to 1 MHz + jsr m65_iec_slow +} ; FALLTROUGH jiffydos_load_loop: @@ -257,10 +265,14 @@ jiffydos_load_loop: cpy #$FF bne jiffydos_load_loop inc EAL+1 - jmp jiffydos_load_loop + +bra jiffydos_load_loop jiffydos_load_end: +!ifdef CONFIG_MB_M65 { + ; If in native mode, switch back to fast mode + jsr m65_iec_fast +} ; Save last byte tax diff --git a/src/kernal/screen_m65/mega65_screen_tables_misc.s b/src/kernal/screen_m65/mega65_screen_tables_misc.s index f0f6b684..8ec028f6 100644 --- a/src/kernal/screen_m65/mega65_screen_tables_misc.s +++ b/src/kernal/screen_m65/mega65_screen_tables_misc.s @@ -4,9 +4,9 @@ m65_scrtab_vic_ctrlb: ; parameters for VIC control register B - !byte %00100000 ; 40x25 + extended attributes - !byte %10100000 ; 80x25 + extended attributes - !byte %10101000 ; 80x50 + extended attributes + !byte %01100000 ; 40x25 + extended attributes + VFAST + !byte %11100000 ; 80x25 + extended attributes + VFAST + !byte %11101000 ; 80x50 + extended attributes + VFAST m65_scrtab_colviewmax_lo: ; maximum allowed color viewport start - low byte From ec2b32f57702d5449485a275bcffb61ff0e8f5c7 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 19 Oct 2020 19:31:33 +0200 Subject: [PATCH 24/51] initial support for cartridge-extended ROMs --- Makefile | 70 ++++++++++++--- src/,,config_cx16.s | 2 +- src/,,config_generic_crt.s | 132 ++++++++++++++++++++++++++++ src/aliases/,aliases_config.s | 8 ++ src/kernal/iec_fast/jiffydos_load.s | 10 +++ 5 files changed, 211 insertions(+), 11 deletions(-) create mode 100644 src/,,config_generic_crt.s diff --git a/Makefile b/Makefile index 79ca47a1..ed1ff185 100644 --- a/Makefile +++ b/Makefile @@ -83,6 +83,7 @@ GEN_KERNAL = DIR_CUS = build/target_custom DIR_GEN = build/target_generic +DIR_CRT = build/target_generic_crt DIR_TST = build/target_testing DIR_M65 = build/target_mega65 DIR_U64 = build/target_ultimate64 @@ -92,6 +93,7 @@ DIR_X16 = build/target_cx16 CFG_CUS = src/,,config_custom.s CFG_GEN = src/,,config_generic.s +CFG_CRT = src/,,config_generic_crt.s CFG_TST = src/,,config_testing.s CFG_M65 = src/,,config_mega65.s CFG_U64 = src/,,config_ultimate64.s @@ -101,6 +103,7 @@ CFG_X16 = src/,,config_cx16.s GEN_STR_CUS = $(DIR_CUS)/,generated/,packed_strings.s GEN_STR_GEN = $(DIR_GEN)/,generated/,packed_strings.s +GEN_STR_CRT = $(DIR_CRT)/,generated/,packed_strings.s GEN_STR_TST = $(DIR_TST)/,generated/,packed_strings.s GEN_STR_M65 = $(DIR_M65)/,generated/,packed_strings.s GEN_STR_U64 = $(DIR_U64)/,generated/,packed_strings.s @@ -136,11 +139,13 @@ TOOLS_LIST = $(TOOL_GENERATE_CONSTANTS) \ TARGET_CUS_B = build/basic_custom.rom TARGET_GEN_B = build/basic_generic.rom +TARGET_CRT_B = build/basic_generic_crt.rom TARGET_TST_B = build/basic_testing.rom TARGET_U64_B = build/basic_ultimate64.rom TARGET_CUS_K = build/kernal_custom.rom TARGET_GEN_K = build/kernal_generic.rom +TARGET_CRT_K = build/kernal_generic_crt.rom TARGET_TST_K = build/kernal_testing.rom TARGET_U64_K = build/kernal_ultimate64.rom @@ -150,6 +155,7 @@ TARGET_X16_x = build/cx16-dummy.rom TARGET_LIST_CUS = $(TARGET_CUS_B) $(TARGET_CUS_K) TARGET_LIST_GEN = $(TARGET_GEN_B) $(TARGET_GEN_K) +TARGET_LIST_CRT = $(TARGET_CRT_B) $(TARGET_CRT_K) TARGET_LIST_TST = $(TARGET_TST_B) $(TARGET_TST_K) TARGET_LIST_U64 = $(TARGET_U64_B) $(TARGET_U64_K) @@ -162,6 +168,9 @@ TARGET_LIST = build/chargen_openroms.rom \ $(TARGET_LIST_U64) \ $(TARGET_X16_x) +SEG_LIST_CRT = $(DIR_X16)/basic.seg_0 \ + $(DIR_X16)/kernal.seg_0 + SEG_LIST_M65 = $(DIR_M65)/basic.seg_0 \ $(DIR_M65)/basic.seg_1 \ $(DIR_M65)/dos.seg_1 \ @@ -281,6 +290,11 @@ $(DIR_TST)/OUTK_x.BIN $(DIR_TST)/KERNAL_combined.vs $(DIR_TST)/KERNAL_combined.s $(DIR_U64)/OUTK_x.BIN $(DIR_U64)/KERNAL_combined.vs $(DIR_U64)/KERNAL_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_U64) $(GEN_STR_U64) +$(DIR_CRT)/OUTB_0.BIN $(DIR_CRT)/BASIC_combined.vs: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_CRT) $(CRT_STR_GEN) $(DIR_CRT)/KERNAL_combined.sym +$(DIR_CRT)/OUTK_0.BIN $(DIR_CRT)/KERNAL_combined.vs $(DIR_CRT)/KERNAL_combined.sym: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_CRT) $(GEN_STR_CRT) + $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/BASIC_0_combined.vs $(DIR_M65)/BASIC_0_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_M65) $(GEN_STR_M65) $(DIR_M65)/KERNAL_0_combined.sym $(DIR_M65)/OUTK_0.BIN $(DIR_M65)/KERNAL_0_combined.vs $(DIR_M65)/KERNAL_0_combined.sym: \ @@ -305,6 +319,7 @@ $(DIR_X16)/kernal.seg_1 $(DIR_X16)/KERNAL_1_combined.vs $(DIR_X16)/KERNAL_1_comb $(DIR_CUS)/OUTx_x.BIN: $(DIR_CUS)/OUTB_x.BIN $(DIR_CUS)/OUTK_x.BIN $(DIR_GEN)/OUTx_x.BIN: $(DIR_GEN)/OUTB_x.BIN $(DIR_GEN)/OUTK_x.BIN +$(DIR_CRT)/OUTx_0.BIN: $(DIR_CRT)/OUTB_0.BIN $(DIR_CRT)/OUTK_0.BIN $(DIR_TST)/OUTx_x.BIN: $(DIR_TST)/OUTB_x.BIN $(DIR_TST)/OUTK_x.BIN $(DIR_M65)/OUTx_0.BIN: $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/OUTK_0.BIN $(DIR_U64)/OUTx_x.BIN: $(DIR_U64)/OUTB_x.BIN $(DIR_U64)/OUTK_x.BIN @@ -335,6 +350,10 @@ $(GEN_STR_GEN): $(TOOL_GENERATE_STRINGS) $(CFG_GEN) @mkdir -p $(DIR_GEN)/,generated $(TOOL_GENERATE_STRINGS) -o $@ -c $(CFG_GEN) +$(GEN_STR_CRT): $(TOOL_GENERATE_STRINGS) $(CFG_CRT) + @mkdir -p $(DIR_CRT)/,generated + $(TOOL_GENERATE_STRINGS) -o $@ -c $(CFG_CRT) + $(GEN_STR_TST): $(TOOL_GENERATE_STRINGS) $(CFG_TST) @mkdir -p $(DIR_TST)/,generated $(TOOL_GENERATE_STRINGS) -o $@ -c $(CFG_TST) @@ -355,12 +374,13 @@ build/,generated/,float_constants.s: $(TOOL_GENERATE_CONSTANTS) @mkdir -p build/,generated $(TOOL_GENERATE_CONSTANTS) -o build/,generated/,float_constants.s -GEN_STR_custom = $(GEN_STR_CUS) -GEN_STR_generic = $(GEN_STR_GEN) -GEN_STR_testing = $(GEN_STR_TST) -GEN_STR_mega65 = $(GEN_STR_M65) -GEN_STR_ultimate64 = $(GEN_STR_U64) -GEN_STR_cx16 = $(GEN_STR_X16) +GEN_STR_custom = $(GEN_STR_CUS) +GEN_STR_generic = $(GEN_STR_GEN) +GEN_STR_generic_crt = $(GEN_STR_CRT) +GEN_STR_testing = $(GEN_STR_TST) +GEN_STR_mega65 = $(GEN_STR_M65) +GEN_STR_ultimate64 = $(GEN_STR_U64) +GEN_STR_cx16 = $(GEN_STR_X16) .PRECIOUS: build/target_%/OUTB_x.BIN build/target_%/BASIC_combined.vs build/target_%/OUTB_x.BIN build/target_%/BASIC_combined.vs: @@ -374,6 +394,18 @@ build/target_%/OUTK_x.BIN build/target_%/KERNAL_combined.vs build/target_%/KERNA @rm -f $@* build/target_$*/KERNAL* @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r STD -s KERNAL -i KERNAL-$* -o OUTK_x.BIN -d build/target_$* -l e4d3 -h ffff src/,,config_$*.s $(SRCDIR_KERNAL) $(GEN_KERNAL) $(GEN_STR_$*) +# Rules - BASIC and KERNAL intermediate files, for ROM with external cartridge + +$(DIR_CRT)/OUTB_0.BIN $(DIR_CRT)/BASIC_0_combined.vs $(DIR_CRT)/BASIC_0_combined.sym: + @mkdir -p $(DIR_CRT) + @rm -f $@* $(DIR_CRT)/BASIC_0* + @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s BASIC_0 -i BASIC_0-generic-crt -o OUTB_0.BIN -d $(DIR_CRT) -l a000 -h e4d2 $(CFG_CRT) $(GEN_STR_CRT) $(SRCDIR_BASIC) $(GEN_BASIC) + +$(DIR_CRT)/OUTK_0.BIN $(DIR_CRT)/KERNAL_0_combined.vs $(DIR_CRT)/KERNAL_0_combined.sym: + @mkdir -p $(DIR_CRT) + @rm -f $@* $(DIR_CRT)/KERNAL_0* + @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s KERNAL_0 -i KERNAL_0-generic-crt -o OUTK_0.BIN -d $(DIR_CRT) -l e4d3 -h ffff $(CFG_CRT) $(GEN_STR_CRT) $(SRCDIR_KERNAL) $(GEN_KERNAL) + # Rules - BASIC and KERNAL intermediate files, for MEGA65 $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/BASIC_0_combined.vs $(DIR_M65)/BASIC_0_combined.sym: @@ -441,6 +473,15 @@ build/basic_%.rom: build/symbols_%.vs: @sort build/target_$*/BASIC_combined.vs build/target_$*/KERNAL_combined.vs | uniq | grep -v "__" > $@ +$(DIR_CRT)/OUTx_0.BIN: + @cat $(DIR_CRT)/OUTB_0.BIN $(DIR_CRT)/OUTK_0.BIN > $@ + +$(DIR_CRT)/kernal.seg_0: $(DIR_CRT)/OUTx_0.BIN + @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=2 of=$@ status=none + +$(DIR_CRT)/basic.seg_0: $(DIR_CRT)/OUTx_0.BIN + @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none + $(DIR_M65)/OUTx_0.BIN: @cat $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/OUTK_0.BIN > $@ @@ -459,6 +500,12 @@ $(DIR_X16)/kernal.seg_0: $(DIR_X16)/OUTx_0.BIN $(DIR_X16)/basic.seg_0: $(DIR_X16)/OUTx_0.BIN @dd if=$(DIR_X16)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none +build/kernal_generic_crt.rom: $(DIR_CRT)/OUTx_0.BIN + @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=2 of=$@ status=none + +build/basic_generic_crt.rom: $(DIR_CRT)/OUTx_0.BIN + @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none + build/kernal_hybrid.rom: kernal $(DIR_GEN)/OUTK_x.BIN @echo @echo $(HYBRID_WARNING) @@ -538,12 +585,12 @@ $(TARGET_X16_x): $(SEG_LIST_X16) build/chargen_openroms.rom # Rules - tests -.PHONY: test test_generic test_generic_x128 test_hybrid test_testing \ - test_mega65 test_mega65_xemu test_m65 \ - test_ultimate64 \ +.PHONY: test test_crt test_generic test_generic_x128 test_generic_crt test_hybrid test_testing \ + test_mega65 test_mega65_xemu test_m65 test_ultimate64 \ testremote testsimilarity -test: test_custom +test: test_custom +test_crt: test_generic_crt test_custom: build/kernal_custom.rom build/basic_custom.rom build/symbols_custom.vs x64 -kernal build/kernal_custom.rom -basic build/basic_custom.rom -moncommands build/symbols_custom.vs -1 $(TESTTAPE) -8 $(TESTDISK) @@ -554,6 +601,9 @@ test_generic: build/kernal_generic.rom build/basic_generic.rom build/symbols_gen test_generic_x128: build/kernal_generic.rom build/basic_generic.rom build/symbols_generic.vs x128 -go64 -kernal64 build/kernal_generic.rom -basic64 build/basic_generic.rom -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_generic_crt: build/kernal_generic_crt.rom build/basic_generic_crt.rom build/symbols_generic_crt.vs + x64 -kernal build/kernal_generic_crt.rom -basic build/basic_generic_crt.rom -moncommands build/symbols_generic_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) + test_testing: build/kernal_testing.rom build/basic_testing.rom build/symbols_testing.vs x64 -kernal build/kernal_testing.rom -basic build/basic_testing.rom -moncommands build/symbols_testing.vs -1 $(TESTTAPE) -8 $(TESTDISK) diff --git a/src/,,config_cx16.s b/src/,,config_cx16.s index 89e55b4a..b1f3b2c8 100644 --- a/src/,,config_cx16.s +++ b/src/,,config_cx16.s @@ -1,5 +1,5 @@ -;; #CONFIG# ID $04 ; should be 1 byte, different for each config file! +;; #CONFIG# ID $E0 ; should be 1 byte, different for each config file! ; ; Please read CONFIG.md before modifying this file! diff --git a/src/,,config_generic_crt.s b/src/,,config_generic_crt.s new file mode 100644 index 00000000..b673a23f --- /dev/null +++ b/src/,,config_generic_crt.s @@ -0,0 +1,132 @@ + +;; #CONFIG# ID $02 ; should be 1 byte, different for each config file! + +; +; Please read CONFIG.md before modifying this file! +; + +; Idea: +; - sane defaults for the Commodore 64/128 emulators +; - use RetroRelplay cartridge image as a ROM extension +; - do not enable features which are a significant compatibility risk + + + +; --- Hardware platform and brand + +;; #CONFIG# PLATFORM_COMMODORE_64 YES +;; #CONFIG# BRAND_GENERIC_CRT YES + + +; --- Processor instruction set + +;; #CONFIG# CPU_MOS_6502 YES +;; #CONFIG# CPU_DTV_6502 NO +;; #CONFIG# CPU_RCW_65C02 NO +;; #CONFIG# CPU_WDC_65C02 NO +;; #CONFIG# CPU_WDC_65816 NO +;; #CONFIG# CPU_CSG_65CE02 NO + + +; --- Memory model + +;; #CONFIG# MEMORY_MODEL_38K NO +;; #CONFIG# MEMORY_MODEL_46K NO +;; #CONFIG# MEMORY_MODEL_50K YES +;; #CONFIG# MEMORY_MODEL_60K NO + + +; --- IEC bus configuration + +;; #CONFIG# IEC YES +;; #CONFIG# IEC_DOLPHINDOS YES +;; #CONFIG# IEC_DOLPHINDOS_FAST YES +;; #CONFIG# IEC_JIFFYDOS YES +;; #CONFIG# IEC_JIFFYDOS_BLANK YES + + +; --- Tape deck configuration + +;; #CONFIG# TAPE_NORMAL YES +;; #CONFIG# TAPE_TURBO YES +;; #CONFIG# TAPE_AUTODETECT YES +;; #CONFIG# TAPE_NO_KEY_SENSE NO +;; #CONFIG# TAPE_NO_MOTOR_CONTROL NO + + +; --- Sound support + +;; #CONFIG# SID_2ND_ADDRESS NO +;; #CONFIG# SID_3RD_ADDRESS NO +;; #CONFIG# SID_D4XX NO +;; #CONFIG# SID_D5XX NO +;; #CONFIG# SID_D6XX NO +;; #CONFIG# SID_D7XX NO + + +; --- Keyboard settings + +;; #CONFIG# LEGACY_SCNKEY NO +;; #CONFIG# KEYBOARD_C128 NO +;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO +;; #CONFIG# KEY_REPEAT_DEFAULT NO +;; #CONFIG# KEY_REPEAT_ALWAYS NO +;; #CONFIG# KEY_FAST_SCAN YES +;; #CONFIG# JOY1_CURSOR NO +;; #CONFIG# JOY2_CURSOR NO + +;; #CONFIG# PROGRAMMABLE_KEYS YES + +;; #CONFIG# KEYCMD_RUN "\5FL" + +;; #CONFIG# KEYCMD_F1 "@8$" +;; #CONFIG# KEYCMD_F2 "LOAD" +;; #CONFIG# KEYCMD_F3 "@9$" +;; #CONFIG# KEYCMD_F4 "RUN:" +;; #CONFIG# KEYCMD_F5 "@10$" +;; #CONFIG# KEYCMD_F6 NO +;; #CONFIG# KEYCMD_F7 "@11$" +;; #CONFIG# KEYCMD_F8 NO + +;; #CONFIG# KEYCMD_HELP "LIST" + +;; #CONFIG# KEYCMD_F9 NO +;; #CONFIG# KEYCMD_F10 NO +;; #CONFIG# KEYCMD_F11 NO +;; #CONFIG# KEYCMD_F12 NO +;; #CONFIG# KEYCMD_F13 NO +;; #CONFIG# KEYCMD_F14 NO + + +; --- Screen editor + +;; #CONFIG# EDIT_STOPQUOTE YES +;; #CONFIG# EDIT_TABULATORS NO + + +; --- Software features + +;; #CONFIG# PANIC_SCREEN YES +;; #CONFIG# DOS_WEDGE YES +;; #CONFIG# TAPE_WEDGE YES +;; #CONFIG# TAPE_HEAD_ALIGN NO +;; #CONFIG# BCD_SAFE_INTERRUPTS YES + + +; --- Eye candy + +;; #CONFIG# COLORS_BRAND YES +;; #CONFIG# BANNER_SIMPLE NO +;; #CONFIG# BANNER_FANCY YES +;; #CONFIG# SHOW_FEATURES YES + + +; --- Debug options + +;; #CONFIG# DBG_STUBS_BRK NO +;; #CONFIG# DBG_PRINTF NO + + +; --- Other + +;; #CONFIG# COMPRESSION_LVL_2 NO diff --git a/src/aliases/,aliases_config.s b/src/aliases/,aliases_config.s index 2e47a455..d8610292 100644 --- a/src/aliases/,aliases_config.s +++ b/src/aliases/,aliases_config.s @@ -39,6 +39,7 @@ !set counter = 0 !ifdef CONFIG_BRAND_CUSTOM { !set counter = counter + 1 } !ifdef CONFIG_BRAND_GENERIC { !set counter = counter + 1 } +!ifdef CONFIG_BRAND_GENERIC_CRT { !set counter = counter + 1 } !ifdef CONFIG_BRAND_TESTING { !set counter = counter + 1 } !ifndef CONFIG_PLATFORM_COMMODORE_64 { @@ -51,6 +52,13 @@ !error "Please select exactly one CONFIG_BRAND_* option" } +!ifdef CONFIG_BRAND_GENERIC_CRT { !ifndef ROM_LAYOUT_CRT { + !error "CONFIG_BRAND_GENERIC_CRT needs cartridge extended ROM set and vice-versa" +}} +!ifdef CONFIG_BRAND_GENERIC { !ifndef ROM_LAYOUT_STD { + !error "CONFIG_BRAND_GENERIC needs standard ROM set and vice-versa" +}} + ; Check that processor configuration is correct diff --git a/src/kernal/iec_fast/jiffydos_load.s b/src/kernal/iec_fast/jiffydos_load.s index fc339414..12c59179 100644 --- a/src/kernal/iec_fast/jiffydos_load.s +++ b/src/kernal/iec_fast/jiffydos_load.s @@ -29,9 +29,16 @@ jiffydos_load: lda FA jsr TALK bcs jiffydos_load_error + + lda #$01 + sta CIA2_DDRB ; XXX for test only + lda #$61 jsr TKSA + lda #$02 + sta CIA2_DDRB ; XXX for test only + ; XXX flow below most likely takes too much time... ; Timing is critical, do not allow interrupts @@ -120,6 +127,9 @@ jiffydos_load_check_loop: jiffydos_load_error: + lda #$F3 + sta CIA2_DDRB ; XXX for test only + +panic $03 ; XXX finish the implementation From a595bfc944b4348ca90978cae0a33dcec927f719 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 19 Oct 2020 20:03:52 +0200 Subject: [PATCH 25/51] more work towards extended ROM cartridge support - makefile --- Makefile | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index ed1ff185..24e402b0 100644 --- a/Makefile +++ b/Makefile @@ -168,9 +168,6 @@ TARGET_LIST = build/chargen_openroms.rom \ $(TARGET_LIST_U64) \ $(TARGET_X16_x) -SEG_LIST_CRT = $(DIR_X16)/basic.seg_0 \ - $(DIR_X16)/kernal.seg_0 - SEG_LIST_M65 = $(DIR_M65)/basic.seg_0 \ $(DIR_M65)/basic.seg_1 \ $(DIR_M65)/dos.seg_1 \ @@ -290,9 +287,9 @@ $(DIR_TST)/OUTK_x.BIN $(DIR_TST)/KERNAL_combined.vs $(DIR_TST)/KERNAL_combined.s $(DIR_U64)/OUTK_x.BIN $(DIR_U64)/KERNAL_combined.vs $(DIR_U64)/KERNAL_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_U64) $(GEN_STR_U64) -$(DIR_CRT)/OUTB_0.BIN $(DIR_CRT)/BASIC_combined.vs: \ - $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_CRT) $(CRT_STR_GEN) $(DIR_CRT)/KERNAL_combined.sym -$(DIR_CRT)/OUTK_0.BIN $(DIR_CRT)/KERNAL_combined.vs $(DIR_CRT)/KERNAL_combined.sym: \ +$(DIR_CRT)/OUTB_0.BIN $(DIR_CRT)/BASIC_0_combined.vs: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_CRT) $(CRT_STR_CRT) $(DIR_CRT)/KERNAL_0_combined.sym +$(DIR_CRT)/OUTK_0.BIN $(DIR_CRT)/KERNAL_0_combined.vs $(DIR_CRT)/KERNAL_0_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_CRT) $(GEN_STR_CRT) $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/BASIC_0_combined.vs $(DIR_M65)/BASIC_0_combined.sym: \ @@ -337,6 +334,7 @@ $(TARGET_U64_K): $(DIR_U64)/OUTx_x.BIN build/symbols_custom.vs: $(DIR_CUS)/BASIC_combined.vs $(DIR_CUS)/KERNAL_combined.vs build/symbols_generic.vs: $(DIR_GEN)/BASIC_combined.vs $(DIR_GEN)/KERNAL_combined.vs +build/symbols_generic_crt.vs: $(DIR_CRT)/BASIC_0_combined.vs $(DIR_CRT)/KERNAL_0_combined.vs build/symbols_testing.vs: $(DIR_TST)/BASIC_combined.vs $(DIR_TST)/KERNAL_combined.vs build/symbols_ultimate64.vs: $(DIR_U64)/BASIC_combined.vs $(DIR_U64)/KERNAL_combined.vs @@ -500,12 +498,15 @@ $(DIR_X16)/kernal.seg_0: $(DIR_X16)/OUTx_0.BIN $(DIR_X16)/basic.seg_0: $(DIR_X16)/OUTx_0.BIN @dd if=$(DIR_X16)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none -build/kernal_generic_crt.rom: $(DIR_CRT)/OUTx_0.BIN +build/kernal0_generic_crt.rom: $(DIR_CRT)/OUTx_0.BIN @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=2 of=$@ status=none -build/basic_generic_crt.rom: $(DIR_CRT)/OUTx_0.BIN +build/basic0_generic_crt.rom: $(DIR_CRT)/OUTx_0.BIN @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none +build/symbols0_generic_crt.vs: + @sort $(DIR_CRT)/BASIC_0_combined.vs $(DIR_CRT)/KERNAL_0_combined.vs | uniq | grep -v "__" > $@ + build/kernal_hybrid.rom: kernal $(DIR_GEN)/OUTK_x.BIN @echo @echo $(HYBRID_WARNING) @@ -601,8 +602,8 @@ test_generic: build/kernal_generic.rom build/basic_generic.rom build/symbols_gen test_generic_x128: build/kernal_generic.rom build/basic_generic.rom build/symbols_generic.vs x128 -go64 -kernal64 build/kernal_generic.rom -basic64 build/basic_generic.rom -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_generic_crt: build/kernal_generic_crt.rom build/basic_generic_crt.rom build/symbols_generic_crt.vs - x64 -kernal build/kernal_generic_crt.rom -basic build/basic_generic_crt.rom -moncommands build/symbols_generic_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_generic_crt: build/kernal0_generic_crt.rom build/basic0_generic_crt.rom build/symbols0_generic_crt.vs + x64 -kernal build/kernal0_generic_crt.rom -basic build/basic0_generic_crt.rom -moncommands build/symbols0_generic_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) test_testing: build/kernal_testing.rom build/basic_testing.rom build/symbols_testing.vs x64 -kernal build/kernal_testing.rom -basic build/basic_testing.rom -moncommands build/symbols_testing.vs -1 $(TESTTAPE) -8 $(TESTDISK) From a69c00a513256b068df82e2a7d9eabdf122b762f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 19 Oct 2020 20:18:08 +0200 Subject: [PATCH 26/51] fixed Kernal for CRT memory layout --- Makefile | 10 +++++----- src/kernal/init/e5a0.vicii_init.s | 1 + src/kernal/init/fd50.ramtas.s | 1 + src/kernal/init/fda3.ioinit.s | 1 + src/kernal/tape/load_tape_normal.s | 1 + src/kernal/tape/load_tape_turbo.s | 1 + src/kernal/tape/tape_common.s | 1 + src/kernal/tape/tape_common_autodetect.s | 1 + src/kernal/tape/tape_common_clean_sid.s | 1 + src/kernal/tape/tape_common_ditch_verify.s | 1 + src/kernal/tape/tape_common_get_pulse.s | 1 + src/kernal/tape/tape_common_motor.s | 1 + src/kernal/tape/tape_common_prepare_cia.s | 1 + src/kernal/tape/tape_common_screen.s | 1 + src/kernal/tape/tape_head_align.s | 1 + src/kernal/tape/tape_head_align_gen_code.s | 1 + src/kernal/tape/tape_head_align_get_pulse.s | 1 + src/kernal/tape/tape_head_align_help.s | 1 + src/kernal/tape/tape_head_align_irq.s | 1 + src/kernal/tape/tape_normal_calibrate.s | 1 + src/kernal/tape/tape_normal_get_bit.s | 1 + src/kernal/tape/tape_normal_get_byte.s | 1 + src/kernal/tape/tape_normal_get_data_1.s | 1 + src/kernal/tape/tape_normal_get_data_2.s | 1 + src/kernal/tape/tape_normal_get_marker.s | 1 + src/kernal/tape/tape_normal_get_pilot.s | 1 + src/kernal/tape/tape_normal_sync.s | 1 + src/kernal/tape/tape_normal_update_checksum.s | 1 + src/kernal/tape/tape_turbo_bytestore.s | 1 + src/kernal/tape/tape_turbo_get_bit.s | 1 + src/kernal/tape/tape_turbo_get_byte.s | 1 + src/kernal/tape/tape_turbo_sync.s | 1 + src/kernal/tape/tape_turbo_sync_first.s | 1 + 33 files changed, 37 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 24e402b0..f40814e4 100644 --- a/Makefile +++ b/Makefile @@ -498,13 +498,13 @@ $(DIR_X16)/kernal.seg_0: $(DIR_X16)/OUTx_0.BIN $(DIR_X16)/basic.seg_0: $(DIR_X16)/OUTx_0.BIN @dd if=$(DIR_X16)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none -build/kernal0_generic_crt.rom: $(DIR_CRT)/OUTx_0.BIN +build/kernal_generic_crt.rom: $(DIR_CRT)/OUTx_0.BIN @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=2 of=$@ status=none -build/basic0_generic_crt.rom: $(DIR_CRT)/OUTx_0.BIN +build/basic_generic_crt.rom: $(DIR_CRT)/OUTx_0.BIN @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none -build/symbols0_generic_crt.vs: +build/symbols_generic_crt.vs: @sort $(DIR_CRT)/BASIC_0_combined.vs $(DIR_CRT)/KERNAL_0_combined.vs | uniq | grep -v "__" > $@ build/kernal_hybrid.rom: kernal $(DIR_GEN)/OUTK_x.BIN @@ -602,8 +602,8 @@ test_generic: build/kernal_generic.rom build/basic_generic.rom build/symbols_gen test_generic_x128: build/kernal_generic.rom build/basic_generic.rom build/symbols_generic.vs x128 -go64 -kernal64 build/kernal_generic.rom -basic64 build/basic_generic.rom -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_generic_crt: build/kernal0_generic_crt.rom build/basic0_generic_crt.rom build/symbols0_generic_crt.vs - x64 -kernal build/kernal0_generic_crt.rom -basic build/basic0_generic_crt.rom -moncommands build/symbols0_generic_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_generic_crt: build/kernal_generic_crt.rom build/basic_generic_crt.rom build/symbols_generic_crt.vs + x64 -kernal build/kernal_generic_crt.rom -basic build/basic_generic_crt.rom -moncommands build/symbols_generic_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) test_testing: build/kernal_testing.rom build/basic_testing.rom build/symbols_testing.vs x64 -kernal build/kernal_testing.rom -basic build/basic_testing.rom -moncommands build/symbols_testing.vs -1 $(TESTTAPE) -8 $(TESTDISK) diff --git a/src/kernal/init/e5a0.vicii_init.s b/src/kernal/init/e5a0.vicii_init.s index 43876303..6a0aa9ee 100644 --- a/src/kernal/init/e5a0.vicii_init.s +++ b/src/kernal/init/e5a0.vicii_init.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT * #TAKE ;; #LAYOUT# M65 KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE-FLOAT ;; #LAYOUT# X16 * #IGNORE diff --git a/src/kernal/init/fd50.ramtas.s b/src/kernal/init/fd50.ramtas.s index d68d3f16..60197f82 100644 --- a/src/kernal/init/fd50.ramtas.s +++ b/src/kernal/init/fd50.ramtas.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE-FLOAT ;; #LAYOUT# X16 KERNAL_0 #TAKE diff --git a/src/kernal/init/fda3.ioinit.s b/src/kernal/init/fda3.ioinit.s index 204b963a..6d03d4d3 100644 --- a/src/kernal/init/fda3.ioinit.s +++ b/src/kernal/init/fda3.ioinit.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE-FLOAT ;; #LAYOUT# X16 * #IGNORE diff --git a/src/kernal/tape/load_tape_normal.s b/src/kernal/tape/load_tape_normal.s index f4478c30..f0fdf8f3 100644 --- a/src/kernal/tape/load_tape_normal.s +++ b/src/kernal/tape/load_tape_normal.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/load_tape_turbo.s b/src/kernal/tape/load_tape_turbo.s index c4f08877..6634b13d 100644 --- a/src/kernal/tape/load_tape_turbo.s +++ b/src/kernal/tape/load_tape_turbo.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_common.s b/src/kernal/tape/tape_common.s index dec74dff..7c5e212b 100644 --- a/src/kernal/tape/tape_common.s +++ b/src/kernal/tape/tape_common.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_common_autodetect.s b/src/kernal/tape/tape_common_autodetect.s index 0a592b5e..f82a33e8 100644 --- a/src/kernal/tape/tape_common_autodetect.s +++ b/src/kernal/tape/tape_common_autodetect.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_common_clean_sid.s b/src/kernal/tape/tape_common_clean_sid.s index 0c44d2bd..0b646f87 100644 --- a/src/kernal/tape/tape_common_clean_sid.s +++ b/src/kernal/tape/tape_common_clean_sid.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_common_ditch_verify.s b/src/kernal/tape/tape_common_ditch_verify.s index 65514982..9552c402 100644 --- a/src/kernal/tape/tape_common_ditch_verify.s +++ b/src/kernal/tape/tape_common_ditch_verify.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_common_get_pulse.s b/src/kernal/tape/tape_common_get_pulse.s index 00591f0e..0e6607aa 100644 --- a/src/kernal/tape/tape_common_get_pulse.s +++ b/src/kernal/tape/tape_common_get_pulse.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_common_motor.s b/src/kernal/tape/tape_common_motor.s index dc6c9171..b4b9d72a 100644 --- a/src/kernal/tape/tape_common_motor.s +++ b/src/kernal/tape/tape_common_motor.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# * KERNAL_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_common_prepare_cia.s b/src/kernal/tape/tape_common_prepare_cia.s index d6977c05..b84de264 100644 --- a/src/kernal/tape/tape_common_prepare_cia.s +++ b/src/kernal/tape/tape_common_prepare_cia.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_common_screen.s b/src/kernal/tape/tape_common_screen.s index da8f04fe..b2c538a6 100644 --- a/src/kernal/tape/tape_common_screen.s +++ b/src/kernal/tape/tape_common_screen.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_head_align.s b/src/kernal/tape/tape_head_align.s index 12ce37ab..33692845 100644 --- a/src/kernal/tape/tape_head_align.s +++ b/src/kernal/tape/tape_head_align.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_head_align_gen_code.s b/src/kernal/tape/tape_head_align_gen_code.s index 30e4834a..960864bb 100644 --- a/src/kernal/tape/tape_head_align_gen_code.s +++ b/src/kernal/tape/tape_head_align_gen_code.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_head_align_get_pulse.s b/src/kernal/tape/tape_head_align_get_pulse.s index df1cacd4..2fea2213 100644 --- a/src/kernal/tape/tape_head_align_get_pulse.s +++ b/src/kernal/tape/tape_head_align_get_pulse.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_head_align_help.s b/src/kernal/tape/tape_head_align_help.s index 243dab12..6ece9b0a 100644 --- a/src/kernal/tape/tape_head_align_help.s +++ b/src/kernal/tape/tape_head_align_help.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_head_align_irq.s b/src/kernal/tape/tape_head_align_irq.s index 0ff660c3..e109051e 100644 --- a/src/kernal/tape/tape_head_align_irq.s +++ b/src/kernal/tape/tape_head_align_irq.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_calibrate.s b/src/kernal/tape/tape_normal_calibrate.s index 6dca34dc..63e4e70c 100644 --- a/src/kernal/tape/tape_normal_calibrate.s +++ b/src/kernal/tape/tape_normal_calibrate.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_get_bit.s b/src/kernal/tape/tape_normal_get_bit.s index fd3b175d..4d9cddd0 100644 --- a/src/kernal/tape/tape_normal_get_bit.s +++ b/src/kernal/tape/tape_normal_get_bit.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_get_byte.s b/src/kernal/tape/tape_normal_get_byte.s index 35558dee..e4f40303 100644 --- a/src/kernal/tape/tape_normal_get_byte.s +++ b/src/kernal/tape/tape_normal_get_byte.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_get_data_1.s b/src/kernal/tape/tape_normal_get_data_1.s index 9d3e49fd..eade4958 100644 --- a/src/kernal/tape/tape_normal_get_data_1.s +++ b/src/kernal/tape/tape_normal_get_data_1.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_get_data_2.s b/src/kernal/tape/tape_normal_get_data_2.s index 9f5fffc1..57517a7c 100644 --- a/src/kernal/tape/tape_normal_get_data_2.s +++ b/src/kernal/tape/tape_normal_get_data_2.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_get_marker.s b/src/kernal/tape/tape_normal_get_marker.s index b3f62525..96644c1e 100644 --- a/src/kernal/tape/tape_normal_get_marker.s +++ b/src/kernal/tape/tape_normal_get_marker.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_get_pilot.s b/src/kernal/tape/tape_normal_get_pilot.s index 40be7e60..12103c02 100644 --- a/src/kernal/tape/tape_normal_get_pilot.s +++ b/src/kernal/tape/tape_normal_get_pilot.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_sync.s b/src/kernal/tape/tape_normal_sync.s index 19cc3b83..5b389d05 100644 --- a/src/kernal/tape/tape_normal_sync.s +++ b/src/kernal/tape/tape_normal_sync.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_update_checksum.s b/src/kernal/tape/tape_normal_update_checksum.s index 8f5010ec..9749f6ea 100644 --- a/src/kernal/tape/tape_normal_update_checksum.s +++ b/src/kernal/tape/tape_normal_update_checksum.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_turbo_bytestore.s b/src/kernal/tape/tape_turbo_bytestore.s index e178825f..ab6c6ce2 100644 --- a/src/kernal/tape/tape_turbo_bytestore.s +++ b/src/kernal/tape/tape_turbo_bytestore.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_turbo_get_bit.s b/src/kernal/tape/tape_turbo_get_bit.s index 52416132..26ac038f 100644 --- a/src/kernal/tape/tape_turbo_get_bit.s +++ b/src/kernal/tape/tape_turbo_get_bit.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_turbo_get_byte.s b/src/kernal/tape/tape_turbo_get_byte.s index 584bf9f9..c0a78007 100644 --- a/src/kernal/tape/tape_turbo_get_byte.s +++ b/src/kernal/tape/tape_turbo_get_byte.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_turbo_sync.s b/src/kernal/tape/tape_turbo_sync.s index 788d3b1b..2fd6ca8c 100644 --- a/src/kernal/tape/tape_turbo_sync.s +++ b/src/kernal/tape/tape_turbo_sync.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_turbo_sync_first.s b/src/kernal/tape/tape_turbo_sync_first.s index 6ef93293..f5a42fd7 100644 --- a/src/kernal/tape/tape_turbo_sync_first.s +++ b/src/kernal/tape/tape_turbo_sync_first.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE From 1097fef3ad43d73c91eab557d39f6b02bb2d7581 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 19 Oct 2020 20:30:30 +0200 Subject: [PATCH 27/51] fixed BASIC for CRT memory layout --- src/basic/assets/packed_as_1n.s | 1 + src/basic/assets/packed_as_3n.s | 1 + src/basic/assets/packed_dictionary.s | 1 + src/basic/assets/packed_errors.s | 1 + src/basic/assets/packed_keywords.s | 1 + src/basic/assets/packed_keywords_01.s | 1 + src/basic/assets/packed_keywords_02.s | 1 + src/basic/assets/packed_keywords_03.s | 1 + src/basic/assets/packed_misc.s | 1 + src/basic/assets/startup_banner.s | 3 +++ src/basic/engine_editor/a533.linkprg.s | 1 + src/basic/engine_editor/tk_cut_away.s | 1 + src/basic/engine_editor/tk_pack.s | 1 + src/basic/engine_editor/tk_search.s | 1 + src/basic/engine_editor/tk_shorten.s | 1 + src/basic/engine_runtime/do_new_clr_restore.s | 1 + src/basic/init/initmsg_bytes_free.s | 1 + src/basic/init/initmsg_real.s | 1 + src/basic/print/list_single_line.s | 1 + src/basic/print/print_features.s | 1 + src/basic/print/print_packed_dict_string.s | 1 + src/basic/print/print_packed_freq_string.s | 1 + src/basic/print/print_packed_search.s | 1 + src/basic/wedge/wedge_dos.s | 1 + 24 files changed, 26 insertions(+) diff --git a/src/basic/assets/packed_as_1n.s b/src/basic/assets/packed_as_1n.s index 4deeadcf..4fae3774 100644 --- a/src/basic/assets/packed_as_1n.s +++ b/src/basic/assets/packed_as_1n.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_as_3n.s b/src/basic/assets/packed_as_3n.s index f7e85a7c..1447af4d 100644 --- a/src/basic/assets/packed_as_3n.s +++ b/src/basic/assets/packed_as_3n.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_dictionary.s b/src/basic/assets/packed_dictionary.s index f53559cc..ed6563ad 100644 --- a/src/basic/assets/packed_dictionary.s +++ b/src/basic/assets/packed_dictionary.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_errors.s b/src/basic/assets/packed_errors.s index ded0d7e1..eda0257e 100644 --- a/src/basic/assets/packed_errors.s +++ b/src/basic/assets/packed_errors.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_keywords.s b/src/basic/assets/packed_keywords.s index df83fd3b..0f01aab6 100644 --- a/src/basic/assets/packed_keywords.s +++ b/src/basic/assets/packed_keywords.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_keywords_01.s b/src/basic/assets/packed_keywords_01.s index b743b433..c4260b5d 100644 --- a/src/basic/assets/packed_keywords_01.s +++ b/src/basic/assets/packed_keywords_01.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_keywords_02.s b/src/basic/assets/packed_keywords_02.s index 34c1334b..cfe22be5 100644 --- a/src/basic/assets/packed_keywords_02.s +++ b/src/basic/assets/packed_keywords_02.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_keywords_03.s b/src/basic/assets/packed_keywords_03.s index d7f57653..2b633ed2 100644 --- a/src/basic/assets/packed_keywords_03.s +++ b/src/basic/assets/packed_keywords_03.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_misc.s b/src/basic/assets/packed_misc.s index d87ddb3b..52e38c48 100644 --- a/src/basic/assets/packed_misc.s +++ b/src/basic/assets/packed_misc.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/startup_banner.s b/src/basic/assets/startup_banner.s index b0f52cb6..9c37434c 100644 --- a/src/basic/assets/startup_banner.s +++ b/src/basic/assets/startup_banner.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE @@ -14,6 +15,8 @@ +CONFIG_BRAND_CUSTOM } else ifdef CONFIG_BRAND_GENERIC { !pet "open roms generic build" +} else ifdef CONFIG_BRAND_GENERIC_CRT { + !pet "open roms generic rom+crt build" } else ifdef CONFIG_BRAND_TESTING { !pet "open roms testing build" } else ifdef CONFIG_MB_U64 { diff --git a/src/basic/engine_editor/a533.linkprg.s b/src/basic/engine_editor/a533.linkprg.s index f13fd6eb..8679e6a2 100644 --- a/src/basic/engine_editor/a533.linkprg.s +++ b/src/basic/engine_editor/a533.linkprg.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE-FLOAT ;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 diff --git a/src/basic/engine_editor/tk_cut_away.s b/src/basic/engine_editor/tk_cut_away.s index 0eeb2de3..3df3fa8f 100644 --- a/src/basic/engine_editor/tk_cut_away.s +++ b/src/basic/engine_editor/tk_cut_away.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/engine_editor/tk_pack.s b/src/basic/engine_editor/tk_pack.s index 1b4c9d70..6ecc45e7 100644 --- a/src/basic/engine_editor/tk_pack.s +++ b/src/basic/engine_editor/tk_pack.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/engine_editor/tk_search.s b/src/basic/engine_editor/tk_search.s index 49be5178..dbe60081 100644 --- a/src/basic/engine_editor/tk_search.s +++ b/src/basic/engine_editor/tk_search.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/engine_editor/tk_shorten.s b/src/basic/engine_editor/tk_shorten.s index 10ed762c..2a62d4af 100644 --- a/src/basic/engine_editor/tk_shorten.s +++ b/src/basic/engine_editor/tk_shorten.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/engine_runtime/do_new_clr_restore.s b/src/basic/engine_runtime/do_new_clr_restore.s index 9a96cc25..fd340c13 100644 --- a/src/basic/engine_runtime/do_new_clr_restore.s +++ b/src/basic/engine_runtime/do_new_clr_restore.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 * #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/init/initmsg_bytes_free.s b/src/basic/init/initmsg_bytes_free.s index 379365bf..59f8ef86 100644 --- a/src/basic/init/initmsg_bytes_free.s +++ b/src/basic/init/initmsg_bytes_free.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/init/initmsg_real.s b/src/basic/init/initmsg_real.s index 03305aed..06f197cc 100644 --- a/src/basic/init/initmsg_real.s +++ b/src/basic/init/initmsg_real.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/print/list_single_line.s b/src/basic/print/list_single_line.s index 797b58ea..19b2ca62 100644 --- a/src/basic/print/list_single_line.s +++ b/src/basic/print/list_single_line.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 * #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/print/print_features.s b/src/basic/print/print_features.s index 9f706da9..0dc34f6b 100644 --- a/src/basic/print/print_features.s +++ b/src/basic/print/print_features.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/print/print_packed_dict_string.s b/src/basic/print/print_packed_dict_string.s index a0bb463e..fe457d73 100644 --- a/src/basic/print/print_packed_dict_string.s +++ b/src/basic/print/print_packed_dict_string.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/print/print_packed_freq_string.s b/src/basic/print/print_packed_freq_string.s index 8450317e..996aabc3 100644 --- a/src/basic/print/print_packed_freq_string.s +++ b/src/basic/print/print_packed_freq_string.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 * #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/print/print_packed_search.s b/src/basic/print/print_packed_search.s index 8012727c..d378ec2d 100644 --- a/src/basic/print/print_packed_search.s +++ b/src/basic/print/print_packed_search.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/wedge/wedge_dos.s b/src/basic/wedge/wedge_dos.s index f451d4a6..91ef1552 100644 --- a/src/basic/wedge/wedge_dos.s +++ b/src/basic/wedge/wedge_dos.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# * BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE From 3e373fd9b9a34fcd099b77904a34eea47210e85e Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 19 Oct 2020 20:48:19 +0200 Subject: [PATCH 28/51] adapted string generator to CRT memory layout --- tools/generate_strings.cc | 392 ++++++++++++++++++++------------------ 1 file changed, 206 insertions(+), 186 deletions(-) diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index 65690641..cd64542e 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -28,6 +28,7 @@ std::string CMD_cnfFile = ""; typedef struct StringEntry { bool enabledSTD; // whether enabled for standard build + bool enabledCRT; // whether enabled for standard build with extra ROM cartridge bool enabledM65; // whether enabled for Mega 65 build bool enabledU64; // whether enabled for Ultimate 64 build bool enabledX16; // whether enabled for Commander X16 build @@ -92,117 +93,116 @@ typedef std::vector StringEncodedList; const StringEntryList GLOBAL_Keywords_V2 = { ListType::KEYWORDS, "keywords_V2", { - // STD M65 U64 X16 - { true, true, true, true, "KV2_80", "END", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_81", "FOR", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_82", "NEXT", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_83", "DATA", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_84", "INPUT#", 2 }, // https://www.atariarchives.org/creativeatari/Using_Disks_With_Atari_Basic.php - { true, true, true, true, "KV2_85", "INPUT", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_86", "DIM", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_87", "READ", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_88", "LET", 2 }, // https://en.wikipedia.org/wiki/Atari_BASIC - { true, true, true, true, "KV2_89", "GOTO", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_8A", "RUN", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_8B", "IF", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_8C", "RESTORE", 3 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_8D", "GOSUB", 3 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_8E", "RETURN", 3 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_8F", "REM", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_90", "STOP", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_91", "ON", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_92", "WAIT", 2 }, // http://www.picaxe.com/BASIC-Commands/Time-Delays/wait/ - { true, true, true, true, "KV2_93", "LOAD", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_94", "SAVE", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_95", "VERIFY", 2 }, // https://en.wikipedia.org/wiki/Sinclair_BASIC - { true, true, true, true, "KV2_96", "DEF", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_97", "POKE", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_98", "PRINT#", 2 }, // https://www.atariarchives.org/creativeatari/Using_Disks_With_Atari_Basic.php - { true, true, true, true, "KV2_99", "PRINT", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_9A", "CONT", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_9B", "LIST", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_9C", "CLR", 2 }, // Apple I Replica Creation: Back to the Garage, p125 - { true, true, true, true, "KV2_9D", "CMD", 2 }, // https://en.wikipedia.org/wiki/List_of_DOS_commands - { true, true, true, true, "KV2_9E", "SYS", 2 }, // https://www.lifewire.com/dos-commands-4070427 - { true, true, true, true, "KV2_9F", "OPEN", 2 }, // https://www.atariarchives.org/creativeatari/Using_Disks_With_Atari_Basic.php - // STD M65 U64 X16 - { true, true, true, true, "KV2_A0", "CLOSE", 3 }, // https://www.atariarchives.org/creativeatari/Using_Disks_With_Atari_Basic.php - { true, true, true, true, "KV2_A1", "GET", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_A2", "NEW", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_A3", "TAB(", 2 }, // http://www.antonis.de/qbebooks/gwbasman/tab.html - { true, true, true, true, "KV2_A4", "TO", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_A5", "FN", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_A6", "SPC(", 2 }, // http://www.antonis.de/qbebooks/gwbasman/spc.html - { true, true, true, true, "KV2_A7", "THEN", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_A8", "NOT", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_A9", "STEP", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_AA", "+", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_AB", "-", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_AC", "*", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_AD", "/", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_AE", "^", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_AF", "AND", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_B0", "OR", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_B1", ">", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_B2", "=", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_B3", "<", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_B4", "SGN", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_B5", "INT", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_B6", "ABS", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_B7", "USR", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_B8", "FRE", 2 }, // http://www.antonis.de/qbebooks/gwbasman/fre.html - { true, true, true, true, "KV2_B9", "POS", 0 }, // http://www.antonis.de/qbebooks/gwbasman/pos.html - { true, true, true, true, "KV2_BA", "SQR", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_BB", "RND", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_BC", "LOG", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_BD", "EXP", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_BE", "COS", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_BF", "SIN", 2 }, // https://www.landsnail.com/a2ref.htm - // STD M65 U64 X16 - { true, true, true, true, "KV2_C0", "TAN", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_C1", "ATN", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_C2", "PEEK", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_C3", "LEN", 0 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_C4", "STR$", 3 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_C5", "VAL", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_C6", "ASC", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_C7", "CHR$", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_C8", "LEFT$", 3 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_C9", "RIGHT$", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_CA", "MID$", 2 }, // https://www.landsnail.com/a2ref.htm - { true, true, true, true, "KV2_CB", "GO", 0 }, // https://en.wikipedia.org/wiki/Goto + // STD CRT M65 U64 X16 + { true, true, true, true, true, "KV2_80", "END", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_81", "FOR", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_82", "NEXT", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_83", "DATA", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_84", "INPUT#", 2 }, // https://www.atariarchives.org/creativeatari/Using_Disks_With_Atari_Basic.php + { true, true, true, true, true, "KV2_85", "INPUT", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_86", "DIM", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_87", "READ", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_88", "LET", 2 }, // https://en.wikipedia.org/wiki/Atari_BASIC + { true, true, true, true, true, "KV2_89", "GOTO", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_8A", "RUN", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_8B", "IF", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_8C", "RESTORE", 3 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_8D", "GOSUB", 3 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_8E", "RETURN", 3 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_8F", "REM", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_90", "STOP", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_91", "ON", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_92", "WAIT", 2 }, // http://www.picaxe.com/BASIC-Commands/Time-Delays/wait/ + { true, true, true, true, true, "KV2_93", "LOAD", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_94", "SAVE", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_95", "VERIFY", 2 }, // https://en.wikipedia.org/wiki/Sinclair_BASIC + { true, true, true, true, true, "KV2_96", "DEF", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_97", "POKE", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_98", "PRINT#", 2 }, // https://www.atariarchives.org/creativeatari/Using_Disks_With_Atari_Basic.php + { true, true, true, true, true, "KV2_99", "PRINT", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_9A", "CONT", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_9B", "LIST", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_9C", "CLR", 2 }, // Apple I Replica Creation: Back to the Garage, p125 + { true, true, true, true, true, "KV2_9D", "CMD", 2 }, // https://en.wikipedia.org/wiki/List_of_DOS_commands + { true, true, true, true, true, "KV2_9E", "SYS", 2 }, // https://www.lifewire.com/dos-commands-4070427 + { true, true, true, true, true, "KV2_9F", "OPEN", 2 }, // https://www.atariarchives.org/creativeatari/Using_Disks_With_Atari_Basic.php + // STD CRT M65 U64 X16 + { true, true, true, true, true, "KV2_A0", "CLOSE", 3 }, // https://www.atariarchives.org/creativeatari/Using_Disks_With_Atari_Basic.php + { true, true, true, true, true, "KV2_A1", "GET", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_A2", "NEW", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_A3", "TAB(", 2 }, // http://www.antonis.de/qbebooks/gwbasman/tab.html + { true, true, true, true, true, "KV2_A4", "TO", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_A5", "FN", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_A6", "SPC(", 2 }, // http://www.antonis.de/qbebooks/gwbasman/spc.html + { true, true, true, true, true, "KV2_A7", "THEN", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_A8", "NOT", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_A9", "STEP", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_AA", "+", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_AB", "-", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_AC", "*", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_AD", "/", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_AE", "^", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_AF", "AND", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_B0", "OR", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_B1", ">", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_B2", "=", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_B3", "<", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_B4", "SGN", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_B5", "INT", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_B6", "ABS", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_B7", "USR", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_B8", "FRE", 2 }, // http://www.antonis.de/qbebooks/gwbasman/fre.html + { true, true, true, true, true, "KV2_B9", "POS", 0 }, // http://www.antonis.de/qbebooks/gwbasman/pos.html + { true, true, true, true, true, "KV2_BA", "SQR", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_BB", "RND", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_BC", "LOG", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_BD", "EXP", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_BE", "COS", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_BF", "SIN", 2 }, // https://www.landsnail.com/a2ref.htm + // STD CRT M65 U64 X16 + { true, true, true, true, true, "KV2_C0", "TAN", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_C1", "ATN", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_C2", "PEEK", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_C3", "LEN", 0 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_C4", "STR$", 3 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_C5", "VAL", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_C6", "ASC", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_C7", "CHR$", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_C8", "LEFT$", 3 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_C9", "RIGHT$", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_CA", "MID$", 2 }, // https://www.landsnail.com/a2ref.htm + { true, true, true, true, true, "KV2_CB", "GO", 0 }, // https://en.wikipedia.org/wiki/Goto } }; // extended BASIC keywords - list reserved for small BASIC commands, suitable for inclusion in non-extended ROMs const StringEntryList GLOBAL_Keywords_01 = { ListType::KEYWORDS, "keywords_01", { - // STD M65 U64 X16 - { true, true, true, true, "K01_01", "SLOW", }, // https://en.wikipedia.org/wiki/Sinclair_BASIC - ZX81 variant - { true, true, true, true, "K01_02", "FAST", }, // https://en.wikipedia.org/wiki/Sinclair_BASIC - ZX81 variant - { true, true, true, true, "K01_03", "OLD", }, // Not present in CBM BASIC dialects, but common to some extensions (*) + // STD CRT M65 U64 X16 + { true, true, true, true, true, "K01_01", "SLOW", }, // https://en.wikipedia.org/wiki/Sinclair_BASIC - ZX81 variant + { true, true, true, true, true, "K01_02", "FAST", }, // https://en.wikipedia.org/wiki/Sinclair_BASIC - ZX81 variant + { true, true, true, true, true, "K01_03", "OLD", }, // Not present in CBM BASIC dialects, but common to some extensions (*) // (*) see https://sourceforge.net/p/vice-emu/code/HEAD/tree/trunk/vice/src/petcat.c // NOTE! These commands are temporarily placed here, they should be a part of list 02! - { true, true, true, true, "K02_01", "MERGE", }, // Not present in CBM BASIC dialects, but common to some extensions (*) - { true, true, true, true, "K02_02", "BLOAD", }, // http://www.antonis.de/qbebooks/gwbasman/bload.html - { true, true, true, true, "K02_03", "BSAVE", }, // http://www.antonis.de/qbebooks/gwbasman/bsave.html - { true, true, true, true, "K02_04", "BVERIFY", }, - { true, true, true, true, "K02_05", "CLEAR", }, // Not present in CBM BASIC dialects, Open ROMs specific - { true, true, true, true, "K02_06", "DISPOSE", }, // Not present in CBM BASIC dialects, Open ROMs specific + { true, true, true, true, true, "K02_01", "MERGE", }, // Not present in CBM BASIC dialects, but common to some extensions (*) + { true, true, true, true, true, "K02_02", "BLOAD", }, // http://www.antonis.de/qbebooks/gwbasman/bload.html + { true, true, true, true, true, "K02_03", "BSAVE", }, // http://www.antonis.de/qbebooks/gwbasman/bsave.html + { true, true, true, true, true, "K02_04", "BVERIFY", }, + { true, true, true, true, true, "K02_05", "CLEAR", }, // Not present in CBM BASIC dialects, Open ROMs specific + { true, true, true, true, true, "K02_06", "DISPOSE", }, // Not present in CBM BASIC dialects, Open ROMs specific } }; // extended BASIC keywords - list reserved for generic (mostly hardware independent) BASIC commands const StringEntryList GLOBAL_Keywords_02 = { ListType::KEYWORDS, "keywords_02", { - // STD M65 U64 X16 - - { false, true, false, false, "K02_07", "COLD", }, // Not present in CBM BASIC dialects, but common to some extensions (*) - { false, true, false, false, "K02_08", "MEM", }, // Not present in CBM BASIC dialects, Open ROMs specific - { false, true, false, false, "K02_09", "SYSINFO", }, // Not present in CBM BASIC dialects, Open ROMs specific + // STD CRT M65 U64 X16 + { false, false, true, false, false, "K02_07", "COLD", }, // Not present in CBM BASIC dialects, but common to some extensions (*) + { false, false, true, false, false, "K02_08", "MEM", }, // Not present in CBM BASIC dialects, Open ROMs specific + { false, false, true, false, false, "K02_09", "SYSINFO", }, // Not present in CBM BASIC dialects, Open ROMs specific // (*) see https://sourceforge.net/p/vice-emu/code/HEAD/tree/trunk/vice/src/petcat.c } }; @@ -211,9 +211,8 @@ const StringEntryList GLOBAL_Keywords_02 = { ListType::KEYWORDS, "keywords_02", const StringEntryList GLOBAL_Keywords_03_M65 = { ListType::KEYWORDS, "keywords_03", { - // STD M65 U64 X16 - - { false, true, false, false, "K03_01", "TEST", }, // Not present in CBM BASIC dialects, Open ROMs specific + // STD CRT M65 U64 X16 + { false, false, true, false, false, "K03_01", "TEST", }, // Not present in CBM BASIC dialects, Open ROMs specific } }; @@ -232,98 +231,98 @@ const StringEntryList GLOBAL_Keywords_03_M65 = { ListType::KEYWORDS, "keywords_ const StringEntryList GLOBAL_Errors = { ListType::STRINGS_BASIC, "errors", { - // STD M65 U64 X16 --- error strings compatible with CBM BASIC V2 - { true, true, true, true, "EV2_01", "TOO MANY FILES" }, - { true, true, true, true, "EV2_02", "FILE OPEN" }, - { true, true, true, true, "EV2_03", "FILE NOT OPEN" }, - { true, true, true, true, "EV2_04", "FILE NOT FOUND" }, - { true, true, true, true, "EV2_05", "DEVICE NOT PRESENT" }, - { true, true, true, true, "EV2_06", "NOT INPUT FILE" }, - { true, true, true, true, "EV2_07", "NOT OUTPUT FILE" }, - { true, true, true, true, "EV2_08", "MISSING FILENAME" }, - { true, true, true, true, "EV2_09", "ILLEGAL DEVICE NUMBER" }, - { true, true, true, true, "EV2_0A", "NEXT WITHOUT FOR" }, - { true, true, true, true, "EV2_0B", "SYNTAX" }, - { true, true, true, true, "EV2_0C", "RETURN WITHOUT GOSUB" }, - { true, true, true, true, "EV2_0D", "OUT OF DATA" }, - { true, true, true, true, "EV2_0E", "ILLEGAL QUANTITY" }, - { true, true, true, true, "EV2_0F", "OVERFLOW" }, - { true, true, true, true, "EV2_10", "OUT OF MEMORY" }, - { true, true, true, true, "EV2_11", "UNDEF\'D STATEMENT" }, - { true, true, true, true, "EV2_12", "BAD SUBSCRIPT" }, - { true, true, true, true, "EV2_13", "REDIM\'D ARRAY" }, - { true, true, true, true, "EV2_14", "DIVISION BY ZERO" }, - { true, true, true, true, "EV2_15", "ILLEGAL DIRECT" }, - { true, true, true, true, "EV2_16", "TYPE MISMATCH" }, - { true, true, true, true, "EV2_17", "STRING TOO LONG" }, - { true, true, true, true, "EV2_18", "FILE DATA" }, - { true, true, true, true, "EV2_19", "FORMULA TOO COMPLEX" }, - { true, true, true, true, "EV2_1A", "CAN\'T CONTINUE" }, - { true, true, true, true, "EV2_1B", "UNDEF\'D FUNCTION" }, - { true, true, true, true, "EV2_1C", "VERIFY" }, - { true, true, true, true, "EV2_1D", "LOAD" }, - { true, true, true, true, "EV2_1E", "BREAK" }, - // STD M65 U64 X16 --- error strings compatible with CBM BASIC V7 - { false, false, false, false, "EV7_1F", "CAN'T RESUME" }, // not used for now - { false, false, false, false, "EV7_20", "LOOP NOT FOUND" }, // not used for now - { false, false, false, false, "EV7_21", "LOOP WITHOUT DO" }, // not used for now - { true, true, true, true, "EV7_22", "DIRECT MODE ONLY" }, - { false, false, false, false, "EV7_23", "NO GRAPHICS AREA" }, // not used for now - { false, false, false, false, "EV7_24", "BAD DISK" }, // not used for now - { false, false, false, false, "EV7_25", "BEND NOT FOUND" }, // not used for now - { true, true, true, true, "EV7_26", "LINE NUMBER TOO LARGE" }, - { false, false, false, false, "EV7_27", "UNRESOLVED REFERENCE" }, // not used for now - { true, true, true, true, "EV7_28", "NOT IMPLEMENTED" }, // this message actually differs from the CBM one - { false, false, false, false, "EV7_29", "FILE READ" }, // not used for now - // STD M65 U64 X16 --- error strings specific to Open ROMs, not present in CBM BASIC dialects - { true, true, true, true, "EOR_2A", "MEMORY CORRUPT" }, - { false, true, false, false, "EOR_2B", "NATIVE MODE ONLY" }, - { false, true, false, false, "EOR_2C", "LEGACY MODE ONLY" }, + // STD CRT M65 U64 X16 --- error strings compatible with CBM BASIC V2 + { true, true, true, true, true, "EV2_01", "TOO MANY FILES" }, + { true, true, true, true, true, "EV2_02", "FILE OPEN" }, + { true, true, true, true, true, "EV2_03", "FILE NOT OPEN" }, + { true, true, true, true, true, "EV2_04", "FILE NOT FOUND" }, + { true, true, true, true, true, "EV2_05", "DEVICE NOT PRESENT" }, + { true, true, true, true, true, "EV2_06", "NOT INPUT FILE" }, + { true, true, true, true, true, "EV2_07", "NOT OUTPUT FILE" }, + { true, true, true, true, true, "EV2_08", "MISSING FILENAME" }, + { true, true, true, true, true, "EV2_09", "ILLEGAL DEVICE NUMBER" }, + { true, true, true, true, true, "EV2_0A", "NEXT WITHOUT FOR" }, + { true, true, true, true, true, "EV2_0B", "SYNTAX" }, + { true, true, true, true, true, "EV2_0C", "RETURN WITHOUT GOSUB" }, + { true, true, true, true, true, "EV2_0D", "OUT OF DATA" }, + { true, true, true, true, true, "EV2_0E", "ILLEGAL QUANTITY" }, + { true, true, true, true, true, "EV2_0F", "OVERFLOW" }, + { true, true, true, true, true, "EV2_10", "OUT OF MEMORY" }, + { true, true, true, true, true, "EV2_11", "UNDEF\'D STATEMENT" }, + { true, true, true, true, true, "EV2_12", "BAD SUBSCRIPT" }, + { true, true, true, true, true, "EV2_13", "REDIM\'D ARRAY" }, + { true, true, true, true, true, "EV2_14", "DIVISION BY ZERO" }, + { true, true, true, true, true, "EV2_15", "ILLEGAL DIRECT" }, + { true, true, true, true, true, "EV2_16", "TYPE MISMATCH" }, + { true, true, true, true, true, "EV2_17", "STRING TOO LONG" }, + { true, true, true, true, true, "EV2_18", "FILE DATA" }, + { true, true, true, true, true, "EV2_19", "FORMULA TOO COMPLEX" }, + { true, true, true, true, true, "EV2_1A", "CAN\'T CONTINUE" }, + { true, true, true, true, true, "EV2_1B", "UNDEF\'D FUNCTION" }, + { true, true, true, true, true, "EV2_1C", "VERIFY" }, + { true, true, true, true, true, "EV2_1D", "LOAD" }, + { true, true, true, true, true, "EV2_1E", "BREAK" }, + // STD CRT M65 U64 X16 --- error strings compatible with CBM BASIC V7 + { false, false, false, false, false, "EV7_1F", "CAN'T RESUME" }, // not used for now + { false, false, false, false, false, "EV7_20", "LOOP NOT FOUND" }, // not used for now + { false, false, false, false, false, "EV7_21", "LOOP WITHOUT DO" }, // not used for now + { true, true, true, true, true, "EV7_22", "DIRECT MODE ONLY" }, + { false, false, false, false, false, "EV7_23", "NO GRAPHICS AREA" }, // not used for now + { false, false, false, false, false, "EV7_24", "BAD DISK" }, // not used for now + { false, false, false, false, false, "EV7_25", "BEND NOT FOUND" }, // not used for now + { true, true, true, true, true, "EV7_26", "LINE NUMBER TOO LARGE" }, + { false, false, false, false, false, "EV7_27", "UNRESOLVED REFERENCE" }, // not used for now + { true, true, true, true, true, "EV7_28", "NOT IMPLEMENTED" }, // this message actually differs from the CBM one + { false, false, false, false, false, "EV7_29", "FILE READ" }, // not used for now + // STD CRT M65 U64 X16 --- error strings specific to Open ROMs, not present in CBM BASIC dialects + { true, true, true, true, true, "EOR_2A", "MEMORY CORRUPT" }, + { false, false, true, false, false, "EOR_2B", "NATIVE MODE ONLY" }, + { false, false, true, false, false, "EOR_2C", "LEGACY MODE ONLY" }, } }; // BASIC errors - miscelaneous strings const StringEntryList GLOBAL_MiscStrings = { ListType::STRINGS_BASIC, "misc", { - // STD M65 U64 X16 --- misc strings as on CBM machines - { true, true, true, true, "STR_RET_QM", "\r?" }, - { true, true, true, true, "STR_BYTES", " BASIC BYTES FREE" }, // https://github.com/stefanhaustein/expressionparser - { true, true, true, true, "STR_READY", "\rREADY.\r" }, // https://www.ibm.com/support/knowledgecenter/zosbasics/com.ibm.zos.zconcepts/zconc_whatistsonative.htm https://github.com/stefanhaustein/expressionparser - { true, true, true, true, "STR_ERROR", " ERROR" }, // simply the word error that is attached to the other parts of messages https://fjkraan.home.xs4all.nl/comp/apple2faq/app2asoftfaq.html - { true, true, true, true, "STR_IN", " IN " }, - { false, true, false, false, "STR_IF_SURE", "\rARE YOU SURE? " }, // https://docs.microsoft.com/en-us/windows/win32/uxguide/mess-confirm - // STD M65 U64 X16 --- misc strings specific to Open ROMs, not present in CBM ROMs - { true, true, true, true, "STR_BRK_AT", "\rBRK AT $" }, + // STD CRT M65 U64 X16 --- misc strings as on CBM machines + { true, true, true, true, true, "STR_RET_QM", "\r?" }, + { true, true, true, true, true, "STR_BYTES", " BASIC BYTES FREE" }, // https://github.com/stefanhaustein/expressionparser + { true, true, true, true, true, "STR_READY", "\rREADY.\r" }, // https://www.ibm.com/support/knowledgecenter/zosbasics/com.ibm.zos.zconcepts/zconc_whatistsonative.htm https://github.com/stefanhaustein/expressionparser + { true, true, true, true, true, "STR_ERROR", " ERROR" }, // simply the word error that is attached to the other parts of messages https://fjkraan.home.xs4all.nl/comp/apple2faq/app2asoftfaq.html + { true, true, true, true, true, "STR_IN", " IN " }, + { false, false, true, false, false, "STR_IF_SURE", "\rARE YOU SURE? " }, // https://docs.microsoft.com/en-us/windows/win32/uxguide/mess-confirm + // STD CRT M65 U64 X16 --- misc strings specific to Open ROMs, not present in CBM ROMs + { true, true, true, true, true, "STR_BRK_AT", "\rBRK AT $" }, - { false, true, false, false, "STR_ORS", "OPEN ROMS BASIC & KERNAL\r" }, - { false, true, false, false, "STR_ORS_LEGACY_1", "OPEN ROMS " }, - { false, true, false, false, "STR_ORS_LEGACY_2", "\r\rLEGACY MODE " }, + { false, false, true, false, false, "STR_ORS", "OPEN ROMS BASIC & KERNAL\r" }, + { false, false, true, false, false, "STR_ORS_LEGACY_1", "OPEN ROMS " }, + { false, false, true, false, false, "STR_ORS_LEGACY_2", "\r\rLEGACY MODE " }, - { false, true, false, false, "STR_MEM_HDR", "\r\x12 AREA START SIZE \r" }, - { false, true, false, false, "STR_MEM_1", " $" }, - { false, true, false, false, "STR_MEM_2", " " }, - { false, true, false, false, "STR_MEM_TEXT", "\r TEXT" }, - { false, true, false, false, "STR_MEM_VARS", "\r VARS" }, - { false, true, false, false, "STR_MEM_ARRS", "\r ARRS" }, - { false, true, false, false, "STR_MEM_STRS", "\r STRS" }, - { false, true, false, false, "STR_MEM_FREE", "\r\r FREE" }, + { false, false, true, false, false, "STR_MEM_HDR", "\r\x12 AREA START SIZE \r" }, + { false, false, true, false, false, "STR_MEM_1", " $" }, + { false, false, true, false, false, "STR_MEM_2", " " }, + { false, false, true, false, false, "STR_MEM_TEXT", "\r TEXT" }, + { false, false, true, false, false, "STR_MEM_VARS", "\r VARS" }, + { false, false, true, false, false, "STR_MEM_ARRS", "\r ARRS" }, + { false, false, true, false, false, "STR_MEM_STRS", "\r STRS" }, + { false, false, true, false, false, "STR_MEM_FREE", "\r\r FREE" }, - { false, true, false, false, "STR_SI_HEADER", "OPEN ROMS, " }, - { false, true, false, false, "STR_SI_MODE64", "LEGACY MODE" }, - { false, true, false, false, "STR_SI_MODE65", "NATIVE MODE" }, - { false, true, false, false, "STR_SI_HDR_REL", "\rRELEASE " }, - { false, true, false, false, "STR_SI_HDR_HW", "BOARD : " }, - { false, true, false, false, "STR_SI_HW_01", "MEGA65 R1" }, - { false, true, false, false, "STR_SI_HW_02", "MEGA65 R2" }, - { false, true, false, false, "STR_SI_HW_03", "MEGA65 R3" }, - { false, true, false, false, "STR_SI_HW_21", "MEGAPHONE R1" }, - { false, true, false, false, "STR_SI_HW_40", "NEXYS4 PSRAM" }, - { false, true, false, false, "STR_SI_HW_41", "NEXYS4 DDR" }, - { false, true, false, false, "STR_SI_HW_42", "NEXYS4 DDR WIDGET" }, - { false, true, false, false, "STR_SI_HW_FD", "WUKONG A100T" }, - { false, true, false, false, "STR_SI_HW_FE", "SIMULATION VHDL" }, - { false, true, false, false, "STR_SI_HW_XX", "UNKNOWN ID $" }, - { false, true, false, false, "STR_SI_HDR_VID", "\rVIDEO : " }, + { false, false, true, false, false, "STR_SI_HEADER", "OPEN ROMS, " }, + { false, false, true, false, false, "STR_SI_MODE64", "LEGACY MODE" }, + { false, false, true, false, false, "STR_SI_MODE65", "NATIVE MODE" }, + { false, false, true, false, false, "STR_SI_HDR_REL", "\rRELEASE " }, + { false, false, true, false, false, "STR_SI_HDR_HW", "BOARD : " }, + { false, false, true, false, false, "STR_SI_HW_01", "MEGA65 R1" }, + { false, false, true, false, false, "STR_SI_HW_02", "MEGA65 R2" }, + { false, false, true, false, false, "STR_SI_HW_03", "MEGA65 R3" }, + { false, false, true, false, false, "STR_SI_HW_21", "MEGAPHONE R1" }, + { false, false, true, false, false, "STR_SI_HW_40", "NEXYS4 PSRAM" }, + { false, false, true, false, false, "STR_SI_HW_41", "NEXYS4 DDR" }, + { false, false, true, false, false, "STR_SI_HW_42", "NEXYS4 DDR WIDGET" }, + { false, false, true, false, false, "STR_SI_HW_FD", "WUKONG A100T" }, + { false, false, true, false, false, "STR_SI_HW_FE", "SIMULATION VHDL" }, + { false, false, true, false, false, "STR_SI_HW_XX", "UNKNOWN ID $" }, + { false, false, true, false, false, "STR_SI_HDR_VID", "\rVIDEO : " }, // Note: depending on configuration, additional strings will be added here } }; @@ -544,6 +543,12 @@ class DataSetSTD : public DataSet std::string layoutName() const { return "STD"; } }; +class DataSetCRT : public DataSet +{ + bool isRelevant(const StringEntry &entry) const { return entry.enabledCRT; } + std::string layoutName() const { return "CRT"; } +}; + class DataSetM65 : public DataSet { bool isRelevant(const StringEntry &entry) const { return entry.enabledM65; } @@ -1063,7 +1068,7 @@ void DictEncoder::process(StringEntryList &outDictionary) for (const auto &dictionaryStr : dictionary) { - StringEntry newEntry = { true, true, true, "", dictionaryStr }; + StringEntry newEntry = { true, true, true, true, "", dictionaryStr }; outDictionary.list.push_back(newEntry); } @@ -1234,8 +1239,8 @@ void DataSet::generateConfigDepStrings() if (GLOBAL_ConfigOptions["SHOW_FEATURES"] || GLOBAL_ConfigOptions["MB_M65"]) { - StringEntry newEntry1 = { true, true, true, true, "STR_PAL", "PAL\r" }; - StringEntry newEntry2 = { true, true, true, true, "STR_NTSC", "NTSC\r" }; + StringEntry newEntry1 = { true, true, true, true, true, "STR_PAL", "PAL\r" }; + StringEntry newEntry2 = { true, true, true, true, true, "STR_NTSC", "NTSC\r" }; stringEntryList.list.push_back(newEntry1); stringEntryList.list.push_back(newEntry2); @@ -1243,19 +1248,19 @@ void DataSet::generateConfigDepStrings() if (GLOBAL_ConfigOptions["SHOW_FEATURES"]) { - StringEntry newEntry = { true, true, true, true, "STR_FEATURES", featureStr }; + StringEntry newEntry = { true, true, true, true, true, "STR_FEATURES", featureStr }; stringEntryList.list.push_back(newEntry); } if (GLOBAL_ConfigOptions["MB_M65"]) { - StringEntry newEntry = { false, true, false, false, "STR_SI_FEATURES", featureStrM65 }; + StringEntry newEntry = { false, true, true, false, false, "STR_SI_FEATURES", featureStrM65 }; stringEntryList.list.push_back(newEntry); } if (!GLOBAL_ConfigOptions["BRAND_CUSTOM_BUILD"] || GLOBAL_ConfigOptions["MB_M65"]) { - StringEntry newEntry = { true, true, true, true, "STR_PRE_REV", "RELEASE " }; + StringEntry newEntry = { true, true, true, true, true, "STR_PRE_REV", "RELEASE " }; stringEntryList.list.push_back(newEntry); } @@ -1866,6 +1871,21 @@ void writeStrings() outputString = dataSetU64.getOutput(); } + else if (GLOBAL_ConfigOptions["PLATFORM_COMMODORE_64"] && GLOBAL_ConfigOptions["BRAND_GENERIC_CRT"]) + { + DataSetCRT dataSetCRT; + + // Add input data to computation objects + + dataSetCRT.addStrings(GLOBAL_Keywords_V2); + dataSetCRT.addStrings(GLOBAL_Keywords_01); + dataSetCRT.addStrings(GLOBAL_Errors); + dataSetCRT.addStrings(GLOBAL_MiscStrings); + + // Retrieve the results + + outputString = dataSetCRT.getOutput(); + } else if (GLOBAL_ConfigOptions["PLATFORM_COMMODORE_64"]) { DataSetSTD dataSetSTD; From a3893dcd1c9180e82c6511eac59b60ae70366882 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 19 Oct 2020 20:53:01 +0200 Subject: [PATCH 29/51] compilation fixes --- src/basic/,imports.s | 1 + src/basic/assets/startup_banner.s | 2 +- src/basic/engine_editor/tokenise_line.s | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/basic/,imports.s b/src/basic/,imports.s index 225c956f..d3ccd633 100644 --- a/src/basic/,imports.s +++ b/src/basic/,imports.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_0 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/startup_banner.s b/src/basic/assets/startup_banner.s index 9c37434c..1582c98c 100644 --- a/src/basic/assets/startup_banner.s +++ b/src/basic/assets/startup_banner.s @@ -16,7 +16,7 @@ } else ifdef CONFIG_BRAND_GENERIC { !pet "open roms generic build" } else ifdef CONFIG_BRAND_GENERIC_CRT { - !pet "open roms generic rom+crt build" + !pet "open roms crt generic build" } else ifdef CONFIG_BRAND_TESTING { !pet "open roms testing build" } else ifdef CONFIG_MB_U64 { diff --git a/src/basic/engine_editor/tokenise_line.s b/src/basic/engine_editor/tokenise_line.s index 4141f2a4..70c18908 100644 --- a/src/basic/engine_editor/tokenise_line.s +++ b/src/basic/engine_editor/tokenise_line.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_0 #TAKE ;; #LAYOUT# M65 * #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE From 2ad3af1a00f00f4464f12c7355536011d225cfc2 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 20 Oct 2020 21:31:56 +0200 Subject: [PATCH 30/51] added creation of dummy CRT file --- Makefile | 30 +++++++++++++++++++++++++++--- assets/cartridge/header-cart.bin | Bin 0 -> 64 bytes assets/cartridge/header-seg0.bin | Bin 0 -> 16 bytes assets/cartridge/header-seg1.bin | Bin 0 -> 16 bytes assets/cartridge/header-seg2.bin | Bin 0 -> 16 bytes assets/cartridge/header-seg3.bin | Bin 0 -> 16 bytes 6 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 assets/cartridge/header-cart.bin create mode 100644 assets/cartridge/header-seg0.bin create mode 100644 assets/cartridge/header-seg1.bin create mode 100644 assets/cartridge/header-seg2.bin create mode 100644 assets/cartridge/header-seg3.bin diff --git a/Makefile b/Makefile index f40814e4..46635863 100644 --- a/Makefile +++ b/Makefile @@ -531,11 +531,35 @@ build/kernal_hybrid_u64.rom: kernal $(DIR_U64)/OUTK_x.BIN build/symbols_hybrid_u64.vs: $(DIR_U64)/KERNAL_combined.vs @sort $(DIR_U64)/KERNAL_combined.vs | uniq | grep -v "__" > $@ +# Rules - external CRT image + +build/padding_8_KB: + @mkdir -p build + @dd if=/dev/zero bs=8192 count=1 of=$@ status=none + +build/external_generic.crt: build/padding_8_KB + @echo + @echo + @echo + @echo //------------------------------------------------------------------------------------------- + @echo // Making external CRT ROM image + @echo //------------------------------------------------------------------------------------------- + @cat assets/cartridge/header-cart.bin > $@ + @cat assets/cartridge/header-seg0.bin >> $@ + @cat build/padding_8_KB >> $@ + @cat assets/cartridge/header-seg1.bin >> $@ + @cat build/padding_8_KB >> $@ + @cat assets/cartridge/header-seg2.bin >> $@ + @cat build/padding_8_KB >> $@ + @cat assets/cartridge/header-seg3.bin >> $@ + @cat build/padding_8_KB >> $@ + @echo + # Rules - MEGA65 platform specific build/padding_64_KB: @mkdir -p build - @dd if=/dev/zero bs=8192 count=8 of=build/padding_64_KB status=none + @dd if=/dev/zero bs=8192 count=8 of=$@ status=none $(TARGET_M65_x) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_64_KB build/chargen_openroms.rom build/chargen_openroms.patched build/chargen_pxlfont.rom build/chargen_pxlfont.patched @echo @@ -602,8 +626,8 @@ test_generic: build/kernal_generic.rom build/basic_generic.rom build/symbols_gen test_generic_x128: build/kernal_generic.rom build/basic_generic.rom build/symbols_generic.vs x128 -go64 -kernal64 build/kernal_generic.rom -basic64 build/basic_generic.rom -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_generic_crt: build/kernal_generic_crt.rom build/basic_generic_crt.rom build/symbols_generic_crt.vs - x64 -kernal build/kernal_generic_crt.rom -basic build/basic_generic_crt.rom -moncommands build/symbols_generic_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_generic_crt: build/kernal_generic_crt.rom build/basic_generic_crt.rom build/external_generic.crt build/symbols_generic_crt.vs + x64 -kernal build/kernal_generic_crt.rom -basic build/basic_generic_crt.rom -cartcrt build/external_generic.crt -moncommands build/symbols_generic_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) test_testing: build/kernal_testing.rom build/basic_testing.rom build/symbols_testing.vs x64 -kernal build/kernal_testing.rom -basic build/basic_testing.rom -moncommands build/symbols_testing.vs -1 $(TESTTAPE) -8 $(TESTDISK) diff --git a/assets/cartridge/header-cart.bin b/assets/cartridge/header-cart.bin new file mode 100644 index 0000000000000000000000000000000000000000..648e9263c702d888b65249142c353eccda14719c GIT binary patch literal 64 zcmZ=ZGf{AM3ZcIo?;EV(8WG|e Date: Tue, 20 Oct 2020 22:11:59 +0200 Subject: [PATCH 31/51] fixed bug in memory size detection --- src/basic/init/initmsg_bytes_free.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/init/initmsg_bytes_free.s b/src/basic/init/initmsg_bytes_free.s index 59f8ef86..5ddf4ed6 100644 --- a/src/basic/init/initmsg_bytes_free.s +++ b/src/basic/init/initmsg_bytes_free.s @@ -29,7 +29,7 @@ initmsg_bytes_free: sec ; Read, not write value jsr JMEMTOP - cpx #$80 + cpy #$80 beq @1 !ifdef CONFIG_MEMORY_MODEL_60K { lda #>$F7FF From e683061e2912cffd5472426aa057ff70ff0f0a38 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 20 Oct 2020 22:38:51 +0200 Subject: [PATCH 32/51] added BASIC_1 and KERNAL_1 segments to CRT ROM layout --- Makefile | 26 ++++++++++++++++--- src/basic/board_crt/dummy.s | 4 +++ .../rom_revision/bf52.rom_revision_basic.s | 1 + src/kernal/board_crt/dummy.s | 4 +++ src/kernal/init/e5a0.vicii_init.s | 2 +- 5 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 src/basic/board_crt/dummy.s create mode 100644 src/kernal/board_crt/dummy.s diff --git a/Makefile b/Makefile index 46635863..71a12068 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ SRCDIR_BASIC = $(SRCDIR_COMMON) \ src/basic/basic_commands_03_m65 \ src/basic/basic_operators \ src/basic/basic_functions \ + src/basic/board_crt \ src/basic/board_m65 \ src/basic/board_x16 \ src/basic/engine_editor \ @@ -42,6 +43,7 @@ SRCDIR_KERNAL = $(SRCDIR_COMMON) \ src/kernal \ src/kernal/,stubs \ src/kernal/assets \ + src/kernal/board_crt \ src/kernal/board_m65 \ src/kernal/board_x16 \ src/kernal/extapi_m65 \ @@ -168,6 +170,9 @@ TARGET_LIST = build/chargen_openroms.rom \ $(TARGET_LIST_U64) \ $(TARGET_X16_x) +SEG_LIST_CRT = $(DIR_CRT)/basic.seg_1 \ + $(DIR_CRT)/kernal.seg_1 + SEG_LIST_M65 = $(DIR_M65)/basic.seg_0 \ $(DIR_M65)/basic.seg_1 \ $(DIR_M65)/dos.seg_1 \ @@ -302,6 +307,11 @@ $(DIR_X16)/OUTB_0.BIN $(DIR_X16)/BASIC_0_combined.vs $(DIR_X16)/BASIC_0_combine $(DIR_X16)/OUTK_0.BIN $(DIR_X16)/KERNAL_0_combined.vs $(DIR_X16)/KERNAL_0_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_X16) $(GEN_STR_X16) +$(DIR_CRT)/basic.seg_1 $(DIR_CRT)/BASIC_1_combined.vs $(DIR_CRT)/BASIC_1_combined.sym: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_CRT) $(GEN_STR_CRT) $(DIR_CRT)/KERNAL_0_combined.sym $(DIR_CRT)/BASIC_0_combined.sym +$(DIR_CRT)/kernal.seg_1 $(DIR_CRT)/KERNAL_1_combined.vs $(DIR_CRT)/KERNAL_1_combined.sym: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_CRT) $(GEN_STR_CRT) $(DIR_CRT)/KERNAL_0_combined.sym + $(DIR_M65)/basic.seg_1 $(DIR_M65)/BASIC_1_combined.vs $(DIR_M65)/BASIC_1_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_M65) $(GEN_STR_M65) $(DIR_M65)/KERNAL_0_combined.sym $(DIR_M65)/BASIC_0_combined.sym $(DIR_M65)/dos.seg_1 $(DIR_M65)/DOS_1_combined.vs $(DIR_M65)/DOS_1_combined.sym: \ @@ -404,6 +414,16 @@ $(DIR_CRT)/OUTK_0.BIN $(DIR_CRT)/KERNAL_0_combined.vs $(DIR_CRT)/KERNAL_0_combin @rm -f $@* $(DIR_CRT)/KERNAL_0* @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s KERNAL_0 -i KERNAL_0-generic-crt -o OUTK_0.BIN -d $(DIR_CRT) -l e4d3 -h ffff $(CFG_CRT) $(GEN_STR_CRT) $(SRCDIR_KERNAL) $(GEN_KERNAL) +$(DIR_CRT)/basic.seg_1 $(DIR_CRT)/BASIC_1_combined.vs $(DIR_CRT)/BASIC_1_combined.sym: + @mkdir -p $(DIR_CRT) + @rm -f $@* $(DIR_CRT)/basic.seg_1 $(DIR_CRT)/BASIC_1* + @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s BASIC_1 -i BASIC_1-generic-crt -o basic.seg_1 -d $(DIR_CRT) -l 8000 -h 9fff $(CFG_CRT) $(GEN_STR_CRT) $(SRCDIR_BASIC) $(GEN_BASIC) + +$(DIR_CRT)/kernal.seg_1 $(DIR_CRT)/KERNAL_1_combined.vs $(DIR_CRT)/KERNAL_1_combined.sym: + @mkdir -p $(DIR_CRT) + @rm -f $@* $(DIR_CRT)/kernal.seg_1 $(DIR_CRT)/KERNAL_1* + @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s KERNAL_1 -i KERNAL_1-generic-crt -o kernal.seg_1 -d $(DIR_CRT) -l 8000 -h 9fff $(CFG_CRT) $(GEN_STR_CRT) $(SRCDIR_KERNAL) $(GEN_KERNAL) + # Rules - BASIC and KERNAL intermediate files, for MEGA65 $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/BASIC_0_combined.vs $(DIR_M65)/BASIC_0_combined.sym: @@ -537,7 +557,7 @@ build/padding_8_KB: @mkdir -p build @dd if=/dev/zero bs=8192 count=1 of=$@ status=none -build/external_generic.crt: build/padding_8_KB +build/external_generic.crt: $(SEG_LIST_CRT) build/padding_8_KB @echo @echo @echo @@ -546,11 +566,11 @@ build/external_generic.crt: build/padding_8_KB @echo //------------------------------------------------------------------------------------------- @cat assets/cartridge/header-cart.bin > $@ @cat assets/cartridge/header-seg0.bin >> $@ - @cat build/padding_8_KB >> $@ + @cat $(DIR_CRT)/basic.seg_1 >> $@ @cat assets/cartridge/header-seg1.bin >> $@ @cat build/padding_8_KB >> $@ @cat assets/cartridge/header-seg2.bin >> $@ - @cat build/padding_8_KB >> $@ + @cat $(DIR_CRT)/kernal.seg_1 >> $@ @cat assets/cartridge/header-seg3.bin >> $@ @cat build/padding_8_KB >> $@ @echo diff --git a/src/basic/board_crt/dummy.s b/src/basic/board_crt/dummy.s new file mode 100644 index 00000000..3a3e191e --- /dev/null +++ b/src/basic/board_crt/dummy.s @@ -0,0 +1,4 @@ +;; #LAYOUT# CRT BASIC_1 #TAKE +;; #LAYOUT# * * #IGNORE + + +nop diff --git a/src/basic/rom_revision/bf52.rom_revision_basic.s b/src/basic/rom_revision/bf52.rom_revision_basic.s index c185b3d9..ef8c1bec 100644 --- a/src/basic/rom_revision/bf52.rom_revision_basic.s +++ b/src/basic/rom_revision/bf52.rom_revision_basic.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE-OFFSET -2F52 ;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 ;; #LAYOUT# * BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/board_crt/dummy.s b/src/kernal/board_crt/dummy.s new file mode 100644 index 00000000..5d70472b --- /dev/null +++ b/src/kernal/board_crt/dummy.s @@ -0,0 +1,4 @@ +;; #LAYOUT# CRT KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE + + +nop diff --git a/src/kernal/init/e5a0.vicii_init.s b/src/kernal/init/e5a0.vicii_init.s index 6a0aa9ee..20f4f732 100644 --- a/src/kernal/init/e5a0.vicii_init.s +++ b/src/kernal/init/e5a0.vicii_init.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT * #TAKE +;; #LAYOUT# CRT KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_0 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE-FLOAT ;; #LAYOUT# X16 * #IGNORE From 8bdaa180f08cacde4b3ee3888d63d5e77f3250cc Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 20 Oct 2020 22:45:00 +0200 Subject: [PATCH 33/51] dependencies fix --- Makefile | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 71a12068..83bb8773 100644 --- a/Makefile +++ b/Makefile @@ -63,18 +63,24 @@ SRCDIR_KERNAL = $(SRCDIR_COMMON) \ src/kernal/tape \ src/kernal/time -SRC_BASIC = $(foreach dir,$(SRCDIR_BASIC),$(wildcard $(dir)/*.s)) -SRC_DOS_M65 = $(foreach dir,$(SRCDIR_DOS_M65),$(wildcard $(dir)/*.s)) -SRC_KERNAL = $(foreach dir,$(SRCDIR_KERNAL),$(wildcard $(dir)/*.s)) -SRC_TOOLS = $(wildcard tools/*.c,tools/*.cc) +SRC_BASIC = $(foreach dir,$(SRCDIR_BASIC),$(wildcard $(dir)/*.s)) +SRC_DOS_M65 = $(foreach dir,$(SRCDIR_DOS_M65),$(wildcard $(dir)/*.s)) +SRC_KERNAL = $(foreach dir,$(SRCDIR_KERNAL),$(wildcard $(dir)/*.s)) +SRC_TOOLS = $(wildcard tools/*.c,tools/*.cc) -DIR_ACME = assembler/acme/src -HDR_ACME = $(filter-out $(wildcard $(DIR_ACME)/_*.h),$(wildcard $(DIR_ACME)/*.h)) -SRC_ACME = $(DIR_ACME)/acme.c $(DIR_ACME)/platform.c $(DIR_ACME)/alu.c $(DIR_ACME)/typesystem.c \ - $(DIR_ACME)/cliargs.c $(DIR_ACME)/global.c $(DIR_ACME)/output.c $(DIR_ACME)/flow.c \ - $(DIR_ACME)/macro.c $(DIR_ACME)/cpu.c $(DIR_ACME)/encoding.c $(DIR_ACME)/pseudoopcodes.c \ - $(DIR_ACME)/dynabuf.c $(DIR_ACME)/mnemo.c $(DIR_ACME)/input.c $(DIR_ACME)/section.c \ - $(DIR_ACME)/symbol.c $(DIR_ACME)/tree.c +DIR_ACME = assembler/acme/src +HDR_ACME = $(filter-out $(wildcard $(DIR_ACME)/_*.h),$(wildcard $(DIR_ACME)/*.h)) +SRC_ACME = $(DIR_ACME)/acme.c $(DIR_ACME)/platform.c $(DIR_ACME)/alu.c $(DIR_ACME)/typesystem.c \ + $(DIR_ACME)/cliargs.c $(DIR_ACME)/global.c $(DIR_ACME)/output.c $(DIR_ACME)/flow.c \ + $(DIR_ACME)/macro.c $(DIR_ACME)/cpu.c $(DIR_ACME)/encoding.c $(DIR_ACME)/pseudoopcodes.c \ + $(DIR_ACME)/dynabuf.c $(DIR_ACME)/mnemo.c $(DIR_ACME)/input.c $(DIR_ACME)/section.c \ + $(DIR_ACME)/symbol.c $(DIR_ACME)/tree.c + +CRT_HDR_LIST = assets/cartridge/header-cart.bin \ + assets/cartridge/header-seg0.bin \ + assets/cartridge/header-seg1.bin \ + assets/cartridge/header-seg2.bin \ + assets/cartridge/header-seg3.bin # Generated files @@ -557,7 +563,7 @@ build/padding_8_KB: @mkdir -p build @dd if=/dev/zero bs=8192 count=1 of=$@ status=none -build/external_generic.crt: $(SEG_LIST_CRT) build/padding_8_KB +build/external_generic.crt: $(SEG_LIST_CRT) $(CRT_HDR_LIST) build/padding_8_KB @echo @echo @echo From c818d980a8587977c466fb204c6c015de25b03e6 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 20 Oct 2020 23:19:48 +0200 Subject: [PATCH 34/51] more works towards CRT ROM layout --- src/basic/rom_revision/bf52.rom_revision_basic.s | 2 +- src/kernal/board_crt/crt_init.s | 9 +++++++++ src/kernal/init/fce2.hw_entry_reset.s | 10 +++++++++- src/kernal/init/fd50.ramtas.s | 12 ++++++++++++ 4 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 src/kernal/board_crt/crt_init.s diff --git a/src/basic/rom_revision/bf52.rom_revision_basic.s b/src/basic/rom_revision/bf52.rom_revision_basic.s index ef8c1bec..6bc6892e 100644 --- a/src/basic/rom_revision/bf52.rom_revision_basic.s +++ b/src/basic/rom_revision/bf52.rom_revision_basic.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_1 #TAKE-OFFSET -2F52 +;; #LAYOUT# CRT BASIC_1 #TAKE-OFFSET -1F66 ;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 ;; #LAYOUT# * BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/board_crt/crt_init.s b/src/kernal/board_crt/crt_init.s new file mode 100644 index 00000000..69c07dec --- /dev/null +++ b/src/kernal/board_crt/crt_init.s @@ -0,0 +1,9 @@ +;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE + + +crt_init: + + ; XXX !!! provide implementation + + rts diff --git a/src/kernal/init/fce2.hw_entry_reset.s b/src/kernal/init/fce2.hw_entry_reset.s index 8cd79829..3867c990 100644 --- a/src/kernal/init/fce2.hw_entry_reset.s +++ b/src/kernal/init/fce2.hw_entry_reset.s @@ -39,12 +39,14 @@ hw_entry_reset: ; Also, https://codebase64.org/doku.php?id=base:assembling_your_own_cart_rom_image was used ; as it shows example startup sequence, to be followe by cartridge creators +!ifndef ROM_LAYOUT_CRT { + ; C64 PRG p269 jsr cartridge_check bne @1 jmp (ICART_COLD_START) @1: - +} ; Disable the screen (and set 40 columns) to prevent visual glitches later ldx #$28 stx VIC_SCROLX @@ -73,6 +75,12 @@ hw_entry_reset: jsr JCINT } +!ifdef ROM_LAYOUT_CRT { + + ; Init external ROM + jsr crt_init +} + ; What do we do when finished? A C64 jumps into the BASIC ROM cli ; allow interrupts to happen diff --git a/src/kernal/init/fd50.ramtas.s b/src/kernal/init/fd50.ramtas.s index 60197f82..6d28c48f 100644 --- a/src/kernal/init/fd50.ramtas.s +++ b/src/kernal/init/fd50.ramtas.s @@ -65,6 +65,17 @@ RAMTAS: ldx #>$0800 stx MEMSTR+1 + +!ifdef ROM_LAYOUT_CRT { + + ; Set RAM size in MEMSIZEK - skip memory test + + ldy #$A0 + sty MEMSIZK+1 + rts + +} else { + ; Work out RAM size and put in MEMSIZK ; Try to modify $8000, if it fails then RAM ends at $7FFF, else $9FFF @@ -101,6 +112,7 @@ ramtas_32k: ldy #$80 bne ramtas_xxk ; branch always +} } else ifdef CONFIG_PLATFORM_COMMANDER_X16 { From 9c29c86a6d360345296c23e0df543496c1998b0f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 21 Oct 2020 20:41:39 +0200 Subject: [PATCH 35/51] added cartridge ROM version check --- src/kernal/board_crt/crt_init.s | 63 ++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/src/kernal/board_crt/crt_init.s b/src/kernal/board_crt/crt_init.s index 69c07dec..0a02c249 100644 --- a/src/kernal/board_crt/crt_init.s +++ b/src/kernal/board_crt/crt_init.s @@ -2,8 +2,69 @@ ;; #LAYOUT# * * #IGNORE +; Register meaning according to http://wiki.icomp.de/wiki/Retro_Replay +; +; $DE00 - write: +; bit 7 - bit 15 of ROM bank address +; bit 6 - needed by freeze, not useful for Open ROMs +; bit 5 - 0 = ROM, 1 = RAM +; bit 4 - bit 14 of ROM/RAM bank address +; bit 3 - bit 13 of ROM/RAM bank address +; bit 2 - 1 = disable cartridge +; bit 1 - EXROM, 0 = assert +; bit 0 - GAME, 0 = assert +; +; $DE01 - write: +; bit 7 - bit 15 of ROM bank address +; bit 6 - 1 = REU compatible memory map +; bit 5 - needed by flash mode, not useful for Open ROMs +; bit 4 - bit 14 of ROM/RAM bank address +; bit 3 - bit 13 of ROM/RAM bank address +; bit 2 - NoFreeze, 1 = disable freeze function +; bit 1 - AllowBank, 1 = enables banking of RAM in $DF00/$DE02 area +; bit 0 - 1 = enables accessory connector +; +; $DE00 / $DE01 - read: +; bit 7 - bit 15 of ROM bank address +; bit 6 - 1 = REU compatible memory map +; bit 5 - needed by flash mode, not useful for Open ROMs +; bit 4 - bit 14 of ROM/RAM bank address +; bit 3 - bit 13 of ROM/RAM bank address +; bit 2 - 1 = FREEZE button pressed +; bit 1 - AllowBank +; bit 0 - 1 = flash mode activated by jumper + + crt_init: - ; XXX !!! provide implementation + ; Setup the cart + + lda #%01000100 ; REU compatible memory map, no freezing + sta $DE01 + + ; Bank-in the first ROM bank + + lda #%00000000 + sta $DE00 + + ; Check if ROM revision matches the cartridge + ldy #$FF +@1: + iny + lda $E4B9, y ; Kernal ROM revision address + cmp $9FEC, y + bne crt_init_fail + cmp #$00 + bne @1 + + ; Unmap cartridge memory XXX provide separate map functions + + lda #%00000010 + sta $DE00 + rts + +crt_init_fail: + + +panic P_ERR_ROM_MISMATCH From cb2ec4e9f3e6778c266fe7869ce7b0ce5709347b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 21 Oct 2020 20:55:16 +0200 Subject: [PATCH 36/51] added memory mapping routines to CRT memory layout --- src/basic/,imports.s | 1 + .../board_crt/{crt_init.s => crt_init_map.s} | 42 ++++++++++++++++--- 2 files changed, 37 insertions(+), 6 deletions(-) rename src/kernal/board_crt/{crt_init.s => crt_init_map.s} (83%) diff --git a/src/basic/,imports.s b/src/basic/,imports.s index d3ccd633..1ccbe2c2 100644 --- a/src/basic/,imports.s +++ b/src/basic/,imports.s @@ -36,6 +36,7 @@ ;; #ALIAS# map_end = KERNAL_0.map_end ;; #ALIAS# map_NORMAL = KERNAL_0.map_NORMAL +;; #ALIAS# map_BASIC_1 = KERNAL_0.map_BASIC_1 ;; #ALIAS# M65_MODEGET = KERNAL_0.M65_MODEGET ;; #ALIAS# M65_MODESET = KERNAL_0.M65_MODESET diff --git a/src/kernal/board_crt/crt_init.s b/src/kernal/board_crt/crt_init_map.s similarity index 83% rename from src/kernal/board_crt/crt_init.s rename to src/kernal/board_crt/crt_init_map.s index 0a02c249..b1eced5e 100644 --- a/src/kernal/board_crt/crt_init.s +++ b/src/kernal/board_crt/crt_init_map.s @@ -35,6 +35,10 @@ ; bit 0 - 1 = flash mode activated by jumper +crt_init_fail: + + +panic P_ERR_ROM_MISMATCH + crt_init: ; Setup the cart @@ -44,8 +48,7 @@ crt_init: ; Bank-in the first ROM bank - lda #%00000000 - sta $DE00 + jsr map_BASIC_1 ; Check if ROM revision matches the cartridge @@ -53,18 +56,45 @@ crt_init: @1: iny lda $E4B9, y ; Kernal ROM revision address - cmp $9FEC, y + cmp $9FEC, y ; cartridge ROM revision address bne crt_init_fail cmp #$00 bne @1 - ; Unmap cartridge memory XXX provide separate map functions + ; FALLTROUGH + +map_NORMAL: + + ; Unmap cartridge memory + + php + pha lda #%00000010 + + ; FALLTROUGH + +map_NORMAL_common: + sta $DE00 + pla + plp + rts -crt_init_fail: +map_BASIC_1: - +panic P_ERR_ROM_MISMATCH + php + pha + + lda #%00000000 + beq map_NORMAL_common + +map_KERNAL_1: + + php + pha + + lda #%00010000 + bne map_NORMAL_common From b2623f9ec80a9f0f5ec68b6fe92b62fd83d1e078 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 22 Oct 2020 15:20:58 +0200 Subject: [PATCH 37/51] for CRT ROM layout, moved tape support to external ROM --- src/,,config_generic_crt.s | 2 +- src/basic/board_m65/4000.interop | 1 + .../board_crt/8000.crt_vectable_kernal_1.s | 40 +++++++++++ src/kernal/board_crt/8000.interop | 1 + src/kernal/board_crt/crt_imports.s | 49 +++++++++++++ src/kernal/board_crt/crt_proxies.s | 72 +++++++++++++++++++ src/kernal/board_crt/crt_redirect_tape.s | 46 ++++++++++++ .../board_crt/crt_tape_normal_byte_store.s | 17 +++++ src/kernal/board_crt/dummy.s | 4 -- src/kernal/board_m65/4000.interop | 2 +- .../board_m65/4000.mega65_vectable_kernal_1.s | 1 - src/kernal/tape/load_tape_normal.s | 2 +- src/kernal/tape/load_tape_turbo.s | 2 +- src/kernal/tape/tape_common.s | 2 +- src/kernal/tape/tape_common_autodetect.s | 2 +- src/kernal/tape/tape_common_clean_sid.s | 2 +- src/kernal/tape/tape_common_ditch_verify.s | 2 +- src/kernal/tape/tape_common_get_pulse.s | 2 +- src/kernal/tape/tape_common_prepare_cia.s | 2 +- src/kernal/tape/tape_common_screen.s | 2 +- src/kernal/tape/tape_head_align.s | 2 +- src/kernal/tape/tape_head_align_gen_code.s | 2 +- src/kernal/tape/tape_head_align_get_pulse.s | 2 +- src/kernal/tape/tape_head_align_help.s | 2 +- src/kernal/tape/tape_head_align_irq.s | 2 +- src/kernal/tape/tape_normal_calibrate.s | 2 +- src/kernal/tape/tape_normal_get_bit.s | 2 +- src/kernal/tape/tape_normal_get_byte.s | 2 +- src/kernal/tape/tape_normal_get_data_1.s | 2 +- src/kernal/tape/tape_normal_get_data_2.s | 2 +- src/kernal/tape/tape_normal_get_marker.s | 2 +- src/kernal/tape/tape_normal_get_pilot.s | 2 +- src/kernal/tape/tape_normal_sync.s | 2 +- src/kernal/tape/tape_normal_update_checksum.s | 2 +- src/kernal/tape/tape_turbo_bytestore.s | 16 ++++- src/kernal/tape/tape_turbo_get_bit.s | 2 +- src/kernal/tape/tape_turbo_get_byte.s | 2 +- src/kernal/tape/tape_turbo_sync.s | 2 +- src/kernal/tape/tape_turbo_sync_first.s | 2 +- 39 files changed, 268 insertions(+), 37 deletions(-) create mode 100644 src/basic/board_m65/4000.interop create mode 100644 src/kernal/board_crt/8000.crt_vectable_kernal_1.s create mode 100644 src/kernal/board_crt/8000.interop create mode 100644 src/kernal/board_crt/crt_imports.s create mode 100644 src/kernal/board_crt/crt_proxies.s create mode 100644 src/kernal/board_crt/crt_redirect_tape.s create mode 100644 src/kernal/board_crt/crt_tape_normal_byte_store.s delete mode 100644 src/kernal/board_crt/dummy.s diff --git a/src/,,config_generic_crt.s b/src/,,config_generic_crt.s index b673a23f..75a312b4 100644 --- a/src/,,config_generic_crt.s +++ b/src/,,config_generic_crt.s @@ -109,7 +109,7 @@ ;; #CONFIG# PANIC_SCREEN YES ;; #CONFIG# DOS_WEDGE YES ;; #CONFIG# TAPE_WEDGE YES -;; #CONFIG# TAPE_HEAD_ALIGN NO +;; #CONFIG# TAPE_HEAD_ALIGN YES ;; #CONFIG# BCD_SAFE_INTERRUPTS YES diff --git a/src/basic/board_m65/4000.interop b/src/basic/board_m65/4000.interop new file mode 100644 index 00000000..7acd2a6f --- /dev/null +++ b/src/basic/board_m65/4000.interop @@ -0,0 +1 @@ +This particular address is not for interoperability - we had to choose some fixed location for the extended ROM jumptable, beginning of the mapped memory block is just sane. diff --git a/src/kernal/board_crt/8000.crt_vectable_kernal_1.s b/src/kernal/board_crt/8000.crt_vectable_kernal_1.s new file mode 100644 index 00000000..9b3a1c00 --- /dev/null +++ b/src/kernal/board_crt/8000.crt_vectable_kernal_1.s @@ -0,0 +1,40 @@ +;; #LAYOUT# CRT KERNAL_0 #TAKE-FLOAT +;; #LAYOUT# CRT KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Definitions for communication with cartridge segment KERNAL_1 from KERNAL_0 +; + + +!ifdef SEGMENT_KERNAL_0 { + + ; Label definitions + + !addr JK1__load_tape_normal = $8000 + 3 * 0 + !addr JK1__load_tape_turbo = $8000 + 3 * 1 + !addr JK1__load_tape_auto = $8000 + 3 * 2 + !addr JK1__tape_head_align = $8000 + 3 * 3 + +} else { + + ; Jump table (Open ROMs private!) + +!ifdef CONFIG_TAPE_NORMAL { !ifndef CONFIG_TAPE_AUTODETECT { + jmp load_tape_normal +} else { !byte $00, $00, $00 } } else { !byte $00, $00, $00 } + +!ifdef CONFIG_TAPE_TURBO { !ifndef CONFIG_TAPE_AUTODETECT { + jmp load_tape_turbo +} else { !byte $00, $00, $00 } } else { !byte $00, $00, $00 } + +!ifdef CONFIG_TAPE_AUTODETECT { + jmp load_tape_auto +} else { !byte $00, $00, $00 } + +!ifdef CONFIG_TAPE_HEAD_ALIGN { + jmp tape_head_align +} else { !byte $00, $00, $00 } + + +} diff --git a/src/kernal/board_crt/8000.interop b/src/kernal/board_crt/8000.interop new file mode 100644 index 00000000..7acd2a6f --- /dev/null +++ b/src/kernal/board_crt/8000.interop @@ -0,0 +1 @@ +This particular address is not for interoperability - we had to choose some fixed location for the extended ROM jumptable, beginning of the mapped memory block is just sane. diff --git a/src/kernal/board_crt/crt_imports.s b/src/kernal/board_crt/crt_imports.s new file mode 100644 index 00000000..3da1707e --- /dev/null +++ b/src/kernal/board_crt/crt_imports.s @@ -0,0 +1,49 @@ +;; #LAYOUT# CRT KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE + +;; #IMPORT# KERNAL_0 = KERNAL_0_combined.sym + +; +; Definitions for calling cartridge segment KERNAL_0 routines from KERNAL_1 +; + +;; #ALIAS# STOP = KERNAL_0.STOP +;; #ALIAS# IOINIT = KERNAL_0.proxy_K1_IOINIT +;; #ALIAS# xxx = KERNAL_0.xxx + +;; #ALIAS# map_NORMAL = KERNAL_0.map_NORMAL +;; #ALIAS# map_KERNAL_1 = KERNAL_0.map_KERNAL_1 + +;; #ALIAS# screen_on = KERNAL_0.screen_on +;; #ALIAS# screen_off = KERNAL_0.screen_off + +;; #ALIAS# hw_entry_reset = KERNAL_0.hw_entry_reset +;; #ALIAS# return_from_interrupt = KERNAL_0.return_from_interrupt +;; #ALIAS# udtim_keyboard = KERNAL_0.udtim_keyboard +;; #ALIAS# wait_x_bars = KERNAL_0.wait_x_bars + +;; #ALIAS# tape_motor_on = KERNAL_0.tape_motor_on +;; #ALIAS# tape_motor_off = KERNAL_0.tape_motor_off + +;; #ALIAS# lvs_display_loading_verifying = KERNAL_0.proxy_K1_lvs_display_loading_verifying +;; #ALIAS# lvs_display_done = KERNAL_0.proxy_K1_lvs_display_done +;; #ALIAS# lvs_return_last_address = KERNAL_0.proxy_K1_lvs_return_last_address +;; #ALIAS# lvs_device_not_found_error = KERNAL_0.proxy_K1_lvs_device_not_found_error +;; #ALIAS# lvs_load_verify_error = KERNAL_0.proxy_K1_lvs_load_verify_error +;; #ALIAS# lvs_check_EAL = KERNAL_0.lvs_check_EAL +;; #ALIAS# lvs_STAL_to_MEMUSS = KERNAL_0.lvs_STAL_to_MEMUSS +;; #ALIAS# lvs_advance_MEMUSS = KERNAL_0.lvs_advance_MEMUSS + +;; #ALIAS# kernalerror_ROUTINE_TERMINATED = KERNAL_0.proxy_K1_kernalerror_ROUTINE_TERMINATED + +;; #ALIAS# print_kernal_message = KERNAL_0.proxy_K1_print_kernal_message +;; #ALIAS# print_return = KERNAL_0.proxy_K1_print_return + +;; #ALIAS# __MSG_KERNAL_PRESS_PLAY = KERNAL_0.__MSG_KERNAL_PRESS_PLAY +;; #ALIAS# __MSG_KERNAL_OK = KERNAL_0.__MSG_KERNAL_OK +;; #ALIAS# __MSG_KERNAL_FOUND = KERNAL_0.__MSG_KERNAL_FOUND + +;; #ALIAS# tape_normal_byte_store = KERNAL_0.tape_normal_byte_store + +;; #ALIAS# CLALL = KERNAL_0.proxy_K1_CLALL +;; #ALIAS# nmi_lock = KERNAL_0.nmi_lock diff --git a/src/kernal/board_crt/crt_proxies.s b/src/kernal/board_crt/crt_proxies.s new file mode 100644 index 00000000..6db895d4 --- /dev/null +++ b/src/kernal/board_crt/crt_proxies.s @@ -0,0 +1,72 @@ +;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Proxies for calling cartridge segment KERNAL_0 routines from KERNAL_1 +; + + + +!ifdef HAS_TAPE { + +proxy_K1_kernalerror_ROUTINE_TERMINATED: + + jsr map_NORMAL + jmp kernalerror_ROUTINE_TERMINATED + +proxy_K1_lvs_display_loading_verifying: + + jsr map_NORMAL + jsr lvs_display_loading_verifying + jmp map_KERNAL_1 + +proxy_K1_lvs_display_done: + + jsr map_NORMAL + jsr lvs_display_done + jmp map_KERNAL_1 + +proxy_K1_lvs_return_last_address: + + jsr map_NORMAL + jmp lvs_return_last_address + +proxy_K1_lvs_device_not_found_error: + + jsr map_NORMAL + jmp lvs_device_not_found_error + +proxy_K1_lvs_load_verify_error: + + jsr map_NORMAL + jmp lvs_load_verify_error + +proxy_K1_print_kernal_message: + + jsr map_NORMAL + jsr print_kernal_message + jmp map_KERNAL_1 + +proxy_K1_print_return: + + jsr map_NORMAL + jsr print_return + jmp map_KERNAL_1 +} + + +!ifdef CONFIG_TAPE_HEAD_ALIGN { + +proxy_K1_CLALL: + + jsr map_NORMAL + jsr CLALL + jmp map_KERNAL_1 + +proxy_K1_IOINIT: + + jsr map_NORMAL + jsr IOINIT + jmp map_KERNAL_1 + +} diff --git a/src/kernal/board_crt/crt_redirect_tape.s b/src/kernal/board_crt/crt_redirect_tape.s new file mode 100644 index 00000000..c520c122 --- /dev/null +++ b/src/kernal/board_crt/crt_redirect_tape.s @@ -0,0 +1,46 @@ +;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE + +; +; ROM routine call redirect for tape routines +; + + +!ifdef CONFIG_TAPE_NORMAL { !ifndef CONFIG_TAPE_AUTODETECT { + +load_tape_normal: + + jsr map_KERNAL_1 + jsr JK1__load_tape_normal + jmp map_NORMAL +} } + + +!ifdef CONFIG_TAPE_TURBO { !ifndef CONFIG_TAPE_AUTODETECT { + +load_tape_turbo: + + jsr map_KERNAL_1 + jsr JK1__load_tape_turbo + jmp map_NORMAL +} } + + +!ifdef CONFIG_TAPE_AUTODETECT { + +load_tape_auto: + + jsr map_KERNAL_1 + jsr JK1__load_tape_auto + jmp map_NORMAL +} + + +!ifdef CONFIG_TAPE_HEAD_ALIGN { + +tape_head_align: + + jsr map_KERNAL_1 + jsr JK1__tape_head_align + jmp map_NORMAL +} diff --git a/src/kernal/board_crt/crt_tape_normal_byte_store.s b/src/kernal/board_crt/crt_tape_normal_byte_store.s new file mode 100644 index 00000000..9569548b --- /dev/null +++ b/src/kernal/board_crt/crt_tape_normal_byte_store.s @@ -0,0 +1,17 @@ +;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Tape (normal) helper routine - byte storage when banking change is needed +; + + +!ifdef CONFIG_TAPE_NORMAL { + + +tape_normal_byte_store: + + jsr map_NORMAL + sta (MEMUSS), y + jmp map_KERNAL_1 +} diff --git a/src/kernal/board_crt/dummy.s b/src/kernal/board_crt/dummy.s deleted file mode 100644 index 5d70472b..00000000 --- a/src/kernal/board_crt/dummy.s +++ /dev/null @@ -1,4 +0,0 @@ -;; #LAYOUT# CRT KERNAL_1 #TAKE -;; #LAYOUT# * * #IGNORE - - +nop diff --git a/src/kernal/board_m65/4000.interop b/src/kernal/board_m65/4000.interop index 7b399af5..7acd2a6f 100644 --- a/src/kernal/board_m65/4000.interop +++ b/src/kernal/board_m65/4000.interop @@ -1 +1 @@ -This particular address is not for interoperability - we had to choose some fixed location foor the extended ROM jumptable, beginning of the mapped memory block is just sane. +This particular address is not for interoperability - we had to choose some fixed location for the extended ROM jumptable, beginning of the mapped memory block is just sane. diff --git a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s index 38f47421..68767abe 100644 --- a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s +++ b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s @@ -43,7 +43,6 @@ !word load_tape_turbo } else { !word $0000 } } else { !word $0000 } - !ifdef CONFIG_TAPE_AUTODETECT { !word load_tape_auto } else { !word $0000 } diff --git a/src/kernal/tape/load_tape_normal.s b/src/kernal/tape/load_tape_normal.s index f0fdf8f3..d8beed39 100644 --- a/src/kernal/tape/load_tape_normal.s +++ b/src/kernal/tape/load_tape_normal.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/load_tape_turbo.s b/src/kernal/tape/load_tape_turbo.s index 6634b13d..f4d205cd 100644 --- a/src/kernal/tape/load_tape_turbo.s +++ b/src/kernal/tape/load_tape_turbo.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_common.s b/src/kernal/tape/tape_common.s index 7c5e212b..2efb626f 100644 --- a/src/kernal/tape/tape_common.s +++ b/src/kernal/tape/tape_common.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_common_autodetect.s b/src/kernal/tape/tape_common_autodetect.s index f82a33e8..4f963dbe 100644 --- a/src/kernal/tape/tape_common_autodetect.s +++ b/src/kernal/tape/tape_common_autodetect.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_common_clean_sid.s b/src/kernal/tape/tape_common_clean_sid.s index 0b646f87..dc5cccbd 100644 --- a/src/kernal/tape/tape_common_clean_sid.s +++ b/src/kernal/tape/tape_common_clean_sid.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_common_ditch_verify.s b/src/kernal/tape/tape_common_ditch_verify.s index 9552c402..7db80ef6 100644 --- a/src/kernal/tape/tape_common_ditch_verify.s +++ b/src/kernal/tape/tape_common_ditch_verify.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_common_get_pulse.s b/src/kernal/tape/tape_common_get_pulse.s index 0e6607aa..ad99950b 100644 --- a/src/kernal/tape/tape_common_get_pulse.s +++ b/src/kernal/tape/tape_common_get_pulse.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_common_prepare_cia.s b/src/kernal/tape/tape_common_prepare_cia.s index b84de264..e07b5976 100644 --- a/src/kernal/tape/tape_common_prepare_cia.s +++ b/src/kernal/tape/tape_common_prepare_cia.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_common_screen.s b/src/kernal/tape/tape_common_screen.s index b2c538a6..9e039758 100644 --- a/src/kernal/tape/tape_common_screen.s +++ b/src/kernal/tape/tape_common_screen.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_head_align.s b/src/kernal/tape/tape_head_align.s index 33692845..71fec45e 100644 --- a/src/kernal/tape/tape_head_align.s +++ b/src/kernal/tape/tape_head_align.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_head_align_gen_code.s b/src/kernal/tape/tape_head_align_gen_code.s index 960864bb..66c13c5c 100644 --- a/src/kernal/tape/tape_head_align_gen_code.s +++ b/src/kernal/tape/tape_head_align_gen_code.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_head_align_get_pulse.s b/src/kernal/tape/tape_head_align_get_pulse.s index 2fea2213..df66d5b1 100644 --- a/src/kernal/tape/tape_head_align_get_pulse.s +++ b/src/kernal/tape/tape_head_align_get_pulse.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_head_align_help.s b/src/kernal/tape/tape_head_align_help.s index 6ece9b0a..ca970b98 100644 --- a/src/kernal/tape/tape_head_align_help.s +++ b/src/kernal/tape/tape_head_align_help.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_head_align_irq.s b/src/kernal/tape/tape_head_align_irq.s index e109051e..818d3d5e 100644 --- a/src/kernal/tape/tape_head_align_irq.s +++ b/src/kernal/tape/tape_head_align_irq.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_calibrate.s b/src/kernal/tape/tape_normal_calibrate.s index 63e4e70c..260fbc0c 100644 --- a/src/kernal/tape/tape_normal_calibrate.s +++ b/src/kernal/tape/tape_normal_calibrate.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_get_bit.s b/src/kernal/tape/tape_normal_get_bit.s index 4d9cddd0..f066f245 100644 --- a/src/kernal/tape/tape_normal_get_bit.s +++ b/src/kernal/tape/tape_normal_get_bit.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_get_byte.s b/src/kernal/tape/tape_normal_get_byte.s index e4f40303..59e4b5ae 100644 --- a/src/kernal/tape/tape_normal_get_byte.s +++ b/src/kernal/tape/tape_normal_get_byte.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_get_data_1.s b/src/kernal/tape/tape_normal_get_data_1.s index eade4958..2e27e66f 100644 --- a/src/kernal/tape/tape_normal_get_data_1.s +++ b/src/kernal/tape/tape_normal_get_data_1.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_get_data_2.s b/src/kernal/tape/tape_normal_get_data_2.s index 57517a7c..c3c40dff 100644 --- a/src/kernal/tape/tape_normal_get_data_2.s +++ b/src/kernal/tape/tape_normal_get_data_2.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_get_marker.s b/src/kernal/tape/tape_normal_get_marker.s index 96644c1e..450b1e7a 100644 --- a/src/kernal/tape/tape_normal_get_marker.s +++ b/src/kernal/tape/tape_normal_get_marker.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_get_pilot.s b/src/kernal/tape/tape_normal_get_pilot.s index 12103c02..5f96c2bd 100644 --- a/src/kernal/tape/tape_normal_get_pilot.s +++ b/src/kernal/tape/tape_normal_get_pilot.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_sync.s b/src/kernal/tape/tape_normal_sync.s index 5b389d05..183c63c2 100644 --- a/src/kernal/tape/tape_normal_sync.s +++ b/src/kernal/tape/tape_normal_sync.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_normal_update_checksum.s b/src/kernal/tape/tape_normal_update_checksum.s index 9749f6ea..dbc59f10 100644 --- a/src/kernal/tape/tape_normal_update_checksum.s +++ b/src/kernal/tape/tape_normal_update_checksum.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_turbo_bytestore.s b/src/kernal/tape/tape_turbo_bytestore.s index ab6c6ce2..8d5e4ad4 100644 --- a/src/kernal/tape/tape_turbo_bytestore.s +++ b/src/kernal/tape/tape_turbo_bytestore.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE @@ -21,6 +21,8 @@ !ifdef CONFIG_MB_M65 { !addr __tape_turbo_bytestore_defmap = __tape_turbo_bytestore + 10 +} else ifdef ROM_LAYOUT_CRT { +!addr __tape_turbo_bytestore_defmap = __tape_turbo_bytestore + 12 } else { !addr __tape_turbo_bytestore_defmap = __tape_turbo_bytestore + 7 } @@ -31,8 +33,11 @@ tape_turbo_bytestore_source: !ifdef CONFIG_MB_M65 { jsr map_NORMAL +} else ifdef ROM_LAYOUT_CRT { + ; 'jsr map_NORMAL' would take too much time + ldx #%00000010 + stx $DE00 } - ; Set all memory as RAM, tape motor ON ldx #$00 stx CPU_R6510 @@ -41,12 +46,17 @@ tape_turbo_bytestore_source: sta (MEMUSS), y ; Restore default memory layout - ldx #$00 ; value will be determined later, offset from start: 7 bytes + ldx #$00 ; value will be determined later, offset from start: 7/10/12 bytes stx CPU_R6510 !ifdef CONFIG_MB_M65 { ; Restore default map and quit jmp map_KERNAL_1 +} else ifdef ROM_LAYOUT_CRT { + ; Restore default map and quit; 'jsr map_KERNAL_1' would take too much time + ldx #%00010000 + stx $DE00 + rts } else { ; Go back rts diff --git a/src/kernal/tape/tape_turbo_get_bit.s b/src/kernal/tape/tape_turbo_get_bit.s index 26ac038f..208f50b9 100644 --- a/src/kernal/tape/tape_turbo_get_bit.s +++ b/src/kernal/tape/tape_turbo_get_bit.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_turbo_get_byte.s b/src/kernal/tape/tape_turbo_get_byte.s index c0a78007..e472371f 100644 --- a/src/kernal/tape/tape_turbo_get_byte.s +++ b/src/kernal/tape/tape_turbo_get_byte.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_turbo_sync.s b/src/kernal/tape/tape_turbo_sync.s index 2fd6ca8c..3c64f2e4 100644 --- a/src/kernal/tape/tape_turbo_sync.s +++ b/src/kernal/tape/tape_turbo_sync.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/kernal/tape/tape_turbo_sync_first.s b/src/kernal/tape/tape_turbo_sync_first.s index f5a42fd7..cd8d42df 100644 --- a/src/kernal/tape/tape_turbo_sync_first.s +++ b/src/kernal/tape/tape_turbo_sync_first.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT KERNAL_0 #TAKE +;; #LAYOUT# CRT KERNAL_1 #TAKE ;; #LAYOUT# M65 KERNAL_1 #TAKE ;; #LAYOUT# * * #IGNORE From 3a33a00d9de8d90b5b9e2183ba74e29f6e867230 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 22 Oct 2020 16:32:45 +0200 Subject: [PATCH 38/51] tape autocalibration code is dangerous on 1MHz, disable it for slower machines --- STATUS.md | 2 +- src/aliases/,aliases_config.s | 8 ++++++++ src/aliases/,aliases_ram_lowmem.s | 3 +++ src/kernal/tape/tape_normal_calibrate.s | 4 ++-- src/kernal/tape/tape_normal_get_bit.s | 10 ++++++++-- src/kernal/tape/tape_normal_get_marker.s | 7 ++++--- src/kernal/tape/tape_normal_get_pilot.s | 3 ++- src/kernal/tape/tape_turbo_get_bit.s | 8 ++++++++ src/kernal/tape/tape_turbo_get_byte.s | 3 +++ 9 files changed, 39 insertions(+), 9 deletions(-) diff --git a/STATUS.md b/STATUS.md index 796b2b6c..ba005490 100644 --- a/STATUS.md +++ b/STATUS.md @@ -18,7 +18,7 @@ Here are the features of the Open ROMs not found in the original ROMs from the 8 * `LIST` command should never damage the screen if trying to list memory content which is not a BASIC program * high performance garbage collector -* turbo tape load support (as device 7, or using `←L` / `←M`, optionally with a file name), quite sophisticated: up to 250 blocks (can store bytes under I/O), automatically adjusts for tape speed differences +* turbo tape load support (as device 7, or using `←L` / `←M`, optionally with a file name), quite sophisticated: up to 250 blocks (can store bytes under I/O), on MEGA65 motherboard automatically adjusts itself for tape speed differences * normal tape load error log is limited by free stack space only (no artificial limitation like in original ROMs) * tape format autodetection; normal vs turbo is mostly transparent to user * improved support for tape adapters (for using regular casette players and other audio devices instead of Datasette) and emulators diff --git a/src/aliases/,aliases_config.s b/src/aliases/,aliases_config.s index d8610292..b8729fd4 100644 --- a/src/aliases/,aliases_config.s +++ b/src/aliases/,aliases_config.s @@ -451,6 +451,14 @@ +; Determine if it is OK to include tape autocalibration routines + +!ifndef CONFIG_MB_M65 { + !set HAS_TAPE_AUTOCALIBRATE = 1 +} + + + ; Defines for multi-segment ROMs !ifdef CONFIG_MB_M65 { diff --git a/src/aliases/,aliases_ram_lowmem.s b/src/aliases/,aliases_ram_lowmem.s index eafc56cb..f8e53af8 100644 --- a/src/aliases/,aliases_ram_lowmem.s +++ b/src/aliases/,aliases_ram_lowmem.s @@ -310,11 +310,14 @@ !ifdef HAS_TAPE { +!ifdef HAS_TAPE_AUTOCALIBRATE { + !addr __normal_time_S = IRQTMP+0 ; duration of the short pulse !addr __normal_time_M = IRQTMP+1 ; duration of the medium pulse !addr __turbo_half_S = IRQTMP+0 ; half-duration of the short pulse !addr __turbo_half_L = IRQTMP+1 ; half-duration of the long pulse +} !addr __pulse_threshold = SVXT ; pulse classification threshold !addr __pulse_threshold_ML = SYNO ; M/L pulse classification threshold, for normal only diff --git a/src/kernal/tape/tape_normal_calibrate.s b/src/kernal/tape/tape_normal_calibrate.s index 260fbc0c..9142fd77 100644 --- a/src/kernal/tape/tape_normal_calibrate.s +++ b/src/kernal/tape/tape_normal_calibrate.s @@ -10,7 +10,7 @@ ; -!ifdef CONFIG_TAPE_NORMAL { +!ifdef CONFIG_TAPE_NORMAL { !ifdef HAS_TAPE_AUTOCALIBRATE { tape_normal_calibrate_during_pilot: ; reecalibration during the pilot @@ -122,4 +122,4 @@ tape_normal_calibrate_threshold_inc: tape_normal_calibrate_done: rts -} +} } diff --git a/src/kernal/tape/tape_normal_get_bit.s b/src/kernal/tape/tape_normal_get_bit.s index f066f245..33a5d355 100644 --- a/src/kernal/tape/tape_normal_get_bit.s +++ b/src/kernal/tape/tape_normal_get_bit.s @@ -22,13 +22,16 @@ tape_normal_get_bit: ; First impulse was short, second should be medium +!ifdef HAS_TAPE_AUTOCALIBRATE { jsr tape_normal_calibrate_after_S +} jsr tape_common_get_pulse bcs tape_normal_get_bit_error +!ifdef HAS_TAPE_AUTOCALIBRATE { jsr tape_normal_calibrate_after_M - +} ; We have a bit '0' lda #$00 @@ -46,13 +49,16 @@ tape_normal_get_bit_1: ; First impulse was medium, second should be short +!ifdef HAS_TAPE_AUTOCALIBRATE { jsr tape_normal_calibrate_after_M +} jsr tape_common_get_pulse bcc tape_normal_get_bit_error +!ifdef HAS_TAPE_AUTOCALIBRATE { jsr tape_normal_calibrate_after_S - +} ; We have a bit '1' clc diff --git a/src/kernal/tape/tape_normal_get_marker.s b/src/kernal/tape/tape_normal_get_marker.s index 450b1e7a..afcdbcfe 100644 --- a/src/kernal/tape/tape_normal_get_marker.s +++ b/src/kernal/tape/tape_normal_get_marker.s @@ -32,16 +32,17 @@ tape_normal_get_marker_type: ; Not an entry point!!! -tape_normal_get_marker_while_sync_loop: +tape_normal_get_marker_while_sync__loop: +!ifdef HAS_TAPE_AUTOCALIBRATE { jsr tape_normal_calibrate_during_pilot ; while sync use short pulses for calibration - +} ; FALLTROUGH tape_normal_get_marker_while_sync: jsr tape_common_get_pulse - bcs tape_normal_get_marker_while_sync_loop ; branch if short pulse + bcs tape_normal_get_marker_while_sync__loop ; branch if short pulse cmp __pulse_threshold_ML bcs tape_normal_get_marker_while_sync ; too short for a long pulse diff --git a/src/kernal/tape/tape_normal_get_pilot.s b/src/kernal/tape/tape_normal_get_pilot.s index 5f96c2bd..433befc2 100644 --- a/src/kernal/tape/tape_normal_get_pilot.s +++ b/src/kernal/tape/tape_normal_get_pilot.s @@ -96,8 +96,9 @@ tape_normal_get_pilot_common_loop_inner: @1: } +!ifdef HAS_TAPE_AUTOCALIBRATE { jsr tape_normal_calibrate_during_pilot - +} dey bne tape_normal_get_pilot_common_loop_inner diff --git a/src/kernal/tape/tape_turbo_get_bit.s b/src/kernal/tape/tape_turbo_get_bit.s index 208f50b9..15789b7b 100644 --- a/src/kernal/tape/tape_turbo_get_bit.s +++ b/src/kernal/tape/tape_turbo_get_bit.s @@ -19,9 +19,12 @@ tape_turbo_get_bit: jsr tape_common_get_pulse bcs @1 +!ifdef HAS_TAPE_AUTOCALIBRATE { + clc ror sta __turbo_half_S ; store half of the last measurement result for short pulse +} lda #$01 !ifdef CONFIG_MB_M65 { @@ -34,10 +37,15 @@ tape_turbo_get_bit: sta VIC_EXTCOL sec rts + @1: + +!ifdef HAS_TAPE_AUTOCALIBRATE { + clc ror sta __turbo_half_L ; store half of the last measurement result for long pulse +} lda #$00 !ifdef CONFIG_MB_M65 { diff --git a/src/kernal/tape/tape_turbo_get_byte.s b/src/kernal/tape/tape_turbo_get_byte.s index e472371f..424df5b2 100644 --- a/src/kernal/tape/tape_turbo_get_byte.s +++ b/src/kernal/tape/tape_turbo_get_byte.s @@ -27,6 +27,8 @@ tape_turbo_get_byte: bcc @1 ; is the initial 1 shifted into carry already? +plx_trash_a +!ifdef HAS_TAPE_AUTOCALIBRATE { + ; Compensate for tape speed variations lda __turbo_half_S ; half of the last value for bit '0' @@ -51,6 +53,7 @@ tape_turbo_get_byte: beq tape_turbo_get_byte_done ; do not increase threshold too far no matter what inc __pulse_threshold +} tape_turbo_get_byte_done: From 6a04cc52d5d4a175c00db497014b3ee76386faa3 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 22 Oct 2020 16:40:59 +0200 Subject: [PATCH 39/51] tape autocalibration fix --- src/aliases/,aliases_config.s | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/aliases/,aliases_config.s b/src/aliases/,aliases_config.s index b8729fd4..fbbc5c0c 100644 --- a/src/aliases/,aliases_config.s +++ b/src/aliases/,aliases_config.s @@ -451,12 +451,16 @@ -; Determine if it is OK to include tape autocalibration routines +; Determine if it is OK to include tape autocalibration routines; they are too slow to be safely used at 1 MHz CPU speed -!ifndef CONFIG_MB_M65 { - !set HAS_TAPE_AUTOCALIBRATE = 1 +!ifdef HAS_TAPE { + !ifdef CONFIG_MB_M65 { + !set HAS_TAPE_AUTOCALIBRATE = 1 + } } +; XXX adapt autocalibration to Ultimate64 once additional Kernal bank is available + ; Defines for multi-segment ROMs From 129635daab5cf9b3fe2bbe666a5a6171ce920bbb Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 22 Oct 2020 18:40:00 +0200 Subject: [PATCH 40/51] MEGA65 tape support fixes, small makefile update --- Makefile | 35 ++++++++++++---------- src/kernal/screen/screen_off.s | 4 +-- src/kernal/screen/screen_on.s | 4 +-- src/kernal/tape/tape_common_screen.s | 44 +++++++++++++++++++++------- 4 files changed, 57 insertions(+), 30 deletions(-) diff --git a/Makefile b/Makefile index 83bb8773..41ebd43d 100644 --- a/Makefile +++ b/Makefile @@ -157,13 +157,15 @@ TARGET_CRT_K = build/kernal_generic_crt.rom TARGET_TST_K = build/kernal_testing.rom TARGET_U64_K = build/kernal_ultimate64.rom +TARGET_CRT_X = build/external_generic.crt + TARGET_M65_x = build/mega65.rom TARGET_M65_x_PXL = build/mega65_pxlfont.rom TARGET_X16_x = build/cx16-dummy.rom TARGET_LIST_CUS = $(TARGET_CUS_B) $(TARGET_CUS_K) TARGET_LIST_GEN = $(TARGET_GEN_B) $(TARGET_GEN_K) -TARGET_LIST_CRT = $(TARGET_CRT_B) $(TARGET_CRT_K) +TARGET_LIST_CRT = $(TARGET_CRT_B) $(TARGET_CRT_K) $(TARGET_CRT_X) TARGET_LIST_TST = $(TARGET_TST_B) $(TARGET_TST_K) TARGET_LIST_U64 = $(TARGET_U64_B) $(TARGET_U64_K) @@ -171,6 +173,7 @@ TARGET_LIST = build/chargen_openroms.rom \ $(TARGET_LIST_CUS) \ $(TARGET_LIST_GEN) \ $(TARGET_LIST_TST) \ + $(TARGET_LIST_CRT) \ $(TARGET_M65_x) \ $(TARGET_M65_x_PXL) \ $(TARGET_LIST_U64) \ @@ -524,10 +527,10 @@ $(DIR_X16)/kernal.seg_0: $(DIR_X16)/OUTx_0.BIN $(DIR_X16)/basic.seg_0: $(DIR_X16)/OUTx_0.BIN @dd if=$(DIR_X16)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none -build/kernal_generic_crt.rom: $(DIR_CRT)/OUTx_0.BIN +$(TARGET_CRT_K): $(DIR_CRT)/OUTx_0.BIN @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=2 of=$@ status=none -build/basic_generic_crt.rom: $(DIR_CRT)/OUTx_0.BIN +$(TARGET_CRT_B): $(DIR_CRT)/OUTx_0.BIN @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none build/symbols_generic_crt.vs: @@ -563,7 +566,7 @@ build/padding_8_KB: @mkdir -p build @dd if=/dev/zero bs=8192 count=1 of=$@ status=none -build/external_generic.crt: $(SEG_LIST_CRT) $(CRT_HDR_LIST) build/padding_8_KB +$(TARGET_CRT_X): $(SEG_LIST_CRT) $(CRT_HDR_LIST) build/padding_8_KB @echo @echo @echo @@ -643,23 +646,23 @@ $(TARGET_X16_x): $(SEG_LIST_X16) build/chargen_openroms.rom test: test_custom test_crt: test_generic_crt -test_custom: build/kernal_custom.rom build/basic_custom.rom build/symbols_custom.vs - x64 -kernal build/kernal_custom.rom -basic build/basic_custom.rom -moncommands build/symbols_custom.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_custom: $(TARGET_LIST_CUS) build/symbols_custom.vs + x64 -kernal $(TARGET_CUS_K) -basic $(TARGET_CUS_B) -moncommands build/symbols_custom.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_generic: build/kernal_generic.rom build/basic_generic.rom build/symbols_generic.vs - x64 -kernal build/kernal_generic.rom -basic build/basic_generic.rom -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_generic: $(TARGET_LIST_GEN) build/symbols_generic.vs + x64 -kernal $(TARGET_GEN_K) -basic $(TARGET_GEN_B) -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_generic_x128: build/kernal_generic.rom build/basic_generic.rom build/symbols_generic.vs - x128 -go64 -kernal64 build/kernal_generic.rom -basic64 build/basic_generic.rom -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_generic_x128: $(TARGET_LIST_GEN) build/symbols_generic.vs + x128 -go64 -kernal64 $(TARGET_GEN_K) -basic64 $(TARGET_GEN_B) -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_generic_crt: build/kernal_generic_crt.rom build/basic_generic_crt.rom build/external_generic.crt build/symbols_generic_crt.vs - x64 -kernal build/kernal_generic_crt.rom -basic build/basic_generic_crt.rom -cartcrt build/external_generic.crt -moncommands build/symbols_generic_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_generic_crt: $(TARGET_LIST_CRT) build/symbols_generic_crt.vs + x64 -kernal $(TARGET_CRT_K) -basic $(TARGET_CRT_B) -cartcrt $(TARGET_CRT_X) -moncommands build/symbols_generic_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_testing: build/kernal_testing.rom build/basic_testing.rom build/symbols_testing.vs - x64 -kernal build/kernal_testing.rom -basic build/basic_testing.rom -moncommands build/symbols_testing.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_testing: $(TARGET_LIST_TST) build/symbols_testing.vs + x64 -kernal $(TARGET_TST_K) -basic $(TARGET_TST_B) -moncommands build/symbols_testing.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_ultimate64: build/kernal_ultimate64.rom build/basic_ultimate64.rom build/symbols_ultimate64.vs - x64 -kernal build/kernal_ultimate64.rom -basic build/basic_ultimate64.rom -moncommands build/symbols_ultimate64.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_ultimate64: $(TARGET_LIST_U64) build/symbols_ultimate64.vs + x64 -kernal $(TARGET_U64_K) -basic $(TARGET_U64_B) -moncommands build/symbols_ultimate64.vs -1 $(TESTTAPE) -8 $(TESTDISK) test_mega65: $(TARGET_M65_x) $(TARGET_M65_x_PXL) ../xemu/build/bin/xmega65.native -dmarev 2 -besure -fontrefresh -forcerom -loadrom $(TARGET_M65_x_PXL) diff --git a/src/kernal/screen/screen_off.s b/src/kernal/screen/screen_off.s index 7e285bbd..664bdb6f 100644 --- a/src/kernal/screen/screen_off.s +++ b/src/kernal/screen/screen_off.s @@ -8,8 +8,8 @@ ; !set NEEDED = 0 -!ifdef HAS_TAPE { !set NEEDED = 1 } -!ifdef CONFIG_IEC_JIFFYDOS { !ifndef CONFIG_MEMORY_MODEL_60K { !set NEEDED = 1 } } +!ifdef HAS_TAPE { !ifndef CONFIG_MB_M65 { !set NEEDED = 1 } } +!ifdef CONFIG_IEC_JIFFYDOS_BLANK { !set NEEDED = 1 } !if NEEDED { diff --git a/src/kernal/screen/screen_on.s b/src/kernal/screen/screen_on.s index d05c5aba..f3409e5a 100644 --- a/src/kernal/screen/screen_on.s +++ b/src/kernal/screen/screen_on.s @@ -8,8 +8,8 @@ ; !set NEEDED = 0 -!ifdef HAS_TAPE { !set NEEDED = 1 } -!ifdef CONFIG_IEC_JIFFYDOS { !ifndef CONFIG_MEMORY_MODEL_60K { !set NEEDED = 1 } } +!ifdef HAS_TAPE { !ifndef CONFIG_MB_M65 { !set NEEDED = 1 } } +!ifdef CONFIG_IEC_JIFFYDOS_BLANK { !set NEEDED = 1 } !if NEEDED { diff --git a/src/kernal/tape/tape_common_screen.s b/src/kernal/tape/tape_common_screen.s index 9e039758..4b51f55d 100644 --- a/src/kernal/tape/tape_common_screen.s +++ b/src/kernal/tape/tape_common_screen.s @@ -4,7 +4,7 @@ ;; #LAYOUT# * * #IGNORE ; -; Handle screen (visible/blanked) + tape deck motor (on/off), +; Handle screen (visible/blanked; on some hardware disable badlines instead) + tape deck motor (on/off), ; store/restore screen color ; @@ -23,7 +23,19 @@ tape_screen_on_motor_off: !ifdef CONFIG_MB_M65 { jsr M65_MODEGET - +bcs screen_on ; MEGA65 native mode does not have badlines, no need to enable/disable screen + bcc @1 + + ; For compatibility mode, restore normal speed settings and hide VIC-IV + + lda #$03 + sta MISC_EMU + + lda VIC_CTRLB + and #%10111111 + sta VIC_CTRLB + + sta VIC_KEY +@1: rts } else ifdef CONFIG_MB_U64 { @@ -53,26 +65,38 @@ tape_screen_off_motor_on: !ifdef CONFIG_MB_M65 { + ; On MEGA65 we need to switch banks everytim we retrieve byte to be stored in memory, + ; additionally we perform advanced tape speed autocallibration - this is all too expensive + ; to be handled by 1 MHz CPU - so in case of compatibility mode, switch CPU to fast speed + ; (and disable badlines, so we will not have to blank the screen) + jsr M65_MODEGET - ; XXX optimize this - bcs @1 ; MEGA65 native mode does not have badlines, no need to enable/disable screen - jsr screen_off -@1: + bcc @2 + + jsr viciv_unhide + + lda VIC_CTRLB + ora #%01000000 + sta VIC_CTRLB + + lda #$00 + sta MISC_EMU +@2: } else ifdef CONFIG_MB_U64 { lda U64_TURBOCTL sta NXTBIT cmp #$FF - beq @1 ; branch if no turbo control available + beq @2 ; branch if no turbo control available lda #$8F ; max speed, no badlines sta U64_TURBOCTL - bne @2 ; branch always + bne @3 ; branch always -@1: - jsr screen_off @2: + jsr screen_off +@3: } else { From 09325665946d94a907fa0fb8ac1feeddd3323f90 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 22 Oct 2020 19:05:43 +0200 Subject: [PATCH 41/51] updated binaries --- Makefile | 2 +- bin/README.md | 6 +++++- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_generic_crt.rom | Bin 0 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/external_generic.crt | Bin 0 -> 32896 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_generic_crt.rom | Bin 0 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes bin/mega65.rom | Bin 131072 -> 131072 bytes bin/mega65_pxlfont.rom | Bin 131072 -> 131072 bytes doc/Development.md | 3 ++- doc/Extended-BASIC.md | 2 +- tools/release.cc | 10 ++++++++++ 14 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 bin/basic_generic_crt.rom create mode 100644 bin/external_generic.crt create mode 100644 bin/kernal_generic_crt.rom diff --git a/Makefile b/Makefile index 41ebd43d..c08d2f56 100644 --- a/Makefile +++ b/Makefile @@ -193,7 +193,7 @@ SEG_LIST_X16 = $(DIR_X16)/basic.seg_0 \ $(DIR_X16)/kernal.seg_0 \ $(DIR_X16)/kernal.seg_1 -REL_TARGET_LIST = $(TARGET_LIST_GEN) $(TARGET_M65_x) $(TARGET_M65_x_PXL) $(TARGET_LIST_U64) +REL_TARGET_LIST = $(TARGET_LIST_GEN) $(TARGET_LIST_CRT) $(TARGET_M65_x) $(TARGET_M65_x_PXL) $(TARGET_LIST_U64) # Misc strings diff --git a/bin/README.md b/bin/README.md index 19a5b8e1..93f2ac57 100644 --- a/bin/README.md +++ b/bin/README.md @@ -13,7 +13,7 @@ Follow these rules, or bad things will happen! * Don't mix ROMs from different builds/versions (again, CHARGEN is an exception). * The generic ROM set should be compatible with any C64-compatible machine; platform-specific ROMs might not work on other platforms. - +
For Ultimate 64 motherboard the following settings are recommended: @@ -22,6 +22,10 @@ For Ultimate 64 motherboard the following settings are recommended:
+The generic_crt ROM set is a special version of generic set, with some code moved to external ROM on the cartridge - thus, more features could be enabled. It needs all the 3 files (BASIC, Kernal, cartridge) to be operable. + +
+ Have fun!
diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 57c777649f313d88b742fec5a2805ca102b14662..370684bc822b0b4dc693f1acfe50e60f6d96c8f7 100644 GIT binary patch delta 116 zcmZp0XmHrDi;->HyQLcxwoN|3Sj=|v=^|N$;K_{a!kc}VY}goIP447KV>6tZ4V&g6awQsBdr%*=RT^9KGWT#TpWXNWDUjP?LFgySN delta 116 zcmZp0XmHrDi;<1(-O>#TY?BW#7PDP=wMbSWcrqiq@Ma$-8#cy-$(Whi zq&DkwsxgUNc(s68Vd_JV4j{2ALxFjV!s%C&Gr1pv6!`EYGc!Keyn+7-7h}TasZu9c Rm<%i?$IAzS4B0I23jlKEE|dTO diff --git a/bin/basic_generic_crt.rom b/bin/basic_generic_crt.rom new file mode 100644 index 0000000000000000000000000000000000000000..23f011e13bb4bb58f8a8d48663615d2315bd29ef GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index 7efd47c9bb2a6f0af3a1c24a68853716eaa71900..1ea03b7bdab1cd9be32ac2883681d728681c7fef 100644 GIT binary patch delta 108 zcmZp0XmHrDiIKha-O>#Tt?wr9WDH}{e?3`{=@H|B&0mlC Gd0zmb$}8yr delta 108 zcmZp0XmHrDiIM%*+oc;6ZoQqnlQE2G=BvqqOph2JZ2rPDg_TiuawkU`NbDnr4UpQb z&#A^FGV|2}W`(H_JvxBIstkqmn-!+Knw-h~5Tw9|XPp3}?B?GxNlZ)z7L()UgFw1B H%liTVJ?}1D diff --git a/bin/external_generic.crt b/bin/external_generic.crt new file mode 100644 index 0000000000000000000000000000000000000000..2001cc5160521bae11cd93c6ee22f90b3235ffdd GIT binary patch literal 32896 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 GB>W$a(6?s* diff --git a/bin/kernal_generic_crt.rom b/bin/kernal_generic_crt.rom new file mode 100644 index 0000000000000000000000000000000000000000..ee4b0800d5b69f34e6e8e37ef069d1d23939df55 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index 79ab55e28d43f8a0db1fd99514b0dc7621394c43..e1a873fc4e8a1aa84d369953554e96454a233159 100644 GIT binary patch delta 3683 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 diff --git a/bin/mega65.rom b/bin/mega65.rom index f3fde96d9e237597fe0689ddb5144184d1209026..179efd8068affc6979eefa051b15fbf9823973b5 100644 GIT binary patch delta 8446 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 Q;G_Ab#ASc_|0n(b0A1DN$p8QV delta 8448 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 Q;G_Ab#ASc_|0n(b0A1DN$p8QV delta 8448 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 ROM_DEFINITIONS = 0x1F80 // KERNAL ID offset }, + { + "CART", + 32896, // file size + 0x203C, // signature offset 1 + 0, // signature offset 2 + 0, // DOS date offset + 0, // BASIC ID offset + 0 // KERNAL ID offset + }, + { "MEGA65", 128 * 1024, // file size From c98407bd845a181aa1046f18d5b0511a63f5f179 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 22 Oct 2020 19:39:11 +0200 Subject: [PATCH 42/51] more tape improvements --- doc/Extended-BASIC.md | 20 ++++++++++++++------ src/basic/wedge/wedge_tape.s | 15 ++++++++++++++- src/kernal/assets/kernal_messages.s | 8 +++++--- src/kernal/board_crt/crt_imports.s | 2 +- src/kernal/board_m65/mega65_imports.s | 2 +- src/kernal/tape/tape_common.s | 2 +- 6 files changed, 36 insertions(+), 13 deletions(-) diff --git a/doc/Extended-BASIC.md b/doc/Extended-BASIC.md index eac72c6d..b82d72d2 100644 --- a/doc/Extended-BASIC.md +++ b/doc/Extended-BASIC.md @@ -1,7 +1,7 @@ # Extended BASIC -NOTE: Command syntax, behaviour details, and tokens are still subject to change! Currently the availability of some depends on the build configuration, in the future most (if not all) extended commands will be available only on machines with extended ROM, like the MEGA65 or Ultimate 64. +NOTE: Command syntax, behaviour details, and tokens are still subject to change! Currently the availability of some depends on the build configuration, in the future most (if not all) extended commands will be available only on machines with extended ROM, like the *MEGA65* or *Ultimate 64*. ## DOS Wedge @@ -29,22 +29,30 @@ Sends the DOS command to the current unit. ## Tape Wedge -The Tape Wedge commands are only available in direct mode, and they have to start from the first character of the line. +The Tape Wedge commands are only available in direct mode, and they have to start from the first character of the line. It is designed to ressemble wedge from *BlackBox* series of cartridges and several tape turbo implementations. ### `←L ["file_name"]` (all) -Loads the file from tape. Depending on the configuration, it tries to load the file in TurboTape 64 format, in the standard CBM format, or autodetects the file format. +Loads the file from tape. Depending on the configuration, it tries to load the file: +* in any format (standard/turbo) - if format autodetection is compiled in +* in *TurboTape 64* format - if turbo support is compiled in +* in the normal CBM format - if only this one is compiled in ### `←M ["file_name"]` (all) Like above, but merges a BASIC program to the one already stored in memory. -### `←H` (MEGA65, cartridge) +### `←H` or `←HF` (MEGA65, cartridge) -Launches a built-in tape head alignment tool. Destroys program in memory. Press `RUN/STOP` to terminate the tool. +Launches a built-in tape head alignment tool. Destroys program in memory. Press `RUN/STOP` to terminate the tool. `←HF` is for compatibility with the *BlackBox v3/v4/v8* cartridges. ## Additional BASIC commands - I/O +### Device numbers + +* if tape format autodetection is compiled-in, you can load file from tape using either device #1 (CBM compatible way) or from device #7 (in a way compatible with *Final* and *Action Replay* cartridges) +* if autodetection is not available, than device #1 means normal CBM format, and device #7 means *Turbo Tape 64* format + ### `MERGE "file_name" [, device_number]` (all) Appends the BASIC program from a storage medium to the one currently present in memory. @@ -106,4 +114,4 @@ Switches machine to C64 compatibility mode or to MEGA65 native mode. Performs `C ### `IF MEGA65 THEN`, `IF MEGA65 GOTO` (MEGA65) -Special check for running under MEGA65. The `MEGA65` string is not tokenized, therefore it will be listed properly even under original BASIC V2. `MEGA65` is not a variable here - it is still possible to normally use the `ME` variable. +Special check for running on *MEGA65* motherboard. The `MEGA65` string is not tokenized, therefore it will be listed properly even under original BASIC V2. `MEGA65` is not a variable here - it is still possible to normally use the `ME` variable. diff --git a/src/basic/wedge/wedge_tape.s b/src/basic/wedge/wedge_tape.s index dfa2478e..54926c89 100644 --- a/src/basic/wedge/wedge_tape.s +++ b/src/basic/wedge/wedge_tape.s @@ -28,6 +28,10 @@ wedge_tape: beq wedge_arrow_H } + ; FALLTROUGH + +wedge_tape_syntax_error: + jmp do_SYNTAX_error !ifdef CONFIG_TAPE_HEAD_ALIGN { @@ -39,7 +43,16 @@ wedge_arrow_H: jsr fetch_character_skip_spaces cmp #$00 - +bne do_SYNTAX_error + beq wedge_arrow_H_or_HF + cmp #$46 ; 'F' + bne wedge_tape_syntax_error + + jsr fetch_character_skip_spaces + + cmp #$00 + bne wedge_tape_syntax_error + +wedge_arrow_H_or_HF: jsr tape_head_align diff --git a/src/kernal/assets/kernal_messages.s b/src/kernal/assets/kernal_messages.s index 7504e91d..6eb9fb56 100644 --- a/src/kernal/assets/kernal_messages.s +++ b/src/kernal/assets/kernal_messages.s @@ -19,7 +19,7 @@ !ifdef HAS_TAPE { !addr __MSG_KERNAL_PRESS_PLAY = __msg_kernalplay - __msg_kernal_first !addr __MSG_KERNAL_FOUND = __msg_kernalfound - __msg_kernal_first -!addr __MSG_KERNAL_OK = __msg_kernalok - __msg_kernal_first +!addr __MSG_KERNAL_OK_SEARCH = __msg_kernaloksearch - __msg_kernal_first } !ifdef CONFIG_PANIC_SCREEN { @@ -69,9 +69,11 @@ __msg_kernalfound: !pet "found" !byte $80 + $20 ; end of string mark + space -__msg_kernalok: +__msg_kernaloksearch: !pet "ok" - !byte $80 + $0D ; end of string mark + return + !byte $0D, $0D + !pet "searchin" + !byte $80 + $47 ; end of string mark + 'G' } !ifdef CONFIG_PANIC_SCREEN { diff --git a/src/kernal/board_crt/crt_imports.s b/src/kernal/board_crt/crt_imports.s index 3da1707e..dd21e1cd 100644 --- a/src/kernal/board_crt/crt_imports.s +++ b/src/kernal/board_crt/crt_imports.s @@ -40,7 +40,7 @@ ;; #ALIAS# print_return = KERNAL_0.proxy_K1_print_return ;; #ALIAS# __MSG_KERNAL_PRESS_PLAY = KERNAL_0.__MSG_KERNAL_PRESS_PLAY -;; #ALIAS# __MSG_KERNAL_OK = KERNAL_0.__MSG_KERNAL_OK +;; #ALIAS# __MSG_KERNAL_OK_SEARCH = KERNAL_0.__MSG_KERNAL_OK_SEARCH ;; #ALIAS# __MSG_KERNAL_FOUND = KERNAL_0.__MSG_KERNAL_FOUND ;; #ALIAS# tape_normal_byte_store = KERNAL_0.tape_normal_byte_store diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index b74001ec..60a496f9 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -70,7 +70,7 @@ ;; #ALIAS# print_return = KERNAL_0.proxy_K1_print_return ;; #ALIAS# __MSG_KERNAL_PRESS_PLAY = KERNAL_0.__MSG_KERNAL_PRESS_PLAY -;; #ALIAS# __MSG_KERNAL_OK = KERNAL_0.__MSG_KERNAL_OK +;; #ALIAS# __MSG_KERNAL_OK_SEARCH = KERNAL_0.__MSG_KERNAL_OK_SEARCH ;; #ALIAS# __MSG_KERNAL_FOUND = KERNAL_0.__MSG_KERNAL_FOUND ;; #ALIAS# tape_normal_byte_store = KERNAL_0.tape_normal_byte_store diff --git a/src/kernal/tape/tape_common.s b/src/kernal/tape/tape_common.s index 2efb626f..45b4a12a 100644 --- a/src/kernal/tape/tape_common.s +++ b/src/kernal/tape/tape_common.s @@ -116,7 +116,7 @@ tape_prepare_reading: ; Display confirmation - ldx #__MSG_KERNAL_OK + ldx #__MSG_KERNAL_OK_SEARCH jsr print_kernal_message ; Prepare for reading From 6dc461d184d178cefb4d6084ee8739489a40b970 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 22 Oct 2020 20:07:53 +0200 Subject: [PATCH 43/51] small tape support + turbo mode tweaks --- Makefile | 1 + src/aliases/,aliases_ram_lowmem.s | 2 +- src/basic/,imports.s | 7 +++++ src/basic/basic_commands_01/cmd_fast_slow.s | 13 ++------- src/kernal/board_m65/mega65_tape_fast_cpu.s | 31 +++++++++++++++++++++ src/kernal/board_u64/ultimate64_slow_fast.s | 22 +++++++++++++++ src/kernal/init/fce2.hw_entry_reset.s | 6 ++++ src/kernal/tape/tape_common_screen.s | 20 ++----------- src/kernal/tape/tape_head_align.s | 11 ++++++++ 9 files changed, 84 insertions(+), 29 deletions(-) create mode 100644 src/kernal/board_m65/mega65_tape_fast_cpu.s create mode 100644 src/kernal/board_u64/ultimate64_slow_fast.s diff --git a/Makefile b/Makefile index c08d2f56..01e8a236 100644 --- a/Makefile +++ b/Makefile @@ -45,6 +45,7 @@ SRCDIR_KERNAL = $(SRCDIR_COMMON) \ src/kernal/assets \ src/kernal/board_crt \ src/kernal/board_m65 \ + src/kernal/board_u64 \ src/kernal/board_x16 \ src/kernal/extapi_m65 \ src/kernal/iec \ diff --git a/src/aliases/,aliases_ram_lowmem.s b/src/aliases/,aliases_ram_lowmem.s index f8e53af8..151c261a 100644 --- a/src/aliases/,aliases_ram_lowmem.s +++ b/src/aliases/,aliases_ram_lowmem.s @@ -121,7 +121,7 @@ !ifndef CONFIG_LEGACY_SCNKEY { !addr BITTS = $B4 ; -- NOT IMPLEMENTED -- } - !addr NXTBIT = $B5 ; -- NOT IMPLEMENTED -- [!] also used by tape routine, we use it only for Ultimate 64 turbo handling + !addr NXTBIT = $B5 ; -- NOT IMPLEMENTED -- [!] also used by tape routine to store CPU turbo settings !ifndef CONFIG_LEGACY_SCNKEY { !addr RODATA = $B6 ; -- NOT IMPLEMENTED -- } diff --git a/src/basic/,imports.s b/src/basic/,imports.s index 1ccbe2c2..fa3bb638 100644 --- a/src/basic/,imports.s +++ b/src/basic/,imports.s @@ -41,3 +41,10 @@ ;; #ALIAS# M65_MODEGET = KERNAL_0.M65_MODEGET ;; #ALIAS# M65_MODESET = KERNAL_0.M65_MODESET ;; #ALIAS# M65_SETWIN_Y = KERNAL_0.M65_SETWIN_Y + +; +; Ultimate 64 specific parts +; + +;; #ALIAS# U64_SLOW = KERNAL_0.U64_SLOW +;; #ALIAS# U64_FAST = KERNAL_0.U64_FAST diff --git a/src/basic/basic_commands_01/cmd_fast_slow.s b/src/basic/basic_commands_01/cmd_fast_slow.s index 891494fe..84e33241 100644 --- a/src/basic/basic_commands_01/cmd_fast_slow.s +++ b/src/basic/basic_commands_01/cmd_fast_slow.s @@ -39,22 +39,13 @@ cmd_slow_fast_common: cmd_slow: - lda #$00 ; for U64_TURBOCTL - badlines, 1MHz sta SCPU_SPEED_NORMAL ; any value will do - - ; FALLTROUGH - -cmd_slow_fast_common: - - sta U64_TURBOCTL - rts + jmp U64_SLOW ; to set turbo in $D031 too cmd_fast: - lda #$0F ; for U64_TURBOCTL - badlines, 48MHz sta SCPU_SPEED_TURBO ; any value will do - - bne cmd_slow_fast_common ; branch always + jmp U64_FAST ; to set turbo in $D031 too } else ifdef CONFIG_PLATFORM_COMMODORE_64 { diff --git a/src/kernal/board_m65/mega65_tape_fast_cpu.s b/src/kernal/board_m65/mega65_tape_fast_cpu.s new file mode 100644 index 00000000..0be56175 --- /dev/null +++ b/src/kernal/board_m65/mega65_tape_fast_cpu.s @@ -0,0 +1,31 @@ +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Tape helper routine +; +; - unlocks VIC-IV +; - switches CPU to fast processing mode and disables badlines +; - stores previous VIC_CTRLB in NXTBIN +; + +!ifdef HAS_TAPE { + + +tape_fast_cpu: + + jsr M65_MODEGET + bcc @1 + + jsr viciv_unhide +@1: + lda VIC_CTRLB + ora #%01000000 + sta VIC_CTRLB + sta NXTBIT + + lda #$00 + sta MISC_EMU + + rts +} diff --git a/src/kernal/board_u64/ultimate64_slow_fast.s b/src/kernal/board_u64/ultimate64_slow_fast.s new file mode 100644 index 00000000..8d68f5c1 --- /dev/null +++ b/src/kernal/board_u64/ultimate64_slow_fast.s @@ -0,0 +1,22 @@ +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE + + +!ifdef CONFIG_MB_U64 { + +U64_SLOW: + + lda #$00 ; for U64_TURBOCTL - badlines, 1MHz + + +skip_2_bytes_trash_nvz + + ; FALLTROUGH + +U64_FAST: + + lda #$0F ; for U64_TURBOCTL - badlines, 48MHz + sta SCPU_SPEED_TURBO ; any value will do + + rts +} diff --git a/src/kernal/init/fce2.hw_entry_reset.s b/src/kernal/init/fce2.hw_entry_reset.s index 3867c990..3f4ac748 100644 --- a/src/kernal/init/fce2.hw_entry_reset.s +++ b/src/kernal/init/fce2.hw_entry_reset.s @@ -32,6 +32,12 @@ hw_entry_reset: jsr m65_reset_part } +!ifdef CONFIG_MB_U64 { + + jsr U64_SLOW + sta SCPU_SPEED_NORMAL +} + !ifdef CONFIG_PLATFORM_COMMODORE_64 { ; The following routine is based on reading the public KERNAL jumptable routine diff --git a/src/kernal/tape/tape_common_screen.s b/src/kernal/tape/tape_common_screen.s index 4b51f55d..51e251cd 100644 --- a/src/kernal/tape/tape_common_screen.s +++ b/src/kernal/tape/tape_common_screen.s @@ -30,8 +30,7 @@ tape_screen_on_motor_off: lda #$03 sta MISC_EMU - lda VIC_CTRLB - and #%10111111 + lda NXTBIT sta VIC_CTRLB sta VIC_KEY @@ -70,18 +69,7 @@ tape_screen_off_motor_on: ; to be handled by 1 MHz CPU - so in case of compatibility mode, switch CPU to fast speed ; (and disable badlines, so we will not have to blank the screen) - jsr M65_MODEGET - bcc @2 - - jsr viciv_unhide - - lda VIC_CTRLB - ora #%01000000 - sta VIC_CTRLB - - lda #$00 - sta MISC_EMU -@2: + jsr tape_fast_cpu } else ifdef CONFIG_MB_U64 { @@ -90,10 +78,8 @@ tape_screen_off_motor_on: cmp #$FF beq @2 ; branch if no turbo control available - lda #$8F ; max speed, no badlines - sta U64_TURBOCTL + jsr U64_FAST ; max speed, no badlines bne @3 ; branch always - @2: jsr screen_off @3: diff --git a/src/kernal/tape/tape_head_align.s b/src/kernal/tape/tape_head_align.s index 71fec45e..2c3144e9 100644 --- a/src/kernal/tape/tape_head_align.s +++ b/src/kernal/tape/tape_head_align.s @@ -45,6 +45,17 @@ tape_head_align: jsr nmi_lock + ; Switch CPU to fast mode + +!ifdef CONFIG_MB_M65 { + jsr tape_fast_cpu +} + +!ifdef CONFIG_MB_U64 { + jsr U64_FAST + sta SCPU_SPEED_TURBO +} + ; Prepare CIA timers ldx #$02 ; set timer A to 3 ticks From 222b72cf7e396f306287a78d36ce5841960f96d3 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 22 Oct 2020 20:13:53 +0200 Subject: [PATCH 44/51] Ultimate 64 turbo handling fix --- src/kernal/board_u64/ultimate64_slow_fast.s | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/kernal/board_u64/ultimate64_slow_fast.s b/src/kernal/board_u64/ultimate64_slow_fast.s index 8d68f5c1..5162e0e9 100644 --- a/src/kernal/board_u64/ultimate64_slow_fast.s +++ b/src/kernal/board_u64/ultimate64_slow_fast.s @@ -13,10 +13,10 @@ U64_SLOW: ; FALLTROUGH -U64_FAST: +U64_FAST: ; clears zero flag - important for tape code lda #$0F ; for U64_TURBOCTL - badlines, 48MHz - sta SCPU_SPEED_TURBO ; any value will do + sta U64_TURBOCTL rts } From 732ba36d8730509212ae7e4a21ec7bacaa1ea00c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 23 Oct 2020 14:38:14 +0200 Subject: [PATCH 45/51] adapted BASIC to CRT memory layout, updated binaries --- Makefile | 57 ++++---- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_generic_crt.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/external_generic.crt | Bin 32896 -> 32896 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_generic_crt.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes bin/mega65.rom | Bin 131072 -> 131072 bytes bin/mega65_pxlfont.rom | Bin 131072 -> 131072 bytes doc/Extended-BASIC.md | 8 +- src/aliases/,aliases_config.s | 15 +- src/basic/ab1e.strout.s | 1 + src/basic/assets/packed_as_1n.s | 2 +- src/basic/assets/packed_as_3n.s | 2 +- src/basic/assets/packed_dictionary.s | 2 +- src/basic/assets/packed_errors.s | 2 +- src/basic/assets/packed_keywords.s | 2 +- src/basic/assets/packed_keywords_01.s | 2 +- src/basic/assets/packed_keywords_02.s | 2 +- src/basic/assets/packed_keywords_03.s | 2 +- src/basic/assets/packed_misc.s | 2 +- src/basic/assets/startup_banner.s | 2 +- .../basic_commands_02/cmd__jumptable_02.s | 13 +- src/basic/basic_commands_02/cmd_mem.s | 28 ++-- .../basic_commands_02/helper_ask_if_sure.s | 7 + .../basic_commands_02/helper_mem_tab_str.s | 1 + .../basic_commands_02/helper_mem_tab_x.s | 1 + .../basic_commands_02/helper_mem_tab_y.s | 1 + .../board_crt/8000.crt_vectable_basic_1.s | 54 ++++++++ src/basic/board_crt/8000.interop | 1 + src/basic/board_crt/crt_imports.s | 41 ++++++ src/basic/board_crt/crt_proxies.s | 130 ++++++++++++++++++ src/basic/board_crt/dummy.s | 4 - src/basic/engine_editor/a533.linkprg.s | 15 ++ src/basic/engine_editor/tk_cut_away.s | 2 +- src/basic/engine_editor/tk_pack.s | 2 +- src/basic/engine_editor/tk_search.s | 2 +- src/basic/engine_editor/tk_shorten.s | 2 +- src/basic/engine_editor/tokenise_line.s | 10 +- src/basic/engine_runtime/do_error.s | 12 +- src/basic/engine_runtime/do_new_clr_restore.s | 22 ++- src/basic/engine_runtime/is_alphanumeric.s | 1 + .../engine_runtime/prepare_direct_execution.s | 7 + src/basic/init/e422.initmsg.jmp.s | 6 + src/basic/init/initmsg_bytes_free.s | 2 +- src/basic/init/initmsg_real.s | 10 +- src/basic/print/list_single_line.s | 20 ++- src/basic/print/print_features.s | 2 +- src/basic/print/print_packed_dict_string.s | 2 +- src/basic/print/print_packed_freq_string.s | 20 ++- src/basic/print/print_packed_search.s | 2 +- src/basic/wedge/wedge_dos.s | 8 +- tools/generate_strings.cc | 23 ++-- 54 files changed, 461 insertions(+), 91 deletions(-) create mode 100644 src/basic/board_crt/8000.crt_vectable_basic_1.s create mode 100644 src/basic/board_crt/8000.interop create mode 100644 src/basic/board_crt/crt_imports.s create mode 100644 src/basic/board_crt/crt_proxies.s delete mode 100644 src/basic/board_crt/dummy.s diff --git a/Makefile b/Makefile index 01e8a236..e884707a 100644 --- a/Makefile +++ b/Makefile @@ -146,6 +146,9 @@ TOOLS_LIST = $(TOOL_GENERATE_CONSTANTS) \ # List of targets +TARGET_CHR_OR = build/chargen_openroms.rom +TARGET_CHR_PXL = build/chargen_pxlfont.rom + TARGET_CUS_B = build/basic_custom.rom TARGET_GEN_B = build/basic_generic.rom TARGET_CRT_B = build/basic_generic_crt.rom @@ -270,17 +273,17 @@ build/tools/%: tools/%.cc tools/common.h # Rules - CHARGEN -build/chargen_openroms.rom: $(TOOL_PNGPREPARE) assets/8x8font.png +$(TARGET_CHR_OR): $(TOOL_PNGPREPARE) assets/8x8font.png @$(TOOL_PNGPREPARE) charrom assets/8x8font.png $@ 1>build/pngprepare.log -build/chargen_pxlfont.rom: bin/chargen_pxlfont_2.3.rom +$(TARGET_CHR_PXL): bin/chargen_pxlfont_2.3.rom @cp $< $@ -build/chargen_openroms.patched: $(TOOL_PATCH_CHARGEN) build/chargen_openroms.rom - @$(TOOL_PATCH_CHARGEN) -i build/chargen_openroms.rom -o $@ -n 7px-OpenROMs +build/chargen_openroms.patched: $(TOOL_PATCH_CHARGEN) $(TARGET_CHR_OR) + @$(TOOL_PATCH_CHARGEN) -i $(TARGET_CHR_OR) -o $@ -n 7px-OpenROMs -build/chargen_pxlfont.patched: $(TOOL_PATCH_CHARGEN) build/chargen_pxlfont.rom - @$(TOOL_PATCH_CHARGEN) -i build/chargen_pxlfont.rom -o $@ -n 6px-PXLfont +build/chargen_pxlfont.patched: $(TOOL_PATCH_CHARGEN) $(TARGET_CHR_PXL) + @$(TOOL_PATCH_CHARGEN) -i $(TARGET_CHR_PXL) -o $@ -n 6px-PXLfont # Dependencies - BASIC, DOS, and KERNAL @@ -591,7 +594,7 @@ build/padding_64_KB: @mkdir -p build @dd if=/dev/zero bs=8192 count=8 of=$@ status=none -$(TARGET_M65_x) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_64_KB build/chargen_openroms.rom build/chargen_openroms.patched build/chargen_pxlfont.rom build/chargen_pxlfont.patched +$(TARGET_M65_x) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_64_KB $(TARGET_CHR_OR) build/chargen_openroms.patched $(TARGET_CHR_PXL) build/chargen_pxlfont.patched @echo @echo @echo @@ -602,7 +605,7 @@ $(TARGET_M65_x) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_64_KB build/c @cat $(DIR_M65)/kernal.seg_1 >> $(TARGET_M65_x) @cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x) @cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x) - @cat build/chargen_openroms.rom >> $(TARGET_M65_x) + @cat $(TARGET_CHR_OR) >> $(TARGET_M65_x) @cat build/chargen_openroms.patched >> $(TARGET_M65_x) @cat $(DIR_M65)/kernal.seg_0 >> $(TARGET_M65_x) @cat build/padding_64_KB >> $(TARGET_M65_x) @@ -616,7 +619,7 @@ $(TARGET_M65_x) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_64_KB build/c @cat $(DIR_M65)/kernal.seg_1 >> $(TARGET_M65_x_PXL) @cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x_PXL) @cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x_PXL) - @cat build/chargen_pxlfont.rom >> $(TARGET_M65_x_PXL) + @cat $(TARGET_CHR_PXL) >> $(TARGET_M65_x_PXL) @cat build/chargen_pxlfont.patched >> $(TARGET_M65_x_PXL) @cat $(DIR_M65)/kernal.seg_0 >> $(TARGET_M65_x_PXL) @cat build/padding_64_KB >> $(TARGET_M65_x_PXL) @@ -647,23 +650,23 @@ $(TARGET_X16_x): $(SEG_LIST_X16) build/chargen_openroms.rom test: test_custom test_crt: test_generic_crt -test_custom: $(TARGET_LIST_CUS) build/symbols_custom.vs - x64 -kernal $(TARGET_CUS_K) -basic $(TARGET_CUS_B) -moncommands build/symbols_custom.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_custom: $(TARGET_LIST_CUS) $(TARGET_CHR_PXL) build/symbols_custom.vs + x64 -kernal $(TARGET_CUS_K) -basic $(TARGET_CUS_B) -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_custom.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_generic: $(TARGET_LIST_GEN) build/symbols_generic.vs - x64 -kernal $(TARGET_GEN_K) -basic $(TARGET_GEN_B) -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_generic: $(TARGET_LIST_GEN)$(TARGET_CHR_PXL) build/symbols_generic.vs + x64 -kernal $(TARGET_GEN_K) -basic $(TARGET_GEN_B) -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_generic_x128: $(TARGET_LIST_GEN) build/symbols_generic.vs - x128 -go64 -kernal64 $(TARGET_GEN_K) -basic64 $(TARGET_GEN_B) -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_generic_x128: $(TARGET_LIST_GEN) $(TARGET_CHR_PXL) build/symbols_generic.vs + x128 -go64 -kernal64 $(TARGET_GEN_K) -basic64 $(TARGET_GEN_B) -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_generic_crt: $(TARGET_LIST_CRT) build/symbols_generic_crt.vs - x64 -kernal $(TARGET_CRT_K) -basic $(TARGET_CRT_B) -cartcrt $(TARGET_CRT_X) -moncommands build/symbols_generic_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_generic_crt: $(TARGET_LIST_CRT) $(TARGET_CHR_PXL) build/symbols_generic_crt.vs + x64 -kernal $(TARGET_CRT_K) -basic $(TARGET_CRT_B) -chargen $(TARGET_CHR_PXL) -cartcrt $(TARGET_CRT_X) -moncommands build/symbols_generic_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_testing: $(TARGET_LIST_TST) build/symbols_testing.vs - x64 -kernal $(TARGET_TST_K) -basic $(TARGET_TST_B) -moncommands build/symbols_testing.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_testing: $(TARGET_LIST_TST) $(TARGET_CHR_PXL) build/symbols_testing.vs + x64 -kernal $(TARGET_TST_K) -basic $(TARGET_TST_B) -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_testing.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_ultimate64: $(TARGET_LIST_U64) build/symbols_ultimate64.vs - x64 -kernal $(TARGET_U64_K) -basic $(TARGET_U64_B) -moncommands build/symbols_ultimate64.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_ultimate64: $(TARGET_LIST_U64) $(TARGET_CHR_PXL) build/symbols_ultimate64.vs + x64 -kernal $(TARGET_U64_K) -basic $(TARGET_U64_B) -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_ultimate64.vs -1 $(TESTTAPE) -8 $(TESTDISK) test_mega65: $(TARGET_M65_x) $(TARGET_M65_x_PXL) ../xemu/build/bin/xmega65.native -dmarev 2 -besure -fontrefresh -forcerom -loadrom $(TARGET_M65_x_PXL) @@ -671,20 +674,20 @@ test_mega65: $(TARGET_M65_x) $(TARGET_M65_x_PXL) test_cx16: $(TARGET_X16_x) ../x16-emulator/x16emu -rom $(TARGET_X16_x) -test_hybrid: build/kernal_hybrid.rom build/symbols_hybrid.vs +test_hybrid: build/kernal_hybrid.rom $(TARGET_CHR_PXL) build/symbols_hybrid.vs @echo @echo $(HYBRID_WARNING) @echo - x64 -kernal build/kernal_hybrid.rom -moncommands build/symbols_hybrid.vs -1 $(TESTTAPE) -8 $(TESTDISK) + x64 -kernal build/kernal_hybrid.rom -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_hybrid.vs -1 $(TESTTAPE) -8 $(TESTDISK) @echo @echo $(HYBRID_WARNING) @echo -test_hybrid_u64: build/kernal_hybrid_u64.rom build/symbols_hybrid_u64.vs +test_hybrid_u64: build/kernal_hybrid_u64.rom $(TARGET_CHR_PXL) build/symbols_hybrid_u64.vs @echo @echo $(HYBRID_WARNING) @echo - x64 -kernal build/kernal_hybrid_u64.rom -moncommands build/symbols_hybrid_u64.vs -1 $(TESTTAPE) -8 $(TESTDISK) + x64 -kernal build/kernal_hybrid_u64.rom -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_hybrid_u64.vs -1 $(TESTTAPE) -8 $(TESTDISK) @echo @echo $(HYBRID_WARNING) @echo @@ -692,8 +695,8 @@ test_hybrid_u64: build/kernal_hybrid_u64.rom build/symbols_hybrid_u64.vs test_m65: build/mega65.rom m65 -b ../mega65-core/bin/mega65r1.bit -k ../mega65-core/bin/KICKUP.M65 -R build/mega65.rom -4 -testremote: build/kernal_custom.rom build/basic_custom.rom build/symbols_custom.vs - x64 -kernal build/kernal_custom.rom -basic build/basic_custom.rom -moncommands build/symbols_custom.vs -remotemonitor +testremote: build/kernal_custom.rom build/basic_custom.rom $(TARGET_CHR_PXL) build/symbols_custom.vs + x64 -kernal build/kernal_custom.rom -basic build/basic_custom.rom -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_custom.vs -remotemonitor testsimilarity: $(TOOL_SIMILARITY) $(DIR_GEN)/OUTx_x.BIN kernal basic $(TOOL_SIMILARITY) kernal $(DIR_GEN)/OUTx_x.BIN diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 370684bc822b0b4dc693f1acfe50e60f6d96c8f7..3683c857b914e350987e3e1859696a6dc8ee5aa3 100644 GIT binary patch delta 107 zcmZp0XmHrDi;->RyQLcxR!%;^Sj?9CdXcO`@MK1I;mtlwHf)T~CU3 zNNv{VRAUlOeZ7ELVd_JV4j{2ALxFjVLc-(>?nfYbA07`r#%G(SN}Xh3G@cwU9|Y37 HS>6`_HyQLcxwoN|3Sj=|v=^|N$;K_{a!kc}VY}goIP447KV>6tX5~a6bac`|x=1F}~V7Rq7-QqtWDe`5=(q H&GNngU56{} diff --git a/bin/basic_generic_crt.rom b/bin/basic_generic_crt.rom index 23f011e13bb4bb58f8a8d48663615d2315bd29ef..0720e80e99ad794709e46e4b850077fed1df5f16 100644 GIT binary patch delta 4165 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 delta 5974 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 U8g|M9e?(+Q{8_5@s`f1PzjpdAX8-^I diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index 1ea03b7bdab1cd9be32ac2883681d728681c7fef..af1dd73cc7cbb2925ee317f16ef0e675aa944486 100644 GIT binary patch delta 1373 zcmXX_Yfuwc6yDvC*T#?_U;`AmB8G^fZG#q}C>D_@Tg7LqeRyN*4E0B6+J6n!>U36t zRt?_TR{66D-lZEI-IzL-kPM>^t=sxowROsmwxEJKbUGJiI_fx`^e*&7i8n5!2l{hpzDWHjr_0>RXp`9gGdRMIa zgu?6hpGh2AoH(cyHD_&dQ}4Cp35~EarbGhDhv;NhIY(XJ$Xd)PcahEPwT<-&2UIXK zg_f9+{ZYyT6)Sj@LO0Dn=WbpltZZGqV%^#e8#gt@i0dc!G8DJ?&~KJTm&AaM(eaSZ zjkiPNb)|LoqTU2>M#ARl^u#8b4qzfGFRpra3qRJ%Nr^U>@QPX7Xk-|&mf2~BK4LNc zu(e?>4%Iwl#Sm_P$cXI_x9Themn4;iIuCl!D4f_T^qxVyZO`oJgyNE1AejM8De7Nh z;vwB6conUj9!(0cAjMVzU_`U2CgFx0Fxpg3wo@n!pxeZxU^+!xL2UJG0a|E3h ztMjJ@r%{P1CeS(3HT_Xdk8{(E9+_l!=#QmY!;=y8)S2KYkJM~GdmG)$e%sbLf`dFY zN2^^+>jol%Its7e8s5U4&-`;vlB9bhcm7PCg5b@F%85zn!Tz1CqCd=yS3`vffD8R$ zqa+FfO1sK9isY!P&}j0%uF5=0k}{G_tG12@^-1B9Y#?3devvClp%2_I(F7vy2ka%( zmE$wWvVc76o(Ix!iHkX-Y=HXJ0C@sy6lTo#EuiWBIEqzsoVcPEu(cn@!LGltN;e9q zxMP3N9MsLq3&PEelm#*as;R^Mn9?~jfF^Qf7Y%WOztw$|X#SgRPKMYqHM014Ct|6nFa#aSKpX;9Zi+uQ%_gr-6XqZLZ_8FTr&&(X z3|D<~n?JT)J6_pUqgOiPC~X?IFu85&iOV*Yn288VSe7S=8OAK#ySkU$d+)x#-{<@J z9%wkw;7=BTVMzt#F~pk(tF;WgX|M`P4Cor2@M+vcCp`W~DVu{hwsG#+kl!HO2+2Gs zkEL&+yq_1R z10MNJbS|TWqoHqREa#5gL1v@NJe?E{DMBXLGI3+7P>&v1oNQ$@li$eZR!m6-aB|esMYnJVxDf?q zsKa`fIW8!C$qNc$L6f+{PEs2pTe>M$YV#-AJv@6+B!>#knApPMw&Cy7e!C9 zqB@C`>?(E|-OGN}ERSI?PtDOf+sfMC0)jFMgXeB<=PsunU5ZAfdw1^s89NU_dqCmD z7_5<*arf7N+Fc!$84tM9@7JG1K|l#xF-MUcwH4@1{?}HPM@dplvgxZ$6JG71@O?-} zy4GIFr3TO&_GPqyfc*h`6&=lS+qX3fYunbX*|=fzmaR=RUG%%0QPv|f-9D|mQiHOs zyHnF1)z>{=v9xU0;!O+OtuMdi+3{k@_7_?jvr2caE?+P1KIAoeHKY8jFr1Pyz`VF( z=(5jHI?s!vsoao_Hlc^)>ec!Nbk<0Db;f_DJ1|5K-0Nr<>ok|1@ry|Q25wb!h#JZlYa6*X)XZnXC%fpGjC{+(>*K~`Rhl&>2 z9Pcsg>Hjst`~C1BLzhknhFIu)=!8uV75ZiFD|BSQkshU4%##^0UkA0JV3iK)y9Jk= zlpd~{aj)p2^en}tc7re|W0&X!bCRGEZ7AHM_w}2?*2PCXu{)3w?@Fj648gvjaQK4E z2G>Xrg+xl&7sR_q5@F4Vy(6(PRQAlZ0+9#(QxYRkI-k5u+u0YwTRcJL0hmTP&U}u} zqube7OQ#d>-rFL!;MewgL=O~(La_A1?qeVMFCRZ7p9-N9=!2|}PmZ+w`pKuC?LXyu z=XC7M+0TFe;`;S3QOLQJcj&%!Vm&Z=+j)>>m!b9|mxWTKmbi6Z94lHtdEHl3UGUY# XG)8dt>Jtq1)l9OY4|h&7Vki6$fyZD* diff --git a/bin/external_generic.crt b/bin/external_generic.crt index 2001cc5160521bae11cd93c6ee22f90b3235ffdd..a2524d6961da6541f5aaa6991586d22a54f03415 100644 GIT binary patch delta 2868 zcmZ`*e^gV~9sj;01c<;3zhbE3y|u2E1r)SkmQyI+S8u1*1Gv? z(du)|s!QtgLYO61y}V^5kZvEWMU~~%Rm*BtRs^%?d0#N| zShG&m1v3y(1YwJ)6Sg9sFO-Qfp_HeGJz<8I3*9EUl$XohdU-2v=XaL~#d{qA@U=?C zY7(uI_O?WoADpfH&us-W=goJOtzYrjBTJvIb*!1Tdcop_%TuR6v3ALf454^;$rVs@ z&IUj#j>@16S$!Ldg<=slln5oXB{>aKNTV7E`tCu}hLl;)Bq>C%6Dyl0N(gmw3 zxkWHJG;khr+m`MTi-=qM!+94H({A=J7eSJ23%?)6w$Y5>GorYo&1!PzAnzG?KsuO9;P`@Vj& z?fo|%aKj!$fuMabWO*%Tv`A^4IEm`3d!xbk`xg`s!M75IcllD52{b+*GVV#T!>D z#g(Xd;>uk5kdHGQ+Ur0dm$hyOB2(}>Wmak8v5&;z)d8Hqq}&o?`C=nRpo8me6m|Kc z)@ZQ1^zM!B8x!cLNAo}+w~=A$&G)snJ>sVF*6?I(h6Z__J1dZOah*p^t5@y?EEgjl zbsS%V)w5YcI#hXoZ-d)uQ!99rL1|>AlHl9ZgPD6C*K3E)O^JK8(aLtlYv& z+W4tHhp7HII_gAU6iXK|>~Rct$M}%wSjpF)GBU|p?Q2mQit7TclLC6|DUNz1txl{& z`jUj5taGf>V8@ZCDicDTl`)}HoXYwA&7Det98;&uj9Me>R9<$ub6Xug$KE_w>lH3s zO26|tTb%MA6`jx-RsJUa&M~dioRjC0Gt|sHUSXZMm)6EML$4(|_CuCzIhi7TccvaFjec zIzgkUut^VnPUubraxwyWCRhx8U4E?WllcTa1tRq6p=;OzZ7yIBdK)}IWd*a#!$6d1M~M;#vl@@*!4GUAuts1LTriSl0-WMrW(xcx8UBQT@20>= zax#cUXeS1EkV^0cYEOY}CfIL+3nm~v4^p7p1YJYvKweFNC`kZvhefTs6EEgwGQf_e z!^?x{J&A8rWYVtt=JMKeu(4YrJtkytUH(yUmD`?!9`X`FW51>E`%BP~iy6$_*o}g1 z)bd4nZ5q7%$x)KEv3u_|sO=`Zv*Y2j$hEP|_oscy{{4$`KW639y;Lo^aZ7*J$3J9( zEqCd&7n0)R*u0kQqh=V+II!;#CoBGIk7&VigqK|fsX0t4GZN8uN`CnJGVY)VUYxA9)TWyU@ zBJH;=-7LZi_pP~jhDWc)C!2OZdwW~_v|ZZSlYKQf4(KM0hV^e=r#}CEn%PDqUgD* zCV3jN7n-QYE#OIdg)(cN*b+*o3Xt`m7aQ@TAH}pCLA7w`od&vYwX) zfzNCap}8Z#Yg@)8&X&TpK|tW}a)b#l)yR{9SXAR>2>6qECY(07zdHpw<*Hg~5Pu=K zPbau7_z;6G2z%xSb$iN!^J%F+2IKJHSvov;(7wKi MsXX!Addt-R0{6_Cr2qf` delta 85 zcmV-b0IL6hfdYVm0+3L#f)f?7kk|?i>Q7PvL`7CEGB7bPGBUGCAa*$!NARVbjUdoW ryzh9a0ENb_Akc-JAp7x5O|#fpS_B64@X8?c@RK-RF#%1pYF-v1z78ZP diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index d085818454689868d959b1eeeeafdf0f9d6a2439..2f309c4ebda5e3cc3877c2c9dbb6d8282fb6bd5c 100644 GIT binary patch delta 3251 zcmZ8jeNa@_6@U8{c0pYC;Rh^;a4;(1SMVz`P3(Y%xU^TuU~9A{_9Z5nO{&vOJCl&F zswqp6X6ce^QqY*J%RcepU|y1T6jMeNgDf%iDUQ)pM$>UY-M70>Ff7a0_Pix_(!M|L zyZ79$bI$#p-#NPrcNa>>;*r`48e?$y96%0XV{XM8M5#w zgiQLJp}>+C=!U#NwS33I7x1_WQln%|6lT!R42vF{8*I__)*UN=h+kywjpRmuY%F*j zOmCNbzV8##)yKnHMU2`T#a};Auq4FupwKj9ZgC(aoP_oODT~@BJE-n)^g<*AUrnH7 z&wzAQWZ-u`=^_jVrAsJcgVI+bKY7*}v>Zxkl`$u&dBm%^?_?j8(i6rdMm!YNETxKZ z;ZvIx2XnpkX=RD-x}4bJVAFWT;b5z|z7{7d8(_^aS#ukX_rcCP3a%&=hSbMgQMa+} z3qS5_JL)&-u6v_uT6b$K+L@az;xt+ApGcVns@(D#>ov)R5FCb;6EHALk0)k5qXfFD^TkiSUQokbm0d1f zrCeQkS#{%Lcp>CG0p0g-HF@n$jTJsqZOyKnmMXSxP=vaR)!cpFb6lM@i4`>@w4$33 z7itJSMXCnj+~+H%Jfx$1l9>}te8?k#S`-Fqf;j5q|vCu3fu1 zh|}rVI9N-6KlKrIFhq||UC#byjNX`m{n-^XrL#r2Hi6jGrdomyX9d>55Tnuyy}PZ^e5AD%B(@# z5m+%uQUd7yeQ0Mhf@QVxV1TyAtP~@V6F_HjdSVNr9u|@~=9;ewlB(rlp^-}x88sfN zsWc7JT?{M@Eoc&&yiqy6iyO!{U|8JMVwcL(QWheAYz?@Wv&YrxFiY(^d)y-H3ee!8 zQ8E%lH^3I3@Sy`_(n~q>iX30W9mR_la>i~soQv0M*1HY8e^k}@Zf>}MZxhw#wi;Sx zF3v`-^6C%~kH!d$4Wc6+5ZETaHlWkEwI;JF=&X4YcHO7Ph?zdaE!RoZ$<@M3zg@a$ zqcxu0@#eN)j&;9#-S1bFKtNH#_WGH_HgyFt|3_w#P1N>|sRwLGK*JoPG9jgR!@2{gPv z)XtEyK~H`A6sMlt3JE6~wy?sG{w={A8?QC>pdOg#55Ufro=|*$3>fq$k`cbcIntj;@-yK(~QDJ#+Sk zzOXb3zq$jAuK0lc0JKg(`-B`sNi%M~bpVZP>LXHL<=Lu^9r=1Y6*}yvg|n4s&;`QD z7(&zUdyTj({XXpd{Ortyx)s_C?A1_ZA0;JGNbOhSRXtJ|nsxZf->-4gVfm0|hc=^! z=ZDa|?3AA(borD&r#__$bzGbn#UK+I-hQI8wdy1Ap_xeK-`6S;hm5)S2c<; zoeN%Ul7jFKElthJE{h0PycSsxcW?Jy(db!H+H+93t%0t}9_}Vcv^KSj?FiBvsTS=Q zN!_mdoIYbAbDqZBZBtXNZq~)ZRG-ZXV$g>6#k*~Afp%IlQ9Yk!!7fP={#kdi1lt`sp$qgd{7V|_wM0|N9`ZmKXUDbwxeKdlPx{JLCq|lMl?{@!Mk83&B+FGEEOOxWQK$_|3Gm7& zY>uE!(gay>UmJ}^Xyfd;=^utMI&emhKty<|vA;B-P2ZS3cNbPS4@D7jSluY1POENw zT6J@CQglsxcCxyWvAPjX+dUSfXW`7`AFslr4OsbU(jU;T6;aPCvEAZ#57JjmX5kai zCptMUmvjx}#wg`%WLE`x3$=d7kN=pe`n$P*ZH^@gE&)?qzLujfN0>Gi7nQHGmXxlCC(6oQCQ?@P zcuDCw)28C`k|*em=_{9;{=4Md&x^}TiwHbfR9eyjOQ5`L18gYSxS{A5>$)ni`g5e| z-O>HfMuQm{(;NLQvt&0@J4@y*u5ouh`Iu(RIlX?J>Q1hmcHOmw z_+cVMMFVC+a0Rfyo*R~u&Nj)$>byV5x3z5Qp|SxXe9VHCC_YFw6*Kd;Tu@@Ebqc0d zxD@RoS0;GjAUEnZ3shy@sTi>CJZv-?Qm1*1>J;G<3|iqB!RCzCJFWE&a$a{nE+hIV z_S@Xq7|x5b(lTPz5MVnN5~v&}&XI448Ca8Bd}ImbvsUMB@{{=!q-cPQ_mg+WNwz}v z1PI%YX`SpDAZ(DlqL9cC`H-HBMEooN delta 3350 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 diff --git a/bin/kernal_generic_crt.rom b/bin/kernal_generic_crt.rom index ee4b0800d5b69f34e6e8e37ef069d1d23939df55..933aae8936e03c0bf38307ff7dff94557f73436c 100644 GIT binary patch delta 3062 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 delta 3110 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 diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index e1a873fc4e8a1aa84d369953554e96454a233159..b4a7dcb3fcb4108ff6439b219eca6fcfa04fe4b0 100644 GIT binary patch delta 4192 zcmZ8k4OA58xtHSo$-X_N8*s)2PO)fpTr@g0g za#I(*j71u_ONJ((NwbbS;9wTl)8;5Dg=m7iRO1K~rIjO10

VJNyVN%d+>KrS`Pt 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 diff --git a/bin/mega65_pxlfont.rom b/bin/mega65_pxlfont.rom index 6c040c1581c672c96e2abb176eb2d50b40e963cf..f0f7a8e17de6b19171d86c167e76175a16becef4 100644 GIT binary patch delta 4554 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 diff --git a/doc/Extended-BASIC.md b/doc/Extended-BASIC.md index b82d72d2..d8c6d046 100644 --- a/doc/Extended-BASIC.md +++ b/doc/Extended-BASIC.md @@ -1,7 +1,7 @@ # Extended BASIC -NOTE: Command syntax, behaviour details, and tokens are still subject to change! Currently the availability of some depends on the build configuration, in the future most (if not all) extended commands will be available only on machines with extended ROM, like the *MEGA65* or *Ultimate 64*. +NOTE: Command syntax, behaviour details, and tokens are still subject to change! Currently the availability of some depends on the build configuration, in the future most (if not all) extended commands will be available only on machines with extended ROM, like the *MEGA65*, *Ultimate 64*, or a build utilizing cartridge with external ROM (build marked as *cart*). ## DOS Wedge @@ -42,7 +42,7 @@ Loads the file from tape. Depending on the configuration, it tries to load the f Like above, but merges a BASIC program to the one already stored in memory. -### `←H` or `←HF` (MEGA65, cartridge) +### `←H` or `←HF` (cart, MEGA65) Launches a built-in tape head alignment tool. Destroys program in memory. Press `RUN/STOP` to terminate the tool. `←HF` is for compatibility with the *BlackBox v3/v4/v8* cartridges. @@ -71,7 +71,7 @@ Saves the binary data from the given memory area. NOTE: for now syntax differs f ## Additional BASIC commands - misc -### `COLD` (MEGA65) +### `COLD` (cart, MEGA65) Resets the machine. In direct mode asks for confirmation first. @@ -83,7 +83,7 @@ Tries to switch the machine to turbo mode (or back to 1MHz operation mode) - det Tries to restore program destroyed by the `NEW` command or a reset. -### `MEM` (MEGA65) +### `MEM` (cart, MEGA65) Displays BASIC memory usage information: * `TEXT` - size of BASIC program text, always at least 2 bytes are used diff --git a/src/aliases/,aliases_config.s b/src/aliases/,aliases_config.s index fbbc5c0c..4eb53819 100644 --- a/src/aliases/,aliases_config.s +++ b/src/aliases/,aliases_config.s @@ -94,6 +94,9 @@ !ifdef CONFIG_MB_M65 { !ifdef CONFIG_MEMORY_MODEL_60K { !error "Do not use CONFIG_MEMORY_MODEL_60K options for MEGA65 motherboard" } } +!ifdef ROM_LAYOUT_CRT { + !ifdef CONFIG_MEMORY_MODEL_60K { !error "Do not use CONFIG_MEMORY_MODEL_60K options for CRT ROM layout" } +} !ifdef CONFIG_PLATFORM_COMMANDER_X16 { !ifndef CONFIG_MEMORY_MODEL_38K { !error "Select CONFIG_MEMORY_MODEL_38K options for Commander X16 platform" } } @@ -445,9 +448,9 @@ ; Determine if we need space-savings in BASIC code -!ifndef CONFIG_MB_M65 { +!ifndef CONFIG_MB_M65 { !ifndef ROM_LAYOUT_CRT { !set HAS_SMALL_BASIC = 1 -} +} } @@ -469,4 +472,12 @@ !ifdef SEGMENT_BASIC_0 { !set SEGMENT_M65_BASIC_0 = 1 } !ifdef SEGMENT_BASIC_1 { !set SEGMENT_M65_BASIC_1 = 1 } !ifdef SEGMENT_KERNAL_0 { !set SEGMENT_M65_KERNAL_0 = 1 } + !ifdef SEGMENT_KERNAL_1 { !set SEGMENT_M65_KERNAL_1 = 1 } +} + +!ifdef ROM_LAYOUT_CRT { + !ifdef SEGMENT_BASIC_0 { !set SEGMENT_CRT_BASIC_0 = 1 } + !ifdef SEGMENT_BASIC_1 { !set SEGMENT_CRT_BASIC_1 = 1 } + !ifdef SEGMENT_KERNAL_0 { !set SEGMENT_CRT_KERNAL_0 = 1 } + !ifdef SEGMENT_KERNAL_1 { !set SEGMENT_CRT_KERNAL_1 = 1 } } diff --git a/src/basic/ab1e.strout.s b/src/basic/ab1e.strout.s index 3f88c657..13daaf5d 100644 --- a/src/basic/ab1e.strout.s +++ b/src/basic/ab1e.strout.s @@ -1,6 +1,7 @@ ;; #LAYOUT# STD * #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 ;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE-FLOAT ;; #LAYOUT# M65 BASIC_1 #TAKE-FLOAT ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_as_1n.s b/src/basic/assets/packed_as_1n.s index 4fae3774..c8874aa6 100644 --- a/src/basic/assets/packed_as_1n.s +++ b/src/basic/assets/packed_as_1n.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_as_3n.s b/src/basic/assets/packed_as_3n.s index 1447af4d..f0d6b833 100644 --- a/src/basic/assets/packed_as_3n.s +++ b/src/basic/assets/packed_as_3n.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_dictionary.s b/src/basic/assets/packed_dictionary.s index ed6563ad..c56b26bc 100644 --- a/src/basic/assets/packed_dictionary.s +++ b/src/basic/assets/packed_dictionary.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_errors.s b/src/basic/assets/packed_errors.s index eda0257e..303bd668 100644 --- a/src/basic/assets/packed_errors.s +++ b/src/basic/assets/packed_errors.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_keywords.s b/src/basic/assets/packed_keywords.s index 0f01aab6..307e1b08 100644 --- a/src/basic/assets/packed_keywords.s +++ b/src/basic/assets/packed_keywords.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_keywords_01.s b/src/basic/assets/packed_keywords_01.s index c4260b5d..f2f77efc 100644 --- a/src/basic/assets/packed_keywords_01.s +++ b/src/basic/assets/packed_keywords_01.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_keywords_02.s b/src/basic/assets/packed_keywords_02.s index cfe22be5..dc0e993e 100644 --- a/src/basic/assets/packed_keywords_02.s +++ b/src/basic/assets/packed_keywords_02.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_keywords_03.s b/src/basic/assets/packed_keywords_03.s index 2b633ed2..916f9bdb 100644 --- a/src/basic/assets/packed_keywords_03.s +++ b/src/basic/assets/packed_keywords_03.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_misc.s b/src/basic/assets/packed_misc.s index 52e38c48..bbfc7c6c 100644 --- a/src/basic/assets/packed_misc.s +++ b/src/basic/assets/packed_misc.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/startup_banner.s b/src/basic/assets/startup_banner.s index 1582c98c..bd0e3b9b 100644 --- a/src/basic/assets/startup_banner.s +++ b/src/basic/assets/startup_banner.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/basic_commands_02/cmd__jumptable_02.s b/src/basic/basic_commands_02/cmd__jumptable_02.s index deb3dc4d..d51a332d 100644 --- a/src/basic/basic_commands_02/cmd__jumptable_02.s +++ b/src/basic/basic_commands_02/cmd__jumptable_02.s @@ -21,18 +21,22 @@ !set ITEM_00 = cmd_cold !set ITEM_01 = cmd_mem -!set ITEM_02 = cmd_sysinfo +!ifdef CONFIG_MB_M65 { +!set ITEM_02 = cmd_sysinfo +} !ifndef HAS_OPCODES_65C02 { command_02_jumptable_lo: - !byte <(ITEM_00-1), <(ITEM_01-1), <(ITEM_02-1) + !byte <(ITEM_00-1), <(ITEM_01-1) + !ifdef CONFIG_MB_M65 { !byte <(ITEM_02-1) } command_02_jumptable_hi: - !byte >(ITEM_00-1), >(ITEM_01-1), >(ITEM_02-1) + !byte >(ITEM_00-1), >(ITEM_01-1) + !ifdef CONFIG_MB_M65 { !byte >(ITEM_02-1) } } else { ; HAS_OPCODES_65C02 @@ -40,5 +44,6 @@ command_02_jumptable: ; Note: 65C02 has the page boundary vector bug fixed! - !word ITEM_00, ITEM_01, ITEM_02 + !word ITEM_00, ITEM_01 + !ifdef CONFIG_MB_M65 { !word ITEM_02 } } } diff --git a/src/basic/basic_commands_02/cmd_mem.s b/src/basic/basic_commands_02/cmd_mem.s index 19c53e03..af06307a 100644 --- a/src/basic/basic_commands_02/cmd_mem.s +++ b/src/basic/basic_commands_02/cmd_mem.s @@ -1,38 +1,50 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# M65 * #TAKE -;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# * BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE !ifndef HAS_SMALL_BASIC { + ; First perform the garbage collection - to be able to determine real values + !ifdef SEGMENT_M65_BASIC_0 { cmd_mem: - ; First perform the garbage collection - to be able to determine real values - jsr varstr_garbage_collect - jsr map_BASIC_1 jsr (VB1__cmd_mem_cont) jmp map_NORMAL +} else ifdef SEGMENT_CRT_BASIC_0 { + +cmd_mem: + + jsr varstr_garbage_collect + + jsr map_BASIC_1 + jsr JB1__cmd_mem_cont + jmp map_NORMAL + } else ifdef SEGMENT_M65_BASIC_1 { cmd_mem_cont: +} else ifdef SEGMENT_CRT_BASIC_1 { + +cmd_mem_cont: + } else { cmd_mem: - ; First perform the garbage collection - to be able to determine real values - jsr varstr_garbage_collect } -!ifndef SEGMENT_M65_BASIC_0 { +!ifndef SEGMENT_BASIC_0 { ; Print header diff --git a/src/basic/basic_commands_02/helper_ask_if_sure.s b/src/basic/basic_commands_02/helper_ask_if_sure.s index 5f52d7b9..5c5f456a 100644 --- a/src/basic/basic_commands_02/helper_ask_if_sure.s +++ b/src/basic/basic_commands_02/helper_ask_if_sure.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# * BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE @@ -19,6 +20,12 @@ helper_ask_if_sure: jsr (VB1__helper_ask_if_sure) jmp map_NORMAL +} else ifdef SEGMENT_CRT_BASIC_0 { + + jsr map_BASIC_1 + jsr JB1__helper_ask_if_sure + jmp map_NORMAL + } else { ; First check, if we are in direct mode,; if not, do not ask diff --git a/src/basic/basic_commands_02/helper_mem_tab_str.s b/src/basic/basic_commands_02/helper_mem_tab_str.s index eca887b1..b336b964 100644 --- a/src/basic/basic_commands_02/helper_mem_tab_str.s +++ b/src/basic/basic_commands_02/helper_mem_tab_str.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/basic_commands_02/helper_mem_tab_x.s b/src/basic/basic_commands_02/helper_mem_tab_x.s index 825d0a59..7b9939bc 100644 --- a/src/basic/basic_commands_02/helper_mem_tab_x.s +++ b/src/basic/basic_commands_02/helper_mem_tab_x.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/basic_commands_02/helper_mem_tab_y.s b/src/basic/basic_commands_02/helper_mem_tab_y.s index 083817d8..7735ccce 100644 --- a/src/basic/basic_commands_02/helper_mem_tab_y.s +++ b/src/basic/basic_commands_02/helper_mem_tab_y.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/board_crt/8000.crt_vectable_basic_1.s b/src/basic/board_crt/8000.crt_vectable_basic_1.s new file mode 100644 index 00000000..7e2f0fa1 --- /dev/null +++ b/src/basic/board_crt/8000.crt_vectable_basic_1.s @@ -0,0 +1,54 @@ +;; #LAYOUT# CRT BASIC_0 #TAKE-FLOAT +;; #LAYOUT# CRT BASIC_1 #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Definitions for communication with cartridge segment BASIC_1 from BASIC_0 +; + + +!ifdef SEGMENT_BASIC_0 { + + + ; Label definitions + + !addr JB1__INITMSG = $8000 + 3 * 0 + !addr JB1__LINKPRG = $8000 + 3 * 1 + !addr JB1__tokenise_line = $8000 + 3 * 2 + !addr JB1__list_single_line = $8000 + 3 * 3 + !addr JB1__print_packed_error = $8000 + 3 * 4 + !addr JB1__print_packed_misc_str = $8000 + 3 * 5 + !addr JB1__do_new = $8000 + 3 * 6 + !addr JB1__do_clr = $8000 + 3 * 7 + !addr JB1__do_restore = $8000 + 3 * 8 + !addr JB1__cmd_mem_cont = $8000 + 3 * 9 + !addr JB1__prepare_direct_execution = $8000 + 3 * 10 + !addr JB1__helper_ask_if_sure = $8000 + 3 * 11 + +!ifdef CONFIG_DOS_WEDGE { + !addr JB1__wedge_dos = $8000 + 3 * 12 +} + +} else { + + ; Jump table (Open ROMs private!) + + jmp INITMSG + jmp LINKPRG + jmp tokenise_line + jmp list_single_line + jmp print_packed_error + jmp print_packed_misc_str + jmp do_new + jmp do_clr + jmp do_restore + jmp cmd_mem_cont + jmp prepare_direct_execution + jmp helper_ask_if_sure + +!ifdef CONFIG_DOS_WEDGE { + jmp wedge_dos +} + + +} diff --git a/src/basic/board_crt/8000.interop b/src/basic/board_crt/8000.interop new file mode 100644 index 00000000..7acd2a6f --- /dev/null +++ b/src/basic/board_crt/8000.interop @@ -0,0 +1 @@ +This particular address is not for interoperability - we had to choose some fixed location for the extended ROM jumptable, beginning of the mapped memory block is just sane. diff --git a/src/basic/board_crt/crt_imports.s b/src/basic/board_crt/crt_imports.s new file mode 100644 index 00000000..678029af --- /dev/null +++ b/src/basic/board_crt/crt_imports.s @@ -0,0 +1,41 @@ +;; #LAYOUT# CRT BASIC_1 #TAKE +;; #LAYOUT# * * #IGNORE + +;; #IMPORT# BASIC_0 = BASIC_0_combined.sym +;; #IMPORT# KERNAL_0 = KERNAL_0_combined.sym + +; +; Definitions for calling segments BASIC_0 and KERNAL_0 routines from BASIC_1 +; + +;; #ALIAS# peek_via_OLDTXT = BASIC_0.proxy_B1_peek_via_OLDTXT +;; #ALIAS# poke_via_OLDTXT = BASIC_0.proxy_B1_poke_via_OLDTXT +;; #ALIAS# JCHROUT = BASIC_0.proxy_B1_JCHROUT +;; #ALIAS# JCLALL = BASIC_0.proxy_B1_JCLALL +;; #ALIAS# plot_set = BASIC_0.proxy_B1_plot_set + +;; #ALIAS# JCLOSE = BASIC_0.proxy_B1_JCLOSE +;; #ALIAS# JOPEN = BASIC_0.proxy_B1_JOPEN +;; #ALIAS# JMEMTOP = KERNAL_0.JMEMTOP +;; #ALIAS# JSETFLS = KERNAL_0.JSETFLS +;; #ALIAS# JSETNAM = KERNAL_0.JSETNAM +;; #ALIAS# JGETIN = KERNAL_0.JGETIN +;; #ALIAS# JCHKIN = BASIC_0.proxy_B1_JCHKIN +;; #ALIAS# JCHRIN = BASIC_0.proxy_B1_JCHRIN +;; #ALIAS# JREADST = KERNAL_0.JREADST +;; #ALIAS# JSCREEN = KERNAL_0.JSCREEN +;; #ALIAS# SELDEV = KERNAL_0.SELDEV +;; #ALIAS# init_oldtxt = BASIC_0.init_oldtxt +;; #ALIAS# tmpstr_free_all_reset = BASIC_0.tmpstr_free_all_reset +;; #ALIAS# print_hex_byte = BASIC_0.proxy_B1_print_hex_byte +;; #ALIAS# print_integer = BASIC_0.proxy_B1_print_integer +;; #ALIAS# print_return = BASIC_0.proxy_B1_print_return +;; #ALIAS# print_space = BASIC_0.proxy_B1_print_space +;; #ALIAS# print_features = BASIC_0.proxy_B1_print_features +;; #ALIAS# do_error_fetch = BASIC_0.do_error_fetch +;; #ALIAS# do_basic_error = BASIC_0.do_basic_error +;; #ALIAS# str_rev_question = BASIC_0.str_rev_question +;; #ALIAS# fetch_character = BASIC_0.proxy_B1_fetch_character +;; #ALIAS# fetch_character_skip_spaces = BASIC_0.proxy_B1_fetch_character_skip_spaces +;; #ALIAS# fetch_uint8 = BASIC_0.proxy_B1_fetch_uint8 +;; #ALIAS# shell_main_loop = BASIC_0.proxy_B1_shell_main_loop diff --git a/src/basic/board_crt/crt_proxies.s b/src/basic/board_crt/crt_proxies.s new file mode 100644 index 00000000..200367c0 --- /dev/null +++ b/src/basic/board_crt/crt_proxies.s @@ -0,0 +1,130 @@ +;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Proxies for calling segment BASIC_0 and KERNAL_0 routines from BASIC_1 +; + +proxy_B1_peek_via_OLDTXT: + + jsr map_NORMAL + +!ifdef CONFIG_MEMORY_MODEL_60K { + !error "not implemented" +} else ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { + jsr peek_under_roms_via_OLDTXT + cmp #$00 +} else { ; CONFIG_MEMORY_MODEL_38K + lda (OLDTXT),y +} + jmp map_BASIC_1 ; do not do 'bra' - we want this one as fast as possible + + +proxy_B1_poke_via_OLDTXT: + + jsr map_NORMAL +!ifdef CONFIG_MEMORY_MODEL_60K { + !error "not implemented" +} else { ; CONFIG_MEMORY_MODEL_38K || CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K + sta (OLDTXT),y +} + + jmp map_BASIC_1 + + +proxy_B1_JCLALL: + + jsr map_NORMAL + jsr JCLALL + jmp map_BASIC_1 + + +!ifdef CONFIG_DOS_WEDGE { + +proxy_B1_JCLOSE: + + jsr map_NORMAL + jsr JCLOSE + jmp map_BASIC_1 + +proxy_B1_JOPEN: + + jsr map_NORMAL + jsr JOPEN + jmp map_BASIC_1 +} + +proxy_B1_JCHKIN: + + jsr map_NORMAL + jsr JCHKIN + jmp map_BASIC_1 + +proxy_B1_JCHRIN: + + jsr map_NORMAL + jsr JCHRIN + jmp map_BASIC_1 + +proxy_B1_JCHROUT: + + jsr map_NORMAL + jsr JCHROUT + jmp map_BASIC_1 + +proxy_B1_print_hex_byte: + + jsr map_NORMAL + jsr print_hex_byte + jmp map_BASIC_1 + +proxy_B1_print_integer: + + jsr map_NORMAL + jsr print_integer + jmp map_BASIC_1 + +proxy_B1_print_return: + + jsr map_NORMAL + jsr print_return + jmp map_BASIC_1 + +proxy_B1_print_space: + + jsr map_NORMAL + jsr print_space + jmp map_BASIC_1 + +proxy_B1_plot_set: + + jsr map_NORMAL + jsr plot_set + jmp map_BASIC_1 + +!ifdef CONFIG_DOS_WEDGE { + +proxy_B1_fetch_character: + + jsr map_NORMAL + jsr fetch_character + jmp map_BASIC_1 + +proxy_B1_fetch_character_skip_spaces: + + jsr map_NORMAL + jsr fetch_character_skip_spaces + jmp map_BASIC_1 + +proxy_B1_fetch_uint8: + + jsr map_NORMAL + jsr fetch_uint8 + jmp map_BASIC_1 + +proxy_B1_shell_main_loop: + + jsr map_NORMAL + jmp shell_main_loop +} + diff --git a/src/basic/board_crt/dummy.s b/src/basic/board_crt/dummy.s deleted file mode 100644 index 3a3e191e..00000000 --- a/src/basic/board_crt/dummy.s +++ /dev/null @@ -1,4 +0,0 @@ -;; #LAYOUT# CRT BASIC_1 #TAKE -;; #LAYOUT# * * #IGNORE - - +nop diff --git a/src/basic/engine_editor/a533.linkprg.s b/src/basic/engine_editor/a533.linkprg.s index 8679e6a2..3e518f9e 100644 --- a/src/basic/engine_editor/a533.linkprg.s +++ b/src/basic/engine_editor/a533.linkprg.s @@ -1,5 +1,6 @@ ;; #LAYOUT# STD * #TAKE ;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE-FLOAT ;; #LAYOUT# M65 BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE-FLOAT ;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 @@ -20,6 +21,12 @@ LINKPRG: jsr (VB1__LINKPRG) jmp map_NORMAL +} else ifdef SEGMENT_CRT_BASIC_0 { + + jsr map_BASIC_1 + jsr JB1__LINKPRG + jmp map_NORMAL + } else { ; Start by getting pointer to the first line @@ -31,6 +38,8 @@ linkprg_loop: !ifdef CONFIG_MB_M65 { jsr peek_via_OLDTXT +} else ifdef ROM_LAYOUT_CRT { + jsr peek_via_OLDTXT } else ifdef CONFIG_MEMORY_MODEL_60K { ldx # Date: Fri, 23 Oct 2020 14:53:56 +0200 Subject: [PATCH 46/51] Makefile cleanup --- Makefile | 280 +++++++++++++++++++++++++++---------------------------- 1 file changed, 140 insertions(+), 140 deletions(-) diff --git a/Makefile b/Makefile index e884707a..1c006005 100644 --- a/Makefile +++ b/Makefile @@ -90,33 +90,33 @@ GEN_KERNAL = # List of build directories -DIR_CUS = build/target_custom -DIR_GEN = build/target_generic -DIR_CRT = build/target_generic_crt -DIR_TST = build/target_testing -DIR_M65 = build/target_mega65 -DIR_U64 = build/target_ultimate64 -DIR_X16 = build/target_cx16 +DIR_CUS = build/target_custom +DIR_GEN = build/target_generic +DIR_GENCRT = build/target_generic_crt +DIR_TST = build/target_testing +DIR_M65 = build/target_mega65 +DIR_U64 = build/target_ultimate64 +DIR_X16 = build/target_cx16 # List of config files -CFG_CUS = src/,,config_custom.s -CFG_GEN = src/,,config_generic.s -CFG_CRT = src/,,config_generic_crt.s -CFG_TST = src/,,config_testing.s -CFG_M65 = src/,,config_mega65.s -CFG_U64 = src/,,config_ultimate64.s -CFG_X16 = src/,,config_cx16.s +CFG_CUS = src/,,config_custom.s +CFG_GEN = src/,,config_generic.s +CFG_GENCRT = src/,,config_generic_crt.s +CFG_TST = src/,,config_testing.s +CFG_M65 = src/,,config_mega65.s +CFG_U64 = src/,,config_ultimate64.s +CFG_X16 = src/,,config_cx16.s # List of files with generated strings -GEN_STR_CUS = $(DIR_CUS)/,generated/,packed_strings.s -GEN_STR_GEN = $(DIR_GEN)/,generated/,packed_strings.s -GEN_STR_CRT = $(DIR_CRT)/,generated/,packed_strings.s -GEN_STR_TST = $(DIR_TST)/,generated/,packed_strings.s -GEN_STR_M65 = $(DIR_M65)/,generated/,packed_strings.s -GEN_STR_U64 = $(DIR_U64)/,generated/,packed_strings.s -GEN_STR_X16 = $(DIR_X16)/,generated/,packed_strings.s +GEN_STR_CUS = $(DIR_CUS)/,generated/,packed_strings.s +GEN_STR_GEN = $(DIR_GEN)/,generated/,packed_strings.s +GEN_STR_GENCRT = $(DIR_GENCRT)/,generated/,packed_strings.s +GEN_STR_TST = $(DIR_TST)/,generated/,packed_strings.s +GEN_STR_M65 = $(DIR_M65)/,generated/,packed_strings.s +GEN_STR_U64 = $(DIR_U64)/,generated/,packed_strings.s +GEN_STR_X16 = $(DIR_X16)/,generated/,packed_strings.s # Dependencies - helper variables @@ -146,58 +146,58 @@ TOOLS_LIST = $(TOOL_GENERATE_CONSTANTS) \ # List of targets -TARGET_CHR_OR = build/chargen_openroms.rom -TARGET_CHR_PXL = build/chargen_pxlfont.rom +TARGET_CHR_ORF = build/chargen_openroms.rom +TARGET_CHR_PXL = build/chargen_pxlfont.rom -TARGET_CUS_B = build/basic_custom.rom -TARGET_GEN_B = build/basic_generic.rom -TARGET_CRT_B = build/basic_generic_crt.rom -TARGET_TST_B = build/basic_testing.rom -TARGET_U64_B = build/basic_ultimate64.rom +TARGET_CUS_B = build/basic_custom.rom +TARGET_GEN_B = build/basic_generic.rom +TARGET_GENCRT_B = build/basic_generic_crt.rom +TARGET_TST_B = build/basic_testing.rom +TARGET_U64_B = build/basic_ultimate64.rom -TARGET_CUS_K = build/kernal_custom.rom -TARGET_GEN_K = build/kernal_generic.rom -TARGET_CRT_K = build/kernal_generic_crt.rom -TARGET_TST_K = build/kernal_testing.rom -TARGET_U64_K = build/kernal_ultimate64.rom +TARGET_CUS_K = build/kernal_custom.rom +TARGET_GEN_K = build/kernal_generic.rom +TARGET_GENCRT_K = build/kernal_generic_crt.rom +TARGET_TST_K = build/kernal_testing.rom +TARGET_U64_K = build/kernal_ultimate64.rom -TARGET_CRT_X = build/external_generic.crt +TARGET_GENCRT_X = build/extrom_generic_crt.crt -TARGET_M65_x = build/mega65.rom -TARGET_M65_x_PXL = build/mega65_pxlfont.rom -TARGET_X16_x = build/cx16-dummy.rom +TARGET_M65_x_ORF = build/mega65.rom +TARGET_M65_x_PXL = build/mega65_pxlfont.rom +TARGET_X16_x = build/cx16-dummy.rom -TARGET_LIST_CUS = $(TARGET_CUS_B) $(TARGET_CUS_K) -TARGET_LIST_GEN = $(TARGET_GEN_B) $(TARGET_GEN_K) -TARGET_LIST_CRT = $(TARGET_CRT_B) $(TARGET_CRT_K) $(TARGET_CRT_X) -TARGET_LIST_TST = $(TARGET_TST_B) $(TARGET_TST_K) -TARGET_LIST_U64 = $(TARGET_U64_B) $(TARGET_U64_K) +TARGET_LIST_CUS = $(TARGET_CUS_B) $(TARGET_CUS_K) +TARGET_LIST_GEN = $(TARGET_GEN_B) $(TARGET_GEN_K) +TARGET_LIST_GENCRT = $(TARGET_GENCRT_B) $(TARGET_GENCRT_K) $(TARGET_GENCRT_X) +TARGET_LIST_TST = $(TARGET_TST_B) $(TARGET_TST_K) +TARGET_LIST_U64 = $(TARGET_U64_B) $(TARGET_U64_K) -TARGET_LIST = build/chargen_openroms.rom \ - $(TARGET_LIST_CUS) \ - $(TARGET_LIST_GEN) \ - $(TARGET_LIST_TST) \ - $(TARGET_LIST_CRT) \ - $(TARGET_M65_x) \ - $(TARGET_M65_x_PXL) \ - $(TARGET_LIST_U64) \ - $(TARGET_X16_x) +TARGET_LIST = build/chargen_openroms.rom \ + $(TARGET_LIST_CUS) \ + $(TARGET_LIST_GEN) \ + $(TARGET_LIST_TST) \ + $(TARGET_LIST_CRT) \ + $(TARGET_M65_x_ORF) \ + $(TARGET_M65_x_PXL) \ + $(TARGET_LIST_U64) \ + $(TARGET_X16_x) -SEG_LIST_CRT = $(DIR_CRT)/basic.seg_1 \ - $(DIR_CRT)/kernal.seg_1 +SEG_LIST_GENCRT = $(DIR_GENCRT)/basic.seg_1 \ + $(DIR_GENCRT)/kernal.seg_1 -SEG_LIST_M65 = $(DIR_M65)/basic.seg_0 \ - $(DIR_M65)/basic.seg_1 \ - $(DIR_M65)/dos.seg_1 \ - $(DIR_M65)/kernal.seg_0 \ - $(DIR_M65)/kernal.seg_1 +SEG_LIST_M65 = $(DIR_M65)/basic.seg_0 \ + $(DIR_M65)/basic.seg_1 \ + $(DIR_M65)/dos.seg_1 \ + $(DIR_M65)/kernal.seg_0 \ + $(DIR_M65)/kernal.seg_1 -SEG_LIST_X16 = $(DIR_X16)/basic.seg_0 \ - $(DIR_X16)/basic.seg_1 \ - $(DIR_X16)/kernal.seg_0 \ - $(DIR_X16)/kernal.seg_1 +SEG_LIST_X16 = $(DIR_X16)/basic.seg_0 \ + $(DIR_X16)/basic.seg_1 \ + $(DIR_X16)/kernal.seg_0 \ + $(DIR_X16)/kernal.seg_1 -REL_TARGET_LIST = $(TARGET_LIST_GEN) $(TARGET_LIST_CRT) $(TARGET_M65_x) $(TARGET_M65_x_PXL) $(TARGET_LIST_U64) +REL_TARGET_LIST = $(TARGET_LIST_GEN) $(TARGET_LIST_GENCRT) $(TARGET_M65_x_ORF) $(TARGET_M65_x_PXL) $(TARGET_LIST_U64) # Misc strings @@ -273,14 +273,14 @@ build/tools/%: tools/%.cc tools/common.h # Rules - CHARGEN -$(TARGET_CHR_OR): $(TOOL_PNGPREPARE) assets/8x8font.png +$(TARGET_CHR_ORF): $(TOOL_PNGPREPARE) assets/8x8font.png @$(TOOL_PNGPREPARE) charrom assets/8x8font.png $@ 1>build/pngprepare.log $(TARGET_CHR_PXL): bin/chargen_pxlfont_2.3.rom @cp $< $@ -build/chargen_openroms.patched: $(TOOL_PATCH_CHARGEN) $(TARGET_CHR_OR) - @$(TOOL_PATCH_CHARGEN) -i $(TARGET_CHR_OR) -o $@ -n 7px-OpenROMs +build/chargen_openroms.patched: $(TOOL_PATCH_CHARGEN) $(TARGET_CHR_ORF) + @$(TOOL_PATCH_CHARGEN) -i $(TARGET_CHR_ORF) -o $@ -n 7px-OpenROMs build/chargen_pxlfont.patched: $(TOOL_PATCH_CHARGEN) $(TARGET_CHR_PXL) @$(TOOL_PATCH_CHARGEN) -i $(TARGET_CHR_PXL) -o $@ -n 6px-PXLfont @@ -305,10 +305,10 @@ $(DIR_TST)/OUTK_x.BIN $(DIR_TST)/KERNAL_combined.vs $(DIR_TST)/KERNAL_combined.s $(DIR_U64)/OUTK_x.BIN $(DIR_U64)/KERNAL_combined.vs $(DIR_U64)/KERNAL_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_U64) $(GEN_STR_U64) -$(DIR_CRT)/OUTB_0.BIN $(DIR_CRT)/BASIC_0_combined.vs: \ - $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_CRT) $(CRT_STR_CRT) $(DIR_CRT)/KERNAL_0_combined.sym -$(DIR_CRT)/OUTK_0.BIN $(DIR_CRT)/KERNAL_0_combined.vs $(DIR_CRT)/KERNAL_0_combined.sym: \ - $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_CRT) $(GEN_STR_CRT) +$(DIR_GENCRT)/OUTB_0.BIN $(DIR_GENCRT)/BASIC_0_combined.vs: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_GENCRT) $(CRT_STR_GENCRT) $(DIR_GENCRT)/KERNAL_0_combined.sym +$(DIR_GENCRT)/OUTK_0.BIN $(DIR_GENCRT)/KERNAL_0_combined.vs $(DIR_GENCRT)/KERNAL_0_combined.sym: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_GENCRT) $(GEN_STR_GENCRT) $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/BASIC_0_combined.vs $(DIR_M65)/BASIC_0_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_M65) $(GEN_STR_M65) $(DIR_M65)/KERNAL_0_combined.sym @@ -320,10 +320,10 @@ $(DIR_X16)/OUTB_0.BIN $(DIR_X16)/BASIC_0_combined.vs $(DIR_X16)/BASIC_0_combine $(DIR_X16)/OUTK_0.BIN $(DIR_X16)/KERNAL_0_combined.vs $(DIR_X16)/KERNAL_0_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_X16) $(GEN_STR_X16) -$(DIR_CRT)/basic.seg_1 $(DIR_CRT)/BASIC_1_combined.vs $(DIR_CRT)/BASIC_1_combined.sym: \ - $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_CRT) $(GEN_STR_CRT) $(DIR_CRT)/KERNAL_0_combined.sym $(DIR_CRT)/BASIC_0_combined.sym -$(DIR_CRT)/kernal.seg_1 $(DIR_CRT)/KERNAL_1_combined.vs $(DIR_CRT)/KERNAL_1_combined.sym: \ - $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_CRT) $(GEN_STR_CRT) $(DIR_CRT)/KERNAL_0_combined.sym +$(DIR_GENCRT)/basic.seg_1 $(DIR_GENCRT)/BASIC_1_combined.vs $(DIR_GENCRT)/BASIC_1_combined.sym: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_GENCRT) $(GEN_STR_GENCRT) $(DIR_GENCRT)/KERNAL_0_combined.sym $(DIR_GENCRT)/BASIC_0_combined.sym +$(DIR_GENCRT)/kernal.seg_1 $(DIR_GENCRT)/KERNAL_1_combined.vs $(DIR_GENCRT)/KERNAL_1_combined.sym: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_GENCRT) $(GEN_STR_GENCRT) $(DIR_GENCRT)/KERNAL_0_combined.sym $(DIR_M65)/basic.seg_1 $(DIR_M65)/BASIC_1_combined.vs $(DIR_M65)/BASIC_1_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_M65) $(GEN_STR_M65) $(DIR_M65)/KERNAL_0_combined.sym $(DIR_M65)/BASIC_0_combined.sym @@ -337,13 +337,13 @@ $(DIR_X16)/basic.seg_1 $(DIR_X16)/BASIC_1_combined.vs $(DIR_X16)/BASIC_1_combi $(DIR_X16)/kernal.seg_1 $(DIR_X16)/KERNAL_1_combined.vs $(DIR_X16)/KERNAL_1_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_X16) $(GEN_STR_X16) $(DIR_X16)/KERNAL_0_combined.sym -$(DIR_CUS)/OUTx_x.BIN: $(DIR_CUS)/OUTB_x.BIN $(DIR_CUS)/OUTK_x.BIN -$(DIR_GEN)/OUTx_x.BIN: $(DIR_GEN)/OUTB_x.BIN $(DIR_GEN)/OUTK_x.BIN -$(DIR_CRT)/OUTx_0.BIN: $(DIR_CRT)/OUTB_0.BIN $(DIR_CRT)/OUTK_0.BIN -$(DIR_TST)/OUTx_x.BIN: $(DIR_TST)/OUTB_x.BIN $(DIR_TST)/OUTK_x.BIN -$(DIR_M65)/OUTx_0.BIN: $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/OUTK_0.BIN -$(DIR_U64)/OUTx_x.BIN: $(DIR_U64)/OUTB_x.BIN $(DIR_U64)/OUTK_x.BIN -$(DIR_X16)/OUTx_0.BIN: $(DIR_X16)/OUTB_0.BIN $(DIR_X16)/OUTK_0.BIN +$(DIR_CUS)/OUTx_x.BIN: $(DIR_CUS)/OUTB_x.BIN $(DIR_CUS)/OUTK_x.BIN +$(DIR_GEN)/OUTx_x.BIN: $(DIR_GEN)/OUTB_x.BIN $(DIR_GEN)/OUTK_x.BIN +$(DIR_GENCRT)/OUTx_0.BIN: $(DIR_GENCRT)/OUTB_0.BIN $(DIR_GENCRT)/OUTK_0.BIN +$(DIR_TST)/OUTx_x.BIN: $(DIR_TST)/OUTB_x.BIN $(DIR_TST)/OUTK_x.BIN +$(DIR_M65)/OUTx_0.BIN: $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/OUTK_0.BIN +$(DIR_U64)/OUTx_x.BIN: $(DIR_U64)/OUTB_x.BIN $(DIR_U64)/OUTK_x.BIN +$(DIR_X16)/OUTx_0.BIN: $(DIR_X16)/OUTB_0.BIN $(DIR_X16)/OUTK_0.BIN $(TARGET_CUS_B): $(DIR_CUS)/OUTx_x.BIN $(TARGET_GEN_B): $(DIR_GEN)/OUTx_x.BIN @@ -355,11 +355,11 @@ $(TARGET_GEN_K): $(DIR_GEN)/OUTx_x.BIN $(TARGET_TST_K): $(DIR_TST)/OUTx_x.BIN $(TARGET_U64_K): $(DIR_U64)/OUTx_x.BIN -build/symbols_custom.vs: $(DIR_CUS)/BASIC_combined.vs $(DIR_CUS)/KERNAL_combined.vs -build/symbols_generic.vs: $(DIR_GEN)/BASIC_combined.vs $(DIR_GEN)/KERNAL_combined.vs -build/symbols_generic_crt.vs: $(DIR_CRT)/BASIC_0_combined.vs $(DIR_CRT)/KERNAL_0_combined.vs -build/symbols_testing.vs: $(DIR_TST)/BASIC_combined.vs $(DIR_TST)/KERNAL_combined.vs -build/symbols_ultimate64.vs: $(DIR_U64)/BASIC_combined.vs $(DIR_U64)/KERNAL_combined.vs +build/symbols_custom.vs: $(DIR_CUS)/BASIC_combined.vs $(DIR_CUS)/KERNAL_combined.vs +build/symbols_generic.vs: $(DIR_GEN)/BASIC_combined.vs $(DIR_GEN)/KERNAL_combined.vs +build/symbols_generic_crt.vs: $(DIR_GENCRT)/BASIC_0_combined.vs $(DIR_GENCRT)/KERNAL_0_combined.vs +build/symbols_testing.vs: $(DIR_TST)/BASIC_combined.vs $(DIR_TST)/KERNAL_combined.vs +build/symbols_ultimate64.vs: $(DIR_U64)/BASIC_combined.vs $(DIR_U64)/KERNAL_combined.vs # Rules - BASIC and KERNAL intermediate files @@ -371,9 +371,9 @@ $(GEN_STR_GEN): $(TOOL_GENERATE_STRINGS) $(CFG_GEN) @mkdir -p $(DIR_GEN)/,generated $(TOOL_GENERATE_STRINGS) -o $@ -c $(CFG_GEN) -$(GEN_STR_CRT): $(TOOL_GENERATE_STRINGS) $(CFG_CRT) - @mkdir -p $(DIR_CRT)/,generated - $(TOOL_GENERATE_STRINGS) -o $@ -c $(CFG_CRT) +$(GEN_STR_GENCRT): $(TOOL_GENERATE_STRINGS) $(CFG_GENCRT) + @mkdir -p $(DIR_GENCRT)/,generated + $(TOOL_GENERATE_STRINGS) -o $@ -c $(CFG_GENCRT) $(GEN_STR_TST): $(TOOL_GENERATE_STRINGS) $(CFG_TST) @mkdir -p $(DIR_TST)/,generated @@ -397,7 +397,7 @@ build/,generated/,float_constants.s: $(TOOL_GENERATE_CONSTANTS) GEN_STR_custom = $(GEN_STR_CUS) GEN_STR_generic = $(GEN_STR_GEN) -GEN_STR_generic_crt = $(GEN_STR_CRT) +GEN_STR_generic_crt = $(GEN_STR_GENCRT) GEN_STR_testing = $(GEN_STR_TST) GEN_STR_mega65 = $(GEN_STR_M65) GEN_STR_ultimate64 = $(GEN_STR_U64) @@ -417,25 +417,25 @@ build/target_%/OUTK_x.BIN build/target_%/KERNAL_combined.vs build/target_%/KERNA # Rules - BASIC and KERNAL intermediate files, for ROM with external cartridge -$(DIR_CRT)/OUTB_0.BIN $(DIR_CRT)/BASIC_0_combined.vs $(DIR_CRT)/BASIC_0_combined.sym: - @mkdir -p $(DIR_CRT) - @rm -f $@* $(DIR_CRT)/BASIC_0* - @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s BASIC_0 -i BASIC_0-generic-crt -o OUTB_0.BIN -d $(DIR_CRT) -l a000 -h e4d2 $(CFG_CRT) $(GEN_STR_CRT) $(SRCDIR_BASIC) $(GEN_BASIC) +$(DIR_GENCRT)/OUTB_0.BIN $(DIR_GENCRT)/BASIC_0_combined.vs $(DIR_GENCRT)/BASIC_0_combined.sym: + @mkdir -p $(DIR_GENCRT) + @rm -f $@* $(DIR_GENCRT)/BASIC_0* + @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s BASIC_0 -i BASIC_0-generic-crt -o OUTB_0.BIN -d $(DIR_GENCRT) -l a000 -h e4d2 $(CFG_GENCRT) $(GEN_STR_GENCRT) $(SRCDIR_BASIC) $(GEN_BASIC) -$(DIR_CRT)/OUTK_0.BIN $(DIR_CRT)/KERNAL_0_combined.vs $(DIR_CRT)/KERNAL_0_combined.sym: - @mkdir -p $(DIR_CRT) - @rm -f $@* $(DIR_CRT)/KERNAL_0* - @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s KERNAL_0 -i KERNAL_0-generic-crt -o OUTK_0.BIN -d $(DIR_CRT) -l e4d3 -h ffff $(CFG_CRT) $(GEN_STR_CRT) $(SRCDIR_KERNAL) $(GEN_KERNAL) +$(DIR_GENCRT)/OUTK_0.BIN $(DIR_GENCRT)/KERNAL_0_combined.vs $(DIR_GENCRT)/KERNAL_0_combined.sym: + @mkdir -p $(DIR_GENCRT) + @rm -f $@* $(DIR_GENCRT)/KERNAL_0* + @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s KERNAL_0 -i KERNAL_0-generic-crt -o OUTK_0.BIN -d $(DIR_GENCRT) -l e4d3 -h ffff $(CFG_GENCRT) $(GEN_STR_GENCRT) $(SRCDIR_KERNAL) $(GEN_KERNAL) -$(DIR_CRT)/basic.seg_1 $(DIR_CRT)/BASIC_1_combined.vs $(DIR_CRT)/BASIC_1_combined.sym: - @mkdir -p $(DIR_CRT) - @rm -f $@* $(DIR_CRT)/basic.seg_1 $(DIR_CRT)/BASIC_1* - @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s BASIC_1 -i BASIC_1-generic-crt -o basic.seg_1 -d $(DIR_CRT) -l 8000 -h 9fff $(CFG_CRT) $(GEN_STR_CRT) $(SRCDIR_BASIC) $(GEN_BASIC) +$(DIR_GENCRT)/basic.seg_1 $(DIR_GENCRT)/BASIC_1_combined.vs $(DIR_GENCRT)/BASIC_1_combined.sym: + @mkdir -p $(DIR_GENCRT) + @rm -f $@* $(DIR_GENCRT)/basic.seg_1 $(DIR_GENCRT)/BASIC_1* + @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s BASIC_1 -i BASIC_1-generic-crt -o basic.seg_1 -d $(DIR_GENCRT) -l 8000 -h 9fff $(CFG_GENCRT) $(GEN_STR_GENCRT) $(SRCDIR_BASIC) $(GEN_BASIC) -$(DIR_CRT)/kernal.seg_1 $(DIR_CRT)/KERNAL_1_combined.vs $(DIR_CRT)/KERNAL_1_combined.sym: - @mkdir -p $(DIR_CRT) - @rm -f $@* $(DIR_CRT)/kernal.seg_1 $(DIR_CRT)/KERNAL_1* - @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s KERNAL_1 -i KERNAL_1-generic-crt -o kernal.seg_1 -d $(DIR_CRT) -l 8000 -h 9fff $(CFG_CRT) $(GEN_STR_CRT) $(SRCDIR_KERNAL) $(GEN_KERNAL) +$(DIR_GENCRT)/kernal.seg_1 $(DIR_GENCRT)/KERNAL_1_combined.vs $(DIR_GENCRT)/KERNAL_1_combined.sym: + @mkdir -p $(DIR_GENCRT) + @rm -f $@* $(DIR_GENCRT)/kernal.seg_1 $(DIR_GENCRT)/KERNAL_1* + @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s KERNAL_1 -i KERNAL_1-generic-crt -o kernal.seg_1 -d $(DIR_GENCRT) -l 8000 -h 9fff $(CFG_GENCRT) $(GEN_STR_GENCRT) $(SRCDIR_KERNAL) $(GEN_KERNAL) # Rules - BASIC and KERNAL intermediate files, for MEGA65 @@ -504,14 +504,14 @@ build/basic_%.rom: build/symbols_%.vs: @sort build/target_$*/BASIC_combined.vs build/target_$*/KERNAL_combined.vs | uniq | grep -v "__" > $@ -$(DIR_CRT)/OUTx_0.BIN: - @cat $(DIR_CRT)/OUTB_0.BIN $(DIR_CRT)/OUTK_0.BIN > $@ +$(DIR_GENCRT)/OUTx_0.BIN: + @cat $(DIR_GENCRT)/OUTB_0.BIN $(DIR_GENCRT)/OUTK_0.BIN > $@ -$(DIR_CRT)/kernal.seg_0: $(DIR_CRT)/OUTx_0.BIN - @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=2 of=$@ status=none +$(DIR_GENCRT)/kernal.seg_0: $(DIR_GENCRT)/OUTx_0.BIN + @dd if=$(DIR_GENCRT)/OUTx_0.BIN bs=8192 count=1 skip=2 of=$@ status=none -$(DIR_CRT)/basic.seg_0: $(DIR_CRT)/OUTx_0.BIN - @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none +$(DIR_GENCRT)/basic.seg_0: $(DIR_GENCRT)/OUTx_0.BIN + @dd if=$(DIR_GENCRT)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none $(DIR_M65)/OUTx_0.BIN: @cat $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/OUTK_0.BIN > $@ @@ -531,14 +531,14 @@ $(DIR_X16)/kernal.seg_0: $(DIR_X16)/OUTx_0.BIN $(DIR_X16)/basic.seg_0: $(DIR_X16)/OUTx_0.BIN @dd if=$(DIR_X16)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none -$(TARGET_CRT_K): $(DIR_CRT)/OUTx_0.BIN - @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=2 of=$@ status=none +$(TARGET_GENCRT_K): $(DIR_GENCRT)/OUTx_0.BIN + @dd if=$(DIR_GENCRT)/OUTx_0.BIN bs=8192 count=1 skip=2 of=$@ status=none -$(TARGET_CRT_B): $(DIR_CRT)/OUTx_0.BIN - @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none +$(TARGET_GENCRT_B): $(DIR_GENCRT)/OUTx_0.BIN + @dd if=$(DIR_GENCRT)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none build/symbols_generic_crt.vs: - @sort $(DIR_CRT)/BASIC_0_combined.vs $(DIR_CRT)/KERNAL_0_combined.vs | uniq | grep -v "__" > $@ + @sort $(DIR_GENCRT)/BASIC_0_combined.vs $(DIR_GENCRT)/KERNAL_0_combined.vs | uniq | grep -v "__" > $@ build/kernal_hybrid.rom: kernal $(DIR_GEN)/OUTK_x.BIN @echo @@ -570,7 +570,7 @@ build/padding_8_KB: @mkdir -p build @dd if=/dev/zero bs=8192 count=1 of=$@ status=none -$(TARGET_CRT_X): $(SEG_LIST_CRT) $(CRT_HDR_LIST) build/padding_8_KB +$(TARGET_GENCRT_X): $(SEG_LIST_GENCRT) $(CRT_HDR_LIST) build/padding_8_KB @echo @echo @echo @@ -579,11 +579,11 @@ $(TARGET_CRT_X): $(SEG_LIST_CRT) $(CRT_HDR_LIST) build/padding_8_KB @echo //------------------------------------------------------------------------------------------- @cat assets/cartridge/header-cart.bin > $@ @cat assets/cartridge/header-seg0.bin >> $@ - @cat $(DIR_CRT)/basic.seg_1 >> $@ + @cat $(DIR_GENCRT)/basic.seg_1 >> $@ @cat assets/cartridge/header-seg1.bin >> $@ @cat build/padding_8_KB >> $@ @cat assets/cartridge/header-seg2.bin >> $@ - @cat $(DIR_CRT)/kernal.seg_1 >> $@ + @cat $(DIR_GENCRT)/kernal.seg_1 >> $@ @cat assets/cartridge/header-seg3.bin >> $@ @cat build/padding_8_KB >> $@ @echo @@ -594,35 +594,35 @@ build/padding_64_KB: @mkdir -p build @dd if=/dev/zero bs=8192 count=8 of=$@ status=none -$(TARGET_M65_x) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_64_KB $(TARGET_CHR_OR) build/chargen_openroms.patched $(TARGET_CHR_PXL) build/chargen_pxlfont.patched +$(TARGET_M65_x_ORF) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_64_KB $(TARGET_CHR_ORF) build/chargen_openroms.patched $(TARGET_CHR_PXL) build/chargen_pxlfont.patched @echo @echo @echo @echo //------------------------------------------------------------------------------------------- @echo // Making ROM image for MEGA65 - with Open ROMs chargen @echo //------------------------------------------------------------------------------------------- - @cat $(DIR_M65)/dos.seg_1 > $(TARGET_M65_x) - @cat $(DIR_M65)/kernal.seg_1 >> $(TARGET_M65_x) - @cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x) - @cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x) - @cat $(TARGET_CHR_OR) >> $(TARGET_M65_x) - @cat build/chargen_openroms.patched >> $(TARGET_M65_x) - @cat $(DIR_M65)/kernal.seg_0 >> $(TARGET_M65_x) - @cat build/padding_64_KB >> $(TARGET_M65_x) + @cat $(DIR_M65)/dos.seg_1 > $(TARGET_M65_x_ORF) + @cat $(DIR_M65)/kernal.seg_1 >> $(TARGET_M65_x_ORF) + @cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x_ORF) + @cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x_ORF) + @cat $(TARGET_CHR_ORF) >> $(TARGET_M65_x_ORF) + @cat build/chargen_openroms.patched >> $(TARGET_M65_x_ORF) + @cat $(DIR_M65)/kernal.seg_0 >> $(TARGET_M65_x_ORF) + @cat build/padding_64_KB >> $(TARGET_M65_x_ORF) @echo @echo @echo @echo //------------------------------------------------------------------------------------------- @echo // Making ROM image for MEGA65 - with PXL font chargen @echo //------------------------------------------------------------------------------------------- - @cat $(DIR_M65)/dos.seg_1 > $(TARGET_M65_x_PXL) - @cat $(DIR_M65)/kernal.seg_1 >> $(TARGET_M65_x_PXL) - @cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x_PXL) - @cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x_PXL) - @cat $(TARGET_CHR_PXL) >> $(TARGET_M65_x_PXL) - @cat build/chargen_pxlfont.patched >> $(TARGET_M65_x_PXL) - @cat $(DIR_M65)/kernal.seg_0 >> $(TARGET_M65_x_PXL) - @cat build/padding_64_KB >> $(TARGET_M65_x_PXL) + @cat $(DIR_M65)/dos.seg_1 > $(TARGET_M65_x_PXL) + @cat $(DIR_M65)/kernal.seg_1 >> $(TARGET_M65_x_PXL) + @cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x_PXL) + @cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x_PXL) + @cat $(TARGET_CHR_PXL) >> $(TARGET_M65_x_PXL) + @cat build/chargen_pxlfont.patched >> $(TARGET_M65_x_PXL) + @cat $(DIR_M65)/kernal.seg_0 >> $(TARGET_M65_x_PXL) + @cat build/padding_64_KB >> $(TARGET_M65_x_PXL) @echo # Rules - platform 'Commander X16' specific @@ -659,8 +659,8 @@ test_generic: $(TARGET_LIST_GEN)$(TARGET_CHR_PXL) build/symbols_generic.vs test_generic_x128: $(TARGET_LIST_GEN) $(TARGET_CHR_PXL) build/symbols_generic.vs x128 -go64 -kernal64 $(TARGET_GEN_K) -basic64 $(TARGET_GEN_B) -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_generic_crt: $(TARGET_LIST_CRT) $(TARGET_CHR_PXL) build/symbols_generic_crt.vs - x64 -kernal $(TARGET_CRT_K) -basic $(TARGET_CRT_B) -chargen $(TARGET_CHR_PXL) -cartcrt $(TARGET_CRT_X) -moncommands build/symbols_generic_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_generic_crt: $(TARGET_LIST_GENCRT) $(TARGET_CHR_PXL) build/symbols_generic_crt.vs + x64 -kernal $(TARGET_GENCRT_K) -basic $(TARGET_GENCRT_B) -chargen $(TARGET_CHR_PXL) -cartcrt $(TARGET_GENCRT_X) -moncommands build/symbols_generic_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) test_testing: $(TARGET_LIST_TST) $(TARGET_CHR_PXL) build/symbols_testing.vs x64 -kernal $(TARGET_TST_K) -basic $(TARGET_TST_B) -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_testing.vs -1 $(TESTTAPE) -8 $(TESTDISK) @@ -668,7 +668,7 @@ test_testing: $(TARGET_LIST_TST) $(TARGET_CHR_PXL) build/symbols_testing.vs test_ultimate64: $(TARGET_LIST_U64) $(TARGET_CHR_PXL) build/symbols_ultimate64.vs x64 -kernal $(TARGET_U64_K) -basic $(TARGET_U64_B) -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_ultimate64.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_mega65: $(TARGET_M65_x) $(TARGET_M65_x_PXL) +test_mega65: $(TARGET_M65_x_ORF) $(TARGET_M65_x_PXL) ../xemu/build/bin/xmega65.native -dmarev 2 -besure -fontrefresh -forcerom -loadrom $(TARGET_M65_x_PXL) test_cx16: $(TARGET_X16_x) From a2f1cfdc870fc1a5ad1ac3e81be532a46aa1b15a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 23 Oct 2020 15:56:48 +0200 Subject: [PATCH 47/51] added ppossibility to build Ultimate 64 ROM with CRT image --- Makefile | 145 +++++++++++++++++++++++------ src/,,config_generic_crt.s | 3 +- src/,,config_ultimate64_crt.s | 122 ++++++++++++++++++++++++ src/aliases/,aliases_config.s | 2 +- src/basic/assets/startup_banner.s | 6 +- src/kernal/board_crt/crt_imports.s | 8 +- tools/generate_strings.cc | 35 ++++--- 7 files changed, 273 insertions(+), 48 deletions(-) create mode 100644 src/,,config_ultimate64_crt.s diff --git a/Makefile b/Makefile index 1c006005..bbb11c14 100644 --- a/Makefile +++ b/Makefile @@ -77,7 +77,7 @@ SRC_ACME = $(DIR_ACME)/acme.c $(DIR_ACME)/platform.c $(DIR_ACME)/alu.c $(DIR $(DIR_ACME)/dynabuf.c $(DIR_ACME)/mnemo.c $(DIR_ACME)/input.c $(DIR_ACME)/section.c \ $(DIR_ACME)/symbol.c $(DIR_ACME)/tree.c -CRT_HDR_LIST = assets/cartridge/header-cart.bin \ +CRT_BIN_LIST = assets/cartridge/header-cart.bin \ assets/cartridge/header-seg0.bin \ assets/cartridge/header-seg1.bin \ assets/cartridge/header-seg2.bin \ @@ -96,6 +96,7 @@ DIR_GENCRT = build/target_generic_crt DIR_TST = build/target_testing DIR_M65 = build/target_mega65 DIR_U64 = build/target_ultimate64 +DIR_U64CRT = build/target_ultimate64_crt DIR_X16 = build/target_cx16 # List of config files @@ -107,6 +108,7 @@ CFG_TST = src/,,config_testing.s CFG_M65 = src/,,config_mega65.s CFG_U64 = src/,,config_ultimate64.s CFG_X16 = src/,,config_cx16.s +CFG_U64CRT = src/,,config_ultimate64_crt.s # List of files with generated strings @@ -116,6 +118,7 @@ GEN_STR_GENCRT = $(DIR_GENCRT)/,generated/,packed_strings.s GEN_STR_TST = $(DIR_TST)/,generated/,packed_strings.s GEN_STR_M65 = $(DIR_M65)/,generated/,packed_strings.s GEN_STR_U64 = $(DIR_U64)/,generated/,packed_strings.s +GEN_STR_U64CRT = $(DIR_U64CRT)/,generated/,packed_strings.s GEN_STR_X16 = $(DIR_X16)/,generated/,packed_strings.s # Dependencies - helper variables @@ -154,14 +157,17 @@ TARGET_GEN_B = build/basic_generic.rom TARGET_GENCRT_B = build/basic_generic_crt.rom TARGET_TST_B = build/basic_testing.rom TARGET_U64_B = build/basic_ultimate64.rom +TARGET_U64CRT_B = build/basic_ultimate64_crt.rom TARGET_CUS_K = build/kernal_custom.rom TARGET_GEN_K = build/kernal_generic.rom TARGET_GENCRT_K = build/kernal_generic_crt.rom TARGET_TST_K = build/kernal_testing.rom TARGET_U64_K = build/kernal_ultimate64.rom +TARGET_U64CRT_K = build/kernal_ultimate64_crt.rom TARGET_GENCRT_X = build/extrom_generic_crt.crt +TARGET_U64CRT_X = build/extrom_ultimate64_crt.crt TARGET_M65_x_ORF = build/mega65.rom TARGET_M65_x_PXL = build/mega65_pxlfont.rom @@ -172,20 +178,26 @@ TARGET_LIST_GEN = $(TARGET_GEN_B) $(TARGET_GEN_K) TARGET_LIST_GENCRT = $(TARGET_GENCRT_B) $(TARGET_GENCRT_K) $(TARGET_GENCRT_X) TARGET_LIST_TST = $(TARGET_TST_B) $(TARGET_TST_K) TARGET_LIST_U64 = $(TARGET_U64_B) $(TARGET_U64_K) +TARGET_LIST_U64CRT = $(TARGET_U64CRT_B) $(TARGET_U64CRT_K) $(TARGET_U64CRT_X) -TARGET_LIST = build/chargen_openroms.rom \ - $(TARGET_LIST_CUS) \ - $(TARGET_LIST_GEN) \ - $(TARGET_LIST_TST) \ - $(TARGET_LIST_CRT) \ - $(TARGET_M65_x_ORF) \ - $(TARGET_M65_x_PXL) \ - $(TARGET_LIST_U64) \ + +TARGET_LIST = $(TARGET_CHR_ORF) \ + $(TARGET_LIST_CUS) \ + $(TARGET_LIST_GEN) \ + $(TARGET_LIST_GENCRT) \ + $(TARGET_LIST_TST) \ + $(TARGET_M65_x_ORF) \ + $(TARGET_M65_x_PXL) \ + $(TARGET_LIST_U64) \ + $(TARGET_LIST_U64CRT) \ $(TARGET_X16_x) SEG_LIST_GENCRT = $(DIR_GENCRT)/basic.seg_1 \ $(DIR_GENCRT)/kernal.seg_1 +SEG_LIST_U64CRT = $(DIR_U64CRT)/basic.seg_1 \ + $(DIR_U64CRT)/kernal.seg_1 + SEG_LIST_M65 = $(DIR_M65)/basic.seg_0 \ $(DIR_M65)/basic.seg_1 \ $(DIR_M65)/dos.seg_1 \ @@ -197,7 +209,12 @@ SEG_LIST_X16 = $(DIR_X16)/basic.seg_0 \ $(DIR_X16)/kernal.seg_0 \ $(DIR_X16)/kernal.seg_1 -REL_TARGET_LIST = $(TARGET_LIST_GEN) $(TARGET_LIST_GENCRT) $(TARGET_M65_x_ORF) $(TARGET_M65_x_PXL) $(TARGET_LIST_U64) +REL_TARGET_LIST = $(TARGET_LIST_GEN) \ + $(TARGET_LIST_GENCRT) \ + $(TARGET_M65_x_ORF) \ + $(TARGET_M65_x_PXL) \ + $(TARGET_LIST_U64) \ + $(TARGET_LIST_U64CRT) # Misc strings @@ -310,6 +327,11 @@ $(DIR_GENCRT)/OUTB_0.BIN $(DIR_GENCRT)/BASIC_0_combined.vs: \ $(DIR_GENCRT)/OUTK_0.BIN $(DIR_GENCRT)/KERNAL_0_combined.vs $(DIR_GENCRT)/KERNAL_0_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_GENCRT) $(GEN_STR_GENCRT) +$(DIR_U64CRT)/OUTB_0.BIN $(DIR_U64CRT)/BASIC_0_combined.vs: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_U64CRT) $(CRT_STR_U64CRT) $(DIR_U64CRT)/KERNAL_0_combined.sym +$(DIR_U64CRT)/OUTK_0.BIN $(DIR_U64CRT)/KERNAL_0_combined.vs $(DIR_U64CRT)/KERNAL_0_combined.sym: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_U64CRT) $(GEN_STR_U64CRT) + $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/BASIC_0_combined.vs $(DIR_M65)/BASIC_0_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_M65) $(GEN_STR_M65) $(DIR_M65)/KERNAL_0_combined.sym $(DIR_M65)/OUTK_0.BIN $(DIR_M65)/KERNAL_0_combined.vs $(DIR_M65)/KERNAL_0_combined.sym: \ @@ -325,6 +347,11 @@ $(DIR_GENCRT)/basic.seg_1 $(DIR_GENCRT)/BASIC_1_combined.vs $(DIR_GENCRT)/BASI $(DIR_GENCRT)/kernal.seg_1 $(DIR_GENCRT)/KERNAL_1_combined.vs $(DIR_GENCRT)/KERNAL_1_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_GENCRT) $(GEN_STR_GENCRT) $(DIR_GENCRT)/KERNAL_0_combined.sym +$(DIR_U64CRT)/basic.seg_1 $(DIR_U64CRT)/BASIC_1_combined.vs $(DIR_U64CRT)/BASIC_1_combined.sym: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_U64CRT) $(GEN_STR_U64CRT) $(DIR_U64CRT)/KERNAL_0_combined.sym $(DIR_U64CRT)/BASIC_0_combined.sym +$(DIR_U64CRT)/kernal.seg_1 $(DIR_U64CRT)/KERNAL_1_combined.vs $(DIR_U64CRT)/KERNAL_1_combined.sym: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_U64CRT) $(GEN_STR_U64CRT) $(DIR_U64CRT)/KERNAL_0_combined.sym + $(DIR_M65)/basic.seg_1 $(DIR_M65)/BASIC_1_combined.vs $(DIR_M65)/BASIC_1_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_M65) $(GEN_STR_M65) $(DIR_M65)/KERNAL_0_combined.sym $(DIR_M65)/BASIC_0_combined.sym $(DIR_M65)/dos.seg_1 $(DIR_M65)/DOS_1_combined.vs $(DIR_M65)/DOS_1_combined.sym: \ @@ -337,13 +364,14 @@ $(DIR_X16)/basic.seg_1 $(DIR_X16)/BASIC_1_combined.vs $(DIR_X16)/BASIC_1_combi $(DIR_X16)/kernal.seg_1 $(DIR_X16)/KERNAL_1_combined.vs $(DIR_X16)/KERNAL_1_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_X16) $(GEN_STR_X16) $(DIR_X16)/KERNAL_0_combined.sym -$(DIR_CUS)/OUTx_x.BIN: $(DIR_CUS)/OUTB_x.BIN $(DIR_CUS)/OUTK_x.BIN -$(DIR_GEN)/OUTx_x.BIN: $(DIR_GEN)/OUTB_x.BIN $(DIR_GEN)/OUTK_x.BIN +$(DIR_CUS)/OUTx_x.BIN: $(DIR_CUS)/OUTB_x.BIN $(DIR_CUS)/OUTK_x.BIN +$(DIR_GEN)/OUTx_x.BIN: $(DIR_GEN)/OUTB_x.BIN $(DIR_GEN)/OUTK_x.BIN $(DIR_GENCRT)/OUTx_0.BIN: $(DIR_GENCRT)/OUTB_0.BIN $(DIR_GENCRT)/OUTK_0.BIN -$(DIR_TST)/OUTx_x.BIN: $(DIR_TST)/OUTB_x.BIN $(DIR_TST)/OUTK_x.BIN -$(DIR_M65)/OUTx_0.BIN: $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/OUTK_0.BIN -$(DIR_U64)/OUTx_x.BIN: $(DIR_U64)/OUTB_x.BIN $(DIR_U64)/OUTK_x.BIN -$(DIR_X16)/OUTx_0.BIN: $(DIR_X16)/OUTB_0.BIN $(DIR_X16)/OUTK_0.BIN +$(DIR_TST)/OUTx_x.BIN: $(DIR_TST)/OUTB_x.BIN $(DIR_TST)/OUTK_x.BIN +$(DIR_M65)/OUTx_0.BIN: $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/OUTK_0.BIN +$(DIR_U64)/OUTx_x.BIN: $(DIR_U64)/OUTB_x.BIN $(DIR_U64)/OUTK_x.BIN +$(DIR_U64CRT)/OUTx_0.BIN: $(DIR_U64CRT)/OUTB_0.BIN $(DIR_U64CRT)/OUTK_0.BIN +$(DIR_X16)/OUTx_0.BIN: $(DIR_X16)/OUTB_0.BIN $(DIR_X16)/OUTK_0.BIN $(TARGET_CUS_B): $(DIR_CUS)/OUTx_x.BIN $(TARGET_GEN_B): $(DIR_GEN)/OUTx_x.BIN @@ -360,6 +388,7 @@ build/symbols_generic.vs: $(DIR_GEN)/BASIC_combined.vs $(DIR_GEN)/ build/symbols_generic_crt.vs: $(DIR_GENCRT)/BASIC_0_combined.vs $(DIR_GENCRT)/KERNAL_0_combined.vs build/symbols_testing.vs: $(DIR_TST)/BASIC_combined.vs $(DIR_TST)/KERNAL_combined.vs build/symbols_ultimate64.vs: $(DIR_U64)/BASIC_combined.vs $(DIR_U64)/KERNAL_combined.vs +build/symbols_ultimate64_crt.vs: $(DIR_U64CRT)/BASIC_0_combined.vs $(DIR_U64CRT)/KERNAL_0_combined.vs # Rules - BASIC and KERNAL intermediate files @@ -387,6 +416,10 @@ $(GEN_STR_U64): $(TOOL_GENERATE_STRINGS) $(CFG_U64) @mkdir -p $(DIR_U64)/,generated $(TOOL_GENERATE_STRINGS) -o $@ -c $(CFG_U64) +$(GEN_STR_U64CRT): $(TOOL_GENERATE_STRINGS) $(CFG_U64CRT) + @mkdir -p $(DIR_U64CRT)/,generated + $(TOOL_GENERATE_STRINGS) -o $@ -c $(CFG_U64CRT) + $(GEN_STR_X16): $(TOOL_GENERATE_STRINGS) $(CFG_X16) @mkdir -p $(DIR_X16)/,generated $(TOOL_GENERATE_STRINGS) -o $@ -c $(CFG_X16) @@ -395,13 +428,14 @@ build/,generated/,float_constants.s: $(TOOL_GENERATE_CONSTANTS) @mkdir -p build/,generated $(TOOL_GENERATE_CONSTANTS) -o build/,generated/,float_constants.s -GEN_STR_custom = $(GEN_STR_CUS) -GEN_STR_generic = $(GEN_STR_GEN) -GEN_STR_generic_crt = $(GEN_STR_GENCRT) -GEN_STR_testing = $(GEN_STR_TST) -GEN_STR_mega65 = $(GEN_STR_M65) -GEN_STR_ultimate64 = $(GEN_STR_U64) -GEN_STR_cx16 = $(GEN_STR_X16) +GEN_STR_custom = $(GEN_STR_CUS) +GEN_STR_generic = $(GEN_STR_GEN) +GEN_STR_generic_crt = $(GEN_STR_GENCRT) +GEN_STR_testing = $(GEN_STR_TST) +GEN_STR_mega65 = $(GEN_STR_M65) +GEN_STR_ultimate64 = $(GEN_STR_U64) +GEN_STR_ultimate64_crt = $(GEN_STR_U64CRT) +GEN_STR_cx16 = $(GEN_STR_X16) .PRECIOUS: build/target_%/OUTB_x.BIN build/target_%/BASIC_combined.vs build/target_%/OUTB_x.BIN build/target_%/BASIC_combined.vs: @@ -437,6 +471,26 @@ $(DIR_GENCRT)/kernal.seg_1 $(DIR_GENCRT)/KERNAL_1_combined.vs $(DIR_GENCRT)/KERN @rm -f $@* $(DIR_GENCRT)/kernal.seg_1 $(DIR_GENCRT)/KERNAL_1* @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s KERNAL_1 -i KERNAL_1-generic-crt -o kernal.seg_1 -d $(DIR_GENCRT) -l 8000 -h 9fff $(CFG_GENCRT) $(GEN_STR_GENCRT) $(SRCDIR_KERNAL) $(GEN_KERNAL) +$(DIR_U64CRT)/OUTB_0.BIN $(DIR_U64CRT)/BASIC_0_combined.vs $(DIR_U64CRT)/BASIC_0_combined.sym: + @mkdir -p $(DIR_U64CRT) + @rm -f $@* $(DIR_U64CRT)/BASIC_0* + @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s BASIC_0 -i BASIC_0-ultimate64-crt -o OUTB_0.BIN -d $(DIR_U64CRT) -l a000 -h e4d2 $(CFG_U64CRT) $(GEN_STR_U64CRT) $(SRCDIR_BASIC) $(GEN_BASIC) + +$(DIR_U64CRT)/OUTK_0.BIN $(DIR_U64CRT)/KERNAL_0_combined.vs $(DIR_U64CRT)/KERNAL_0_combined.sym: + @mkdir -p $(DIR_U64CRT) + @rm -f $@* $(DIR_U64CRT)/KERNAL_0* + @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s KERNAL_0 -i KERNAL_0-ultimate64-crt -o OUTK_0.BIN -d $(DIR_U64CRT) -l e4d3 -h ffff $(CFG_U64CRT) $(GEN_STR_U64CRT) $(SRCDIR_KERNAL) $(GEN_KERNAL) + +$(DIR_U64CRT)/basic.seg_1 $(DIR_U64CRT)/BASIC_1_combined.vs $(DIR_U64CRT)/BASIC_1_combined.sym: + @mkdir -p $(DIR_U64CRT) + @rm -f $@* $(DIR_U64CRT)/basic.seg_1 $(DIR_U64CRT)/BASIC_1* + @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s BASIC_1 -i BASIC_1-ultimate64-crt -o basic.seg_1 -d $(DIR_U64CRT) -l 8000 -h 9fff $(CFG_U64CRT) $(GEN_STR_U64CRT) $(SRCDIR_BASIC) $(GEN_BASIC) + +$(DIR_U64CRT)/kernal.seg_1 $(DIR_U64CRT)/KERNAL_1_combined.vs $(DIR_U64CRT)/KERNAL_1_combined.sym: + @mkdir -p $(DIR_U64CRT) + @rm -f $@* $(DIR_U64CRT)/kernal.seg_1 $(DIR_U64CRT)/KERNAL_1* + @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s KERNAL_1 -i KERNAL_1-ultimate64-crt -o kernal.seg_1 -d $(DIR_U64CRT) -l 8000 -h 9fff $(CFG_U64CRT) $(GEN_STR_U64CRT) $(SRCDIR_KERNAL) $(GEN_KERNAL) + # Rules - BASIC and KERNAL intermediate files, for MEGA65 $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/BASIC_0_combined.vs $(DIR_M65)/BASIC_0_combined.sym: @@ -513,6 +567,15 @@ $(DIR_GENCRT)/kernal.seg_0: $(DIR_GENCRT)/OUTx_0.BIN $(DIR_GENCRT)/basic.seg_0: $(DIR_GENCRT)/OUTx_0.BIN @dd if=$(DIR_GENCRT)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none +$(DIR_U64CRT)/OUTx_0.BIN: + @cat $(DIR_U64CRT)/OUTB_0.BIN $(DIR_U64CRT)/OUTK_0.BIN > $@ + +$(DIR_U64CRT)/kernal.seg_0: $(DIR_U64CRT)/OUTx_0.BIN + @dd if=$(DIR_U64CRT)/OUTx_0.BIN bs=8192 count=1 skip=2 of=$@ status=none + +$(DIR_U64CRT)/basic.seg_0: $(DIR_U64CRT)/OUTx_0.BIN + @dd if=$(DIR_U64CRT)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none + $(DIR_M65)/OUTx_0.BIN: @cat $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/OUTK_0.BIN > $@ @@ -537,9 +600,18 @@ $(TARGET_GENCRT_K): $(DIR_GENCRT)/OUTx_0.BIN $(TARGET_GENCRT_B): $(DIR_GENCRT)/OUTx_0.BIN @dd if=$(DIR_GENCRT)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none +$(TARGET_U64CRT_K): $(DIR_U64CRT)/OUTx_0.BIN + @dd if=$(DIR_U64CRT)/OUTx_0.BIN bs=8192 count=1 skip=2 of=$@ status=none + +$(TARGET_U64CRT_B): $(DIR_U64CRT)/OUTx_0.BIN + @dd if=$(DIR_U64CRT)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none + build/symbols_generic_crt.vs: @sort $(DIR_GENCRT)/BASIC_0_combined.vs $(DIR_GENCRT)/KERNAL_0_combined.vs | uniq | grep -v "__" > $@ +build/symbols_ultimate64_crt.vs: + @sort $(DIR_U64CRT)/BASIC_0_combined.vs $(DIR_U64CRT)/KERNAL_0_combined.vs | uniq | grep -v "__" > $@ + build/kernal_hybrid.rom: kernal $(DIR_GEN)/OUTK_x.BIN @echo @echo $(HYBRID_WARNING) @@ -564,18 +636,18 @@ build/kernal_hybrid_u64.rom: kernal $(DIR_U64)/OUTK_x.BIN build/symbols_hybrid_u64.vs: $(DIR_U64)/KERNAL_combined.vs @sort $(DIR_U64)/KERNAL_combined.vs | uniq | grep -v "__" > $@ -# Rules - external CRT image +# Rules - external CRT images build/padding_8_KB: @mkdir -p build @dd if=/dev/zero bs=8192 count=1 of=$@ status=none -$(TARGET_GENCRT_X): $(SEG_LIST_GENCRT) $(CRT_HDR_LIST) build/padding_8_KB +$(TARGET_GENCRT_X): $(SEG_LIST_GENCRT) $(CRT_BIN_LIST) build/padding_8_KB @echo @echo @echo @echo //------------------------------------------------------------------------------------------- - @echo // Making external CRT ROM image + @echo // Making external CRT ROM image - generic @echo //------------------------------------------------------------------------------------------- @cat assets/cartridge/header-cart.bin > $@ @cat assets/cartridge/header-seg0.bin >> $@ @@ -588,6 +660,24 @@ $(TARGET_GENCRT_X): $(SEG_LIST_GENCRT) $(CRT_HDR_LIST) build/padding_8_KB @cat build/padding_8_KB >> $@ @echo +$(TARGET_U64CRT_X): $(SEG_LIST_U64CRT) $(CRT_BIN_LIST) build/padding_8_KB + @echo + @echo + @echo + @echo //------------------------------------------------------------------------------------------- + @echo // Making external CRT ROM image - Ultimate 64 + @echo //------------------------------------------------------------------------------------------- + @cat assets/cartridge/header-cart.bin > $@ + @cat assets/cartridge/header-seg0.bin >> $@ + @cat $(DIR_U64CRT)/basic.seg_1 >> $@ + @cat assets/cartridge/header-seg1.bin >> $@ + @cat build/padding_8_KB >> $@ + @cat assets/cartridge/header-seg2.bin >> $@ + @cat $(DIR_U64CRT)/kernal.seg_1 >> $@ + @cat assets/cartridge/header-seg3.bin >> $@ + @cat build/padding_8_KB >> $@ + @echo + # Rules - MEGA65 platform specific build/padding_64_KB: @@ -668,6 +758,9 @@ test_testing: $(TARGET_LIST_TST) $(TARGET_CHR_PXL) build/symbols_testing.vs test_ultimate64: $(TARGET_LIST_U64) $(TARGET_CHR_PXL) build/symbols_ultimate64.vs x64 -kernal $(TARGET_U64_K) -basic $(TARGET_U64_B) -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_ultimate64.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_ultimate64_crt: $(TARGET_LIST_U64CRT) $(TARGET_CHR_PXL) build/symbols_ultimate64_crt.vs + x64 -kernal $(TARGET_U64CRT_K) -basic $(TARGET_U64CRT_B) -chargen $(TARGET_CHR_PXL) -cartcrt $(TARGET_U64CRT_X) -moncommands build/symbols_ultimate64_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) + test_mega65: $(TARGET_M65_x_ORF) $(TARGET_M65_x_PXL) ../xemu/build/bin/xmega65.native -dmarev 2 -besure -fontrefresh -forcerom -loadrom $(TARGET_M65_x_PXL) diff --git a/src/,,config_generic_crt.s b/src/,,config_generic_crt.s index 75a312b4..1e9a6970 100644 --- a/src/,,config_generic_crt.s +++ b/src/,,config_generic_crt.s @@ -1,5 +1,5 @@ -;; #CONFIG# ID $02 ; should be 1 byte, different for each config file! +;; #CONFIG# ID $11 ; should be 1 byte, different for each config file! ; ; Please read CONFIG.md before modifying this file! @@ -15,6 +15,7 @@ ; --- Hardware platform and brand ;; #CONFIG# PLATFORM_COMMODORE_64 YES +;; #CONFIG# ROM_CRT YES ;; #CONFIG# BRAND_GENERIC_CRT YES diff --git a/src/,,config_ultimate64_crt.s b/src/,,config_ultimate64_crt.s new file mode 100644 index 00000000..290d2756 --- /dev/null +++ b/src/,,config_ultimate64_crt.s @@ -0,0 +1,122 @@ + +;; #CONFIG# ID $13 ; should be 1 byte, different for each config file! + +; +; Please read CONFIG.md before modifying this file! +; + +; Idea: +; - sane defaults for the Ultimate 64 FPGA computer +; - do not enable features which are a significant compatibility risk + + + +; --- Hardware platform and brand + +;; #CONFIG# PLATFORM_COMMODORE_64 YES +;; #CONFIG# MB_U64 YES +;; #CONFIG# ROM_CRT YES + + +; --- Memory model + +;; #CONFIG# MEMORY_MODEL_38K NO +;; #CONFIG# MEMORY_MODEL_46K NO +;; #CONFIG# MEMORY_MODEL_50K YES +;; #CONFIG# MEMORY_MODEL_60K NO + + +; --- IEC bus configuration + +;; #CONFIG# IEC YES +;; #CONFIG# IEC_DOLPHINDOS YES +;; #CONFIG# IEC_DOLPHINDOS_FAST YES +;; #CONFIG# IEC_JIFFYDOS YES +;; #CONFIG# IEC_JIFFYDOS_BLANK YES + + +; --- Tape deck configuration + +;; #CONFIG# TAPE_NORMAL YES +;; #CONFIG# TAPE_TURBO YES +;; #CONFIG# TAPE_AUTODETECT YES +;; #CONFIG# TAPE_NO_KEY_SENSE NO +;; #CONFIG# TAPE_NO_MOTOR_CONTROL NO + + +; --- Sound support + +;; #CONFIG# SID_2ND_ADDRESS NO +;; #CONFIG# SID_3RD_ADDRESS NO +;; #CONFIG# SID_D4XX YES +;; #CONFIG# SID_D5XX YES +;; #CONFIG# SID_D6XX NO +;; #CONFIG# SID_D7XX NO + + +; --- Keyboard settings + +;; #CONFIG# LEGACY_SCNKEY NO +;; #CONFIG# KEYBOARD_C128 NO +;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO +;; #CONFIG# KEY_REPEAT_DEFAULT NO +;; #CONFIG# KEY_REPEAT_ALWAYS NO +;; #CONFIG# KEY_FAST_SCAN YES +;; #CONFIG# JOY1_CURSOR NO +;; #CONFIG# JOY2_CURSOR NO + +;; #CONFIG# PROGRAMMABLE_KEYS YES + +;; #CONFIG# KEYCMD_RUN "\5FL" + +;; #CONFIG# KEYCMD_F1 "@8$" +;; #CONFIG# KEYCMD_F2 "LOAD" +;; #CONFIG# KEYCMD_F3 "@9$" +;; #CONFIG# KEYCMD_F4 "RUN:" +;; #CONFIG# KEYCMD_F5 "@10$" +;; #CONFIG# KEYCMD_F6 NO +;; #CONFIG# KEYCMD_F7 "@11$" +;; #CONFIG# KEYCMD_F8 NO + +;; #CONFIG# KEYCMD_HELP "LIST" + +;; #CONFIG# KEYCMD_F9 NO +;; #CONFIG# KEYCMD_F10 NO +;; #CONFIG# KEYCMD_F11 NO +;; #CONFIG# KEYCMD_F12 NO +;; #CONFIG# KEYCMD_F13 NO +;; #CONFIG# KEYCMD_F14 NO + + +; --- Screen editor + +;; #CONFIG# EDIT_STOPQUOTE YES +;; #CONFIG# EDIT_TABULATORS NO + + +; --- Software features + +;; #CONFIG# PANIC_SCREEN YES +;; #CONFIG# DOS_WEDGE YES +;; #CONFIG# TAPE_WEDGE YES +;; #CONFIG# TAPE_HEAD_ALIGN YES +;; #CONFIG# BCD_SAFE_INTERRUPTS YES + + +; --- Eye candy + +;; #CONFIG# COLORS_BRAND YES +;; #CONFIG# BANNER_SIMPLE NO +;; #CONFIG# BANNER_FANCY YES +;; #CONFIG# SHOW_FEATURES YES + + +; --- Debug options + +;; #CONFIG# DBG_STUBS_BRK NO +;; #CONFIG# DBG_PRINTF NO + + +; --- Other + +;; #CONFIG# COMPRESSION_LVL_2 NO diff --git a/src/aliases/,aliases_config.s b/src/aliases/,aliases_config.s index 4eb53819..54444095 100644 --- a/src/aliases/,aliases_config.s +++ b/src/aliases/,aliases_config.s @@ -24,7 +24,7 @@ !if (counter > 1) { !error "Please select at most one CONFIG_MB_* option" } !ifdef ROM_LAYOUT_M65 { !ifndef CONFIG_MB_M65 { !error "ROM layout requires CONFIG_MB_M65 option" } } -!ifdef ROM_LAYOUT_U16 { !ifndef CONFIG_MB_U64 { !error "ROM layout requires CONFIG_MB_U64 option" } } +!ifdef ROM_LAYOUT_U64 { !ifndef CONFIG_MB_U64 { !error "ROM layout requires CONFIG_MB_U64 option" } } !ifdef CONFIG_MB_M65 { !ifndef ROM_LAYOUT_M65 { !error "CONFIG_MB_M65 can only be used with appropriate ROM layout" } } ; !ifdef CONFIG_MB_U64 { !ifndef ROM_LAYOUT_U64 { !error "CONFIG_MB_U64 can only be used with appropriate ROM layout" } } diff --git a/src/basic/assets/startup_banner.s b/src/basic/assets/startup_banner.s index bd0e3b9b..2340c4c4 100644 --- a/src/basic/assets/startup_banner.s +++ b/src/basic/assets/startup_banner.s @@ -20,7 +20,11 @@ } else ifdef CONFIG_BRAND_TESTING { !pet "open roms testing build" } else ifdef CONFIG_MB_U64 { - !pet "open roms for ultimate 64" + !ifdef CONFIG_ROM_CRT { + !pet "open roms crt for ultimate 64" + } else { + !pet "open roms for ultimate 64" + } } } diff --git a/src/kernal/board_crt/crt_imports.s b/src/kernal/board_crt/crt_imports.s index dd21e1cd..86a5c251 100644 --- a/src/kernal/board_crt/crt_imports.s +++ b/src/kernal/board_crt/crt_imports.s @@ -9,7 +9,6 @@ ;; #ALIAS# STOP = KERNAL_0.STOP ;; #ALIAS# IOINIT = KERNAL_0.proxy_K1_IOINIT -;; #ALIAS# xxx = KERNAL_0.xxx ;; #ALIAS# map_NORMAL = KERNAL_0.map_NORMAL ;; #ALIAS# map_KERNAL_1 = KERNAL_0.map_KERNAL_1 @@ -47,3 +46,10 @@ ;; #ALIAS# CLALL = KERNAL_0.proxy_K1_CLALL ;; #ALIAS# nmi_lock = KERNAL_0.nmi_lock + +; +; Ultimate 64 specific entries +; + +;; #ALIAS# U64_SLOW = KERNAL_0.U64_SLOW +;; #ALIAS# U64_FAST = KERNAL_0.U64_FAST diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index 81f01b41..074393b4 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -1685,7 +1685,6 @@ void DataSet::prepareOutput() // Convert our encoded strings to a KickAssembler source std::ostringstream stream; - stream << std::endl << "!ifdef ROM_LAYOUT_" << layoutName() << " {"<< std::endl; // Export 1-nibble and 3-nibble encoding data @@ -1724,7 +1723,7 @@ void DataSet::prepareOutput() // Finalize the file stream - stream << std::endl << "} ; ROM_LAYOUT_" << layoutName() << std::endl; + stream << std::endl; outFileContent = stream.str(); } @@ -1856,22 +1855,7 @@ void writeStrings() outputString = dataSetM65.getOutput(); } - else if (GLOBAL_ConfigOptions["PLATFORM_COMMODORE_64"] && GLOBAL_ConfigOptions["MB_U64"]) - { - DataSetU64 dataSetU64; - - // Add input data to computation objects - - dataSetU64.addStrings(GLOBAL_Keywords_V2); - dataSetU64.addStrings(GLOBAL_Keywords_01); - dataSetU64.addStrings(GLOBAL_Errors); - dataSetU64.addStrings(GLOBAL_MiscStrings); - - // Retrieve the results - - outputString = dataSetU64.getOutput(); - } - else if (GLOBAL_ConfigOptions["PLATFORM_COMMODORE_64"] && GLOBAL_ConfigOptions["BRAND_GENERIC_CRT"]) + else if (GLOBAL_ConfigOptions["PLATFORM_COMMODORE_64"] && GLOBAL_ConfigOptions["ROM_CRT"]) { DataSetCRT dataSetCRT; @@ -1887,6 +1871,21 @@ void writeStrings() outputString = dataSetCRT.getOutput(); } + else if (GLOBAL_ConfigOptions["PLATFORM_COMMODORE_64"] && GLOBAL_ConfigOptions["MB_U64"]) + { + DataSetU64 dataSetU64; + + // Add input data to computation objects + + dataSetU64.addStrings(GLOBAL_Keywords_V2); + dataSetU64.addStrings(GLOBAL_Keywords_01); + dataSetU64.addStrings(GLOBAL_Errors); + dataSetU64.addStrings(GLOBAL_MiscStrings); + + // Retrieve the results + + outputString = dataSetU64.getOutput(); + } else if (GLOBAL_ConfigOptions["PLATFORM_COMMODORE_64"]) { DataSetSTD dataSetSTD; From f2b7abfdb9d02996299e7c4f475ddf3fae658020 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 23 Oct 2020 16:59:36 +0200 Subject: [PATCH 48/51] small cleanup --- src/,,config_generic_crt.s | 2 +- src/aliases/,aliases_config.s | 10 ++++------ src/basic/assets/startup_banner.s | 8 +++++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/,,config_generic_crt.s b/src/,,config_generic_crt.s index 1e9a6970..045a4632 100644 --- a/src/,,config_generic_crt.s +++ b/src/,,config_generic_crt.s @@ -16,7 +16,7 @@ ;; #CONFIG# PLATFORM_COMMODORE_64 YES ;; #CONFIG# ROM_CRT YES -;; #CONFIG# BRAND_GENERIC_CRT YES +;; #CONFIG# BRAND_GENERIC YES ; --- Processor instruction set diff --git a/src/aliases/,aliases_config.s b/src/aliases/,aliases_config.s index 54444095..de9bbbeb 100644 --- a/src/aliases/,aliases_config.s +++ b/src/aliases/,aliases_config.s @@ -39,7 +39,6 @@ !set counter = 0 !ifdef CONFIG_BRAND_CUSTOM { !set counter = counter + 1 } !ifdef CONFIG_BRAND_GENERIC { !set counter = counter + 1 } -!ifdef CONFIG_BRAND_GENERIC_CRT { !set counter = counter + 1 } !ifdef CONFIG_BRAND_TESTING { !set counter = counter + 1 } !ifndef CONFIG_PLATFORM_COMMODORE_64 { @@ -52,15 +51,14 @@ !error "Please select exactly one CONFIG_BRAND_* option" } -!ifdef CONFIG_BRAND_GENERIC_CRT { !ifndef ROM_LAYOUT_CRT { - !error "CONFIG_BRAND_GENERIC_CRT needs cartridge extended ROM set and vice-versa" +!ifdef CONFIG_ROM_CRT { !ifndef ROM_LAYOUT_CRT { + !error "ROM_LAYOUT_CRT needs standard CONFIG_ROM_CRT set and vice-versa" }} -!ifdef CONFIG_BRAND_GENERIC { !ifndef ROM_LAYOUT_STD { - !error "CONFIG_BRAND_GENERIC needs standard ROM set and vice-versa" +!ifdef ROM_LAYOUT_CRT { !ifndef CONFIG_ROM_CRT { + !error "ROM_LAYOUT_CRT needs standard CONFIG_ROM_CRT set and vice-versa" }} - ; Check that processor configuration is correct !set counter = 0 diff --git a/src/basic/assets/startup_banner.s b/src/basic/assets/startup_banner.s index 2340c4c4..b1c0f552 100644 --- a/src/basic/assets/startup_banner.s +++ b/src/basic/assets/startup_banner.s @@ -14,9 +14,11 @@ !pet "open roms " +CONFIG_BRAND_CUSTOM } else ifdef CONFIG_BRAND_GENERIC { - !pet "open roms generic build" -} else ifdef CONFIG_BRAND_GENERIC_CRT { - !pet "open roms crt generic build" + !ifdef CONFIG_ROM_CRT { + !pet "open roms crt generic build" + } else { + !pet "open roms generic build" + } } else ifdef CONFIG_BRAND_TESTING { !pet "open roms testing build" } else ifdef CONFIG_MB_U64 { From 678c38a3e0c342bfcc37ddc5cceaf2fd5d4e5239 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 24 Oct 2020 09:08:57 +0200 Subject: [PATCH 49/51] reorganized extended BASIC tokens --- CONFIG.md | 4 ++ Makefile | 4 +- bin/README.md | 2 +- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_generic_crt.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64_crt.rom | Bin 0 -> 8192 bytes ...nal_generic.crt => extrom_generic_crt.crt} | Bin 32896 -> 32896 bytes bin/extrom_ultimate64_crt.crt | Bin 0 -> 32896 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_generic_crt.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64_crt.rom | Bin 0 -> 8192 bytes bin/mega65.rom | Bin 131072 -> 131072 bytes bin/mega65_pxlfont.rom | Bin 131072 -> 131072 bytes doc/Development.md | 28 +++++---- doc/Extended-BASIC.md | 14 ++--- src/,,config_ultimate64_crt.s | 1 + src/basic/assets/packed_keywords_02.s | 12 ---- src/basic/assets/packed_keywords_03.s | 13 ---- src/basic/assets/packed_keywords_04.s | 7 +++ src/basic/assets/packed_keywords_06.s | 7 +++ .../basic_commands_01/cmd__jumptable_01.s | 42 ++++++++----- .../cmd_bload_bverify.s | 3 + .../cmd_bsave.s | 3 + .../cmd_clear.s | 3 + .../cmd_cold.s | 0 .../cmd_dispose.s | 0 .../cmd_mem.s | 0 .../cmd_merge.s | 3 + .../helper_ask_if_sure.s | 0 .../helper_bload_fetch_address.s | 3 + .../helper_bload_fetch_filename.s | 3 + .../helper_mem_tab_str.s | 0 .../helper_mem_tab_x.s | 0 .../helper_mem_tab_y.s | 0 .../basic_commands_02/cmd__jumptable_02.s | 49 --------------- .../basic_commands_03_m65/cmd__jumptable_03.s | 15 ----- .../basic_commands_04/cmd__jumptable_04.s | 29 +++++++++ .../cmd_sysinfo.s | 0 .../basic_functions_06/fun__jumptable_06.s | 28 +++++++++ src/basic/engine_editor/tokenise_line.s | 38 +++++------ .../engine_runtime/execute_line_statements.s | 59 ++++-------------- src/basic/print/list_single_line.s | 47 +++++++------- src/basic/print/print_packed_freq_string.s | 21 +++---- src/basic/wedge/wedge_tape.s | 8 +++ tools/generate_strings.cc | 49 +++++++-------- 47 files changed, 235 insertions(+), 260 deletions(-) create mode 100644 bin/basic_ultimate64_crt.rom rename bin/{external_generic.crt => extrom_generic_crt.crt} (93%) create mode 100644 bin/extrom_ultimate64_crt.crt create mode 100644 bin/kernal_ultimate64_crt.rom delete mode 100644 src/basic/assets/packed_keywords_02.s delete mode 100644 src/basic/assets/packed_keywords_03.s create mode 100644 src/basic/assets/packed_keywords_04.s create mode 100644 src/basic/assets/packed_keywords_06.s rename src/basic/{basic_commands_02 => basic_commands_01}/cmd_bload_bverify.s (96%) rename src/basic/{basic_commands_02 => basic_commands_01}/cmd_bsave.s (95%) rename src/basic/{basic_commands_02 => basic_commands_01}/cmd_clear.s (86%) rename src/basic/{basic_commands_02 => basic_commands_01}/cmd_cold.s (100%) rename src/basic/{basic_commands_02 => basic_commands_01}/cmd_dispose.s (100%) rename src/basic/{basic_commands_02 => basic_commands_01}/cmd_mem.s (100%) rename src/basic/{basic_commands_02 => basic_commands_01}/cmd_merge.s (96%) rename src/basic/{basic_commands_02 => basic_commands_01}/helper_ask_if_sure.s (100%) rename src/basic/{basic_commands_02 => basic_commands_01}/helper_bload_fetch_address.s (92%) rename src/basic/{basic_commands_02 => basic_commands_01}/helper_bload_fetch_filename.s (94%) rename src/basic/{basic_commands_02 => basic_commands_01}/helper_mem_tab_str.s (100%) rename src/basic/{basic_commands_02 => basic_commands_01}/helper_mem_tab_x.s (100%) rename src/basic/{basic_commands_02 => basic_commands_01}/helper_mem_tab_y.s (100%) delete mode 100644 src/basic/basic_commands_02/cmd__jumptable_02.s delete mode 100644 src/basic/basic_commands_03_m65/cmd__jumptable_03.s create mode 100644 src/basic/basic_commands_04/cmd__jumptable_04.s rename src/basic/{basic_commands_02 => basic_commands_04}/cmd_sysinfo.s (100%) create mode 100644 src/basic/basic_functions_06/fun__jumptable_06.s diff --git a/CONFIG.md b/CONFIG.md index 68fa3e88..c3033ba5 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -31,6 +31,10 @@ Since Open ROMs is highly modular, it should be possible to add other platforms Select if the ROM is going to be used exclusively on the specified motherboard. It prevents from enabling options not having sense, skips initialization of C128-only registers, and enables motherboard-specific features. +### `ROM_CRT` + +Has to be set for builds utilizing cartridge image as a ROM extension. + ## Brand Branding is only allowed for C64 platform, if no motherboard is specified. diff --git a/Makefile b/Makefile index bbb11c14..e746d3aa 100644 --- a/Makefile +++ b/Makefile @@ -15,10 +15,10 @@ SRCDIR_BASIC = $(SRCDIR_COMMON) \ src/basic/assets \ src/basic/basic_commands \ src/basic/basic_commands_01 \ - src/basic/basic_commands_02 \ - src/basic/basic_commands_03_m65 \ + src/basic/basic_commands_04 \ src/basic/basic_operators \ src/basic/basic_functions \ + src/basic/basic_functions_06 \ src/basic/board_crt \ src/basic/board_m65 \ src/basic/board_x16 \ diff --git a/bin/README.md b/bin/README.md index 93f2ac57..b7c980d7 100644 --- a/bin/README.md +++ b/bin/README.md @@ -22,7 +22,7 @@ For Ultimate 64 motherboard the following settings are recommended:
-The generic_crt ROM set is a special version of generic set, with some code moved to external ROM on the cartridge - thus, more features could be enabled. It needs all the 3 files (BASIC, Kernal, cartridge) to be operable. +The \*\_crt ROM set is a special version, with some code moved to external ROM on the cartridge - thus, more features could be enabled. It needs all the 3 files (BASIC, Kernal, cartridge) to be operable.
diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 3683c857b914e350987e3e1859696a6dc8ee5aa3..6d8d0ed886a23c62adb0ea512c4714fed5176017 100644 GIT binary patch delta 3788 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 ZU1{j>iGkk>mp*q+Oq`raj3#2I{tM9|@?ih~ diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index af1dd73cc7cbb2925ee317f16ef0e675aa944486..029dbe3e781066aa520736c67dd87b360d56ec90 100644 GIT binary patch delta 3371 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 y2O*m8^NnOJd5@L0k$Dmjc9P-2VUoPyDI? diff --git a/bin/basic_ultimate64_crt.rom b/bin/basic_ultimate64_crt.rom new file mode 100644 index 0000000000000000000000000000000000000000..ca471e34c201bd566691800cd5c40e2fd806692c GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/bin/external_generic.crt b/bin/extrom_generic_crt.crt similarity index 93% rename from bin/external_generic.crt rename to bin/extrom_generic_crt.crt index a2524d6961da6541f5aaa6991586d22a54f03415..1dbfdc03e80510ded36b4350319410b12f96b2ed 100644 GIT binary patch delta 917 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 TFanGKBftnS0*t`_pTK_uUTD_z literal 0 HcmV?d00001 diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index 2f309c4ebda5e3cc3877c2c9dbb6d8282fb6bd5c..9d6d01f0f2a325c04c8ba8b718c56445d61796ec 100644 GIT binary patch delta 529 zcmZp0XmCjI*|ZFZ6b|m(Ag-`}{Zd{7W}oxRmL|4tUz*gqduej(9*KmNYORb5Sh_B{ z`)qg&W;1N8YPCH9BHi6Vk5H2*cQdK0v@B^2kXWje z8qlgVf$5lXf`ay*lMF!BZi`MfY+&};_rQm7(ZtnJ(xO{eEfqVdv_W`9tGGlabF0`i zh8Fjg46PnMrzR^fzUSzC;1lskL1@opaV9^uh64)(B5WpSGbw~Fl6)feL24_*2f@~W zt&FXKTbWvex;zwCEY4W<;>C*#k5)>yimeoD6;DW5$+*aI!AGCH{}m?hQeb;9f!XKM zGKHSU8<-VluV1OXOm~T%!j1nx(N)V5CO=>b7pvM0^|AX=*9)vCHo6~m1NwNfFSC8T zg2bW?Os%^T76|VQ+JAHBlMk#b8FRKj=@9tf6SWMaOTp(6$4d29MvVj?r_~-FK6AGv zc>m&OXnxJ$#meyiKhPfw7!{^I1cwCUnxzvBn0@{%S9rcn!RVpS`NxxAGh6AmD7Pvt zVA-hDn%e;+azI2jkl<`+&Dy9Wz`XLm4ls1`K*E_z6B809#u_MZv~9IK0VJ$IR{OYb rgStO!qSA>YnHRp#Q0ROxc{z(5pNXEEvz{RXg90-H5Ny88qALvmHg)0l delta 529 zcmZp0XmE&K$*8lEL1E%9g{R9E(icu(_Bp?-b(ccG!lhgaSN{XKtCl6KRBL5iz|wWm z-DkoBFq>gxRjcg@AYsR93lxJWU^tR^f!QbV@x~;DOaD&@d`$4!v}|$+i-DYi&m)eN z>aC0#2@2YKPBH)$9a(s?VFRTE!(YnOnuCF|@d^ zWN7v9IWbv*@jb`N$378{6r`6=7H9Hf`|91p$HXu>n@M3}g1TP)dXPN|lXoeYuLipI z(lUhu8-eusWk4@qH8Lc8KMSN_RPkz7@F2=A6>IwIwt`}HOY;-^B2K2;a zUuOIGXCN;u-jT3CcxTZ5n>(L;U|q?Wv;9ejzz3hGWvu}cOO;XsT9qa+9aB#5S+kIl zE9Hei!UBdxF+NvzE4c1axVQj_PWpUcKk55{6Xb@Ai+wil0+I_DT6X#*J(>KP*{a^> zCm%!e9R^QU2Kk4-Mfn)yT{?lxBR_SfAS>*VP_1v8G3>g>{Uhni_T(kKyi>@>P3k0 delta 197 zcmV;$06PDGK!8AyHVsF`MbHJvu}8&5Oi1IALtG1BtjU0|15Cc)Orw#iU_)0-)Vm-_ ztDpfOIONFy&;v|2sHKrG15BFZAQHSFIpItZ;i)Et0iXnm(ML>3nyE1F1tGxQT1DKF$ubX!Si)IJL*yz)u7i;&%TqE!`K+K- zAA!ldh=AW^e8VaO9^y|X8rVVBC|!ptCVS*%4o`$@-}$e)6!TRH-V_U?DGtUqJQy7< zL<)t%!<$+Qyvl<~6je6dANnSjMJ%6VV=jQmqk^~c8p7-QYKvk!wBwheZX=2)=eTGI ze%{wOIG1JA=sZYxJY*y-nyFJ??+kDsE)iE{LM+~S{lCCQX|NrU&SN}&j5}V*eO~@V z-EBTA2q8mUfK|Val|L-&D3xF-E>s}3*sA|p`_qebMihh7tu<;Bu<>5#y3^6EHUmq3 ZPUUTbquga58n8PU1|vpK;>lpE{{?odoa6ui delta 402 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 delta 2748 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 Qg3#@|G}?b@lqjD0Uve(!VgLXD diff --git a/bin/mega65_pxlfont.rom b/bin/mega65_pxlfont.rom index f0f7a8e17de6b19171d86c167e76175a16becef4..4c18426b18af275edf78f3993412b284301d5bd5 100644 GIT binary patch delta 2733 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 delta 2748 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 Qg3#@|G}?b@lqjD0Uve(!VgLXD diff --git a/doc/Development.md b/doc/Development.md index 000dc546..a63ed9b9 100644 --- a/doc/Development.md +++ b/doc/Development.md @@ -78,19 +78,21 @@ Make sure to read the main [README](../README.md) first - although any help with List of the most important make targets: -| target | description | -| :------------------ | :------------------------------------------------------------------------------ | -| `all` | builds all ROMs, places them in 'build' subdirectory | -| `clean` | removes all the compilation results and intermediate files | -| `updatebin` | upates ROMs in 'bin' subdirectory - with embedded version string, for release | -| `testsimilarity` | launches the similarity tool, see [README](../README.md) | -| `test` | builds the 'custom' configuration, launches it using VICE emulator | -| `test_generic` | builds the default ROMs, for generic C64/C128, launches using VICE | -| `test_generic_x128` | as above, but launches C128 emulator instead | -| `test_mega65` | builds the MEGA65 ROM, launches it using XEMU emulator | -| `test_ultimate64` | builds the Ultimate 64 configuration, launches it using VICE emulator | -| `test_hybrid` | builds a hybrid ROM (Open ROMs Kernal + original BASIC), launches it using VICE | -| `test_testing` | builds a rather odd testing configuration, launches it using VICE emulator | +| target | description | +| :-------------------- | :------------------------------------------------------------------------------ | +| `all` | builds all ROMs, places them in 'build' subdirectory | +| `clean` | removes all the compilation results and intermediate files | +| `updatebin` | upates ROMs in 'bin' subdirectory - with embedded version string, for release | +| `testsimilarity` | launches the similarity tool, see [README](../README.md) | +| `test` | builds the 'custom' configuration, launches it using VICE emulator | +| `test_generic` | builds the default ROMs, for generic C64/C128, launches using VICE | +| `test_generic_x128` | as above, but launches C128 emulator instead | +| `test_generic_crt` | builds the default ROM with extended cartridge image, launches using VICE | +| `test_mega65` | builds the MEGA65 ROM, launches it using XEMU emulator | +| `test_ultimate64` | builds the Ultimate 64 configuration, launches it using VICE | +| `test_ultimate64_crt` | as above, ROM with extended cartriodge image | +| `test_hybrid` | builds a hybrid ROM (Open ROMs Kernal + original BASIC), launches it using VICE | +| `test_testing` | builds a rather odd testing configuration, launches it using VICE | ### Code segments and ROM layouts diff --git a/doc/Extended-BASIC.md b/doc/Extended-BASIC.md index d8c6d046..1ea35116 100644 --- a/doc/Extended-BASIC.md +++ b/doc/Extended-BASIC.md @@ -53,19 +53,19 @@ Launches a built-in tape head alignment tool. Destroys program in memory. Press * if tape format autodetection is compiled-in, you can load file from tape using either device #1 (CBM compatible way) or from device #7 (in a way compatible with *Final* and *Action Replay* cartridges) * if autodetection is not available, than device #1 means normal CBM format, and device #7 means *Turbo Tape 64* format -### `MERGE "file_name" [, device_number]` (all) +### `MERGE "file_name" [, device_number]` (cart, MEGA65) Appends the BASIC program from a storage medium to the one currently present in memory. -### `BLOAD "file_name", device_number, start_address` (all) +### `BLOAD "file_name", device_number, start_address` (cart, MEGA65) Loads a binary file starting from the given memory location. Does not clear variables, does not perform BASIC program relinking, etc. NOTE: for now syntax differs from the BASIC V3.5+ - this will be changed once the necessary BASIC infrastructure is implemented. -### `BVERIFY "file_name", device_number, start_address` (all) +### `BVERIFY "file_name", device_number, start_address` (cart, MEGA65) Verify operation for the binary data starting from a given addres. NOTE: for now syntax differs from the BASIC V3.5+ - this will be changed once the necessary BASIC infrastructure is implemented. -### `BSAVE "file_name", device_number, start_address, end_address` (all) +### `BSAVE "file_name", device_number, start_address, end_address` (cart, MEGA65) Saves the binary data from the given memory area. NOTE: for now syntax differs from the BASIC V3.5+ - this will be changed once the necessary BASIC infrastructure is implemented. @@ -77,7 +77,7 @@ Resets the machine. In direct mode asks for confirmation first. ### `FAST`, `SLOW` (all) -Tries to switch the machine to turbo mode (or back to 1MHz operation mode) - details differ depending on the configured machine / motherboard. On MEGA65 motherboard this is not available in native mode, it is not designed to run in 1MHz due to using compound CPU instructions. +Tries to switch the machine to turbo mode (or back to 1MHz operation mode) - details differ depending on the configured machine / motherboard. On MEGA65 motherboard this is not available in native mode, it is not designed to run in 1MHz due to using compound CPU instructions usage. ### `OLD` (all) @@ -96,11 +96,11 @@ Displays BASIC memory usage information: Displays various system information. -### `CLEAR` (all) +### `CLEAR` (cart, MEGA65) Clears the screen content. -### `DISPOSE` (all) +### `DISPOSE` (cart, MEGA65) Runs the garbage collector - disposes outdated strings. diff --git a/src/,,config_ultimate64_crt.s b/src/,,config_ultimate64_crt.s index 290d2756..566868c0 100644 --- a/src/,,config_ultimate64_crt.s +++ b/src/,,config_ultimate64_crt.s @@ -7,6 +7,7 @@ ; Idea: ; - sane defaults for the Ultimate 64 FPGA computer +; - use RetroRelplay cartridge image as a ROM extension ; - do not enable features which are a significant compatibility risk diff --git a/src/basic/assets/packed_keywords_02.s b/src/basic/assets/packed_keywords_02.s deleted file mode 100644 index dc0e993e..00000000 --- a/src/basic/assets/packed_keywords_02.s +++ /dev/null @@ -1,12 +0,0 @@ -;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_1 #TAKE -;; #LAYOUT# M65 BASIC_1 #TAKE -;; #LAYOUT# X16 BASIC_0 #TAKE -;; #LAYOUT# * * #IGNORE - -!ifndef HAS_SMALL_BASIC { - -packed_freq_keywords_02: - - +PUT_PACKED_FREQ_keywords_02 -} diff --git a/src/basic/assets/packed_keywords_03.s b/src/basic/assets/packed_keywords_03.s deleted file mode 100644 index 916f9bdb..00000000 --- a/src/basic/assets/packed_keywords_03.s +++ /dev/null @@ -1,13 +0,0 @@ -;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_1 #TAKE -;; #LAYOUT# M65 BASIC_1 #TAKE -;; #LAYOUT# X16 BASIC_0 #TAKE -;; #LAYOUT# * * #IGNORE - -!ifdef CONFIG_MB_M65 { - -packed_freq_keywords_03: - - +PUT_PACKED_FREQ_keywords_03 - -} \ No newline at end of file diff --git a/src/basic/assets/packed_keywords_04.s b/src/basic/assets/packed_keywords_04.s new file mode 100644 index 00000000..d80ac41b --- /dev/null +++ b/src/basic/assets/packed_keywords_04.s @@ -0,0 +1,7 @@ +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# * * #IGNORE + + +packed_freq_keywords_04: + + +PUT_PACKED_FREQ_keywords_04 diff --git a/src/basic/assets/packed_keywords_06.s b/src/basic/assets/packed_keywords_06.s new file mode 100644 index 00000000..77d1eac9 --- /dev/null +++ b/src/basic/assets/packed_keywords_06.s @@ -0,0 +1,7 @@ +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# * * #IGNORE + + +packed_freq_keywords_06: + + +PUT_PACKED_FREQ_keywords_06 diff --git a/src/basic/basic_commands_01/cmd__jumptable_01.s b/src/basic/basic_commands_01/cmd__jumptable_01.s index 31ebb526..ad3a7490 100644 --- a/src/basic/basic_commands_01/cmd__jumptable_01.s +++ b/src/basic/basic_commands_01/cmd__jumptable_01.s @@ -6,33 +6,42 @@ ; Jumptable for BASIC commands with tokens prefixed by $01 ; +!set ITEM_01 = cmd_slow +!set ITEM_02 = cmd_fast +!set ITEM_03 = cmd_old -!set ITEM_00 = cmd_slow -!set ITEM_01 = cmd_fast -!set ITEM_02 = cmd_old +!ifndef HAS_SMALL_BASIC { - ; NOTE! These commands are temporarily placed here, they should be a part of list 02! +!set ITEM_04 = cmd_clear +!set ITEM_05 = varstr_garbage_collect ; cmd_dispose +!set ITEM_06 = cmd_merge +!set ITEM_07 = cmd_bload +!set ITEM_08 = cmd_bsave +!set ITEM_09 = cmd_bverify +!set ITEM_0A = cmd_cold +!set ITEM_0B = cmd_mem -!set ITEM_03 = cmd_merge +} -!set ITEM_04 = cmd_bload -!set ITEM_05 = cmd_bsave -!set ITEM_06 = cmd_bverify - -!set ITEM_07 = cmd_clear -!set ITEM_08 = varstr_garbage_collect ; cmd_dispose !ifndef HAS_OPCODES_65C02 { command_01_jumptable_lo: - !byte <(ITEM_00-1), <(ITEM_01-1), <(ITEM_02-1), <(ITEM_03-1), <(ITEM_04-1), <(ITEM_05-1), <(ITEM_06-1), <(ITEM_07-1), <(ITEM_08-1) + !byte <(ITEM_01-1), <(ITEM_02-1), <(ITEM_03-1) +!ifndef HAS_SMALL_BASIC { + !byte <(ITEM_04-1), <(ITEM_05-1), <(ITEM_06-1), <(ITEM_07-4), <(ITEM_08-1), <(ITEM_09-1), <(ITEM_0A-1), <(ITEM_0B-1) +} command_01_jumptable_hi: - !byte >(ITEM_00-1), >(ITEM_01-1), >(ITEM_02-1), >(ITEM_03-1), >(ITEM_04-1), >(ITEM_05-1), >(ITEM_06-1), >(ITEM_07-1), >(ITEM_08-1) + !byte >(ITEM_01-1), >(ITEM_02-1), >(ITEM_03-1) + +!ifndef HAS_SMALL_BASIC { + !byte >(ITEM_04-1), >(ITEM_05-1), >(ITEM_06-1), >(ITEM_07-4), >(ITEM_08-1), >(ITEM_09-1), >(ITEM_0A-1), >(ITEM_0B-1) +} } else { ; HAS_OPCODES_65C02 @@ -40,5 +49,10 @@ command_01_jumptable: ; Note: 65C02 has the page boundary vector bug fixed! - !word ITEM_00, ITEM_01, ITEM_02, ITEM_03, ITEM_04, ITEM_05, ITEM_06, ITEM_07, ITEM_08 + !word ITEM_01, ITEM_02, ITEM_03 + +!ifndef HAS_SMALL_BASIC { + !word ITEM_04, ITEM_05, ITEM_06, ITEM_07, ITEM_08, ITEM_09, ITEM_0A, ITEM_0B +} + } diff --git a/src/basic/basic_commands_02/cmd_bload_bverify.s b/src/basic/basic_commands_01/cmd_bload_bverify.s similarity index 96% rename from src/basic/basic_commands_02/cmd_bload_bverify.s rename to src/basic/basic_commands_01/cmd_bload_bverify.s index 87ab76d8..2e31c215 100644 --- a/src/basic/basic_commands_02/cmd_bload_bverify.s +++ b/src/basic/basic_commands_01/cmd_bload_bverify.s @@ -3,6 +3,8 @@ ;; #LAYOUT# * * #IGNORE +!ifndef HAS_SMALL_BASIC { + cmd_bverify: ; LOAD and VERIFY are very similar, from BASIC perspective there is almost no difference; @@ -40,3 +42,4 @@ cmd_bload: ; Execute next statement rts +} \ No newline at end of file diff --git a/src/basic/basic_commands_02/cmd_bsave.s b/src/basic/basic_commands_01/cmd_bsave.s similarity index 95% rename from src/basic/basic_commands_02/cmd_bsave.s rename to src/basic/basic_commands_01/cmd_bsave.s index f702a295..9a6ba5c9 100644 --- a/src/basic/basic_commands_02/cmd_bsave.s +++ b/src/basic/basic_commands_01/cmd_bsave.s @@ -3,6 +3,8 @@ ;; #LAYOUT# * * #IGNORE +!ifndef HAS_SMALL_BASIC { + cmd_bsave: ; Set default device and secondary address @@ -40,3 +42,4 @@ cmd_bsave: ; Perform SAVE - reuse regular command jmp cmd_save_do +} \ No newline at end of file diff --git a/src/basic/basic_commands_02/cmd_clear.s b/src/basic/basic_commands_01/cmd_clear.s similarity index 86% rename from src/basic/basic_commands_02/cmd_clear.s rename to src/basic/basic_commands_01/cmd_clear.s index a4af3508..1f4333db 100644 --- a/src/basic/basic_commands_02/cmd_clear.s +++ b/src/basic/basic_commands_01/cmd_clear.s @@ -3,8 +3,11 @@ ;; #LAYOUT# * * #IGNORE +!ifndef HAS_SMALL_BASIC { + cmd_clear: ; XXX in the future add separate implementation for graphics screen jmp clear_screen +} diff --git a/src/basic/basic_commands_02/cmd_cold.s b/src/basic/basic_commands_01/cmd_cold.s similarity index 100% rename from src/basic/basic_commands_02/cmd_cold.s rename to src/basic/basic_commands_01/cmd_cold.s diff --git a/src/basic/basic_commands_02/cmd_dispose.s b/src/basic/basic_commands_01/cmd_dispose.s similarity index 100% rename from src/basic/basic_commands_02/cmd_dispose.s rename to src/basic/basic_commands_01/cmd_dispose.s diff --git a/src/basic/basic_commands_02/cmd_mem.s b/src/basic/basic_commands_01/cmd_mem.s similarity index 100% rename from src/basic/basic_commands_02/cmd_mem.s rename to src/basic/basic_commands_01/cmd_mem.s diff --git a/src/basic/basic_commands_02/cmd_merge.s b/src/basic/basic_commands_01/cmd_merge.s similarity index 96% rename from src/basic/basic_commands_02/cmd_merge.s rename to src/basic/basic_commands_01/cmd_merge.s index 75e5bc44..e9740c36 100644 --- a/src/basic/basic_commands_02/cmd_merge.s +++ b/src/basic/basic_commands_01/cmd_merge.s @@ -3,6 +3,8 @@ ;; #LAYOUT# * * #IGNORE +!ifndef HAS_SMALL_BASIC { + cmd_merge: lda #$00 ; mark operation as LOAD @@ -45,3 +47,4 @@ cmd_merge_no_error: ; Relink loaded program, clear variables, execute next statement jmp update_LINKPRG_VARTAB_do_clr +} \ No newline at end of file diff --git a/src/basic/basic_commands_02/helper_ask_if_sure.s b/src/basic/basic_commands_01/helper_ask_if_sure.s similarity index 100% rename from src/basic/basic_commands_02/helper_ask_if_sure.s rename to src/basic/basic_commands_01/helper_ask_if_sure.s diff --git a/src/basic/basic_commands_02/helper_bload_fetch_address.s b/src/basic/basic_commands_01/helper_bload_fetch_address.s similarity index 92% rename from src/basic/basic_commands_02/helper_bload_fetch_address.s rename to src/basic/basic_commands_01/helper_bload_fetch_address.s index f3ab147f..940ec192 100644 --- a/src/basic/basic_commands_02/helper_bload_fetch_address.s +++ b/src/basic/basic_commands_01/helper_bload_fetch_address.s @@ -7,6 +7,8 @@ ; +!ifndef HAS_SMALL_BASIC { + helper_bload_fetch_address: jsr injest_comma @@ -20,3 +22,4 @@ helper_bload_fetch_address: ldy LINNUM+1 rts +} \ No newline at end of file diff --git a/src/basic/basic_commands_02/helper_bload_fetch_filename.s b/src/basic/basic_commands_01/helper_bload_fetch_filename.s similarity index 94% rename from src/basic/basic_commands_02/helper_bload_fetch_filename.s rename to src/basic/basic_commands_01/helper_bload_fetch_filename.s index e1b238de..6ad5ad74 100644 --- a/src/basic/basic_commands_02/helper_bload_fetch_filename.s +++ b/src/basic/basic_commands_01/helper_bload_fetch_filename.s @@ -7,6 +7,8 @@ ; +!ifndef HAS_SMALL_BASIC { + helper_bload_fetch_filename: ; Fetch the file name @@ -24,3 +26,4 @@ helper_bload_fetch_filename: sta FNLEN @1: rts +} \ No newline at end of file diff --git a/src/basic/basic_commands_02/helper_mem_tab_str.s b/src/basic/basic_commands_01/helper_mem_tab_str.s similarity index 100% rename from src/basic/basic_commands_02/helper_mem_tab_str.s rename to src/basic/basic_commands_01/helper_mem_tab_str.s diff --git a/src/basic/basic_commands_02/helper_mem_tab_x.s b/src/basic/basic_commands_01/helper_mem_tab_x.s similarity index 100% rename from src/basic/basic_commands_02/helper_mem_tab_x.s rename to src/basic/basic_commands_01/helper_mem_tab_x.s diff --git a/src/basic/basic_commands_02/helper_mem_tab_y.s b/src/basic/basic_commands_01/helper_mem_tab_y.s similarity index 100% rename from src/basic/basic_commands_02/helper_mem_tab_y.s rename to src/basic/basic_commands_01/helper_mem_tab_y.s diff --git a/src/basic/basic_commands_02/cmd__jumptable_02.s b/src/basic/basic_commands_02/cmd__jumptable_02.s deleted file mode 100644 index d51a332d..00000000 --- a/src/basic/basic_commands_02/cmd__jumptable_02.s +++ /dev/null @@ -1,49 +0,0 @@ -;; #LAYOUT# STD * #TAKE -;; #LAYOUT# * BASIC_0 #TAKE -;; #LAYOUT# * * #IGNORE - -; -; Jumptable for BASIC commands with tokens prefixed by $02 -; - -!ifndef HAS_SMALL_BASIC { - - ; NOTE! These commands are temporarily placed in list 01! - - ; cmd_merge, - - ; cmd_bload, - ; cmd_bsave, - ; cmd_bverify, - - ; cmd_clear, - ; varstr_garbage_collect, ; cmd_dispose - -!set ITEM_00 = cmd_cold -!set ITEM_01 = cmd_mem - -!ifdef CONFIG_MB_M65 { -!set ITEM_02 = cmd_sysinfo -} - -!ifndef HAS_OPCODES_65C02 { - -command_02_jumptable_lo: - - !byte <(ITEM_00-1), <(ITEM_01-1) - !ifdef CONFIG_MB_M65 { !byte <(ITEM_02-1) } - -command_02_jumptable_hi: - - !byte >(ITEM_00-1), >(ITEM_01-1) - !ifdef CONFIG_MB_M65 { !byte >(ITEM_02-1) } - -} else { ; HAS_OPCODES_65C02 - -command_02_jumptable: - - ; Note: 65C02 has the page boundary vector bug fixed! - - !word ITEM_00, ITEM_01 - !ifdef CONFIG_MB_M65 { !word ITEM_02 } -} } diff --git a/src/basic/basic_commands_03_m65/cmd__jumptable_03.s b/src/basic/basic_commands_03_m65/cmd__jumptable_03.s deleted file mode 100644 index cd3b7b54..00000000 --- a/src/basic/basic_commands_03_m65/cmd__jumptable_03.s +++ /dev/null @@ -1,15 +0,0 @@ -;; #LAYOUT# M65 BASIC_0 #TAKE -;; #LAYOUT# * * #IGNORE - -; -; Jumptable for BASIC commands with tokens prefixed by $03 -; - -!set ITEM_00 = cmd_rem ; XXX just for testing - - -command_03_jumptable: - - ; Note: 65C02 has the page boundary vector bug fixed! - - !word ITEM_00 diff --git a/src/basic/basic_commands_04/cmd__jumptable_04.s b/src/basic/basic_commands_04/cmd__jumptable_04.s new file mode 100644 index 00000000..4b623071 --- /dev/null +++ b/src/basic/basic_commands_04/cmd__jumptable_04.s @@ -0,0 +1,29 @@ +;; #LAYOUT# M65 * #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Jumptable for BASIC commands with tokens prefixed by $04 +; + +!set ITEM_01 = cmd_sysinfo + + + +!ifndef HAS_OPCODES_65C02 { + +command_04_jumptable_lo: + + !byte <(ITEM_01-1) + +command_04_jumptable_hi: + + !byte >(ITEM_01-1) + +} else { ; HAS_OPCODES_65C02 + +command_04_jumptable: + + ; Note: 65C02 has the page boundary vector bug fixed! + + !word ITEM_01 +} diff --git a/src/basic/basic_commands_02/cmd_sysinfo.s b/src/basic/basic_commands_04/cmd_sysinfo.s similarity index 100% rename from src/basic/basic_commands_02/cmd_sysinfo.s rename to src/basic/basic_commands_04/cmd_sysinfo.s diff --git a/src/basic/basic_functions_06/fun__jumptable_06.s b/src/basic/basic_functions_06/fun__jumptable_06.s new file mode 100644 index 00000000..63213301 --- /dev/null +++ b/src/basic/basic_functions_06/fun__jumptable_06.s @@ -0,0 +1,28 @@ +;; #LAYOUT# M65 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Jumptable for BASIC commands with tokens prefixed by $03 +; + +!set ITEM_01 = do_NOT_IMPLEMENTED_error ; just for testing + + +!ifndef HAS_OPCODES_65C02 { + +function_06_jumptable_lo: + + !byte <(ITEM_01-1) + +function_06_jumptable_hi: + + !byte >(ITEM_01-1) + +} else { ; HAS_OPCODES_65C02 + +function_06_jumptable: + + ; Note: 65C02 has the page boundary vector bug fixed! + + !word ITEM_01 +} diff --git a/src/basic/engine_editor/tokenise_line.s b/src/basic/engine_editor/tokenise_line.s index 2144abd8..500c4714 100644 --- a/src/basic/engine_editor/tokenise_line.s +++ b/src/basic/engine_editor/tokenise_line.s @@ -92,26 +92,23 @@ tokenise_line_loop: jsr tk_search bcc tokenise_line_keyword_01 ; branch if keyword identified -!ifndef HAS_SMALL_BASIC { - - lda #packed_freq_keywords_02 - sta FRESPC+1 - - jsr tk_search - bcc tokenise_line_keyword_02 ; branch if keyword identified -} - !ifdef CONFIG_MB_M65 { - lda #packed_freq_keywords_03 + lda #>packed_freq_keywords_04 sta FRESPC+1 jsr tk_search - bcc tokenise_line_keyword_03 ; branch if keyword identified + bcc tokenise_line_keyword_04 ; branch if keyword identified + + lda #packed_freq_keywords_06 + sta FRESPC+1 + + jsr tk_search + bcc tokenise_line_keyword_06 ; branch if keyword identified } ; Shorten packed keyword candidate and try again @@ -189,23 +186,18 @@ tokenise_line_char: !ifdef CONFIG_MB_M65 { -tokenise_line_keyword_03: +tokenise_line_keyword_04: ; Store the token list index - lda #$03 + lda #$04 +skip_2_bytes_trash_nvz - ; FALLTROUGH -} - -!ifndef HAS_SMALL_BASIC { - -tokenise_line_keyword_02: +tokenise_line_keyword_06: ; Store the token list index - lda #$02 + lda #$06 +skip_2_bytes_trash_nvz ; FALLTROUGH diff --git a/src/basic/engine_runtime/execute_line_statements.s b/src/basic/engine_runtime/execute_line_statements.s index 1c500524..ea128073 100644 --- a/src/basic/engine_runtime/execute_line_statements.s +++ b/src/basic/engine_runtime/execute_line_statements.s @@ -39,23 +39,19 @@ execute_statements: ; Check if token is valid for execution -!ifdef HAS_SMALL_BASIC { +!ifndef CONFIG_MB_M65 { cpx #$01 beq execute_statements_01 } else { -!ifdef CONFIG_MB_M65 { - cpx #$04 -} else { - cpx #$03 -} + cpx #$05 bcc execute_statements_extended } cpx #$CB - +beq cmd_go ; 'GO' command has a strange token, placed after function tokens + +beq cmd_go ; 'GO' command has a strange token, placed after function tokens cpx #$7F +bcc execute_statements_var_assign ; not a token - try variable assign @@ -84,25 +80,17 @@ execute_statements: jmp (command_jumptable, x) } -!ifndef HAS_SMALL_BASIC { +!ifdef CONFIG_MB_M65 { execute_statements_extended: ; Support for extended BASIC commands - ; XXX consider jumpable here - cpx #$01 beq execute_statements_01 - cpx #$02 - beq execute_statements_02 - -!ifdef CONGIH_MB_M65 { - - cpx #$03 - beq execute_statements_03 -} + cpx #$04 + beq execute_statements_04 jmp do_SYNTAX_error } @@ -141,9 +129,9 @@ execute_statements_01: jmp (command_01_jumptable - 2, x) } -!ifndef HAS_SMALL_BASIC { +!ifdef CONFIG_MB_M65 { -execute_statements_02: +execute_statements_04: ; Get the sub-token, check that it is valid @@ -151,7 +139,7 @@ execute_statements_02: cmp #$00 +beq do_SYNTAX_error - cmp #(TK__MAXTOKEN_keywords_02+1) + cmp #(TK__MAXTOKEN_keywords_04+1) +bcs do_SYNTAX_error ; Execute command @@ -161,9 +149,9 @@ execute_statements_02: ; Get the jump table entry for it, push it on the stack, and then RTS to start it. tax - lda command_02_jumptable_hi - 1, x + lda command_04_jumptable_hi - 1, x pha - lda command_02_jumptable_lo - 1, x + lda command_04_jumptable_lo - 1, x pha rts @@ -174,31 +162,10 @@ execute_statements_02: asl tax - jmp (command_02_jumptable - 2, x) + jmp (command_04_jumptable - 2, x) } -} ; !HAS_SMALL_BASIC - -!ifdef CONFIG_MB_M65 { - -execute_statements_03: - - ; Get the sub-token, check that it is valid - - jsr fetch_character - cmp #$00 - +beq do_SYNTAX_error - - cmp #(TK__MAXTOKEN_keywords_03+1) - +bcs do_SYNTAX_error - - ; Use jumptable to go to the command routine - - asl - tax - jmp (command_03_jumptable - 2, x) - -} ; CONFIG_MB_M65 +} execute_statements_end_of_line: diff --git a/src/basic/print/list_single_line.s b/src/basic/print/list_single_line.s index 485f2a16..bd2cbd31 100644 --- a/src/basic/print/list_single_line.s +++ b/src/basic/print/list_single_line.s @@ -104,13 +104,11 @@ list_not_quote: ; Check for extended BASIC tokens cmp #$01 beq list_display_token_01 -!ifndef HAS_SMALL_BASIC { - cmp #$02 - beq list_display_token_02 -} !ifdef CONFIG_MB_M65 { - cmp #$03 - beq list_display_token_03 + cmp #$04 + beq list_display_token_04 + cmp #$06 + beq list_display_token_06 } ; Check for literals @@ -232,37 +230,34 @@ list_display_token_ext_done: ; Next iteration +bra list_not_rem -!ifndef HAS_SMALL_BASIC { - -list_display_token_02: - - ; Display a 2-byte token - for extended BASIC - jsr list_fetch_subtoken - - ; Check if token is known - cpx #TK__MAXTOKEN_keywords_02 - bcs list_is_unknown - - ; Now ask for it to be printed - +phy_trash_a - jsr print_packed_keyword_02 - +bra list_display_token_ext_done -} - !ifdef CONFIG_MB_M65 { -list_display_token_03: +list_display_token_04: ; Display a 2-byte token - for extended BASIC jsr list_fetch_subtoken ; Check if token is known - cpx #TK__MAXTOKEN_keywords_03 + cpx #TK__MAXTOKEN_keywords_04 bcs list_is_unknown ; Now ask for it to be printed +phy_trash_a - jsr print_packed_keyword_03 + jsr print_packed_keyword_04 + +bra list_display_token_ext_done + +list_display_token_06: + + ; Display a 2-byte token - for extended BASIC + jsr list_fetch_subtoken + + ; Check if token is known + cpx #TK__MAXTOKEN_keywords_06 + bcs list_is_unknown + + ; Now ask for it to be printed + +phy_trash_a + jsr print_packed_keyword_06 +bra list_display_token_ext_done } diff --git a/src/basic/print/print_packed_freq_string.s b/src/basic/print/print_packed_freq_string.s index 882bf26d..cc46cdc1 100644 --- a/src/basic/print/print_packed_freq_string.s +++ b/src/basic/print/print_packed_freq_string.s @@ -59,21 +59,18 @@ print_packed_keyword_01: ; .X - token number ldy #>packed_freq_keywords_01 bne print_freq_packed_string ; branch always -!ifndef HAS_SMALL_BASIC { - -print_packed_keyword_02: ; .X - token number - - lda #packed_freq_keywords_02 - bne print_freq_packed_string ; branch always -} - !ifdef CONFIG_MB_M65 { -print_packed_keyword_03: ; .X - token number +print_packed_keyword_04: ; .X - token number - lda #packed_freq_keywords_03 + lda #packed_freq_keywords_04 + bne print_freq_packed_string ; branch always + +print_packed_keyword_06: ; .X - token number + + lda #packed_freq_keywords_06 bne print_freq_packed_string ; branch always } diff --git a/src/basic/wedge/wedge_tape.s b/src/basic/wedge/wedge_tape.s index 54926c89..0b83dc15 100644 --- a/src/basic/wedge/wedge_tape.s +++ b/src/basic/wedge/wedge_tape.s @@ -19,8 +19,12 @@ wedge_tape: cmp #$4C ; 'L' beq wedge_arrow_L + +!ifndef HAS_SMALL_BASIC { + cmp #$4D ; 'M' beq wedge_arrow_M +} !ifdef CONFIG_TAPE_HEAD_ALIGN { @@ -68,6 +72,9 @@ wedge_arrow_L: jmp cmd_load_got_params + +!ifndef HAS_SMALL_BASIC { + wedge_arrow_M: jsr wedge_tape_prepare_load @@ -77,5 +84,6 @@ wedge_arrow_M: ; Perform merging jmp cmd_merge_got_params +} } ; CONFIG_TAPE_WEDGE diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index 074393b4..17440485 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -174,7 +174,7 @@ const StringEntryList GLOBAL_Keywords_V2 = { ListType::KEYWORDS, "keywords_V2", { true, true, true, true, true, "KV2_CB", "GO", 0 }, // https://en.wikipedia.org/wiki/Goto } }; -// extended BASIC keywords - list reserved for small BASIC commands, suitable for inclusion in non-extended ROMs +// extended BASIC keywords - list reserved for small BASIC commands, suitable for inclusion in all machines with extended ROM const StringEntryList GLOBAL_Keywords_01 = { ListType::KEYWORDS, "keywords_01", { @@ -182,37 +182,33 @@ const StringEntryList GLOBAL_Keywords_01 = { ListType::KEYWORDS, "keywords_01", { true, true, true, true, true, "K01_01", "SLOW", }, // https://en.wikipedia.org/wiki/Sinclair_BASIC - ZX81 variant { true, true, true, true, true, "K01_02", "FAST", }, // https://en.wikipedia.org/wiki/Sinclair_BASIC - ZX81 variant { true, true, true, true, true, "K01_03", "OLD", }, // Not present in CBM BASIC dialects, but common to some extensions (*) - - // (*) see https://sourceforge.net/p/vice-emu/code/HEAD/tree/trunk/vice/src/petcat.c - - // NOTE! These commands are temporarily placed here, they should be a part of list 02! - - { true, true, true, true, true, "K02_01", "MERGE", }, // Not present in CBM BASIC dialects, but common to some extensions (*) - { true, true, true, true, true, "K02_02", "BLOAD", }, // http://www.antonis.de/qbebooks/gwbasman/bload.html - { true, true, true, true, true, "K02_03", "BSAVE", }, // http://www.antonis.de/qbebooks/gwbasman/bsave.html - { true, true, true, true, true, "K02_04", "BVERIFY", }, - { true, true, true, true, true, "K02_05", "CLEAR", }, // Not present in CBM BASIC dialects, Open ROMs specific - { true, true, true, true, true, "K02_06", "DISPOSE", }, // Not present in CBM BASIC dialects, Open ROMs specific -} }; - -// extended BASIC keywords - list reserved for generic (mostly hardware independent) BASIC commands - -const StringEntryList GLOBAL_Keywords_02 = { ListType::KEYWORDS, "keywords_02", -{ - // STD CRT M65 U64 X16 - { false, true, true, false, false, "K02_07", "COLD", }, // Not present in CBM BASIC dialects, but common to some extensions (*) - { false, true, true, false, false, "K02_08", "MEM", }, // Not present in CBM BASIC dialects, Open ROMs specific - { false, false, true, false, false, "K02_09", "SYSINFO", }, // Not present in CBM BASIC dialects, Open ROMs specific + { false, true, true, true, false, "K01_04", "CLEAR", }, // Not present in CBM BASIC dialects, Open ROMs specific + { false, true, true, true, false, "K01_05", "DISPOSE", }, // Not present in CBM BASIC dialects, Open ROMs specific + { false, true, true, true, false, "K01_06", "MERGE", }, // Not present in CBM BASIC dialects, but common to some extensions (*) + { false, true, true, true, false, "K01_07", "BLOAD", }, // http://www.antonis.de/qbebooks/gwbasman/bload.html + { false, true, true, true, false, "K01_08", "BSAVE", }, // http://www.antonis.de/qbebooks/gwbasman/bsave.html + { false, true, true, true, false, "K01_09", "BVERIFY", }, + { false, true, true, true, false, "K01_0A", "COLD", }, // Not present in CBM BASIC dialects, but common to some extensions (*) + { false, true, true, true, false, "K01_0B", "MEM", }, // Not present in CBM BASIC dialects, Open ROMs specific // (*) see https://sourceforge.net/p/vice-emu/code/HEAD/tree/trunk/vice/src/petcat.c } }; // extended BASIC keywords - list reserved for hardware dependent BASIC commands -const StringEntryList GLOBAL_Keywords_03_M65 = { ListType::KEYWORDS, "keywords_03", +const StringEntryList GLOBAL_Keywords_04 = { ListType::KEYWORDS, "keywords_04", { // STD CRT M65 U64 X16 - { false, false, true, false, false, "K03_01", "TEST", }, // Not present in CBM BASIC dialects, Open ROMs specific + { false, false, true, false, false, "K04_01", "SYSINFO", }, // Not present in CBM BASIC dialects, Open ROMs specific + +} }; + +// extended BASIC keywords - list reserved for functions + +const StringEntryList GLOBAL_Keywords_06 = { ListType::KEYWORDS, "keywords_06", +{ + // STD CRT M65 U64 X16 + { false, false, true, false, false, "K06_01", "TEST", }, // Not present in CBM BASIC dialects, Open ROMs specific } }; @@ -1846,8 +1842,8 @@ void writeStrings() dataSetM65.addStrings(GLOBAL_Keywords_V2); dataSetM65.addStrings(GLOBAL_Keywords_01); - dataSetM65.addStrings(GLOBAL_Keywords_02); - dataSetM65.addStrings(GLOBAL_Keywords_03_M65); + dataSetM65.addStrings(GLOBAL_Keywords_04); + dataSetM65.addStrings(GLOBAL_Keywords_06); dataSetM65.addStrings(GLOBAL_Errors); dataSetM65.addStrings(GLOBAL_MiscStrings); @@ -1863,7 +1859,6 @@ void writeStrings() dataSetCRT.addStrings(GLOBAL_Keywords_V2); dataSetCRT.addStrings(GLOBAL_Keywords_01); - dataSetCRT.addStrings(GLOBAL_Keywords_02); dataSetCRT.addStrings(GLOBAL_Errors); dataSetCRT.addStrings(GLOBAL_MiscStrings); From 833d126c296b434b547cc81902a08c7cb253f7a3 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 24 Oct 2020 17:00:59 +0200 Subject: [PATCH 50/51] removed build which is not really practical --- Makefile | 3 +-- bin/basic_ultimate64_crt.rom | Bin 8192 -> 0 bytes bin/extrom_ultimate64_crt.crt | Bin 32896 -> 0 bytes bin/kernal_ultimate64_crt.rom | Bin 8192 -> 0 bytes 4 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 bin/basic_ultimate64_crt.rom delete mode 100644 bin/extrom_ultimate64_crt.crt delete mode 100644 bin/kernal_ultimate64_crt.rom diff --git a/Makefile b/Makefile index e746d3aa..11cf3ac2 100644 --- a/Makefile +++ b/Makefile @@ -213,8 +213,7 @@ REL_TARGET_LIST = $(TARGET_LIST_GEN) \ $(TARGET_LIST_GENCRT) \ $(TARGET_M65_x_ORF) \ $(TARGET_M65_x_PXL) \ - $(TARGET_LIST_U64) \ - $(TARGET_LIST_U64CRT) + $(TARGET_LIST_U64) # Misc strings diff --git a/bin/basic_ultimate64_crt.rom b/bin/basic_ultimate64_crt.rom deleted file mode 100644 index ca471e34c201bd566691800cd5c40e2fd806692c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 diff --git a/bin/extrom_ultimate64_crt.crt b/bin/extrom_ultimate64_crt.crt deleted file mode 100644 index e3c337fcc6b83a64bd88748601ed76d024f7060c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32896 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 TFanGKBftnS0*t`_pTK_uUTD_z diff --git a/bin/kernal_ultimate64_crt.rom b/bin/kernal_ultimate64_crt.rom deleted file mode 100644 index 2ddf63452ece7c87efc4c7db501f715c7e28568e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 kToEeH5{j1y#Y+X;c^-!@;e Date: Sat, 24 Oct 2020 22:46:26 +0200 Subject: [PATCH 51/51] explained all similarities >3 --- strings/0185C0A2 | 3 +++ strings/20CAB44C | 3 +++ strings/534541524348494E | 3 +++ strings/AFC9FFD0 | 3 +++ strings/F5A98085 | 3 +++ 5 files changed, 15 insertions(+) create mode 100644 strings/0185C0A2 create mode 100644 strings/20CAB44C create mode 100644 strings/534541524348494E create mode 100644 strings/AFC9FFD0 create mode 100644 strings/F5A98085 diff --git a/strings/0185C0A2 b/strings/0185C0A2 new file mode 100644 index 00000000..2f322ce3 --- /dev/null +++ b/strings/0185C0A2 @@ -0,0 +1,3 @@ +$01 + STA $C0 + LDX#(value does not match) + +Instruction + some parts. Trivial - not copyrightable. diff --git a/strings/20CAB44C b/strings/20CAB44C new file mode 100644 index 00000000..3a3fb9fc --- /dev/null +++ b/strings/20CAB44C @@ -0,0 +1,3 @@ +JSR $B4CA + JMP (address does not match) + +Instruction + some parts. Trivial - not copyrightable. diff --git a/strings/534541524348494E b/strings/534541524348494E new file mode 100644 index 00000000..d54aecd0 --- /dev/null +++ b/strings/534541524348494E @@ -0,0 +1,3 @@ +PETSCII string: SEARCHIN + +A single word - not copyrightable. diff --git a/strings/AFC9FFD0 b/strings/AFC9FFD0 new file mode 100644 index 00000000..f99952e3 --- /dev/null +++ b/strings/AFC9FFD0 @@ -0,0 +1,3 @@ +$AF + CMP #$FF + BNE (offset does not match) + +Instruction + some parts. Trivial - not copyrightable. diff --git a/strings/F5A98085 b/strings/F5A98085 new file mode 100644 index 00000000..166260bd --- /dev/null +++ b/strings/F5A98085 @@ -0,0 +1,3 @@ +$F5 + LDA #$80 + STA (zeropage address does not match) + +Instruction + some parts. Trivial - not copyrightable.