From 113653a1cecd9ac19f16d038efc703a51316401a Mon Sep 17 00:00:00 2001 From: Stephen White Date: Mon, 11 Jun 2018 20:08:11 +1000 Subject: [PATCH] Added my modified version of nbla000's CBM-FileBrowser.asm --- .../sources/CBM-FileBrowser.asm | 4360 +++++++++++++++++ 1 file changed, 4360 insertions(+) create mode 100644 CBM-FileBrowser_v1.6/sources/CBM-FileBrowser.asm diff --git a/CBM-FileBrowser_v1.6/sources/CBM-FileBrowser.asm b/CBM-FileBrowser_v1.6/sources/CBM-FileBrowser.asm new file mode 100644 index 0000000..95c24c2 --- /dev/null +++ b/CBM-FileBrowser_v1.6/sources/CBM-FileBrowser.asm @@ -0,0 +1,4360 @@ +; -------------------- +; - Constants +; -------------------- + +; - joystick port address + +!if target = 20 { +joyport = $9111 ; joystick port +ScreenCols = 22 ; Number of screen columns +curpos = $d3 ; Position of cursor on line (used to avoid screen scroll when print "quit") + +} + +!if target = 64 { +joyport = $dc00 ; joystick port 2 ($dc01 for port 1) +ScreenCols = 40 ; Number of screen columns +} + + +!if target = 16 { +joyport = $FF08 ; joystick port (set #$fa before for port 1 or #$fd for port 2) +ScreenCols = 40 ; Number of screen columns +} + +!if target = 128 { +joyport = $dc00 ; change me, joystick port +ScreenCols = 40 ; Number of screen columns +} + + +; - max. length for stored entries +entrylen = 17 +; - max. length for shown entries +namelen = 16 + +; - some PETSCII chars +quotechar = $22 +leftarrowchar = 95 + +; - Vic-20 Mega-Cart used locations and constants +MC_NVRamCheck = $9c00 ; value #214 (CheckByte) means that prefences are stored from $9C01 to $9C3F +MC_CheckByte = 214 ; Value to check if preference are stored on NVRAM +MC_ExternalBootDelay = $9c3f ; 2 to 50 [default 5] (cycles to wait before to check for external boot program) +MC_SJLOAD_init = $9c40 ; SJLOAD quick start jump (SYS40000) +MC_NvRAM_state = $9d80 ; Set 3k/NvRAM (bit0 = 0, enabled) but it could be used to set 32k too in someway. +MC_LastCartEprom1 = $9c08 +MC_LastCartEprom2 = $9c09 +MC_LastCartExp3k = $9c0a +MC_LastConfig = $9c0b + +; -------------------- +; - kernal functions +; -------------------- + +!if target = 20 | target = 64 | target = 16 | target = 128 { +SETLFS = $ffba ; a = filenr, x = unitnr, y = sec.addr/command (255|1) +SETNAM = $ffbd ; a = namelen, x:y->name +OPEN = $ffc0 ; Open Vector [F40A] Open File + ; Preparing: SETLFS, SETNAM +CLOSE = $ffc3 ; x = filenr +LOAD = $ffd5 ; a = 0 +SCNKEY = $ff9f +GETIN = $ffe4 ; ret: a = 0: no keys pressed, otherwise a = ASCII code +CHROUT = $ffd2 ; a = output char +PLOT = $fff0 ; x<->y +} + + +!if target = 20 { +CLRLINE = $ea8d ; Clear Screen Line X + +CHKIN = $ffc6 ; Set Input [F2C7] Set Input Device + ; Preparing: OPEN +CHRIN = $ffcf ; Input Vector, chrin [F20E] Input a byte + ; Preparing: OPEN, CHKIN +CINT1 = $e518 ; Initialize I/O + +PRNSTR = $cb1e ; print string in A/Y, 0 terminated +PRNINT = $ddcd ; print integer in A/X +CLEARSCREEN = $e55f +SHFLAG = $28D ; ($00 = None, $01 = Shift, $02 = CBM, $04 = CTRL or a sum of them). + ; not used for the Vic-20 (auto or manual startmode method) +} + +!if target = 64 { +PRNSTR = $ab1e ; print string in A/Y, 0 terminated +PRNINT = $bdcd ; print integer in A/X +CLEARSCREEN = $e544 +SHFLAG = $28d ; ($00 = None, $01 = Shift, $02 = CBM, $04 = CTRL or a sum of them). + +CINT1 = $e518 ; Initialize I/O +INITV = $e45b ; initv Initialize Vectors +INTTCZ = $e3a4 ; initcz Initialize BASIC RAM +SCRTCHF = $a644 ; scrtch Perform [new] FORCED and return + +} + +!if target = 128 { +;PRNSTR = $ab1e ; print string in A/Y, 0 terminated +;PRNINT = $8e32 ; print integer in A/X +CLEARSCREEN = $c142 +SHFLAG = $d3 ; ($00 = None, $01 = Shift, $02 = CBM, $04 = CTRL or a sum of them). + +CINT = $ff81 ; CINT - $ff81 - Initializes screen editor +IOINIT = $ff84 ; IOINIT - $ff84 - Initializes I/O devices + +} + +!if target = 16 { +PRNSTR = $9088 ; print string in A/Y, 0 terminated +PRNINT = $8b40 ; print integer in A/X +CLEARSCREEN = $d888 +SHFLAG = $543 ; ($00 = None, $01 = Shift, $02 = CBM, $04 = CTRL or a sum of them). + +CINT = $ff81 ; CINT - $ff81 - Initializes screen editor +IOINIT = $ff84 ; IOINIT - $ff84 - Initializes I/O devices + +SCRTCHF = $8a7b ; scrtch Perform [new] FORCED and return +} + +!if target = 20 | target = 64 | target = 16 | target = 128 { +LISTN = $ffb1 ; Command Serial Bus LISTEN +UNLSN = $ffae ; Command Serial Bus UNLISTEN +SECOND = $ff93 ; Send secondary address for LISTEN +} + + + +; -------------------- +; - hw addresses +; -------------------- + +!if target = 20 { + +!if vicmemcfg = 0 | vicmemcfg = 3 { +screen = $1E00 ; screen address +color = $9600 ; color ram address +} + +!if vicmemcfg = 8 { +screen = $1000 ; screen address +color = $9400 ; color ram address +} + +vicborder = $900F ; border color register <<--- The vic uses just one register for both border and background +vicbackgnd = $900F ; background color register <<--- The vic uses just one register for both border and background +vicraster = $9004 ; raster compare register ??? + +start_memory_hi = $282 ; Start of memory (hi-byte) +top_memory_hi = $284 ; Top of memory (hi-byte) +screen_mem_page = $288 ; Screen memory page start (hi-byte) + +output_control = $9d ;Direct=$80/RUN=0 + +} + +!if target = 64 | target = 128 { +screen = $0400 ; screen address +color = $d800 ; color ram address +vicborder = $d020 ; border color register +vicbackgnd = $d021 ; background color register +vicraster = $d012 ; raster compare register +} + +!if target = 16 { +screen = $0C00 ; screen address +color = $0800 ; color ram address + +vicborder = $FF19 ; border color register +vicbackgnd = $FF15 ; background color register +vicraster = $FF0B ; raster compare register ??? + +output_control = $9a ;Direct=$80/RUN=0 + +} + +!if target = 128 { + basicstartaddress_lo = $2d ;Pointer: Start of Basic lo byte + basicstartaddress_hi = $2e ;Pointer: Start of Basic hi byte +; variablesstartaddress_lo = $2d ;Pointer: Start of Basic lo byte +; variablesstartaddress_hi = $2e ;Pointer: Start of Basic hi byte +} else { +;common for C64/Vic20/C16 + basicstartaddress_lo = $2b ;Pointer: Start of Basic lo byte + basicstartaddress_hi = $2c ;Pointer: Start of Basic hi byte + variablesstartaddress_lo = $2d ;Pointer: Start of Basic lo byte + variablesstartaddress_hi = $2e ;Pointer: Start of Basic hi byte +} + +status_word_st = $90 ; Status word ST + +!if target = 20 | target = 64 { +keybuf = $0277 ; keyboard buffer +keybuflen = $c6 ; keyboard buffer byte count +lastdevice = $ba ; last used device number +} + +!if target = 16 { +keybuf = $0527 ; keyboard buffer +keybuflen = $ef ; keyboard buffer byte count +lastdevice = $ae ; current device number +} + +!if target = 128 { +keybuf = $034a ; keyboard buffer +keybuflen = $d0 ; keyboard buffer byte count +lastdevice = $ba ; last used device number +} + + + + +; -------------------- +; - Zero page variables +; -------------------- + +!if target = 20 | target = 64 | target = 16 | target = 128 { + +; current joystick state (1 = falling edge) +curjoy = $22 + +; temp variables +tmp = $23 +tmp2 = $24 ; it must be continuous with tmp Example $FD and $FE (used as pointer in some cases) +tmp3 = $25 + +; pointer to last of the table +tbllst = $26 +tbllsth = $27 + +; menustate, bits: +; 0 = top reached (disable up & page up) +; 1 = bottom reached +; 2 = last reached (disable down & page down) +; 7 = inside d64 +menustate = $28 + +; length of diskname +disknamepetlen = $29 + +!if rememberpos = 1 { +; previous dir position +prevdirpos = $57 +prevdirposh = $58 +} +} + +!if target = 20 | target = 64 | target = 128 { + +; - pointer to selected entry +selected = $fb +selectedh = $fc + +; - temp pointer +tmpptr = $fd +tmpptrh = $fe +} + +!if target = 16 { + +; - pointer to selected entry +selected = $d8 +selectedh = $d9 + +; - temp pointer +tmpptr = $da +tmpptrh = $db +} + + +; -------------------- +; - Miscellaneus +; -------------------- + +!if target = 16 { +FkeyStoreArea = $332 ; 16 bytes ($332-341) ; 264 series cassette buffer ($332-$3f2) +} + +!if target = 128 { +FkeyStoreArea = $110 ; 20 bytes ($110-123) ; DOS / Print Using work area ($110-$136) +} + + +; --- Main + +!ct pet ; petscii + +; start of program + +!if target = 20 { +!if variant = 0 { + +!if vicmemcfg = 0 { +*=$1001 + +entry: +; BASIC stub: "2010 SYS 4109" +!by $0b,$10,$DA,$07,$9E,"4","1","0","9",0,0,0 + +} + +!if vicmemcfg = 3 { +*=$401 + +entry: +; BASIC stub: "2010 SYS 1037" +!by $0b,$04,$DA,$07,$9E,"1","0","3","7",0,0,0 + +} + + +!if vicmemcfg = 8 { +*=$1201 + +entry: +; BASIC stub: "2010 SYS 4621" +!by $0b,$12,$DA,$07,$9E,"4","6","2","1",0,0,0 + +} + +} + +!if variant = 1 { + + +; +; MC code installer based on sys.asm sources of mega-utils by Daniel Kahlin +; + + +;DASM SYNTAX +;#org $401 + +;ACME SYNTAX +*=$401 + +entry: + +mc_installer_begin: + +; +; Basic line +; 2010 SYSPEEK(44)*256+21 +; + +;DASM SYNTAX +; byte $13,$04,$da,$07,$9e,$c2,"(44)",$ac,"256",$aa,"21",0,0,0 + +;ACME SYNTAX +!tx $13,$04,$da,$07,$9e,$c2,"(44)",$ac,"256",$aa,"21",0,0,0 + +; +; Move the mc-installer code to the tape buffer ($334) and execute it +; + + sei + +MC_INSTALL_OFFS_LSB = mc_installer_start - mc_installer_begin +MC_INSTALL_END_LSB = mc_installer_end - mc_installer_begin + + ldy #MC_INSTALL_OFFS_LSB +mc_soc_lp1: + lda ($2b),y ; basic start ($1201, $1001 or $0401) + sta mc_installer-MC_INSTALL_OFFS_LSB,y + iny + cpy #MC_INSTALL_END_LSB + bne mc_soc_lp1 +; C=1 + jmp mc_installer_entry + + + + +; +; Mega-Cart Installer code start here +; + +mc_installer_start: + +;DASM SYNTAX +;#rorg $0334 + +;ACME SYNTAX +!pseudopc $0334 { + +mc_installer: + +mc_installer_no_mc: + lda #mc_installer_no_mc_msg + jsr $cb1e + jmp $c474 + +mc_installer_no_mc_msg: + +;DASM SYNTAX +; dc.b "MEGA-CART NOT FOUND",0 + +;ACME SYNTAX +!tx "mega-cart not found",0 + + +mc_installer_entry: + +; Check for mega cart by toggling NvRAM on and off + ldx #$f8 +mc_ie_lp1: + stx MC_NvRAM_state ; $9d80 - Change NvRAM state (bit0 = 0, enabled) + stx MC_NvRAM_state ; $9d80 - Try to write to the NvRAM (same value) + cpx MC_NvRAM_state ; $9d80 - Check if the value sticks + beq mc_ie_skp1 + clc +mc_ie_skp1: + ror + inx + bmi mc_ie_lp1 +; Last store was $ff -> $9d80 (+32Kb) + cmp #$55 + bne mc_installer_no_mc + dex + dex + stx MC_NvRAM_state ;$9d80 - $fe -> $9d80 + +; Ok, Mega-Cart detected properly. We now have +32Kb +3Kb configured +; Proceed to copy data (in reverse to allow overlap) + ldy #mc_program_Pages + clc + tya + adc $2c + sta mc_ie_sm1+2 + + ldx #0 +mc_ie_lp2: + dec mc_ie_sm1+2 + dec mc_ie_sm2+2 +mc_ie_lp3: + +mc_ie_sm1: + +;DASM SYNTAX +; lda mc_program_start+[mc_program_Pages<<8],x + +;ACME SYNTAX + lda mc_program_start+(mc_program_Pages<<8),x + +mc_ie_sm2: +;DASM SYNTAX +; sta mc_program_start+[mc_program_Pages<<8],x + +;ACME SYNTAX + sta mc_program_start+(mc_program_Pages<<8),x + + inx + bne mc_ie_lp3 + dey + bne mc_ie_lp2 + +; Data copied to target, start code + jmp mc_program_start + +;DASM SYNTAX +;#rend + +;ACME SYNTAX (Close code #rorg for $0334) +} +mc_installer_end: + + + + + +; +; Mega-Cart program code starts here ($47e) +; SYS1150 +; + +mc_program_start: + + + +} +} + +!if target = 64 { +*=$0801 + +entry: +; BASIC stub: "1 SYS 2061" +!by $0b,$08,$01,$00,$9e,$32,$30,$36,$31,$00,$00,$00 + + +!if variant = 2 { +;C64-DTV + +; Copy the JiffyDOS-DTV detection & install routine +; +; It works with the 6.01 version patched for DTV soft-kernal +; (http://dtvforge.ath.cx/jiffydtv/) +; Just flash the JIFFYDTV.PRG on C64-DTV and call it JIFFYDTV +; for dtvmkfs just use this txt structure: +; +; JIFFYDTV.PRG,JIFFYDTV,,256,PRG +; + + ldy #0 + ldx #jiffydtv_end-jiffydtv_start +JiffyRoutineLoop: + lda jiffydtv_start,y + sta loadrunpos,y + iny + dex + bne JiffyRoutineLoop + + jsr loadrunpos ; detect & install & use jiffyDOS for C64-DTV +} + +} + +!if target = 16 { +*=$1001 + +entry: +; BASIC stub: "2012 SYS4109" +!by $0B,$10,$DC,$07,$9E,"4","1","0","9",0,0,0 + +} + +!if target = 128 { +*=$1c01 + +entry: +!by $13,$1C,$DC,$07 ;line link and # +!by $de, $9c, $3a ;GRAPHIC CLR +!by $fe, $02, "1", "5", $3a ;BANK 15 +!by $9E,"7","1","8","9" ;SYS +!by 0,0,0 ;end +} + +mlcodeentry: + +!if target = 20 { + +!if variant = 1 { + +; +; Mega-Cart start point from file $047e - (SYS1150) +; + +; Set Vic+32k+3k soft reset no auto as last selection for easy restart +; just hold CBM key on reset and type SYS1150 to restart +; +; This codes assumes that NVRAM is enabled because it may starts +; 1) from the MC-istaller that enables NVRAM +; 2) with a SYS1150 call so 3K thus NVRAM must be enabled before + + +;VIC+32K+3K (NO AUTOSTART) - #127, #40 + +lda #127 +sta MC_LastCartEprom1 + +lda #40 +sta MC_LastCartEprom2 + +lda #0 +sta MC_LastCartExp3k + +lda #255 +sta MC_LastConfig + +; +; Mega-Cart start point from Menu in rom $0492 - (SYS1170) +; + + +; wait a bit to finish the Mega-Cart reset cycle (Not required when restart browser as start mode) + + ldx #$05 ; default wait loop cycles if value on NVRAM is not valid (2 to 50 allowed). + + lda MC_NVRamCheck + cmp #MC_CheckByte + bne MC_wait_loop ; Mega-Cart preferences not setted, use default wait loop cycles + + lda MC_ExternalBootDelay ; read ExternalBootDelay on NVRAM + cmp #2 + bcc MC_wait_loop1 ; use default wait loop cycles if value on NVRAM is < 2. + cmp #51 + bcs MC_wait_loop1 ; use default wait loop cycles if value on NVRAM is > 50. + + ldx MC_ExternalBootDelay ; use wait loop cycles stored on Mega-cart NV-RAM + +MC_wait_loop1: + stx MC_ExternalBootDelay ; ExternalBootDelay on NVRAM (save current or Default value on NVRAM) + +MC_wait_loop: ;@@@ + txa + ldx #$ff + jsr Wait + tax + dex + bne MC_wait_loop + + +program_restart: + +; set proper Mega-cart Memory Configuration for the program (Vic +32K R/W +3K R/W) +ldx #192 +stx MC_NvRAM_state ; $9d80 - POKE40320,192 (Vic +32K R/W +3K R/W) ;11000000 + + + +;copy the Program Table to $1203 +CopyProgramTableBaseStructure: +tbl = $1203 + +; copy Program table base structure to $1200 +ldy #0 +ldx #tblbaseend-tblbasestart +- lda tblbasestart,y +sta $1200,y +iny +dex +bne - + + +} else { + +program_restart: + +} + + +; ********************************************************************************************** +; +; THIS CODE IS REQUIRED IF THE BROWSER RESTART ITSELF AFTER SETTING THE VIC MEMORY CONFIGURATION +; +; DIFFERENT FROM THE WORKING MEMORY CONFIGURATION +; +; ********************************************************************************************** + + +;!if vicmemcfg = 0 { *** NOT REQUIRED SINCE THE MEMORY CONFIGURATION IS NOT CHANGED FOR VIC UNEXPANDED +; +;lda start_memory_hi ; Start of memory (hi-byte) +;cmp #$10 +;beq set_output_control ; SKIP forced mem configu & NEW if current mem config is unexpanded +; +;; Force Vic+3k pointers if program loaded/restarted +;; from another Vic memory configuration (this code is required if a manual memory configuration is setted) +; +;lda #$1e ; Screen memory page start $1e00 (hi-byte) +;ldx #$10 ; Start of memory $1000 (hi-byte) +;ldy #$1e ; Top of memory $1e00 (hi-byte) +; +;jsr unexpand ; Set the forced memory configuration and Perform NEW +; +;} + + +!if vicmemcfg = 3 { + +lda start_memory_hi ; Start of memory (hi-byte) +cmp #$04 +beq set_output_control ; SKIP forced mem configu & NEW if current mem config is 3k + +; Force Vic+3k pointers if program loaded/restarted +; from another Vic memory configuration (normally Unexpanded only) + +lda #$1e ; Screen memory page start $1e00 (hi-byte) +ldx #$04 ; Start of memory $0400 (hi-byte) +ldy #$1e ; Top of memory $1e00 (hi-byte) + +jsr unexpand ; Set the forced memory configuration and Perform NEW + +} + +!if vicmemcfg = 8 { + +lda start_memory_hi ; Start of memory (hi-byte) +cmp #$12 +beq set_output_control ; SKIP forced mem configu & NEW if current mem config is 8k+ + +; Force Vic+32k pointers if program loaded/restarted +; from another Vic memory configuration (Unexpanded or +3k) + +lda #$10 ; Screen memory page start $1000 (hi-byte) +ldx #$12 ; Start of memory $1200 (hi-byte) +ldy #$80 ; Top of memory $8000 (hi-byte) + +jsr unexpand ; Set the forced memory configuration and Perform NEW + +} + +} + +; ********************************************************************************************** + + +!if target = 20 | target = 16 { + +set_output_control: + +; this code prevent "LOADING FILENAME" message +; if program started with SYS instead of RUN + +lda #$0 +sta output_control ; Direct=$80/RUN=0 output control + +} + +!if target = 128 { +;set appropriate memory config (BANK) +lda #$02 ;RAM 0, KERNAL ROM, BASIC High ROM, I/O +sta $ff00 ;set mem config +lda #0 ;bank 0 (for file, not needed yet) +tax ;(for filename, needed now for OPEN and later for LOAD) +jsr $ff68 ;set bank +} + +!if forecolor>4 { +lda #forecolor +jsr CHROUT +} + +; clear screen +!if clearscrena = 1 { +jsr CLEARSCREEN + + +!if target = 20 & forecolor2 <> 1 & forecolor2 < 8 { +;Set foreground char color if not white (NOT REQUIRED FOR C64) + LDX #$FF + LDA #forecolor2 + +clear_screen_color: + sta color-1,X + sta color+$100-2,X + DEX + BNE clear_screen_color +} +} + + +; set colors + +!if target = 20 { + +!if bordercolor<8 & backcolor<16 { + +lda #backcolor*16+8+bordercolor +sta vicborder +} + +} + + +!if target = 64 { + +!if bordercolor<16 { +lda #bordercolor +sta vicborder +} +!if backcolor<16 { +lda #backcolor +sta vicbackgnd +} + +} + +!if target = 16 { + +!if bordercolor<255 { +lda #bordercolor +sta vicborder +} +!if backcolor<255 { +lda #backcolor +sta vicbackgnd +} + +;store the current fkeys definition area and set a custom one for the program +jsr set_custom_fkeys_def_area + +} + +!if target = 128 { + +!if bordercolor<16 { +lda #bordercolor +sta vicborder +} +!if backcolor<16 { +ldx #backcolor +stx vicbackgnd ;VIC-II background +lda #$1a ;VDC background register +sta $d600 ;access register +lda $d601 ;read register +and #$f0 ;clear low nibble (color) +ora $ce5c,x ;look-up VDC color nibble (VIC -> VDC translation) +sta $d601 ;update register +} + +;store the current fkeys definition area and set a custom one for the program +jsr set_custom_fkeys_def_area + +} + + + +!if hwdevicenum = 0 & autodetectm = 0 { +; store last used device number +lda lastdevice +sta device + +} + +!if hwdevicenum = 0 & autodetectm = 1 { +; store last used device number +lda lastdevice +beq SearchDevice ; If current drive is zero search the first active drive + +cmp #1 +bne StoreDevice ; If current drive is not zero and not 1 use it + +SearchDevice: +jsr SearchActiveDrive ; else search the first active drive + +bne StoreDevice ; drive present, store it, A=detected drive + +lda #8 ; Set Drive 8 as Default if no drive found + +StoreDevice: +sta device + +} + + + + +!if printbars = 1 { + +ldx #listtopy-1 ; row +Jsr PrintLine ; print the top line + +ldx #listbottomy ; row +Jsr PrintLine ; print the bottom line + + +!if key_quit<255 { + +;print quit +ldx #listbottomy+1 ;row to print + +!if target = 20 { +jsr CLRLINE ; clear line and set cursor to row listbottomy+1 to avoid screen scroll if listbottomy+1 = 22 +} + +ldy #listx+17 ; col to print + +!if target = 20 { +sty curpos ; set cursor position and avoid screen scroll +} + +!if target = 64 | target = 16 | target = 128 { +clc ; function: set cursor +jsr PLOT ; set cursor position +} + +ldy #>quit_text ; string start point hi-byte +lda #drive_text ; string start point hi-byte +lda #cdback_text ; string start point hi-byte +lda #4 { +lda #arrowcolor +jsr CHROUT +} +!if listx > 0 { +ldy #listx-1 +ldx #listtopy +clc +jsr PLOT +lda #'>' +jsr CHROUT +} +!if listx+namelen < ScreenCols { +ldy #listx+namelen +ldx #listtopy +clc +jsr PLOT +lda #'<' +jsr CHROUT +} +!if arrowcolor>4 { +!if forecolor>4 { +; set foreground color again +lda #forecolor +jsr CHROUT +} ; forecolor +} ; arrowcolor +} ; showcursors + +!if rootonstart = 1 { +; exit to root: (Also from DNP - HD file images) "CD//", "CD:_", "CD//" +ldx #diskcmdroot +lda #1 +jsr openclose +ldx #diskcmdexit +lda #1 +jsr openclose +ldx #diskcmdroot +lda #1 +jsr openclose +} + +!if rememberpos = 1 { +lda #0 +sta prevdirposh +} + + +!if rootonstart = 0 { + +lda #0 ;disknamepetlen - using this value the diskcmdexit command will be just "CD:" without left arrow. +beq loadprev2 + + +; - previous directory load (if rootonstart = 0) +; +loadprev: +lda #1 + +loadprev2: +sta disknamepetlen + +lda #0 +sta menustate +sta tmp +} else { + +; - previous directory load (if rootonstart = 1) +; +loadprev: +lda #0 +sta menustate +sta tmp +lda #1 +sta disknamepetlen + +} + +loadprev3: +lda #tmp +sta selectedh +lda #diskcmdexit +sta tmpptrh +jsr loadlist +; set selected to tbl (or remembered pos) +!if rememberpos = 1 { +lda prevdirposh +beq + ; skip if not available +sta selectedh +lda prevdirpos +sta selected +lda #0 +sta prevdirposh ; disable next remembered pos ++ +} + + +; - menu +; +menu: +jsr clearlist + +!if sortdir = 1 { + +lda sortflag +beq ++ + +jsr sortlist +++ +} + +jsr redrawlist ; SLOW + +menuchanged: +!if statusenabl = 1 { +; print file status +jsr printstatus +} + +menuwait: + +lda #rastercmp +- cmp vicraster +bne - ; wait until raster = rastercmp + +iny ; y++ +cpy #joyrepeat ; check if y >= joyrepeat + +bcc + ; if not, skip +ldy #0 ; reset joyrepeat counter +lda #$ff ; reset lastjoy for repeat +sta lastjoy + +!if target = 20 | target = 64 | target = 128 { +; read joystick ++ lda joyport ; a = joy +} + + +!if target = 16 { +; read joystick ++ jsr GetJoyValueC16 + +;create a c64 joy structure to use same joy routines + +;c16 joy bit switches: + +;bit switch +;0 Up (Same for C64) +;1 Down (Same for C64) +;2 Left (Same for C64) +;3 Right (Same for C64) +;4 -- +;5 -- +;6 Fire for Port 1 (Unused for 2) +;7 Fire for Port 2 (Unused for 1) + +rol ; Rotate one bit left (carry = bit 7 now) +;rol ; add this instructions to check Fire port 1 + +bcs + ; button not pressed + +and #%11011111 ; Button pressed, turn off bit 5 (off = pressed) +;and #%10111111 ; use this instructions instead of previous to check Fire port 1 +bcc ++ + ++ ora #%00100000 ; Button not pressed, turn on bit 5 (on = not pressed) +;ora #%01000000 ; use this instructions instead of previous to check Fire port 1 + +++ lsr ; now fire bit is the same as c64 (bit 4) +; lsr ; add this instructions to check Fire port 1 + +ora #%11100000 ; turn on unused bits + +} + + +!if target = 20 { + +;create a c64 joy structure to use same joy routines + +lsr ; %11100001 +and joyport ; %11000001 +ora #%00010000 ; %11010001 +lsr ; %11101000 ; now up, down, left and fire bits are like the c64 +pha + +ldx #127 ; set DDR of VIA #2 +stx $9122 ; on VIA #2 port B +lda $9120 ; read I/O port B +ldx #255 ; restore DDR of via #2 +stx $9122 +and #128 ; filter JOY right (Bit 7) + +bne + + +pla +and #%11110111 ; %11100000 ; now right bit is like the c64 +pha + ++ pla +} + +;c64 joy bit switches structure: + +;bit switch +;0 Up +;1 Down +;2 Left +;3 Right +;4 Fire +;5 -- +;6 -- +;7 -- + + + +!if target = 20 | target = 64 | target = 16 | target = 128 { +;joystick read +tax ; save to x +eor lastjoy ; a = joy xor lastjoy +and lastjoy ; a = a and lastjoy +stx lastjoy ; update lastjoy +} + +!if target = 20 | target = 64 | target = 128 { +sta curjoy +and #$1f ; test if anything is pressed +bne + ; if is, process input +} + +!if target = 16 { +sta curjoy +and #$1f ; test if fire is pressed (otherwise use getin to use kernal key repeat delay) +;pha +bne + ; if is, process input +} + + +jsr GETIN ; read keyboard +tax ; x = pressed key (or 0) +;!if target = 16 { +; cpx #0 +; bne + ; key pressed (skip joy input) +; pla ; joy status +; bne ++ ; joy pressed +;} + +beq menuwait ; if no keys pressed, no input -> wait + + +; process input + +;!if target = 20 | target = 64 { ++ lda curjoy + +;} + +;!if target = 16 { +;+ pla +;lda #0 +;++ +;} +;processinput: + +lsr ; check if up +bcs + ; jump if pressed +cpx #key_preve ; check if key_preve +bne ++ ; jump if not ++ lda menustate ; a = menustate +and #1 ; check if top reached +bne menuwait ; if it is, jump back +; prev entry +sec +lda selected ; selected -= entrylen +sbc #entrylen +sta selected +bcs + +dec selectedh ++ +!if fastscrolle = 1 { +jsr scrollup +jmp menuchanged +} else { +jmp menu +} + +++ lsr ; check if down +bcs + ; jump if pressed +cpx #key_nexte ; check if key_nexte +bne ++ ; jump if not ++ lda menustate ; a = menustate +and #4 ; check if last reached +bne menuwait ; if it is, jump back +; next entry +clc +lda selected ; selected += entrylen +adc #entrylen +sta selected +bcc + +inc selectedh ++ +!if fastscrolle = 1 { +jsr scrolldown +jmp menuchanged +} else { +jmp menu +} + + +++ cpx #key_exit ; check if key_exit +bne ++ ; jump if not +jmp loadprev ; load prev dir + +!if (target = 64 | target = 128) & key_quit < 255 { +++ cpx #key_quit ; check if key_quit +bne ++ ; jump if not + +; quit to basic +; rts ; old method +!if target = 128 { + lda #0 ;RAM 0, all ROMs, I/O + sta $ff00 ;set mem config +; restore default background/border/cursor colors +!if colorenable = 1 { + jsr Default_Color +} + jsr restore_fkeys_def_area + jmp $fa59 ; reset screen then Warm Start Basic (Stop+Restore) +} else { + jmp $fe66 ; Warm Start Basic [BRK] +} +} + +!if (target = 64 | target = 128) & key_reset < 255 { +++ cpx #key_reset +bne ++ ; jump if not +;jmp $FCE2 ; Reset the C64 SYS64738 +jmp ($fffc) ;reset CPU +} + + + + +!if target = 20 & key_quit < 255 { +++ cpx #key_quit ; check if key_quit +bne ++ +jmp ExitToBasic +} + +!if target = 20 & key_reset < 255 { +++ cpx #key_reset +bne ++ ; jump if not + +!if variant = 0 { + jmp StartMode2 ; Reset the vic (Clean Mode) +} else { + sta $9e00 ; Restart the Mega-Cart Menu +} + +} + +!if target = 16 & key_quit < 255 { +++ cpx #key_quit ; check if key_quit +bne ++ ; jump if not + +; quit to basic +jsr restore_fkeys_def_area +jsr $FF8A ; RESTOR - Restore vectors to initial values +jsr $FF81 ; CINT - Initialize screen editor +jsr $FF84 ; IOINIT - Initialize I/O devices +jmp $8003 ; Warm Start Basic [BRK] +} + +!if target = 16 & key_reset < 255 { +++ cpx #key_reset +bne ++ ; jump if not + +jmp $fff6 ; Reset the C16/Plus4 SYS65526 +} + + +++ cpx #key_top ; check if key_top +bne ++ ; jump if not + +movetop: +lda #tbl +sta selectedh +jmp menu + +++ cpx #key_bottom ; check if key_bottom +bne ++ ; jump if not +lda tbllst +sta selected ; selected = table +lda tbllsth +sta selectedh +jmp menu + +++ lsr ; check if left +bcs + ; jump if pressed + +!if key_prevp2=255 { + +cpx #key_prevp ; check if key_prevp (only) +bne ++ ; jump if not ++ jmp prevpage ; previous page + +} else { + +cpx #key_prevp ; check if key_prevp +beq prevpage20 +cpx #key_prevp2 ; check if key_prevp2 +bne ++ ; jump if not +prevpage20: ++ jmp prevpage ; previous page +} + + +++ lsr ; check if right +bcs + ; jump if pressed + +!if key_nextp2=255 { + +cpx #key_nextp ; check if key_nextp (only) +bne ++ ; jump if not + +} else { + +cpx #key_nextp ; check if key_nextp +beq nextpage2 +cpx #key_nextp2 ; check if key_nextp2 +bne ++ ; jump if not +nextpage2: +} + ++ jmp nextpage ; next page + +++ lsr ; check if fire +bcs firepressed ; jump if pressed +cpx #key_fire ; check if key_fire +beq firepressed ; jump if pressed + +!if target = 64 | target = 16 | target = 128 { + +!if startmode = 1 { +cpx #key_fire2 ; check if key_fire2 (CBM+ENTER) +beq firepressed ; jump if pressed +} + +} + + +!if sortdir = 1 { +cpx #key_sort ; check if key_sort +beq keysortpressed +} + + +!if drivechange = 1 { +cpx #key_drive ; check if key_drive is pressed +bne ++ ; jump if not +jmp ChangeDrive ; change Drive +++ +} + +!if target = 20 { + +!if startmode = 1 { +cpx #key_startmode ; check if key_startmode is pressed +bne ++ ; jump if not +jsr ChangeVicMode ; change Vic Mode + +++ +} + +} + +jmp menuwait + + +!if sortdir = 1 { + +; - key_sort pressed +keysortpressed: + +lda sortflag +eor #$ff +sta sortflag + +!if printbars = 1 { +jsr PrintSortMode +} + + +lda #0 +sta menustate +sta tmp +sta disknamepetlen + +!if rememberpos = 1 { +sta prevdirposh ;Reset previous dir position because it remembers the position of the list sorted in another way. +} + + +lda sortflag +beq unSort + + +!if pleasewaite = 1 { +lda #tmp +sta selectedh + +; print info... +jsr showpleasewait +} + +jsr sortlist +jmp movetop + +unSort: ;Read again the current directory +jmp loadprev3 + + + + +!if printbars = 1 { +PrintSortMode: + +ldx #listbottomy+1 ; row +!if variant = 2 { +;C64-DTV +ldy #listx+8 ; col to print +} else{ +ldy #listx+13 ; col to print +} +clc ; function: set cursor +jsr PLOT + +lda sortflag +beq sortOFF + +lda #sortON_text +jmp PrintSortString + +sortOFF: +lda #sortOFF_text + +PrintSortString: +jsr PRNSTR +rts +} + + +} + +; - fire pressed +firepressed: + +; - check if first file ("_") +lda selectedh +cmp #>tbl +bne ++ ; jump if not +lda selected +cmp #tbl+entrylen +bne +++ ; jump if not +lda selected +cmp #diskcmdexit +lda #1 +jsr openclose +ldx #diskcmdroot +lda #1 +jsr openclose +} + +JMP OpenNewDrive ; reload current drive dir from root ++++ +} else { +++ +} +; copy selected to disknamepet, save length of name +ldy #namelen +sty disknamepetlen +lda #disknamepet +sta tmpptrh +- dey +php +lda (selected),y +bne + +sty disknamepetlen ++ sta (tmpptr),y +plp +bne - + +; check if inside d64 +bit menustate +bmi prselected ; if in d64, load selected program + +; check if selected is dir +ldy #(entrylen-1) +lda (selected),y +cmp #3 ; FIXME magic value for "dir" +bne search ; jump if not dir + +loaddir: +!if rememberpos = 1 { +lda selected +sta prevdirpos +lda selectedh +sta prevdirposh +} +lda #diskcmdcd +sta tmpptrh +jsr loadlist +jmp menu + +; determine if selected file is d64(/d71/d81/m2i/d41/dnp/tap) +; - if d64 -> change dir & set d64 flag + +; seach for last . +search: +!if tap_support = 1 { +lda #$0 +sta tmp3 ; tmp3 used as flag for TAP detection (0=NO TAP) +} ++ ldy #namelen-1 +- lda (tmpptr),y +cmp #'.' +beq + +dey +bne - + +; . not found, assuming entry is program +beq prselected + +; . found on y (>0), check known extensions ++ iny +lda #extensions +sta extension_list+1 +lda #4 ; extension len +ldx #extensions_max ; extension max +jsr parseext +cpx #0 +beq prselected ; jump not d64(/d71/d81/m2i/d41/dnp/tap) + +lda #$0 +sta menustate ; Clear menustate bits +cpx #4 +beq loaddir ; inside dnp, just load directory, do not set flag "inside d64" to allow subfolders browsing + +!if tap_support = 1 { +cpx #8 +beq tapselected ; tap file selected +} + +; d64(/d71/d81/m2i/d41) selected +lda #$80 ; set "inside d64" flag +sta menustate +bne loaddir ; load directory + +!if tap_support = 1 { +tapselected: +lda #$1 +sta tmp3 ; tmp3 used as flag for TAP detection (1=TAP file detected) +} + +; - program selected, start loading +prselected: + +!if pleasewaite = 1 { +; print info... +jsr showpleasewait +} + +; setup load +setupload: + +!if target = 16 | target = 128 { + +jsr restore_fkeys_def_area + +} + +!if target = 20 { + +!if startmode = 0 { + ; for TAP files always uses the current machine memory Config (3k, 8k, unexpanded) + ; there is no way to read first 2 bytes of prg file inside the TAP. +jmp SetAutoConfiguration + +} else { + +!if tap_support = 1 { + +lda tmp3 + +!if variant = 1 { +bne MC_SJLOAD_Disable ; TAP file selected so force Manual Start to select Mem Config + ; and disable SJLOAD Pointers +} else { +bne SetManualConfiguration ; TAP file selected so force Manual Start to select Mem Config + +} + +} + +lda VicMode +bne SetManualConfiguration + +jmp SetAutoConfiguration + + +SetManualConfiguration: + + +!if variant = 1 { + +lda MC_SJLOAD_init ; check if SJLOAD (minimal) for Mega-Cart is installed + +cmp #$4c + +bne MC_SJLOAD_finish + +;menu to enable/disable sjload speed-up +ldy #>SJLOADconfig_text ; string start point hi-byte +lda #memconfig_text ; string start point hi-byte +lda #startconfig_text ; string start point hi-byte +lda #disknamepet ; x:y->filename +jsr SETNAM ; "filename" + +lda #1 ; filenr +ldx device ; unitnr +ldy #0 ; sec.address (,0) ; Open drive sa 0 for input operations + +jsr SETLFS + +jsr OPEN ; open 1,8,0,"filename" + +lda status_word_st ; read Status word ST +bne VicConfigurationExit ; if a <> 0 then there is an error so exit from autodetection + +ldx #$01 +jsr CHKIN ; set logical file number #1 as input + +jsr CHRIN ; get file address lo-byte +tay ; and move it to Y (CHRIN uses A and X so Y is a safe place) +jsr CHRIN ; get file address hi-byte in A + + +cpy #$00 ; check file address lo-byte +bne CheckBasicProgramAddress + +!if vicmemcfg = 8 { + +cmp #$20 +beq VicConfigurationExit ; leave default values for BLK1 ($2000) cart image (+32K +3K & Restart FileBrowser) +cmp #$40 +beq VicConfigurationExit ; leave default values for BLK2 ($4000) cart image (+32K +3K & Restart FileBrowser) +cmp #$60 +beq VicConfigurationExit ; leave default values for BLK3 ($6000) cart image (+32K +3K & Restart FileBrowser) + +cmp #$a0 +beq SetA0CartImage ; Set A0 Cart image parameters + +} + +SetNotCartImage: +lda #0 +sta tmpptr ; Set Do not RUN (BASIC PROMPT) as Start mode and leave (+32K +3K) for NOT cart image and NOT basic programs +jmp VicConfigurationExit + + +!if vicmemcfg = 8 { + +SetA0CartImage: +lda #$02 ; Set Reset as Start mode for A0 cart image +ldx #$03 ; set +32K Read Only for A0 cart image +stx tmpptrh +bne VicSetRunMode2 + +} + + +CheckBasicProgramAddress: +cpy #$01 +bne SetNotCartImage ; Set NOT Cart image parameters for NOT Basic Programs + + +ldx #$0 + +cmp #$10 +beq setautomemconfig ; set Vic Unexpanded for unexpanded Basic programs + +inx +cmp #$04 +beq setautomemconfig ; set +3K for 3k Basic programs +n +inx +cmp #$12 +beq setautomemconfig ; set +32K for 8k+ Basic programs + +bne SetNotCartImage ; Set NOT Cart image parameters for NOT Basic Programs + + +setautomemconfig: +stx tmpptrh + +!if vicmemcfg = 3 | vicmemcfg = 8 { + +jsr SetVicMemConfig + +} + +VicSetRunMode: +lda #1 +VicSetRunMode2: +sta tmpptr ; check byte to detect the RUN mode (0 = NONE) (1 = RUN)(2 = SYS64802) + +VicConfigurationExit: +lda #1 +jsr CLOSE ;close 1 +ldx #0 +jsr CHKIN ; restore standard input + + + +startloading: +} + + + + + +!if tap_support = 1 { + +lda tmp3 +beq + ; No TAP file selected + +; setup TAP name +ldx disknamepetlen +inx ; x = filenamelen +ldy #00 +lo_1: +lda disknamepet,y +sta tapname+3,y +iny +dex +bne lo_1 + +ldx #tapname +lda disknamepetlen +jsr openclose + +!if target = 64 { + +ldx #$ff +sei +txs +cld +ldx #$0 +stx $d016 +JSR $FDA3 ; ioinit - Initialise I/O +;JSR $FD50 ; ramtas - Initialise System Constants (skip Memory check, Fast boot) +JSR $FD15 ; restor - Restore Kernal Vectors (at 0314) +JSR $FF5B ; cint - Initialize screen editor +cli + +JSR $E453 ; initv - Initialize Vectors +JSR $E3BF ; initcz - Initialize BASIC RAM +jsr $e422 ; initms - Output Power-Up Message (DO NOT SKIP, otherwise there are problems with some loaders) +ldx #$fb +txs + +; LOAD from Tape (Shift + Run Stop) +lda #131 +sta $277 +lda #1 +sta $c6 + +JMP $A7AE ; BASIC Warm Start (RUN) + +} + +!if target = 20 { +;JSR $FD8D +;JSR $FD52 +JSR $FDF9 ; ioinit Initialise I/O +jsr CINT1 ; Initialize I/O +JSR $E45B ; initv Initialize Vectors +JSR $E3A4 ; initcz Initialize BASIC RAM +JSR $E404 ; initms Output Power-Up Message +LDX #$FB +TXS + +; LOAD from Tape (Shift + Run Stop) +lda #131 +sta $277 +lda #1 +sta $c6 + +JSR $c474 ;ready Restart BASIC + +} + +!if target = 16 { +jsr CINT ; CINT - $ff81 - Initializes screen editor +jsr IOINIT ; IOINIT - $ff84 - Initializes I/O devices + +; LOAD from Tape (L[O]+ENTER) +lda #76 +sta $527 +lda #207 +sta $528 +lda #13 +sta $529 +lda #82 +sta $52A +lda #213 +sta $52B +lda #13 +sta $52C +lda #6 +sta $ef + +rts +} + +!if target = 128 { +jsr CINT ; CINT - $ff81 - Initializes screen editor +jsr IOINIT ; IOINIT - $ff84 - Initializes I/O devices + +; LOAD from Tape (L[O]:R[U]+ENTER) +lda #76 +sta $34A +lda #207 +sta $34B +lda #13 +sta $34C +lda #82 +sta $34D +lda #213 +sta $34E +lda #13 +sta $34F +lda #6 +sta $D0 + +rts +} ++ +} + + + +!if target = 64 | target = 16 { + +!if startmode = 0 { +;old method, LOAD"FILE",8,1 + (System auto RUN) +lda #1 ; filenr +ldx device ; unitnr +ldy #1 ; sec.address (,1) +} + + +!if startmode = 1 { + +LDA SHFLAG ; 1 shift pressed, 2 CBM pressed, 4 CTRL pressed +and #$02 +cmp #$02 ; check cbm key +beq + ; start mode 2 (LOAD "FILE",8 + RUN) + +ldy #1 ; sec.address (,1) File start address LOAD +lda #0 ; start mode 0 (LOAD "FILE",8,1 + RUN) +beq ++ + ++ ldy #0 ; sec.address (,0) Basic start address LOAD + +++ sta tmpptr ; start mode (0 or <> 0) + +lda #1 ; filenr +ldx device ; unitnr +} +} + + +!if target = 128 { + +!if colorenable = 1 { + jsr Default_Color ; restore default background/border/cursor colors +} + +!if startmode = 0 { +;old method, DLOAD"FILE" +lda #1 ; filenr +ldx device ; unitnr +ldy #0 ; sec.address +} + +!if startmode = 1 { + +lda #2 ; start mode 2 (DLOAD "FILE" + RUN) +ldy SHFLAG ; 1 shift pressed, 2 CBM pressed, 4 CTRL pressed +beq + + +lda #0 ; start mode 0 (BLOAD "FILE" + SYS) + ++ sta tmpptr ; start mode (0 or <> 0) + +lda #1 ; filenr +ldx device ; unitnr +} +} + +!if target = 20 { + +ldy #1 ; sec.address (,1) + +lda tmpptr +cmp #1 ;is RUN the start mode ? (1 = RUN) +bne startloadingb + +ldy #0 ; sec.address (,0) for RUN start mode +startloadingb: +lda #1 ; filenr +ldx device ; unitnr + +} + + +jsr SETLFS +lda disknamepetlen ; a = filenamelen +ldx #disknamepet ; x:y->filename +jsr SETNAM + +; copy LOAD & RUN code to loadrunpos +ldy #0 +ldx #loadrunend-loadrunstart +- lda loadrunstart,y +sta loadrunpos,y +iny +dex +bne - +jmp loadrunpos ; jump to loadrunpos + +; (the following code is executed at loadrunpos) +loadrunstart ; start of code to copy + + +!if target = 20 { +; load program for the Vic-20 +; +; the Vic-20 loadrun rutine do not use relative addresses so do not use direct JMP or JSR inside the routine but BEQ BNE etc +; + +lda #0 ; a = 0: load + ;Load start address used only in RUN start mode (sec.address (,0) on SETLFS) +ldx basicstartaddress_lo ;Pointer: Start of Basic lod byte +ldy basicstartaddress_hi ;Pointer: Start of Basic hi byte + +jsr LOAD +; error detection would be nice :) + +; save end address +stx variablesstartaddress_lo +sty variablesstartaddress_hi + + +!if variant = 1 { + +; Set hardware Vic Memory Configuration + +lda tmpptrh ; read the Mem Config check byte (0 = Unexpanded) (1 = +3K)(2 = +32K)(3 = +32K Read Only)(4 = +32K +3K) + +;#129 is the correct value but it disables also NVRAM and SJLOAD routines +; so leave 3K enabled since Vic Memory pointers for screen/color are already changed above +; +;ldx #129 ; POKE40320,129 (Vic +32K R/O +3K DISABLED) ;10000001 + +ldx #128 ; POKE40320,128 (Vic +32K R/O +3K R/W) ;10000000 +cmp #0 ; F1 (Unexpanded) +beq set_megacart_memconfig +cmp #3 ; F7 (+32K Read Only) +beq set_megacart_memconfig + +ldx #128 ; POKE40320,128 (Vic +32K R/O +3K R/W) ;10000000 +cmp #1 ; F3 (+3K) +beq set_megacart_memconfig + +;#193 is the correct value but it disables also NVRAM and SJLOAD routines +; so leave 3K enabled since Vic Memory pointers for screen/color are already changed above +; +;ldx #193 ; POKE40320,193 (Vic +32K R/W +3K DISABLED) ;11000001 + +ldx #192 ; POKE40320,192 (Vic +32K R/W +3K R/W) ;11000000 +cmp #2 ; F5 (+32K) +beq set_megacart_memconfig + +ldx #192 ; POKE40320,192 (Vic +32K R/W +3K R/W) ;11000000 +;save space Vic+32K+3K assumed at this point +;cmp #4 ; F8 (+32K +3K) +;beq set_megacart_memconfig + + +set_megacart_memconfig: +stx MC_NvRAM_state ;$9d80 - poke40320,X +} + + +lda tmpptr ; read the RUN mode check byte (0 = NONE) (1 = RUN)(2 = SYS64802)(3 = RESTART BROWSER) + +cmp #$01 +beq StartMode1 + +cmp #$02 +beq StartMode2 + +cmp #$03 +beq StartMode3 + +ExitToBasic: ; Return to basic +JMP $FED5 ; Warm Start Basic [BRK] (without Restore Kernal Vectors (at 0314)) + + +StartMode1: ; Perform [RUN] + +; clear screen +!if clearscrena = 1 { +jsr CLEARSCREEN +} + +; restore default background/border/cursor colors +!if colorenable = 1 { +lda #27 +sta vicborder ;$900F default border/background colors (#27) + +lda #31 +jsr CHROUT ;default coursor color (#31 blue) + +} + +JSR $C659 ; CLR +JSR $C533 ; Relinks BASIC Program from and to any address... +JMP $C7AE ; BASIC Warm Start (RUN) + + +StartMode2: ; Perform a clear soft reset (It allows MS-PacMan and others to start) + +; -- Reset IO --Start-- +sei +lda #$00 +sta $9112 +sta $9113 +sta $9122 +sta $9123 + +lda #$7f +sta $911e +sta $912e +; -- Reset IO --End-- + +JMP $FD22 ; SoftReset + +StartMode3: ; Restart the file browser + +JMP program_restart + +} + + +!if target = 64 | target = 16 { + +!pseudopc loadrunpos { +; load program +; +lda #0 ; a = 0: load + +!if startmode = 1 { + ;Load start address used only in RUN start mode (sec.address (,0) on SETLFS) +ldx basicstartaddress_lo ;Pointer: Start of Basic lo byte +ldy basicstartaddress_hi ;Pointer: Start of Basic hi byte +} + +jsr LOAD +; error detection would be nice :) + +; save end address +stx variablesstartaddress_lo +sty variablesstartaddress_hi +} +} + +!if target = 128 { + lda #0 ;0=load + sta $ff00 ;bank 15 (all ROMs and I/O) + ldx basicstartaddress_lo ;Pointer: Start of Basic lo byte + ldy basicstartaddress_hi ;Pointer: Start of Basic hi byte + jsr LOAD + ; error detection would be nice :) + stx $1210 ;txt_top (end of program, low) + sty $1211 ;(high) +} + + +!if target = 64 { + + +; clear screen +!if clearscrena = 1 { + +jsr CLEARSCREEN +} + +; restore default background/border/cursor colors +!if colorenable = 1 { +lda #14 +sta vicborder ;$d020 default border color (#14) + +lda #6 +sta vicbackgnd ;$d021 default background color (#6) + +lda #154 +jsr CHROUT ;default coursor color (#154 Light Blue) + + +} + + + + +!if startmode = 0 { +; autostart program +; (from comp.sys.cbm) +; +jsr $a659 ; reset pointers etc... +jmp $a7ae ; BASIC warm start +} + + +!if startmode = 1 { + +JSR $A659 ; CLR + +lda tmpptr ; read the RUN mode check byte (0 = ,8,1 + RUN)(<> 0 = ,8 + RUN) +beq StartMode0 + +JSR $A533 ; Relinks BASIC Program from and to any address... + +StartMode0: +JMP $A7AE ; BASIC Warm Start (RUN) + +;ExitToBasic: ; Return to basic +;JMP $FE66 ; Warm Start Basic [BRK] + +} + +} + +!if target = 16 { + +; clear screen +!if clearscrena = 1 { +jsr CLEARSCREEN +} + +; restore default background/border/cursor colors +!if colorenable = 1 { +lda #238 +sta vicborder ;$FF19 default border color (#238) + +lda #241 +sta vicbackgnd ;$FF15 default background color (#241) + +lda #144 +jsr CHROUT ;default coursor color (#144 black) + +} + + +!if startmode = 0 { + +Jsr $8A98 ; Perform [CLR] +;JSR $8818 ; linkprg Rechain Lines - Relinks BASIC Program from and to any address... +jsr $8bbe ; perform run+clr +jmp $8bea ; start + +} + + +!if startmode = 1 { + +Jsr $8A98 ; Perform [CLR] + +lda tmpptr ; read the RUN mode check byte (0 = ,8,1 + RUN)(<> 0 = ,8 + RUN) +beq StartMode0 + +JSR $8818 ; linkprg Rechain Lines - Relinks BASIC Program from and to any address... + +StartMode0: +jsr $8bbe ; perform run+clr +jmp $8bea ; start + + +;ExitToBasic: ; Return to basic +;jsr $FF8A ; RESTOR - Restore vectors to initial values +;jsr $FF81 ; CINT - Initialize screen editor +;jsr $FF84 ; IOINIT - Initialize I/O devices +;jmp $8003 ; Warm Start Basic [BRK] + +} + + +} + + +!if target = 128 { + +; clear screen +!if clearscrena = 1 { + +jsr CLEARSCREEN +} + +!if startmode = 0 { + jsr $51f3 ;CLR + jsr $f4f4 ;relink program lines + jsr $5a81 ;setup RUN mode + jmp $4af6 ;advance to next (first) BASIC program line +} + + +!if startmode = 1 { + + lda tmpptr ; read the RUN mode check byte (0 = machine language)(<> 0 = BASIC) + beq StartMode0 + jsr $51f3 ;CLR + jsr $4f4f ;relink program lines + jsr $5a81 ;setup RUN mode + jmp $4af6 ;advance to next (first) BASIC program line + +StartMode0: + jmp ($00ac) ;SYS to load address (bug with old ROMs and non-fast-serial disk drive) +} +} + + +loadrunend ; end of code to copy + + +; --- Subroutines + +; - nextpage +; +nextpage: +lda #<(listbottomy-listtopy)*entrylen +sta tmp +lda #>(listbottomy-listtopy)*entrylen +sta tmp2 +clc +lda selected ; selected += page +adc tmp +sta selected +lda selectedh +adc tmp2 +sta selectedh +lda tbllsth ; check if table last < selected +cmp selectedh +bcc + +bne ++ +lda tbllst +cmp selected +bcs ++ ++ lda tbllst +sta selected ; table last < selected -> selected = table last +lda tbllsth +sta selectedh +++ jmp menu + + +; - prevpage +; +prevpage: +lda #<(listbottomy-listtopy)*entrylen +sta tmp +lda #>(listbottomy-listtopy)*entrylen +sta tmp2 +sec +lda selected ; selected -= page +sbc tmp +sta selected +lda selectedh +sbc tmp2 +sta selectedh +lda #>tbl ; check if selected < table +cmp selectedh +bcc ++ +bne + +lda # selected = table +lda #>tbl +sta selectedh +++ jmp menu + + +!if printbars = 1 { + +; parameters: +; x->the row where to print the bar +; returns: +; menustate + +PrintLine: + +ldy #listx-1 ; col +clc ; function: set cursor +jsr PLOT ; set place to print + +ldy #0 +- lda #$c0 ; "-" char +jsr CHROUT ; print char +iny +cpy #namelen+6 +bne - +rts + + +} + + +!if target = 20 { + +!if startmode = 1 { + +; - ChangeVicMode +; +ChangeVicMode: +lda VicMode +eor #$ff +sta VicMode + +!if printbars = 1 { +PrintVicMode: +ldx #listbottomy+1 ; row +ldy #listx+7 ; col +clc ; function: set cursor +jsr PLOT ; set place to print + +lda VicMode +beq manualOFF + +lda #manualON_text +jmp PrintVicModeString + +manualOFF: +lda #manualOFF_text + +PrintVicModeString: +jsr PRNSTR +} + +rts +} + + + +!if variant = 1 { +Wait: ; wait X cycles and returns + ldy #$ff +WaitLoop + dey + bne WaitLoop + dex + bne WaitLoop + rts +} + + + +} + + + +!if drivechange = 1 { +ChangeDrive: + +lda #0 +sta status_word_st ; set Status word ST as 0 + +ldx device +; #8-#14 (Drive accepted for increasing auto-detection) +cpx #8 +bmi SearchActiveDriveSTD ;auto detect next drive from drive #8 +cpx #14 +bpl SearchActiveDriveSTD ;auto detect next drive from drive #8 + +inx +txa +sta lastdevice + +jsr SearchActiveDriveLoop ;auto detect next drive from current drive +1 + +bne StoreNewDevice ; drive present, store it, A=detected drive + +SearchActiveDriveSTD: +jsr SearchActiveDrive +bne StoreNewDevice ; drive present, store it, A=detected drive +lda #8 ; Set Drive 8 as Default if no drive found + +StoreNewDevice: +sta device + +!if printbars = 1 { +jsr PrintDriveNr +} + +JMP OpenNewDrive + +!if printbars = 1 { +PrintDriveNr: +ldx #listbottomy+1 ; row + +!if variant = 2 { +;C64-DTV +ldy #listx+19 ; col +} else { +ldy #listx+4 ; col +} +clc ; function: set cursor +jsr PLOT + +!if buttoncolor>4 { +lda #buttoncolor +jsr CHROUT ; print Red +} + +lda device +cmp #128 +bpl PrintDriveNumberText +cmp #10 +bpl PrintDriveNumberText +lda #"0" +jsr CHROUT ; print "0" char for device 8 and 9 + +PrintDriveNumberText: +ldx device +lda #0 +jsr PRNINT ; print integer in A/X + +!if forecolor>4 { +lda #forecolor +jsr CHROUT ; print white +} + +lda device +cmp #128 +bpl PrintDriveNrExit +cmp #100 +bpl PrintDriveNrExit + +lda #$20 +jsr CHROUT ; print space + +PrintDriveNrExit: +rts +} + +} + + + +!if autodetectm = 1 | drivechange = 1 { + +SearchActiveDrive: + lda #0 + sta status_word_st ; set Status word ST as 0 + + lda #8 + sta lastdevice ; check for first existing drive from #8 to #15 + +SearchActiveDriveLoop: ; from drive #8 to drive #15 + jsr LISTN ; send LISTEN command ($FFB1) to the drive #A + jsr UNLSN ; send UNLISTEN command ($FFAE) + lda status_word_st ; read Status word ST + beq SearchActiveDriveExit ; if a = 0 then drive exist so check for file now + + lda #0 + sta status_word_st ; set Status word ST as 0 + + inc lastdevice + lda lastdevice + + cmp #16 + bne SearchActiveDriveLoop ; if a <> #16 loop + + ;else device from #8 to #15 is not present so exit reporting 0 as current device + + lda #0 + sta lastdevice + +SearchActiveDriveExit: + lda lastdevice ; A report Current device, 0 = not found + rts +} + + + + +!if disknameena = 1 & drivechange = 1 { + +; - cleardiskname +; +cleardiskname: + +lda #18 +jsr CHROUT +ldx #disknamey +ldy #disknamex +clc ; function: set cursor +jsr PLOT ; set place to print +ldy #0 +- lda #$20 ; space char +jsr CHROUT ; print char +iny +cpy #namelen +bne - +lda #146 +jsr CHROUT +rts +} + + + + +; - clearlist +; +clearlist: +!if target = 128 { + jsr PreScroll ;set window to clear + jsr $ff7d ;Print Immediate + !by $93 ;clear window + !by $13, $13 ;full screen + !by 0 ;end of string +} else { +lda #screen+listtopy*ScreenCols+listx +sta clearlistsh + +ldx #listbottomy-listtopy +-- ldy #0 +lda #listbackgnd +- +clearlistsl = *+1 +clearlistsh = *+2 +sta $1234,y +iny +cpy #namelen +bne - +clc +lda clearlistsl +adc #ScreenCols +sta clearlistsl +lda clearlistsh +adc #0 +sta clearlistsh +dex +bne -- +} +rts + + +; - redrawlist (SLOW) +; parameters: +; selected:h->top entry +; returns: +; menustate +; +redrawlist: +; check if top is reached +lda menustate +and #$f0 +tay +lda #>tbl +cmp selectedh +bne + +lda #text to print +; returns: +; x,y = coord. of next line +; +printentry: +txa +pha +tya +pha ; store x,y +clc ; function: set cursor +jsr PLOT ; set place to print +ldy #0 +- lda (selected),y ; load char +beq + ; jump if 0 +jsr CHROUT ; print char +iny +cpy #namelen +bne - ; loop entrylen times ++ pla +tay +pla +tax ; restore x,y +inx ; x++ (next row) +rts + + +!if disknameena + fastscrolle != 0 { +; - printoverentry +; parameters: +; x = y-coordinate (row) +; y = x-coordinate (column) +; tmpptr:h->text to print +; returns: +; x,y = coord. of line end +; +printoverentry: +clc ; function: set cursor +jsr PLOT ; set place to print +ldy #0 +- lda (tmpptr),y ; load char +beq + ; jump if 0 +jsr CHROUT ; print char +iny +cpy #namelen +bne - +rts ++ lda #listbackgnd +- jsr CHROUT +iny +cpy #namelen +bne - +sec +jsr PLOT +rts +} ; disknameena + fastscrolle != 0 + + +!if statusenabl = 1 { +; - printstatus +; +printstatus: +ldy #statusx +ldx #statusy +clc ; function: set cursor +jsr PLOT ; set place to print +ldy #(entrylen-1) +lda (selected),y +tax +ldy #0 +- lda filetypes_print,x +jsr CHROUT +inx +iny +cpy #3 +bne - +rts +} + + +!if fastscrolle = 1 { +; - scrolldown +; +scrolldown: +lda menustate +and #$f0 +sta menustate +!if target = 128 { + jsr PreScroll ;set window for scrolling + jsr $ff7d ;Print Immediate + !by $1d, $13 ;right, home (fix pointers) + !by $1b, $56 ;ESC, V (scroll up) + !by $13, $13 ;home, home (restore full screen) + !by 0 ;end of string +} else { +lda #screen+(listtopy+1)*ScreenCols+listx +sta scrolldownlh +lda #screen+(listtopy)*ScreenCols+listx +sta scrolldownsh +ldx #listbottomy-listtopy-1 +-- ldy #namelen-1 +- +scrolldownll = *+1 +scrolldownlh = *+2 +lda $1234,y +scrolldownsl = *+1 +scrolldownsh = *+2 +sta $1234,y +dey +cpy #$ff +bne - +clc +lda scrolldownll +sta scrolldownsl +adc #ScreenCols +sta scrolldownll +lda scrolldownlh +sta scrolldownsh +adc #0 +sta scrolldownlh +dex +bne -- +} +jsr scrollcheckend ; check if end +lda menustate +and #2 +beq ++ +lda #0 +sta tmp +lda #tmp +sta tmpptrh +++ lda tbllsth ; check if selected = table last +cmp selectedh +bne + +lda tbllst +cmp selected +bne + +lda menustate +ora #4 ; last reached, bit 2 = 1 +sta menustate +bne +++ ; if last, don't print ++ ldx #listbottomy-1 +ldy #listx +jsr printoverentry ++++ ldy #0 +rts + + +; - scrollup +; +scrollup: +lda menustate +and #$f0 +sta menustate +!if target = 128 { + jsr PreScroll + jsr $ff7d ;Print Immediate + !by $1d, $13 ;right, home (fix pointers) + !by $1b, $57 ;ESC, W (scroll down) + !by $13, $13 ;home, home (restore full screen) + !by 0 ;end of string +} else { +lda #screen+(listbottomy-2)*ScreenCols+listx +sta scrolluplh +lda #screen+(listbottomy-1)*ScreenCols+listx +sta scrollupsh +ldx #listbottomy-listtopy-1 +-- ldy #namelen-1 +- +scrollupll = *+1 +scrolluplh = *+2 +lda $1234,y +scrollupsl = *+1 +scrollupsh = *+2 +sta $1234,y +dey +cpy #$ff +bne - +sec +lda scrollupll +sta scrollupsl +sbc #ScreenCols +sta scrollupll +lda scrolluplh +sta scrollupsh +sbc #0 +sta scrolluplh +dex +bne -- +} +jsr scrollcheckend ; check if end +lda #>tbl ; check if selected = table first +cmp selectedh +bne + +lda #(listbottomy-listtopy-1)*entrylen +sta tmp2 +clc +lda selected +adc tmp +sta tmpptr +lda selectedh +adc tmp2 +sta tmpptrh +lda tbllsth ; check if table last >= tmpptr +cmp tmpptrh +bcc + +bne ++ +lda tbllst +cmp tmpptr +bcs ++ ++ lda menustate +ora #2 ; end reached, bit 1 = 1 +sta menustate +++ rts +} ; fastscrolle + + +!if pleasewaite = 1 { +; - showpleasewait +; parameters: +; selected:h->text to be shown +; +showpleasewait: +jsr clearlist +ldx #listtopy +ldy #listx +jsr printentry ; print filename +lda selected +pha +lda selectedh +pha +lda #pleasewait +sta selectedh +jsr printentry ; print "loading" +pla +sta selectedh +pla +sta selected +rts +} + + +; - parseext +; parameters: +; tmpptr:h+y->first char of extension +; extension_list->list of extensions +; a = extension length +; x = extension max +; returns: +; x = offset to next extension (or 0 if not found) +; +parseext: +sty tmp ; store offset to first char +sta extension_len ; store len +stx extension_max ; store max +ldx #0 +stx extension_limit ; store offset to extension +-- ldy tmp ; y->first char of extension +lda extension_limit +tax ; x->filetypes +clc +extension_len = *+1 +adc #3 ; a->end of filetypes +sta extension_limit ; x->filetypes +extension_max = *+1 +cpx #$12 +beq + ; extension not found +- lda (tmpptr),y +and #%01111111 ; compare shifted chars too, turn off bit 7 (Tap,TAP,tAP etc, all recognized) +extension_list = *+1 +cmp $1234,x +bne -- +iny +inx +extension_limit = *+1 +cpx #0 +bne - +; match found (x->next extension) +rts +; no match found ++ ldx #0 +rts + + +; - openclose +; parameters: +; x:y->filename +; a = filenamelen (or cmdlen - 3) +; +openclose: +clc +adc #3 ; add "cd:" +jsr SETNAM +lda #1 ; filenr +ldx device ; unitnr +ldy #15 ; sec.address (,15) +jsr SETLFS +jsr OPEN ; OPEN1,device,15,"" +; error detection would be nice :) +lda #1 +jsr CLOSE ; CLOSE1 +rts + + +; - loadlist +; parameters: +; selected:h->text to be shown +; tmpptr:h->dir/diskname as petscii +; disknamepetlen = length of dir/diskname - 1 +; returns: +; tbl = the list +; tbllst:h->end of list +; selected->top of list (or remembered position) +; +loadlist: +!if disknameena = 1 & drivechange = 1 { +jsr cleardiskname +} +!if pleasewaite = 1 { +; clear list & show info +jsr showpleasewait +} + +; prepare for extension parsing +lda #filetypes +sta extension_list+1 + +; send open command +ldx tmpptr +ldy tmpptrh +lda disknamepetlen +jsr openclose + +;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +; Pi1541 Changes +;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +; Changed dir and mounted disk +; We now need to wait for the drive + +.trydir +!if(1){ +; We now need to wait until the disk image can be loaded of the SD card and the drive can boot. +; Whilst we are loading of the SD card we cannot do any IEC bus activity so we fudge a wait here. +; Shouldn't need to do this if the "device not present" code below worked 100% of the time? +; Seems to need a delay before reattempting. +ldx #0 +.waitloop1 +ldy #0 +.waitloop2 +dey +bne .waitloop2 +dex +bne .waitloop1 +} + +!if(1){ +lda #$00 +sta $90 ; clear STATUS flags +lda device +jsr LISTN +lda #$6F ; secondary address 15 (command channel) +jsr SECOND +jsr UNLSN +lda $90 ; get STATUS flags +bne .trydir ; device not present +} +;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +; load the list +lda #1 ; filenr +ldx device ; unitnr +ldy #0 ; sec.address (0 = reloc) +jsr SETLFS +lda #1 ; filenamelen +ldx #disklist ; x:y->filename ("$") +jsr SETNAM +lda #0 ; a = 0: load +!if rootentry = 0 { +ldx #tbl ; load address = tbl (leave <- menu entries only) +} else { +ldy #>tbl+entrylen ; load address = tbl + 17 (leave <- and // menu entries) +} +sty selectedh ; selected:h->2nd entry in list +iny ; load address = tbl+256 +sty tmpptrh ; tmpptr:h->load address + +!if drivechange = 1 { + +;lda #0 ; clear dir entry (lda #0 for load is not required, A is 0 at this point) +ldy #128 +cleardir_loop: +sta (tmpptr),y ; clear dir entry +dey +bne cleardir_loop +ldy tmpptrh ; tmpptr:h->load address (Restore Y value) +} + +jsr LOAD +;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +; Pi1541 Changes +;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +bcc .done +jmp .trydir +.done +;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +; - parse list +; skip first 6 bytes +clc +lda tmpptr +adc #6 +sta tmpptr +bcc + +inc tmpptrh + ++ +!if disknameena = 1 { +; print disk name +lda #18 +jsr CHROUT +ldx #disknamey +ldy #disknamex +jsr printoverentry +lda #146 +jsr CHROUT +} + +loadlist_loop: +; search 0 +ldy #0 +- lda (tmpptr),y +beq + ; if 0 -> next line +inc tmpptr +bne - +inc tmpptrh +bne - ; loop until zero + +; next entry (skips "_" on first time), set tbllst = current ++ clc +lda selected +sta tbllst +adc #entrylen +sta selectedh + +; skip 5 bytes (0 + filelen&type) ++ clc +lda tmpptr +adc #5 +sta tmpptr +bcc + +inc tmpptrh + +; search for " (or 0 for last) ++ +- lda (tmpptr),y +beq +++ ; if 0 -> "BLOCKS FREE" -> finished +cmp #quotechar +beq ++ ; if " -> start of filename found +inc tmpptr +bne - +inc tmpptrh +bne - ; loop until zero + +; error - no " or 0 found. + +; finished ++++ +; put end mark +sta (selected),y +lda #tbl +sta selectedh +rts + +; copy name until last " +++ iny ; y = 1, skip first " +ldx #0 +- lda (tmpptr),y +cmp #quotechar +beq + ; if ", ok +dey ; y--, for selected +sta (selected),y +iny ; restore y +iny ; next y +bne - + +; error - no " found. + +; 0-pad to entrylen ++ lda #0 +sty tmp2 ; tmp2 -> " +dey +- cpy #entrylen +beq + +sta (selected),y +iny +bne - + +; skip ' ''s ++ ldy tmp2 +iny ; y++, skip last " +ldx #0 +- lda (tmpptr),y +cmp #' ' +bne + ; jump if not ' ' +iny ; next y +bne - + +; skip possible '*' ++ cmp #'*' +bne + +iny + +; parse filetype ++ lda #3 ; extension len +ldx #filetypes_max ; extension max +jsr parseext + +; save extension to entry +ldy #(entrylen-1) +txa +sta (selected),y + +jmp loadlist_loop + + + + + + + + + +!if sortdir = 1 { + +; +; Sort code by Mike from Denial Forum. +; + +sortlist: + +!if rootentry = 0 { + +lda #tbl+entrylen ; starth list to sort +sta tmpptr+1 + +} else { + +lda #tbl+entrylen+entrylen ; starth list to sort +sta tmpptr+1 + +} + +lda #0 +sta tmp3 + +sort_00: +clc +lda tmpptr +sta tmp +adc #entrylen ;17 +sta tmpptr +lda tmpptr+1 +sta tmp+1 +adc #0 +sta tmpptr+1 +lda tmp +cmp tbllst +lda tmp+1 +sbc tbllsth +bcc sort_01 +lda tmp3 +bne sortlist +rts + +sort_01: +ldy #0 + +sort_02: +lda (tmpptr),y +cmp (tmp),y +bcc sort_03 +bne sort_00 +iny +cpy #entrylen ;17 +bne sort_02 +beq sort_00 + +sort_03: +lda #1 +sta tmp3 +ldy #0 + +sort_04: +lda (tmp),y +pha +lda (tmpptr),y +sta (tmp),y +pla +sta (tmpptr),y +iny +cpy #entrylen ;17 +bne sort_04 +beq sort_00 + + +} + + + + +!if target = 16 { + +set_custom_fkeys_def_area: + +;save current fkeys definition area + +ldx #16 +save_fkeys_def_area_loop: +lda $055f-1,X +sta FkeyStoreArea-1,x +dex +bne save_fkeys_def_area_loop + +;set custom fkeys definition area + +ldx #8 +redefine_fkeys_loop: +lda #1 +sta $055f-1,X ; redefine fkeys lenght (F1-F8) + +lda fkeysdef-1,x +sta $0567-1,X ; redefine fkeys string (F1-F8) + +dex +bne redefine_fkeys_loop + +rts + + +restore_fkeys_def_area: +ldx #16 +restore_fkeys_def_area_loop: +lda FkeyStoreArea-1,x +sta $055f-1,X +dex +bne restore_fkeys_def_area_loop +rts + + +GetJoyValueC16: +LDX #$07 + +JoyLoop: +LDA joya,X +STA $FD30 +STA joyport +LDA joyport +STA joyb,X +DEX +BPL JoyLoop + +LDA #$FF +STA $FD30 + +LDA #$FD ; Latch value for port 2. (Use #$FA for Port 1) +STA joyport +LDA joyport ; report the JoyPort value +rts + +} + +!if target = 128 { +; *** Routines for C128 *** + +PRNINT: +;print .AX unsigned +;compare with $8e32... but that calls BASIC Low ROM which is not available + sta $64 ;mantissa bits 31~24 + stx $65 ;mantissa bits 23~16 + ldx #$90 ;exponent + 128 + sec ;positive mantissa + jsr $8c75 ;normalize FAC + jsr $8e44 ;FAC to string + lda #0 ;floatBuf (low) + ldy #1 ;floatBuf (high) + +;print A/Y +PRNSTR: + sta $ce + sty $cf + ldy #0 +pstrlp: + lda ($ce),y + beq pstrex + jsr CHROUT + iny + bne pstrlp +pstrex: + rts + +PreScroll: ;setup window for scrolling + lda #2 ;top row + ldx #22 ;bottom row + sta $e5 + stx $e4 + lda #listx ;left column + ldx #listx+namelen-1 ;right column + sta $e6 + stx $e7 + rts + +set_custom_fkeys_def_area: +;save current fkeys definition area + +ldx #20 +save_fkeys_def_area_loop: +lda $1000-1,X +sta FkeyStoreArea-1,x +dex +bne save_fkeys_def_area_loop + +;set custom fkeys definition area +ldx #10 +redefine_fkeys_loop: +lda #1 +sta $1000-1,X ; redefine fkeys lenght (F1-F8, RUN, HELP) +lda fkeysdef-1,x +sta $100a-1,X ; redefine fkeys string (F1-F8, RUN, HELP) +dex +bne redefine_fkeys_loop +rts + + +restore_fkeys_def_area: +ldx #20 +restore_fkeys_def_area_loop: +lda FkeyStoreArea-1,x +sta $1000-1,X +dex +bne restore_fkeys_def_area_loop +rts + +!if colorenable > 0 { +Default_Color: + lda #13 ;light green + sta vicborder ;$d020 default border color + + lda #11 ;dark gray + sta vicbackgnd ;$d021 default background color + + lda #$1a ;VDC color register + sta $d600 ;request register + lda $d601 ;read value + and #$f0 ;keep high nibble + ;ora #0 ;black + sta $d601 ;set background color + + lda #$99 ;light green (assume VIC-II) + bit $d7 ;test video mode + bpl + ;good assumption + lda #$9f ;cyan (for VDC) ++ jmp CHROUT ;set cursor color +} +} + + + +!if target = 64 { +!if variant = 2 { +;C64-DTV + +;Copy the JiffyDOS detection & install routine + +jiffydtv_start: + +;DASM SYNTAX +;#rorg loadrunpos + +;ACME SYNTAX +!pseudopc loadrunpos { + + + jsr check_for_jiffydtv_softkernal + + beq load_JiffyDTV + + jsr active_JiffyDTV + rts + + +load_JiffyDTV: ;load "JIFFYDTV" from flash if exist + + +; Store current program on $6000 so it could be restored after the "JIFFYDTV" load. + LDX #$08 ; copy from F9-FA = $800 + LDY #$60 ; to FB-FC = $6000 + jsr CopyBytes + + + + lda #1 ; filenr + ldx #1 ; unitnr + ldy #1 ; sec.address (,1) + jsr SETLFS + + lda #8 ; a = filenamelen ("jiffydtv") + ldx #jiffydtv_name ; x:y->filename address + jsr SETNAM + + + lda #0 ; A: 0 = Load, 1-255 = Verify + jsr LOAD + + bcs JiffyDTV_LoadError ; Carry: 0 = No errors, 1 = Error; + + lda #$60 + sta $0843 ; patch the JIFFY INSTALL code to avoid bank swap and reset + + jsr $080d ; and start the INSTALL JIFFY Routine + + jsr active_JiffyDTV + + jmp RestoreProgram + +JiffyDTV_LoadError: +; lda #$02 +; sta vicborder ; POKE 53280,02 (Red) + +RestoreProgram: + LDX #$60 ; copy from F9-FA = $6000 + LDY #$08 ; to FB-FC = $800 + + jsr CopyBytes ; Restore program. + + rts + + +active_JiffyDTV: + ldx #1 + stx $d03f + LDA #$5E + STA $D100 ; $5E %01-011110 01=RAM 011110 = $1e (kernal in RAM $1E0000) + LDA #$00 + STA $D03F + JSR $FD15 ; set JiffyDOS pointers + + ;JiffyDOS actived +; lda #$05 +; sta vicborder ; POKE 53280,05 (Green) + rts + + + +CopyBytes: + STX $FA ; copy from/to FA-FC hi-byte + STY $FC + + LDX #$20 ; blocks to copy ($20 = $2000 bytes) + LDY #$00 + STY $F9 + STY $FB ; copy from/to F9/FB lo-byte fixed 0 + + +CopyBytesLoop: + LDA ($F9),Y + STA ($FB),Y + INY + BNE CopyBytesLoop + + INC $FA + INC $FC + DEX + BNE CopyBytesLoop + RTS + + + +jiffydtv_name: + +;DASM SYNTAX +; .byte "JIFFYDTV" + +;ACME SYNTAX + !tx "jiffydtv" + + + + +;************************************************************************** +;* +;* NAME check_for_kernal (based on DTVmenu from tlr) +;* +;* DESCRIPTION +;* Check if there is a kernal present at $1ee000. +;* z=1, means no kernal +;* +;****** +check_for_jiffydtv_softkernal: + +; sir $e8 +;DASM SYNTAX +; .byte $42,$e8 ;sir $e8 +;ACME SYNTAX + !by $42,$e8 ;sir $e8 + + ldy #$1ee000/$4000 + ldx #%01010101 ;all ram +; sir $12 +;DASM SYNTAX +; .byte $42,$12 ;sir $12 +;ACME SYNTAX + !by $42,$12 ;sir $12 + + + + + + +; is the vectors all $ff's? + ldx #5 + lda #$ff + + + ldy $bd4c + cpy #$a5 + bne check_kernal_exit ;fd4c a5 f4 (JIFFYDOS load Address pointers in ROM lo-byte) + + ldy $bd4d + cpy #$f4 + bne check_kernal_exit ;fd4c a5 f4 (JIFFYDOS load Address pointers in ROM hi-byte) + + +cfk_lp1: ; check also some vectors to be sure they are not all $ff + and $bffa,x + dex + bpl cfk_lp1 + +check_kernal_exit: + +; sir $e8 +;DASM SYNTAX +; .byte $42,$e8 ;sir $e8 +;ACME SYNTAX + !by $42,$e8 ;sir $e8 + + ldy #$02 + ldx #%01010101 ;all ram +; sir $12 +;DASM SYNTAX +; .byte $42,$12 ;sir $12 +;ACME SYNTAX + !by $42,$12 ;sir $12 + + cmp #$ff ;Z=1 is all $ff's. + rts +;DASM SYNTAX +;#rend + +;ACME SYNTAX (Close code #rorg for loadrunpos[$0334]) +} + +jiffydtv_end: + +} +} + + +; --- Variables + +; device number (8,9,...) +device !by hwdevicenum + +; last joystick state (for edge detection) +lastjoy !by $ff + + +!if sortdir = 1 { + +; sort flag used for sortlist routine +sortflag !by $0 + +} + + +!if target = 20 { + +!if startmode = 1 { + +VicMode !by $0 + +} + +} + + +; --- Strings + +; |---------0---------0---------0--------| + +!if target = 16 { +fkeysdef: +!tx 133,137,134,138,135,139,136,140 + +joya: +!tx $fe,$fd,$fb,$f7,$ef,$df,$bf,$7f + +joyb: +!tx $0,$0,$0,$0,$0,$0,$0,$0 + +} + +!if target = 128 { +fkeysdef: +!tx 133,137,134,138,135,139,136,140,131,132 +} + + +!if printbars = 1 { + + +!if drivechange = 1 { +drive_text: +!if variant = 2 { + +;C64-DTV (DTV_D) button + +!tx $12,"d",$92,"rive",0 +} else { + +!tx $12,"d",$92,"rive",0 +} + +} + + +!if key_quit < 255 { +quit_text: +!tx $12,"q",$92,"uit",0 +} + +!if variant = 2 { + +;C64-DTV + +cdback_text: +!tx $12,"rgbtn",$92,"cd",leftarrowchar,0 + +} + + + +!if target = 20 & startmode = 1 { + +manualOFF_text: +!tx $12,"m",$92,"anual",0 + +manualON_text: +!tx $12,"m",$92 + +!if buttoncolor>4 { +!tx buttoncolor +} + +!tx "anual" + +!if forecolor>4 { +!tx forecolor +} + +!tx 0 + +} + +!if sortdir = 1 { + +!if variant = 2 { + +;C64-DTV (DTV_C) button + +sortOFF_text: +!tx $12,"c",$92,"sort",0 + +sortON_text: +!tx $12,"c",$92 +!if buttoncolor>4 { +!tx buttoncolor +} + +!tx "sort" + +!if forecolor>4 { +!tx forecolor +} + + +} else { + +sortOFF_text: +!tx $12,"s",$92,"ort",0 + +sortON_text: +!tx $12,"s",$92 +!if buttoncolor>4 { +!tx buttoncolor +} + +!tx "ort" + +!if forecolor>4 { +!tx forecolor +} + +} +!tx 0 + +} + +} + + + + +!if target = 20 & startmode = 1 { + + +memconfig_text + +!if vicmemcfg = 3 | vicmemcfg = 8 { + +!if forecolor>4 { +!tx forecolor +} +!tx $0d,$0d,"mem config:",$0d + +!if buttoncolor>4 { +!tx buttoncolor +} +!tx "f1" +!if forecolor>4 { +!tx forecolor +} +!tx " unexpanded",$0d + +!if buttoncolor>4 { +!tx buttoncolor +} +!tx "f3" +!if forecolor>4 { +!tx forecolor +} +!tx " +3k",$0d +} + +!if vicmemcfg = 8 { + +!if buttoncolor>4 { +!tx buttoncolor +} + +!tx "f5" +!if forecolor>4 { +!tx forecolor +} +!tx " +32k",$0d + + +!if variant = 1 { +!if buttoncolor>4 { +!tx buttoncolor +} +!tx "f7" +!if forecolor>4 { +!tx forecolor +} +!tx " +32k r/only",$0d +} +!if buttoncolor>4 { +!tx buttoncolor +} +!tx "f8" +!if forecolor>4 { +!tx forecolor +} +!tx " +32k +3k" +} +!tx $0 + +startconfig_text +!if forecolor>4 { +!tx forecolor +} +!tx $0d,$0d,"start mode:",$0d +!if buttoncolor>4 { +!tx buttoncolor +} +!tx "f1" +!if forecolor>4 { +!tx forecolor +} +!tx " prompt",$0d + +!if buttoncolor>4 { +!tx buttoncolor +} +!tx "f3" +!if forecolor>4 { +!tx forecolor +} +!tx " run",$0d + +!if buttoncolor>4 { +!tx buttoncolor +} +!tx "f5" +!if forecolor>4 { +!tx forecolor +} +!tx " reset",$0d + +!if buttoncolor>4 { +!tx buttoncolor +} +!tx "f7" +!if forecolor>4 { +!tx forecolor +} +!tx " restart browser",$0 + +!if variant = 1 { + +SJLOADconfig_text +!if forecolor>4 { +!tx forecolor +} +!tx $0d,$0d,"sjload:",$0d +!if buttoncolor>4 { +!tx buttoncolor +} +!tx "f1" +!if forecolor>4 { +!tx forecolor +} +!tx " yes",$0d +!if buttoncolor>4 { +!tx buttoncolor +} +!tx "f3" +!if forecolor>4 { +!tx forecolor +} +!tx " no",$0 + +} + +} + + + +extensions +!tx "dnp",0 ; this extension must be the first for submenu logic of this file image +!if tap_support = 1 { +!tx "tap",0 ; this extension must be the second for submenu logic of this file image +} +!tx "d64",0 +!tx "d71",0 +!tx "d81",0 +!tx "m2i",0 +!tx "d41",0 +;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +; Pi1541 Changes +;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!tx "g64",0 +!tx "nib",0 +!tx "nbz",0 +!tx "lst",0 +;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +extensions_max = * - extensions + +filetypes_print +!tx "cd",leftarrowchar +filetypes +!tx "dir" +!tx "del" +!tx "seq" +!tx "prg" +!tx "usr" +!tx "rel" +!tx "cbm" +filetypes_max = * - filetypes + +!if pleasewaite = 1 { +pleasewait +!tx "loading...",0 +} + +!if tap_support = 1 { +tapname ; "xt:0123456789abcdef",0 +!tx "xt:",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +} + +disklist +!tx "$" + +diskcmdroot +!tx "cd//",0 + +diskcmdcd ; "cd:0123456789abcdef",0 +!tx "cd:" +disknamepet ; "0123456789abcdef",0 +!tx 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +diskcmdexit ; "cd:_" +!tx "cd:" + + +!if target = 20 { + +!if variant = 1 { + +!tx leftarrowchar + +tblbasestart +!tx 0,0,0 ; remove any BASIC LINE on $1200 + +;tbl = $1203 + +} else { + +; --- Program table + +tbl + +} + +} else { + +; --- Program table + +tbl +} + +; "prev dir" entry is always present +!tx leftarrowchar,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; name +!by 0 ; type + +!if rootentry = 1 { +; "exit to root" entry +!tx "//",0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; name +!by 0 ; type +} + + + +tblbaseend + +!if target = 20 { +!if variant = 1 { + +mc_program_end: + +mc_program_length = mc_program_end - mc_program_start + +;DASM SYNTAX +;mc_program_Pages = >[mc_program_length+255] + +;ACME SYNTAX +mc_program_Pages = >(mc_program_length+255) + + + +} +} + +progsize = * - entry