TEST_SAVE = 0 TEST_INVALID_PARAMETERS = 0 TEST_BUS_LOCK = 0 NO_SPRITES_OR_IRQ = 0 VERIFY = 0; verify correct loading by loading twice and comparing PAUSE_BETWEEN_LOADS = 0; delay value INSTALL_ONLY = 0 KEY_FOR_WATCHDOG = 0 LITTLE_CPU_FOR_LOADER = 0 COUPLED_TIMERS = NO_SPRITES_OR_IRQ; Plus/4: As TED timer emulation is horribly broken on VICE, only use coupled ; timers if there is no other way to measure more than 64K cycles .include "standard.inc" .include "../include/loader.inc"; includes config.inc .if !((DIRTRACK = 18) | (DIRTRACK = 17)) .error "The test application only supports DIRTRACK = 18 or DIRTRACK = 17" .endif .if !((DIRTRACK81 = 40) | (DIRTRACK81 = 39)) .error "The test application only supports DIRTRACK81 = 40 or DIRTRACK81 = 39" .endif .include "../version.inc" .include "datetime.inc" .include "cpu.inc" .if PLATFORM = diskio::platform::COMMODORE_16 .include "pio.inc" .include "ted.inc" .else .include "cia.inc" .include "vic.inc" .endif .if PLATFORM = diskio::platform::COMMODORE_128 .include "mmu.inc" .include "vdc.inc" .endif .include "float.inc" .include "basic.inc" .include "kernal.inc" .macpack cbm .macpack longbranch .segment "ZEROPAGE" : zeropage .if PLATFORM = diskio::platform::COMMODORE_16 IRQSLACK = $03; 0: NTSC .else IRQSLACK = $a8; RS232 Input Bit count/Tape temporary .endif POINTERS: .res 6 IRQ_SLACK = $00 KERNAL_FALLBACK_IRQ_SLACK_PARALLEL = $00 KERNAL_FALLBACK_IRQ_SLACK_BURST = $30 .if PLATFORM = diskio::platform::COMMODORE_128 KERNAL_FALLBACK_IRQ_SLACK_SERIAL = $37 .else KERNAL_FALLBACK_IRQ_SLACK_SERIAL = $1f .endif LOAD_TO_UPPER_MEM = LOAD_UNDER_D000_DFFF; on C-16/+4, himem is $8000..$fcff, but it can be loaded to regardless of this setting .if LOAD_TO_UPPER_MEM .segment "BITMAPHI" .import __BITMAPHI_LOAD__ BITMAP = __BITMAPHI_LOAD__ .if PLATFORM = diskio::platform::COMMODORE_16 .segment "COLRAM" .import __COLRAM_LOAD__ COLRAM = __COLRAM_LOAD__ .else .segment "COLRAMHI" .import __COLRAMHI_LOAD__ COLRAM = __COLRAMHI_LOAD__ .endif .else; !LOAD_TO_UPPER_MEM .segment "BITMAP" .import __BITMAP_LOAD__ BITMAP = __BITMAP_LOAD__ .segment "COLRAM" .import __COLRAM_LOAD__ COLRAM = __COLRAM_LOAD__ .endif .if PLATFORM <> diskio::platform::COMMODORE_16 .segment "SPRITES" .import __SPRITES_LOAD__ SPRITES = __SPRITES_LOAD__ .if LOAD_TO_UPPER_MEM SPRITESCR = SPRITES + $0400 .else SPRITESCR = COLRAM .endif .endif TESTNAMEPOS = $0b; x coord ; cannot define string symbols from the command line with ca65 .if DECOMPRESSOR = DECOMPRESSORS::BITNAX .define COMPEXT "BNX" .define SAFETYMARGIN 0 .elseif DECOMPRESSOR = DECOMPRESSORS::BYTEBOOZER2 .define COMPEXT "B2" .define SAFETYMARGIN 3 .elseif DECOMPRESSOR = DECOMPRESSORS::DOYNAX_LZ .define COMPEXT "DNX" .define SAFETYMARGIN 4 .elseif DECOMPRESSOR = DECOMPRESSORS::EXOMIZER .define COMPEXT "EXO" .define SAFETYMARGIN 3 .elseif DECOMPRESSOR = DECOMPRESSORS::LEVELCRUSH .define COMPEXT "LC" .define SAFETYMARGIN 3 .elseif DECOMPRESSOR = DECOMPRESSORS::LZSA2 .define COMPEXT "SA2" .define SAFETYMARGIN 0 .elseif DECOMPRESSOR = DECOMPRESSORS::NUCRUNCH .define COMPEXT "NC" .define SAFETYMARGIN 5 .elseif DECOMPRESSOR = DECOMPRESSORS::PUCRUNCH .define COMPEXT "PU" .define SAFETYMARGIN 36 .elseif DECOMPRESSOR = DECOMPRESSORS::SUBSIZER .define COMPEXT "SSZ" .define SAFETYMARGIN 2 .elseif DECOMPRESSOR = DECOMPRESSORS::TINYCRUNCH .define COMPEXT "TC" .define SAFETYMARGIN 0 .elseif DECOMPRESSOR = DECOMPRESSORS::TSCRUNCH .define COMPEXT "TS" .define SAFETYMARGIN 0 .elseif DECOMPRESSOR = DECOMPRESSORS::ZX0 .define COMPEXT "ZX0" .define SAFETYMARGIN 0 .else .define COMPEXT "PRG" .define SAFETYMARGIN 0 .endif ; testing macros .if VERIFY .macro VERIFY_PROLOGUE ; copy away jsr piccopy .endmacro .macro VERIFY_EPILOGUE .local verifyok jsr piccomp beq verifyok jsr verifyfail verifyok: .endmacro .endif .macro MEMCONFIG_BUFFER .if PLATFORM = diskio::platform::COMMODORE_16 lda TED_CHARGEN_ADDR .elseif PLATFORM = diskio::platform::COMMODORE_128 lda #BANK_0 | HIGH_RAM | MID_RAM | LOW_RAM | IO_SPACE; $3e sta MMU_CR .else lda IO_PORT_DIRECTION pha lda IO_PORT .endif pha .endmacro .macro MEMCONFIG_CHECK pla .if PLATFORM = diskio::platform::COMMODORE_16 eor TED_CHARGEN_ADDR and #ROM_IS_ENABLED | FORCE_SINGLE_CLOCK beq :+ lda #MEMCONFCHNG jsr error .elseif PLATFORM = diskio::platform::COMMODORE_128 cmp MMU_CR beq :+ tax ; expected ldy MMU_CR; actual lda #MEMCONFCHNG jsr error .else tax ldy IO_PORT pla cpx IO_PORT bne :+ tax ldy IO_PORT_DIRECTION cpx IO_PORT_DIRECTION beq :++ : lda #MEMCONFCHNG jsr error .endif : .endmacro .macro ENABLE_MEMCONFIG_CHECK lda #$ff sta memcfgchks .endmacro .macro DISABLE_MEMCONFIG_CHECK lda #0 sta memcfgchks .endmacro .macro ENABLE_ALL_ROM .if PLATFORM = diskio::platform::COMMODORE_16 sta TED_ROM_ENABLE .elseif PLATFORM = diskio::platform::COMMODORE_128 lda #BANK_0 | SYSTEM_ROM | BASIC_HI | BASIC_LO | IO_SPACE sta MMU_CR .else lda #MEMCONFIG_IO_KERNAL_BASIC sta IO_PORT .endif .endmacro .macro ENABLE_ALL_RAM .if PLATFORM = diskio::platform::COMMODORE_16 sta TED_RAM_ENABLE .elseif PLATFORM = diskio::platform::COMMODORE_128 lda #BANK_0 | HIGH_RAM | MID_RAM | LOW_RAM | RAM_ROM sta MMU_CR .else lda #MEMCONFIG_ALL_RAM sta IO_PORT .endif .endmacro .macro PUSH_MEMCONFIG .if PLATFORM = diskio::platform::COMMODORE_16 lda TED_CHARGEN_ADDR lsr php .elseif PLATFORM = diskio::platform::COMMODORE_128 lda MMU_CR pha .else lda IO_PORT pha .endif .endmacro .macro PUSH_MEMCONFIG_AND_ENABLE_ALL_ROM PUSH_MEMCONFIG ENABLE_ALL_ROM .endmacro .macro PUSH_MEMCONFIG_AND_ENABLE_ALL_RAM PUSH_MEMCONFIG ENABLE_ALL_RAM .endmacro .macro POP_MEMCONFIG .if PLATFORM = diskio::platform::COMMODORE_16 .local enable_ram plp ENABLE_ALL_RAM bcc enable_ram ENABLE_ALL_ROM enable_ram: .elseif PLATFORM = diskio::platform::COMMODORE_128 pla sta MMU_CR .else pla sta IO_PORT .endif .endmacro .macro TEST testmacro, filename, redzone .local redzoneok .if TEST_BUS_LOCK ENTER_BUS_LOCK : inc CIA2_PRA dex bne :- ror CIA2_PRA dey bne :- LEAVE_BUS_LOCK .endif; TEST_BUS_LOCK DISABLE_MEMCONFIG_CHECK PUSH_MEMCONFIG_AND_ENABLE_ALL_RAM lda looprunlo sta redzone POP_MEMCONFIG ENABLE_MEMCONFIG_CHECK MEMCONFIG_BUFFER .if !NO_SPRITES_OR_IRQ lda #.lobyte(filename) sta filenamelo lda #.hibyte(filename) sta filenamehi .endif testmacro filename MEMCONFIG_CHECK DISABLE_MEMCONFIG_CHECK PUSH_MEMCONFIG_AND_ENABLE_ALL_RAM lda looprunlo cmp redzone beq redzoneok lda #ERRSAFETYMARGIN ldx #.lobyte(redzone) ldy #.hibyte(redzone) jmp error redzoneok: POP_MEMCONFIG ENABLE_MEMCONFIG_CHECK .if VERIFY VERIFY_PROLOGUE testmacro filename VERIFY_EPILOGUE .endif jsr checkkeys .endmacro .macro CHECKLOADADDRESSRAW .local lodaddfail .local loadaddrok .if LOAD_TO_API lda #.lobyte(BITMAP + $20) .else lda #.lobyte(BITMAP) .endif cmp loadaddrlo bne lodaddfail lda #.hibyte(BITMAP) cmp loadaddrhi beq loadaddrok lodaddfail: lda #ERRLOADADDR ldx loadaddrlo ldy loadaddrhi jmp error loadaddrok: .endmacro .macro CHECKLOADADDRESSCOMPD .local loadaddrok ; load address must be > BITMAP address lda #.lobyte(BITMAP) cmp loadaddrlo lda #.hibyte(BITMAP) sbc loadaddrhi bcc loadaddrok lda #ERRLOADADDR ldx loadaddrlo ldy loadaddrhi jmp error loadaddrok: .endmacro .macro CHECKENDADDRESSRAW .if END_ADDRESS_API .local endaddfail .local endaddrok clc lda #.lobyte(BITMAP_SIZE) adc loadaddrlo eor endaddrlo bne endaddfail lda #.hibyte(BITMAP_SIZE) adc loadaddrhi cmp endaddrhi beq endaddrok endaddfail: lda #ERRENDADDR ldx endaddrlo ldy endaddrhi jmp error endaddrok: .endif; END_ADDRESS_API .endmacro .macro CHECKENDADDRESSCOMPD dataoffset .if END_ADDRESS_API .local endaddfail .local endaddrok lda endaddrlo cmp #.lobyte(BITMAP + BITMAP_SIZE + dataoffset) bcc endaddfail lda endaddrhi cmp #.hibyte(BITMAP + BITMAP_SIZE + dataoffset) beq endaddrok endaddfail: lda #ERRENDADDR ldx endaddrlo ldy endaddrhi jmp error endaddrok: .endif; END_ADDRESS_API .endmacro .macro PRINTTESTNAME testname .local filllength .local name .local nameend DISABLE_MEMCONFIG_CHECK lda #0 sta DFLTO .if !NO_SPRITES_OR_IRQ lda #.lobyte(name) sta testnamelo lda #.hibyte(name) sta testnamehi .endif ldx #TESTNAMEPOS ldy #$01 jsr setplotxy ldx #.lobyte(name) ldy #.hibyte(name) jsr plottext .if PLATFORM = diskio::platform::COMMODORE_16 sec lda #.lobyte(COLRAM + $0c38) sbc POINTERS + 2 .else lda #$10 .endif sta filllength sec lda #.lobyte(emptytexte) filllength = * + 1 sbc #$00 tax lda #.hibyte(emptytexte) sbc #$00 tay jsr plottext ENABLE_MEMCONFIG_CHECK jmp nameend name: .byte testname, 0 nameend: .endmacro .macro TESTUNCOMPRESSED testmacro, testname, dataoffset PRINTTESTNAME testname TEST testmacro, pic1unc, BITMAP + BITMAP_SIZE + dataoffset CHECKLOADADDRESSRAW CHECKENDADDRESSRAW TEST testmacro, pic2unc, BITMAP + BITMAP_SIZE + dataoffset CHECKLOADADDRESSRAW CHECKENDADDRESSRAW .endmacro .macro TESTCOMPRESSED testmacro, testname, dataoffset PRINTTESTNAME .concat(testname, ":", COMPEXT) TEST testmacro, pic1compd, BITMAP + BITMAP_SIZE + SAFETYMARGIN + dataoffset CHECKLOADADDRESSCOMPD CHECKENDADDRESSCOMPD dataoffset TEST testmacro, pic2compd, BITMAP + BITMAP_SIZE + SAFETYMARGIN + dataoffset CHECKLOADADDRESSCOMPD CHECKENDADDRESSCOMPD dataoffset .endmacro .macro CONSOLE text lda #.lobyte(text) ldy #.hibyte(text) jsr consoleout .endmacro .macro INITSTAT jsr initstat .endmacro .macro PRINTSTAT numbytes DISABLE_MEMCONFIG_CHECK ldx #.hibyte(numbytes) ldy #.lobyte(numbytes) jsr printstat ENABLE_MEMCONFIG_CHECK .endmacro .macro MEMCLEAR address, size lda #.hibyte(size) ldx #.hibyte(address) jsr memclear .endmacro .macro MEMCOPY source, dest, size lda #.hibyte(size) ldx #.hibyte(source) ldy #.hibyte(dest) jsr memcopy .endmacro .macro MEMCOMP buffer1, buffer2, size lda #.lobyte(size) sta POINTERS + $00 lda #.hibyte(size) ldx #.hibyte(buffer1) ldy #.hibyte(buffer2) jsr memcomp .endmacro .segment "CODE" sei ldx #$ff txs .if USE_2_MHZ lda #0 sta VIC2_C128_CLOCK .endif .if (PLATFORM = diskio::platform::COMMODORE_64) & LOAD_TO_UPPER_MEM IEEE_488_CODE_START = $c800 IEEE_488_CODE_END = $d000 IEEE_488_CODE_RELOC = $0800 lda IOPEN + 1 cmp #.hibyte(IEEE_488_CODE_START) bcc noieeerloc cmp #.hibyte(IEEE_488_CODE_END) bcs noieeerloc lda #0 sta POINTERS sta POINTERS + 2 lda #.hibyte(IEEE_488_CODE_START) sta POINTERS + 1 lda #.hibyte(IEEE_488_CODE_RELOC) sta POINTERS + 3 sec sbc POINTERS + 1 sta POINTERS + 4 ldx #.hibyte(IEEE_488_CODE_END - IEEE_488_CODE_START) relocloop: ldy #0 lda (POINTERS),y sta (POINTERS + 2),y cmp #OPC_JSR_ABS beq :+ cmp #OPC_JMP_ABS beq :+ cmp #OPC_JMP_ABSI beq :+ cmp #OPC_LDA_ABSX bne noreloc : ldy #2 lda (POINTERS),y ldy #0 cmp #.hibyte(IEEE_488_CODE_START) bcc noreloc cmp #.hibyte(IEEE_488_CODE_END) bcs noreloc iny lda (POINTERS),y sta (POINTERS + 2),y iny lda POINTERS + 4 adc (POINTERS),y sta (POINTERS + 2),y noreloc: tya sec adc POINTERS sta POINTERS sta POINTERS + 2 bcc relocloop inc POINTERS + 1 inc POINTERS + 3 dex bne relocloop ldx #ISAVE - IOPEN : lda IOPEN + 1,x cmp #.hibyte(IEEE_488_CODE_START) bcc :+ cmp #.hibyte(IEEE_488_CODE_END) bcs :+ adc POINTERS + 4 sta IOPEN + 1,x : dex dex bpl :-- noieeerloc: .endif .if PLATFORM = diskio::platform::COMMODORE_16 ; pucrunch turns off the screen during decompression lda #DISPLAY_DISABLE sta TED_CTRL1 ; YAPE doesn't set FA to the current ; drive when using autostart lda FA and #.lobyte(~$01) cmp #$08 beq :+ lda #$08 sta FA : .endif lda #0; OPC_BRK ldx #$40; MMU registers are at $ff00..$ff07, TED registers are at $ff00..$ff3f : sta $ff00,x; guard against calling ROM inx ; code with RAM enabled bne :- lda #.lobyte(nmihandler) .if PLATFORM <> diskio::platform::COMMODORE_16 sta NMINV + $00 .endif sta NMI_VECTORLO lda #.hibyte(nmihandler) .if PLATFORM <> diskio::platform::COMMODORE_16 sta NMINV + $01 .endif sta NMI_VECTORHI lda #.lobyte(ramirq) sta IRQ_VECTORLO lda #.hibyte(ramirq) sta IRQ_VECTORHI .if PLATFORM = diskio::platform::COMMODORE_16 ldx #$00 stx tod_hrs stx tod_mins stx tod_secs stx tod_10s stx tod_frames lda #PAL_NTSC_MASK and TED_CTRL2 bne :+ inx; PAL : stx palntsc jsr waitvbl lda TED_CHARGEN_ADDR and #.lobyte(~(CHARGEN_ADDR_MASK | FORCE_SINGLE_CLOCK)) ora #MAKE_CHARGEN_ADDR(CHARSET_ADDR_UPPERLOWER) sta TED_CHARGEN_ADDR lda #COLOUR_BLACK sta TED_BGCOLOUR sta TED_BORDERCOLOUR .if COUPLED_TIMERS = 0 calibrate: jsr readctr stx prevctr3lo sty prevctr3hi lda #$00 sta adjustdiff jsr docalibrte sta adjustdiff jsr docalibrte cmp #$00 bne calibrate cpx #$00 bne calibrate cpy #$00 bne calibrate .endif lda #PALETTE_DEFAULT sta PALETTE CONSOLE startupmsg jsr waitvbl lda #TEXT_MODE | DISPLAY_ENABLE | LINES_25 | SCROLLY_3 sta TED_CTRL1 lda TED_RASTERLINE : cmp TED_RASTERLINE beq :- : ldx TED_RASTERLINE lda TED_RASTERLINE_MSB cpx TED_RASTERLINE bne :- stx TED_IRQ_RASTERLINE lsr lda TED_IMR and #.lobyte(~IRQ_RASTERLINE_MSB) bcc :+ ora #IRQ_RASTERLINE_MSB : sta TED_IMR lda #.lobyte(clockirq) sta CINV + $00 lda #.hibyte(clockirq) sta CINV + $01 lda #RASTER_IRQ sta TED_IMR lda TED_IRR sta TED_IRR .else; PLATFORM <> diskio::platform::COMMODORE_16 .if PLATFORM = diskio::platform::COMMODORE_128 ldx #leaveirqe - leaveirq - 1 : lda leaveirq,x sta BUF,x dex bpl :- lda #BANK_0 | SYSTEM_ROM | BASIC_HI | LOW_RAM | IO_SPACE sta MMU_CR .else; PLATFORM <> diskio::platform::COMMODORE_128 lda #MEMCONFIG_IO_KERNAL_BASIC sta IO_PORT .endif; PLATFORM <> diskio::platform::COMMODORE_128 ; detect video standard : bit VIC2_CTRL1 bmi :- : bit VIC2_CTRL1 bpl :- lda #$37 : cmp VIC2_RASTERLINE bne :- lda VIC2_CTRL1 asl lda #$00 .if PLATFORM = diskio::platform::COMMODORE_128 bcc :+ lda #$ff; 0: NTSC, $ff: PAL : .else rol; 0: NTSC, 1: PAL .endif sta palntsc ; detect mains frequency lda #TOD_SET_CLOCK | TIMER_STOP sta CIA1_CRB ldx #0 stx CIA1_TOD_10S ldy #$ff sty CIA1_TA_LO sty CIA1_TA_HI ldy #TOD_FREQ_60HZ | FORCE_LOAD | CONTINUOUS | TIMER_START sty CIA1_CRA lda #CIA_CLR_INTF | TIMERA_IRQ bit CIA1_ICR sta CIA1_ICR : cpx CIA1_TOD_10S bne haveac bit CIA1_ICR beq :- : bit CIA1_ICR bne noac cpx CIA1_TOD_10S beq :- haveac: sty CIA1_CRA ldx CIA1_TOD_10S : cpx CIA1_TOD_10S beq :- lda CIA1_TA_HI cmp #$50 lda #TOD_FREQ_60HZ ldx #60 bcs :+ lda #TOD_FREQ_50HZ ldx #50 : sta CIA1_CRA stx mainsfreq + 1 noac: jsr waitvbl lda #DISPLAY_DISABLE sta VIC2_CTRL1 lda #VIC2_MAKE_ADDR($0400, CHARSET_ADDR_UPPERLOWER) sta VIC2_ADDR lda VIC2_ADDR lda #COLOUR_BLACK sta VIC2_BGCOLOUR sta VIC2_BORDERCOLOUR CONSOLE startupmsg jsr waitvbl lda #TEXT_MODE | DISPLAY_ENABLE | LINES_25 | SCROLLY_3 sta VIC2_CTRL1 lda #0 sta CIA1_TOD_HRS sta CIA1_TOD_MIN sta CIA1_TOD_SEC sta CIA1_TOD_10S .endif; PLATFORM <> diskio::platform::COMMODORE_16 cli CONSOLE detectedms lda #.lobyte(paltext) ldy #.hibyte(paltext) ldx palntsc bne :+ lda #.lobyte(ntsctext) ldy #.hibyte(ntsctext) : jsr consoleout CONSOLE systemmsg PUSH_MEMCONFIG_AND_ENABLE_ALL_ROM lda palntsc beq ntsckbs INT32TOFAC numccpal; fac#1 = cyclespersecond jmp :+ ntsckbs: INT32TOFAC numccntsc; fac#1 = cyclespersecond : jsr DIV10; fac#1 /= 10 ldx #.lobyte(cyclesperd) ldy #.hibyte(cyclesperd) jsr MOV2M; cyclesperd = fac#1 = cycles per 1/10 seconds lda #.hibyte(100) ldy #.lobyte(100) jsr GIVAYF; fac#1 = 100 ldx #.lobyte(hundred) ldy #.hibyte(hundred) jsr MOV2M; hundred = fac#1 = 100 POP_MEMCONFIG .if PLATFORM <> diskio::platform::COMMODORE_16 CONSOLE detectedms lda #0 mainsfreq: ldx #0 jsr printword CONSOLE acfreqmsg .endif lda #.hibyte(__DISKIO_INSTALL_SIZE__) jsr tohex stx inssizebyt sta inssizebyt + 1 lda #.lobyte(__DISKIO_INSTALL_SIZE__) jsr tohex stx inssizebyt + 2 sta inssizebyt + 3 CONSOLE inssizemsg lda #.hibyte(__DISKIO_SIZE__) jsr tohex stx ressizebyt sta ressizebyt + 1 lda #.lobyte(__DISKIO_SIZE__) jsr tohex stx ressizebyt + 2 sta ressizebyt + 3 CONSOLE ressizemsg .if TEST_SAVE .import __DISKIO_PLUGIN_SIZE__ lda #.hibyte(__DISKIO_PLUGIN_SIZE__) jsr tohex stx trnsizebyt sta trnsizebyt + 1 lda #.lobyte(__DISKIO_PLUGIN_SIZE__) jsr tohex stx trnsizebyt + 2 sta trnsizebyt + 3 CONSOLE trnsizemsg .endif CONSOLE installmsg lda #0 ldx FA jsr printword CONSOLE installrst lda #.lobyte(brkhandler) sta CBINV lda #.hibyte(brkhandler) sta CBINV + 1 lda IBSOUT sta bsout + 1 lda IBSOUT + 1 sta bsout + 2 .if PLATFORM = diskio::platform::COMMODORE_128 lda #.lobyte(dualhead) sta IBSOUT lda #.hibyte(dualhead) sta IBSOUT + 1 .endif; PLATFORM = diskio::platform::COMMODORE_128 LOADER_INSTALL .if PLATFORM = diskio::platform::COMMODORE_128 pha lda bsout + 1 sta IBSOUT lda bsout + 2 sta IBSOUT + 1 pla .endif; PLATFORM = diskio::platform::COMMODORE_128 stx drivetype bcc :+ .if LOAD_VIA_KERNAL_FALLBACK cmp #diskio::status::DEVICE_INCOMPATIBLE beq :+ cmp #diskio::status::TOO_MANY_DEVICES beq :+ .endif jmp error : tya pha php sei lda #COLOUR_BLACK sta BGCOLOUR sta BORDERCOLOUR plp .if PLATFORM <> diskio::platform::COMMODORE_16 lda palntsc; as detected cmp PALNTS; $02a6 (C-64) or $0a03 (C-128), as set by KERNAL beq :+ lda #ERRPALNTSC jmp error : .endif; PLATFORM <> diskio::platform::COMMODORE_16 DISABLE_MEMCONFIG_CHECK CONSOLE runningmsg ldx #IRQ_SLACK lda drivetype bpl drvconsole cmp #diskio::drivetype::DRIVE_GENERIC_PARALLEL bne :+ lda #drivemsgpa - drivemsgsl + diskio::drivetype::DRIVE_1541; generic parallel drive ldx #KERNAL_FALLBACK_IRQ_SLACK_PARALLEL jmp drvconsole : cmp #diskio::drivetype::DRIVE_GENERIC_BURST bne :+ lda #drivemsgbr - drivemsgsl + diskio::drivetype::DRIVE_1541; generic burst drive ldx #KERNAL_FALLBACK_IRQ_SLACK_BURST jmp drvconsole : lda #drivemsgsr - drivemsgsl + diskio::drivetype::DRIVE_1541; generic serial drive ldx #KERNAL_FALLBACK_IRQ_SLACK_SERIAL drvconsole: stx IRQSLACK and #%00001111 tax lda drivemsgsl - diskio::drivetype::DRIVE_1541,x ldy drivemsgsh - diskio::drivetype::DRIVE_1541,x jsr consoleout CONSOLE returnmsg bit drivetype bmi no2bitatn .if PLATFORM = diskio::platform::COMMODORE_128 bit CIA1_CRA bvs :+; branch if IO mode is set to output CONSOLE burstmsg jmp no2bitatn : .endif; PLATFORM = diskio::platform::COMMODORE_128 CONSOLE twobitatnm no2bitatn: CONSOLE quotemsg pla tax lda 0,x ldy 1,x ; print version string jsr consoleout lda #$00 sta QTSW; leave quote mode sta consoletime CONSOLE quotemsg + 1 lda #$00 sta QTSW; leave quote mode CONSOLE returnmsg .if PLATFORM = diskio::platform::COMMODORE_16 jsr pauseonkey; don't continue as long as any key is pressed CONSOLE loopmsg sei jsr waitvbl lda #DISPLAY_DISABLE sta TED_CTRL1 ldx #$00 : lda #INTENSITY_4 | (INTENSITY_6 >> 4) sta COLRAM + $00,x sta COLRAM + $0100,x sta COLRAM + $0200,x sta COLRAM + $0300,x lda #(COLOUR_WHITE << 4) | COLOUR_WHITE sta COLRAM + $0400,x sta COLRAM + $0500,x sta COLRAM + $0600,x sta COLRAM + $0700,x lda #INTENSITY_6 | COLOUR_YELLOW sta COLRAM + $0800,x sta COLRAM + $0900,x sta COLRAM + $0a00,x sta COLRAM + $0b00,x lda #' ' sta COLRAM + $0c00,x sta COLRAM + $0d00,x sta COLRAM + $0e00,x sta COLRAM + $0f00,x inx bne :- txa ldx #$06 * $08 - 1 : sta COLRAM + $0c60,x sta COLRAM + $0c88,x sta COLRAM + $0d00,x; space character sta COLRAM + $0860,x dex bpl :- ldx #$11 stx COLRAM + $0c38 inx stx COLRAM + $0c39 inx stx COLRAM + $0c3a inx stx COLRAM + $0c3b inx stx COLRAM + $0c3c inx stx COLRAM + $0c3d lda #$b0 sta TED_CURSOR_LO lda #$00 sta TED_CURSOR_HI lda #INTENSITY_0 | COLOUR_BLACK sta TED_BGCOLOUR0 MEMCLEAR BITMAP, ALIGN BITMAP_SIZE, $0100 jsr waitvbl lda #BITMAP_MODE | DISPLAY_ENABLE | LINES_25 | SCROLLY_3 sta TED_CTRL1 lda TED_BITMAP_ADDR and #.lobyte(~(BITMAP_ADDR_MASK | CHARSET_BITMAP_IN_ROM)) ora #MAKE_BITMAP_ADDR(BITMAP) sta TED_BITMAP_ADDR lda TED_SCREEN_ADDR and #.lobyte(~SCREEN_ADDR_MASK) ora #MAKE_SCREEN_ADDR(COLRAM) sta TED_SCREEN_ADDR sei sec lda #$c7 sbc IRQSLACK sta TED_IRQ_RASTERLINE lda #.lobyte(~IRQ_RASTERLINE_MSB) and TED_IMR sta TED_IMR lda #.lobyte(irq1) sta CINV lda #.hibyte(irq1) sta CINV + 1 cli .else; PLATFORM <> diskio::platform::COMMODORE_16 jsr pauseonkey; don't continue as long as any key is pressed CONSOLE loopmsg sei jsr waitvbl lda #DISPLAY_DISABLE sta VIC2_CTRL1 ldx #$00 : .if LOAD_TO_UPPER_MEM ENABLE_ALL_RAM .endif lda #$00 sta SPRITES + $00,x sta SPRITES + $0100,x lda #(COLOUR_LIGHTGREY << 4) | COLOUR_DARKGREY sta COLRAM + $00,x sta COLRAM + $0100,x sta COLRAM + $0200,x sta COLRAM + $0300,x .if LOAD_TO_UPPER_MEM ENABLE_ALL_ROM .endif inx bne :- MEMCLEAR BITMAP, ALIGN BITMAP_SIZE, $0100 SPRITESXPOS = $18 lda #SPRITESXPOS + SPRITE_WIDTH * 0 sta SPRITE0_X lda #SPRITESXPOS + SPRITE_WIDTH * 1 sta SPRITE1_X lda #SPRITESXPOS + SPRITE_WIDTH * 2 sta SPRITE2_X lda #SPRITESXPOS + SPRITE_WIDTH * 3 sta SPRITE3_X lda #SPRITESXPOS + SPRITE_WIDTH * 4 sta SPRITE4_X lda #SPRITESXPOS + SPRITE_WIDTH * 5 sta SPRITE5_X lda #SPRITESXPOS + SPRITE_WIDTH * 6 sta SPRITE6_X lda #SPRITESXPOS + SPRITE_WIDTH * 7 sta SPRITE7_X lda #$fb sta SPRITE0_Y sta SPRITE1_Y sta SPRITE2_Y sta SPRITE3_Y sta SPRITE4_Y sta SPRITE5_Y sta SPRITE6_Y sta SPRITE7_Y lda #%00000000 sta SPRITES_X_MSB lda #%11111111 sta VIC2_SPR_ENABLE lda #COLOUR_YELLOW sta VIC2_SPR0_COLOUR sta VIC2_SPR1_COLOUR sta VIC2_SPR2_COLOUR sta VIC2_SPR3_COLOUR sta VIC2_SPR4_COLOUR sta VIC2_SPR5_COLOUR sta VIC2_SPR6_COLOUR sta VIC2_SPR7_COLOUR ldx #MAKE_SPRITE_POINTER(SPRITES) stx SPRITESCR + SPRITE_POINTERS inx stx SPRITESCR + SPRITE_POINTERS + 1 inx stx SPRITESCR + SPRITE_POINTERS + 2 inx stx SPRITESCR + SPRITE_POINTERS + 3 inx stx SPRITESCR + SPRITE_POINTERS + 4 inx stx SPRITESCR + SPRITE_POINTERS + 5 inx stx SPRITESCR + SPRITE_POINTERS + 6 inx stx SPRITESCR + SPRITE_POINTERS + 7 .if PLATFORM = diskio::platform::COMMODORE_128 lda #IO_PORT_CHARGEN_DISABLED sta IO_PORT .endif lda #BITMAP_MODE | DISPLAY_ENABLE | LINES_25 | SCROLLY_3 sta VIC2_CTRL1 lda #VIC2_MAKE_ADDR COLRAM, BITMAP sta VIC2_ADDR SET_VIC_BANK VIC2_MAKE_BANK BITMAP .if LOAD_TO_UPPER_MEM lda #$01 sta VIC2_RASTERLINE lda #.lobyte(irq0) sta CINV lda #.hibyte(irq0) .else sec lda #$f8 sbc IRQSLACK sta VIC2_RASTERLINE lda #.lobyte(irq1) sta CINV lda #.hibyte(irq1) .endif sta CINV + 1 lda #ALL_COLUMNS sta CIA1_PRA lda #CIA_CLR_INTF | EVERY_IRQ sta CIA1_ICR bit CIA1_ICR lda #RASTER_IRQ sta VIC2_IMR sta VIC2_IRR .endif; PLATFORM <> diskio::platform::COMMODORE_16 ; print the static settings lda #.lobyte(printstatc) sta IBSOUT lda #.hibyte(printstatc) sta IBSOUT + 1 lda #0 sta DFLTO cli PUSH_MEMCONFIG_AND_ENABLE_ALL_ROM ldx #$00 ldy #$00 jsr setplotxy ldx #.lobyte(paltext) ldy #.hibyte(paltext) lda palntsc bne :+ ldx #.lobyte(ntsctext) ldy #.hibyte(ntsctext) : jsr plottext lda #',' jsr BSOUT lda #' ' jsr BSOUT lda #'#' .if PLATFORM = diskio::platform::COMMODORE_128 bit drivetype bmi :+ bit CIA1_CRA bvs :+; branch if IO mode is set to output lda #'b'; burst mode : .endif jsr BSOUT lda FA cmp #10 bcc :+ lda #'1' jsr BSOUT sec lda FA sbc #10 : ora #'0' jsr BSOUT lda #'/' jsr BSOUT lda drivetype and #%00001111 tax lda drivtypesl - diskio::drivetype::DRIVE_1541,x ldy drivtypesh - diskio::drivetype::DRIVE_1541,x tax jsr plottext lda #',' jsr BSOUT lda #' ' jsr BSOUT lda #'$' jsr BSOUT lda #.hibyte(__DISKIO_SIZE__) beq :+ jsr plotbyte : lda #.lobyte(__DISKIO_SIZE__) jsr plothex POP_MEMCONFIG .if !INSTALL_ONLY .if PLATFORM = diskio::platform::COMMODORE_16 sta TED_RAM_ENABLE lda #.lobyte(~FORCE_SINGLE_CLOCK) sei and TED_CHARGEN_ADDR sta TED_CHARGEN_ADDR cli .elseif PLATFORM = diskio::platform::COMMODORE_128 lda #BANK_0 | HIGH_RAM | MID_RAM | LOW_RAM | IO_SPACE; $3e sta MMU_CR .else lda #MEMCONFIG_IO sta IO_PORT .endif ENABLE_MEMCONFIG_CHECK .if NO_SPRITES_OR_IRQ .if PLATFORM <> diskio::platform::COMMODORE_16 lda #$00 sta VIC2_IMR sei sta VIC2_SPR_ENABLE .else lda #$00 sta TED_IMR lda TED_IRR sta TED_IRR sei lda #BITMAP_MODE | DISPLAY_ENABLE | LINES_25 | SCROLLY_3 sta TED_CTRL1 .endif .endif testloop: .if !NO_SPRITES_OR_IRQ DISABLE_MEMCONFIG_CHECK PUSH_MEMCONFIG_AND_ENABLE_ALL_ROM lda bsout + 1 sta IBSOUT lda bsout + 2 sta IBSOUT + 1 CONSOLE looprunmsg looprunhi = * + 1 lda #0 looprunlo = * + 1 ldx #1 jsr printword .if USE_2_MHZ ldx #'1' lda VIC2_C128_CLOCK cmp #.lobyte(~C128_INC_LINECNTR); $fd, will say "1 MHz" for Turbo Chameleon turbo mode ($ff, as on C-64) bne :+ inx : stx mhz CONSOLE mhzmsg .endif CONSOLE returnmsg lda #.lobyte(printstatc) sta IBSOUT lda #.hibyte(printstatc) sta IBSOUT + 1 inc looprunlo bne :+ inc looprunhi : POP_MEMCONFIG ENABLE_MEMCONFIG_CHECK .endif .if LOAD_RAW_API ; --- load raw --- .macro LOAD_RAW filename .local done INITSTAT .if LOAD_TO_API LOADRAW_LOADTO filename, BITMAP + $20 .else LOADRAW filename .endif jcs error PRINTSTAT BITMAP_SIZE + 2 done: .endmacro .if LOAD_TO_API TESTUNCOMPRESSED LOAD_RAW, "LoadRaw", $20 .else TESTUNCOMPRESSED LOAD_RAW, "LoadRaw", 0 .endif .if TEST_INVALID_PARAMETERS PRINTTESTNAME "LoadRawInv" .if !NO_SPRITES_OR_IRQ lda #.lobyte(bogusname) sta filenamelo lda #.hibyte(bogusname) sta filenamehi .endif INITSTAT MEMCONFIG_BUFFER LOADRAW bogusname jcc error cmp #diskio::status::FILE_NOT_FOUND jne error PRINTSTAT 0 MEMCONFIG_CHECK .endif .endif .if FILE_EXISTS_API PRINTTESTNAME "FileExists" lda #.lobyte(pic1unc) sta filenamelo lda #.hibyte(pic1unc) sta filenamehi INITSTAT FILEEXISTS pic1unc jcs error PRINTSTAT 0 lda #.lobyte(bogusname) sta filenamelo lda #.hibyte(bogusname) sta filenamehi INITSTAT FILEEXISTS bogusname jcc error cmp #diskio::status::FILE_NOT_FOUND jne error PRINTSTAT 0 jsr checkkeys .endif .if TEST_SAVE PRINTTESTNAME "Save" lda #.lobyte(pic1unc) sta filenamelo lda #.hibyte(pic1unc) sta filenamehi INITSTAT SAVE_OVERWRITE saveparams bcc donesave jmp error saveparams: .word pic1unc; filename .word BITMAP; from .word BITMAP_SIZE; length .word BITMAP; loadaddress .word __SWAPBUFFER_LOAD__; buffer donesave: PRINTSTAT BITMAP_SIZE + 2 jsr checkkeys .endif; TEST_SAVE .if MEM_DECOMP_API ; --- load a compressed file, then decompress after loading .macro LOADANDMEMDECOMP_COMMON filename .local done INITSTAT .if LOAD_RAW_API LOADRAW filename jcs error .else .error "To test memory decompression, please set LOAD_RAW_API to non-0" .endif clc done: .endmacro .macro LOADANDMEMDECOMP filename .local done .if VERIFY .local verifyok MEMCLEAR BITMAP, ALIGN BITMAP_SIZE, $0100 LOADANDMEMDECOMP_COMMON filename PUSH_MEMCONFIG_AND_ENABLE_ALL_RAM MEMCOPY BITMAP + ALIGN (BITMAP_SIZE >> 1), $0100, COMPDATA + ALIGN BITMAP_SIZE, $0100, ALIGN BITMAP_SIZE, $0100 POP_MEMCONFIG MEMCLEAR BITMAP, ALIGN BITMAP_SIZE, $0100 LOADANDMEMDECOMP_COMMON filename PUSH_MEMCONFIG_AND_ENABLE_ALL_RAM MEMCOMP BITMAP + ALIGN (BITMAP_SIZE >> 1), $0100, COMPDATA + ALIGN BITMAP_SIZE, $0100, ALIGN BITMAP_SIZE, $0100 php pla tax POP_MEMCONFIG txa pha plp beq verifyok jsr verifyfail verifyok: .else LOADANDMEMDECOMP_COMMON filename .endif .if LOAD_TO_UPPER_MEM PUSH_MEMCONFIG_AND_ENABLE_ALL_RAM .endif lda loadaddrlo sta POINTERS lda loadaddrhi sta POINTERS + 1 dec loadaddrlo inc loadaddrhi .if MEM_DECOMP_TO_API MEMDECOMP_TO POINTERS, POINTERS + 1, BITMAP - $10 .else MEMDECOMP POINTERS, POINTERS + 1 .endif .if LOAD_TO_UPPER_MEM POP_MEMCONFIG .endif PRINTSTAT BITMAP_SIZE + 2 done: .endmacro TESTCOMPRESSED LOADANDMEMDECOMP, "MemDecomp", 0 .endif .if LOAD_COMPD_API ; --- load with decompression --- .macro LOADCOMPRESSED filename .local done INITSTAT .if LOAD_TO_API LOADCOMPD_RELTO filename, -$10 .else LOADCOMPD filename .endif jcs error PRINTSTAT BITMAP_SIZE + 2 done: .endmacro .if LOAD_TO_API TESTCOMPRESSED LOADCOMPRESSED, "LoadCompd", -$10 .else TESTCOMPRESSED LOADCOMPRESSED, "LoadCompd", 0 .endif .if TEST_INVALID_PARAMETERS PRINTTESTNAME "LoadCompdInv" .if !NO_SPRITES_OR_IRQ lda #.lobyte(bogusname) sta filenamelo lda #.hibyte(bogusname) sta filenamehi .endif INITSTAT MEMCONFIG_BUFFER LOADCOMPD bogusname jcc error cmp #diskio::status::FILE_NOT_FOUND jne error PRINTSTAT 0 loadcmpdun: MEMCONFIG_CHECK .endif .endif; LOAD_COMPD_API inc bordercol + 1 setborder: lda #1 beq :+ bordercol: lda #0 sta BORDERCOLOUR : .if USE_2_MHZ lda #C128_TWO_MHZ eor VIC2_C128_CLOCK sta VIC2_C128_CLOCK .endif jmp testloop .if PLATFORM = diskio::platform::COMMODORE_16 pauseonkey: lda #ALL_COLUMNS : sei sta PIO_KEYBOARD_COLUMN sta TED_KEYBOARD_LATCH ldx TED_KEYBOARD_LATCH sta TED_KEYBOARD_LATCH cpx TED_KEYBOARD_LATCH cli bne :- cpx #NO_ROWS beq :+; branch if no key presed ; pause on any key except left shift (lock) ldx #LEFT_SHIFT_COLUMN ldy #LEFT_SHIFT_ROW sei stx PIO_KEYBOARD_COLUMN stx TED_KEYBOARD_LATCH cpy TED_KEYBOARD_LATCH cli bne pauseonkey : rts .else; PLATFORM <> diskio::platform::COMMODORE_16 pauseonkey: lda #ALL_COLUMNS : sei sta CIA1_PRA ldx CIA1_PRB cpx CIA1_PRB cli bne :- inx beq :+; branch if no key presed ; pause on any key except left shift (lock) lda #LEFT_SHIFT_COLUMN ldx #LEFT_SHIFT_ROW sei sta CIA1_PRA cpx CIA1_PRB cli bne pauseonkey : rts .endif; PLATFORM <> diskio::platform::COMMODORE_16 checkkeys: .if PAUSE_BETWEEN_LOADS lda #PAUSE_BETWEEN_LOADS ldx #$00 ldy #$00 : dex bne :- dey bne :- sec sbc #$01 bne :- .endif .if !UNINSTALL_API jmp pauseonkey .else .if PLATFORM = diskio::platform::COMMODORE_16 lda #ALL_COLUMNS sta PIO_KEYBOARD_COLUMN sta TED_KEYBOARD_LATCH lda TED_KEYBOARD_LATCH cmp #NO_ROWS .else inc CIA1_PRB; uninstall on keypress .endif bne off rts off: LOADER_UNINSTALL .endif; !UNINSTALL_API .else ; INSTALL_ONLY .if UNINSTALL_API : .if PLATFORM = diskio::platform::COMMODORE_16 lda #ALL_COLUMNS sta PIO_KEYBOARD_COLUMN sta TED_KEYBOARD_LATCH lda TED_KEYBOARD_LATCH cmp #NO_ROWS .else inc CIA1_PRB; uninstall on keypress .endif beq :- LOADER_UNINSTALL .endif; UNINSTALL_API .endif; INSTALL_ONLY DISABLE_MEMCONFIG_CHECK .if UNINSTALL_API lda #MSGUNINST jsr printmsg lda bsout + 1 sta IBSOUT lda bsout + 2 sta IBSOUT + 1 CONSOLE cmsguninst .if 0 sei lda #.lobyte(KEY) sta CINV lda #.hibyte(KEY) sta CINV + 1 lda #0 sta VIC2_IMR sta VIC2_IRR sta VIC2_SPR_ENABLE dec BORDERCOLOUR lda #savefilend - savefile Ldx #.lobyte(savefile) ldy #.hibyte(savefile) jsr SETNAM lda #0 ldx FA tay jsr SETLFS lda #.lobyte(savefile) sta STAL lda #.hibyte(savefile) sta STAH lda #STAL ldx #.lobyte(savefilend) ldy #.hibyte(savefilend) jsr SAVE bcc :+ jmp error savefile: .byte "savefile" savefilend: : .endif .endif jsr waitvbl lda #COLOUR_GREEN sta bordercol + 1 sta BORDERCOLOUR halt: jmp halt waitvbl: .if PLATFORM <> diskio::platform::COMMODORE_16 lda palntsc cmp #$01 .endif WAIT_VBL rts initstat: .if !NO_SPRITES_OR_IRQ DISABLE_MEMCONFIG_CHECK PUSH_MEMCONFIG_AND_ENABLE_ALL_ROM lda bsout + 1 sta IBSOUT lda bsout + 2 sta IBSOUT + 1 CONSOLE logmsg testnamelo = * + 1 lda #$00 testnamehi = * + 1 ldy #$00 jsr consoleout CONSOLE spacemsg lda filenamehi beq noname CONSOLE quotemsg filenamelo = * + 1 lda #$00 sta POINTERS filenamehi = * + 1 lda #$00 sta POINTERS + 1 ldy #0 : lda (POINTERS),y beq :++ cmp #$40 bcc :+ eor #$80 : sta capsname,y iny bne :-- : sta capsname,y lda #.lobyte(capsname) ldy #.hibyte(capsname) jsr consoleout CONSOLE quotemsg + 1 noname: lda #.lobyte(printstatc) sta IBSOUT lda #.hibyte(printstatc) sta IBSOUT + 1 POP_MEMCONFIG ENABLE_MEMCONFIG_CHECK .endif .if PLATFORM = diskio::platform::COMMODORE_16 calibinits: .if COUPLED_TIMERS ldx #$ff lda TED_CHARGEN_ADDR and #FORCE_SINGLE_CLOCK pha bne :+ lda #FORCE_SINGLE_CLOCK php sei ora TED_CHARGEN_ADDR sta TED_CHARGEN_ADDR plp : stx TED_COUNTER1_LO stx TED_COUNTER1_HI stx TED_COUNTER2_LO stx TED_COUNTER2_HI pla bne :+ lda #.lobyte(~FORCE_SINGLE_CLOCK) php sei and TED_CHARGEN_ADDR sta TED_CHARGEN_ADDR plp : .else jsr readcycles sta prvcycslo stx prvcycsmid sty prvcycshi .endif .else lda #$ff sta CIA2_TA_LO sta CIA2_TA_HI sta CIA2_TB_LO sta CIA2_TB_HI lda #FORCE_LOAD | CONTINUOUS | COUNT_TA_UNDF | TIMER_START sta CIA2_CRB lda CIA2_CRA and #.lobyte(~(COUNT_CNT | ONE_SHOT)) ora #FORCE_LOAD | CONTINUOUS | TIMER_START sta CIA2_CRA .endif rts ; in: x/y - number of bytes transferred printstat: .if PLATFORM = diskio::platform::COMMODORE_16 stx statxbuf sty statybuf .if COUPLED_TIMERS lda TED_CHARGEN_ADDR and #FORCE_SINGLE_CLOCK pha bne :+ lda #FORCE_SINGLE_CLOCK php sei ora TED_CHARGEN_ADDR sta TED_CHARGEN_ADDR plp : ldy TED_COUNTER1_HI ldx TED_COUNTER2_HI lda TED_COUNTER1_LO sta :+ + 1 lda TED_COUNTER2_LO cpy TED_COUNTER1_HI bne :- cpx TED_COUNTER2_HI bne :- pha; TED_COUNTER2_LO eor #$ff sbc #70; empirically found offset sta numcycles + $00 txa; TED_COUNTER2_HI eor #$ff sbc #$00 sta numcycles + $01 pla; TED_COUNTER2_LO : sbc #$00; TED_COUNTER1_LO sta numcycles + $02 lda #$00 sta numcycles + $03 pla bne :+ lda #.lobyte(~FORCE_SINGLE_CLOCK) php sei and TED_CHARGEN_ADDR sta TED_CHARGEN_ADDR plp : .else .if NO_SPRITES_OR_IRQ ; no speed measurement without IRQs nor coupled timers rts .endif jsr diffcycles .endif PUSH_MEMCONFIG_AND_ENABLE_ALL_ROM .else; PLATFORM <> diskio::platform::COMMODORE_16 lda #.lobyte(~TIMER_START) and CIA2_CRA sta CIA2_CRA lda #TIMER_STOP sta CIA2_CRB PUSH_MEMCONFIG_AND_ENABLE_ALL_ROM sec lda #$ff - 31; subtract overhead sbc CIA2_TA_LO sta numcycles + $00 lda #$ff sbc CIA2_TA_HI sta numcycles + $01 lda #$ff sbc CIA2_TB_LO sta numcycles + $02 lda #$ff sbc CIA2_TB_HI sta numcycles + $03 stx statxbuf sty statybuf .endif; PLATFORM <> diskio::platform::COMMODORE_16 ; print kB/s figure lda #0 sta DFLTO .if NO_SPRITES_OR_IRQ lda #.lobyte(printstatb) sta IBSOUT lda #.hibyte(printstatb) sta IBSOUT + 1 lda #.lobyte(BITMAP + (8 * (SCREEN_ROWS - 1) * SCREEN_COLUMNS)) pha lda #.hibyte(BITMAP + (8 * (SCREEN_ROWS - 1) * SCREEN_COLUMNS)) pha .else ldx #$00 ldy #$01 jsr setplotxy ; buffer pointer to stats lda POINTERS + $02 pha lda POINTERS + $03 pha .endif statxbuf = * + $01 lda #$00; number of bytes transferred statybuf = * + $01 ldy #$00 jsr GIVAYF; fac#1 = numbytes lda #.lobyte(cyclesperd) ldy #.hibyte(cyclesperd) jsr FMULT; fac#1 *= cycles per 1/10 seconds jsr MOVAF; fac#2 = fac#1 lda numcycles + $00 ora numcycles + $01 ora numcycles + $02 ora numcycles + $03 bne :+ inc numcycles + $00 : INT32TOFAC numcycles; fac#1 = numcycles jsr FDIVT; fac#1 = fac#2 / numcycles jsr FADDH; fac#1 += 0.5 jsr MOVAF; fac#2 = fac#1 ldx #$00 lda #.lobyte(hundred) ldy #.hibyte(hundred) jsr FDIVM; fac#1 = fac#2 / 100 ; fac#1 = cyclespersecond * numbytes / numcycles / 1000 jsr FOUT ; truncate to 2 decimals (floored rounding) ldy #$00 : lda FBUFFR + 1,y beq :+ iny cmp #'.' bne :- iny iny : lda #0 sta FBUFFR + 1,y .if !NO_SPRITES_OR_IRQ sty statlen .endif ; restore pointer to sprite bitmap pla sta POINTERS + 3 pla sta POINTERS + 2 ldx #TESTNAMEPOS; num chars lda statxbuf ora statybuf beq :+ ldx #.lobyte(FBUFFR + 1) ldy #.hibyte(FBUFFR + 1) jsr plottext ldx #.lobyte(kbstext) ldy #.hibyte(kbstext) jsr plottext .if NO_SPRITES_OR_IRQ : .else; NO_SPRITES_OR_IRQ sec lda #TESTNAMEPOS; num chars statlen = * + 1 sbc #0 sbc #5; length of " kB/s" tax beq :++ bmi :++ : lda #' ' jsr BSOUT dex bne :- : lda bsout + 1 sta IBSOUT lda bsout + 2 sta IBSOUT + 1 lda statxbuf ora statybuf beq nokbscons CONSOLE kbsspcmsg CONSOLE FBUFFR + 1 CONSOLE kbscoltext .if PLATFORM = diskio::platform::COMMODORE_64 lda PNTR beq :+ cmp #SCREEN_COLUMNS bne :++ : inc consoletime jmp nonewline : .endif nokbscons: CONSOLE returnmsg nonewline: .endif; NO_SPRITES_OR_IRQ lda #.lobyte(printstatc) sta IBSOUT lda #.hibyte(printstatc) sta IBSOUT + 1 POP_MEMCONFIG rts error: sei sta errora + 1 stx errorx + 1 sty errory + 1 DISABLE_MEMCONFIG_CHECK .if PLATFORM = diskio::platform::COMMODORE_16 sta TED_ROM_ENABLE .elseif PLATFORM <> diskio::platform::COMMODORE_128 lda #MEMCONFIG_IO_KERNAL sta IO_PORT .endif; PLATFORM <> diskio::platform::COMMODORE_128 tsx dex dex txs pla sec sbc #$02 sta erroraddrl + 1 pla cli sbc #$00 sta erroraddrh + 1 errora: lda #$00 errorx: ldx #$00 errory: ldy #$00 ; print error message lsr putchar + 1 jsr prntmsgadr lda bsout + 1 sta IBSOUT lda bsout + 2 sta IBSOUT + 1 jsr timestamp lda #PETSCII_RED jsr BSOUT sec ror putchar + 1 lda errora + 1 ldx errorx + 1 ldy errory + 1 jsr prntmsgadr .if PLATFORM = diskio::platform::COMMODORE_128 jsr SWAPPER jsr timestamp lda #PETSCII_RED jsr BSOUT sec ror putchar + 1 lda errora + 1 ldx errorx + 1 ldy errory + 1 jsr prntmsgadr .endif; PLATFORM = diskio::platform::COMMODORE_128 errorhalt: jsr waitvbl php sei lda #COLOUR_RED sta BORDERCOLOUR sta bordercol + 1 plp lda #.lobyte(~MULTICOLOUR_MODE) .if PLATFORM = diskio::platform::COMMODORE_16 and TED_CTRL2 sta TED_CTRL2 .else and VIC2_CTRL2 sta VIC2_CTRL2 .endif errorhaltl: ldy #12 : jsr waitvbl dey bne :- lda #COLOUR_RED ^ COLOUR_BLACK eor BORDERCOLOUR php sei sta BORDERCOLOUR sta bordercol + 1 plp .if PLATFORM = diskio::platform::COMMODORE_128 lda #VRT : bit VDC_SR beq :- lda #FG_BG sta VDC_CR lda #RED : bit VDC_SR; wait until update ready bpl :- eor VDC_DR sta VDC_DR .endif; PLATFORM = diskio::platform::COMMODORE_128 jmp errorhaltl .if PLATFORM = diskio::platform::COMMODORE_128 : jsr bsout ldx dualheadx + 1 rts dualhead: stx dualheadx + 1 ldx DFLTO cpx #8 bcs :- sta :+ + 1 jsr bsout jsr SWAPPER : lda #0 jsr bsout jsr SWAPPER dualheadx: ldx #0 rts .endif; PLATFORM = diskio::platform::COMMODORE_128 consoleout: .if PLATFORM = diskio::platform::COMMODORE_128 tax pha tya pha lda consoletime pha txa jsr doconsout jsr SWAPPER pla sta consoletime pla tay pla jsr doconsout jmp SWAPPER doconsout: .endif; PLATFORM = diskio::platform::COMMODORE_128 sta POINTERS + $00 sty POINTERS + $01 PUSH_MEMCONFIG_AND_ENABLE_ALL_ROM lda #DEVICE_SCREEN sta DFLTO lda #$00 sta QTSW; disable quote mode consoletime = * + $01 lda #$00 beq notimestmp; don't print timestamp if 0 lda #$00 sta consoletime jsr timestamp notimestmp: .if PLATFORM = diskio::platform::COMMODORE_128 lda #BANK_0 | SYSTEM_ROM | BASIC_HI | LOW_RAM | IO_SPACE sta MMU_CR .elseif PLATFORM <> diskio::platform::COMMODORE_16 lda #MEMCONFIG_IO_KERNAL sta IO_PORT .endif ldy #$00 : lda (POINTERS + $00),y beq :++ pha jsr BSOUT pla cmp #PETSCII_RETURN bne :+ inc consoletime : iny bne :-- : POP_MEMCONFIG rts timestamp: lda #$00 sta QTSW; disable quote mode lda PNTR beq :+ .if PLATFORM = diskio::platform::COMMODORE_64 cmp #SCREEN_COLUMNS beq :+ .endif lda #PETSCII_RETURN jsr BSOUT : lda #PETSCII_LIGHTBLUE jsr BSOUT .if PLATFORM = diskio::platform::COMMODORE_16 lda tod_hrs .else lda #%00011111 and CIA1_TOD_HRS prevhours: cmp #$00 sta prevhours + 1 bcs :+ lda #$12 php sei sed adc hoursbase + 1 plp sta hoursbase + 1 lda prevhours + 1 : clc php sei sed hoursbase: adc #$00 plp cmp #0 .endif beq :+ jsr putconbyte lda #':' jsr BSOUT : .if PLATFORM = diskio::platform::COMMODORE_16 lda tod_mins .else lda CIA1_TOD_MIN .endif jsr putconbyte lda #':' jsr BSOUT .if PLATFORM = diskio::platform::COMMODORE_16 lda tod_secs .else lda CIA1_TOD_SEC .endif jsr putconbyte .if PLATFORM <> diskio::platform::COMMODORE_16 bit CIA1_TOD_10S; to free the latch .endif lda #'.' jsr BSOUT .if PLATFORM = diskio::platform::COMMODORE_16 lda tod_10s .else lda CIA1_TOD_10S .endif jsr putconibbl lda #' ' jmp BSOUT putconword: txa pha tya jsr putconbyte pla putconbyte: tax lsr lsr lsr lsr cmp #10 bcc :+ adc #'a' - '0' - 10 - 1 : adc #'0' jsr BSOUT txa putconibbl: and #%00001111 cmp #10 bcc :+ adc #'a' - '0' - 10 - 1 : adc #'0' jmp BSOUT prntmsgadr: cmp #ERRBRKOPC beq :+ sec; with address SKIPBYTE printmsg: clc sta printa : stx printx sty printy tax lda errormsgsl,x sta POINTERS + $00 lda errormsgsh,x sta POINTERS + $01 lda putchar + 1 bmi :+ lda #.lobyte(BITMAP) sta POINTERS + $02 lda #.hibyte(BITMAP) sta POINTERS + $03 lda #$00 tay clearline: sta BITMAP + $00,y sta BITMAP + $40,y iny bne clearline lda #1 : sta putchar + 1 tay bne :+ .if PLATFORM = diskio::platform::COMMODORE_16 lda TED_SCREEN_ADDR and #.lobyte(~SCREEN_ADDR_MASK) ora #MAKE_SCREEN_ADDR($0800) sta TED_SCREEN_ADDR lda #.hibyte($0c00) .else lda #VIC2_MAKE_ADDR($0400, CHARSET_ADDR_UPPERLOWER) sta VIC2_ADDR lda #.hibyte($0400) .endif sta POINTERS + $03 : .if PLATFORM = diskio::platform::COMMODORE_16 PUSH_MEMCONFIG_AND_ENABLE_ALL_ROM .elseif PLATFORM = diskio::platform::COMMODORE_128 lda #BANK_0 | SYSTEM_ROM | BASIC_HI | LOW_RAM | RAM_ROM bit putchar + 1 bpl :+ lda #BANK_0 | SYSTEM_ROM | BASIC_HI | LOW_RAM | IO_SPACE : sta MMU_CR .else; PLATFORM <> diskio::platform::COMMODORE_128 lda #IO_PORT_DIRECTION_DEFAULT sta IO_PORT_DIRECTION lda #MEMCONFIG_IO_KERNAL sta IO_PORT .endif; PLATFORM <> diskio::platform::COMMODORE_128 txa pha eor #MSGUNINST beq doprintmsg bcc :+ lda #'@' jsr putchar erroraddrh: lda #$00 jsr puthex erroraddrl: lda #$00 jsr puthexnum lda #' ' jsr putchar : lda #'A' jsr putchar lda #'=' jsr putchar printa = * + 1 lda #0 jsr puthex lda #' ' jsr putchar lda #'X' jsr putchar lda #'=' jsr putchar printx = * + 1 lda #$00 jsr puthex lda #' ' jsr putchar lda #'Y' jsr putchar lda #'=' jsr putchar printy = * + 1 lda #$00 jsr puthex lda #':' jsr putchar lda #' ' jsr putchar lda #$00 sta doprintmsg + 1 doprintmsg: ldy #$00 lda (POINTERS + $00),y beq :+ jsr putchar inc doprintmsg + 1 bne doprintmsg : pla cmp #ERRBRKOPC bne :+ brkaddrhi = * + $01 lda #$00 jsr puthexnum brkaddrlo = * + $01 lda #$00 jsr puthexnum lda #'.' jsr putchar : .if PLATFORM = diskio::platform::COMMODORE_16 POP_MEMCONFIG .elseif PLATFORM = diskio::platform::COMMODORE_128 lda #BANK_0 | SYSTEM_ROM | BASIC_HI | LOW_RAM | IO_SPACE sta MMU_CR .else; PLATFORM <> diskio::platform::COMMODORE_128 lda #MEMCONFIG_IO_KERNAL sta IO_PORT .endif; PLATFORM <> diskio::platform::COMMODORE_128 rts tohex: tay lsr lsr lsr lsr cmp #10 bcc :+ adc #.lobyte('a' - '0' + $80 - 10 - 1) : adc #'0' tax tya and #%00001111 cmp #10 bcc :+ adc #.lobyte('a' - '0' + $80 - 10 - 1) : adc #'0' rts puthex: tax lda #'$' jsr putchar txa puthexnum: jsr tohex pha txa jsr putchar pla putchar: ldy #$00 bpl :+ jmp bsout : jsr petsciiscr ldy putchar + 1 bne plotbitmap ; print char to screen sta (POINTERS + $02),y lda POINTERS + $03 pha and #%00000011 .if PLATFORM = diskio::platform::COMMODORE_16 ora #.hibyte($0800) sta POINTERS + $03 lda #COLOUR_WHITE | INTENSITY_7 sta (POINTERS + $02),y .elseif PLATFORM = diskio::platform::COMMODORE_128 ora #.hibyte(VIC2_COLOURRAM) sta POINTERS + $03 lda MMU_CR pha lda #BANK_0 | SYSTEM_ROM | BASIC_HI | LOW_RAM | IO_SPACE sta MMU_CR lda #COLOUR_WHITE sta (POINTERS + $02),y pla sta MMU_CR .else; PLATFORM <> diskio::platform::COMMODORE_128 ora #.hibyte(VIC2_COLOURRAM) sta POINTERS + $03 lda IO_PORT pha lda #MEMCONFIG_IO sta IO_PORT lda #COLOUR_WHITE sta (POINTERS + $02),y pla sta IO_PORT .endif; PLATFORM <> diskio::platform::COMMODORE_128 pla sta POINTERS + $03 inc POINTERS + $02 rts ; plot char to bitmap plotbitmap: .if PLATFORM = diskio::platform::COMMODORE_64 tay lda IO_PORT pha lda #MEMCONFIG_CHARGEN sta IO_PORT tya .endif ldy #$00 sty POINTERS + $05 asl rol POINTERS + $05 asl rol POINTERS + $05 asl rol POINTERS + $05 sta POINTERS + $04 lda #.hibyte(ROM_CHARSET_UPLOW) adc POINTERS + $05 sta POINTERS + $05 ldy #$07 : lda (POINTERS + $04),y sta (POINTERS + $02),y dey bpl :- clc lda #$08 adc POINTERS + $02 sta POINTERS + $02 bcc :+ inc POINTERS + $03 : .if PLATFORM = diskio::platform::COMMODORE_64 pla sta IO_PORT .endif rts ; in: a - length in pages ; x - destination hibyte memclear: stx POINTERS + $01 ldy #$00 sty POINTERS + $00 tax PUSH_MEMCONFIG_AND_ENABLE_ALL_RAM tya memclrlp: sta (POINTERS + $00),y iny bne memclrlp inc POINTERS + $01 dex bne memclrlp POP_MEMCONFIG rts ; in: a - length in pages ; x - source hibyte ; y - destination hibyte memcopy: stx POINTERS + $01 sty POINTERS + $03 ldy #$00 sty POINTERS + $00 sty POINTERS + $02 tax memcpylp: lda (POINTERS + $00),y sta (POINTERS + $02),y iny bne memcpylp inc POINTERS + $01 inc POINTERS + $03 dex bne memcpylp rts .import __SWAPBUFFER_LOAD__ .pushseg .segment "SWAPBUFFER" .popseg .if VERIFY COMPDATA = __SWAPBUFFER_LOAD__ COMPBMP = COMPDATA verifyfail: tya jsr tohex sta verifysrc + $03 stx verifysrc + $02 sta verifydest + $03 stx verifydest + $02 lda POINTERS + $02 jsr tohex sta verifysrc + $01 stx verifysrc + $00 lda POINTERS + $04 jsr tohex sta verifydest + $01 stx verifydest + $00 pla pla lda #MSGVERIFAIL jmp error piccopy: .if LOAD_TO_UPPER_MEM PUSH_MEMCONFIG_AND_ENABLE_ALL_RAM .endif MEMCOPY BITMAP, COMPBMP, ALIGN BITMAP_SIZE, $0100 .if LOAD_TO_UPPER_MEM POP_MEMCONFIG .endif rts piccomp: .if LOAD_TO_UPPER_MEM PUSH_MEMCONFIG_AND_ENABLE_ALL_RAM .endif MEMCOMP BITMAP, COMPBMP, ALIGN BITMAP_SIZE, $0100 .if LOAD_TO_UPPER_MEM php pla tax POP_MEMCONFIG txa pha plp .endif rts ; in: POINTERS + $00 - lobyte of length ; a - hibyte of length ; x - memory area 1 hibyte ; y - memory area 2 hibyte memcomp: stx POINTERS + $02 sty POINTERS + $04 ldy #$00 sty POINTERS + $01 sty POINTERS + $03 tax memcmplp: lda (POINTERS + $01),y cmp (POINTERS + $03),y bne memcmpne iny bne memcmplp inc POINTERS + $02 inc POINTERS + $04 dex bne memcmplp lda POINTERS + $00 beq memcmpne memcmpl1: lda (POINTERS + $01),y cmp (POINTERS + $03),y bne memcmpne iny cpy POINTERS + $00 bne memcmpl1 memcmpne: rts .endif; VERIFY plothex: pha lsr lsr lsr lsr cmp #10 bcc :+ adc #'a' - '0' - 10 - 1 : adc #'0' jsr BSOUT pla plotbyte: and #%00001111 cmp #10 bcc :+ adc #'a' - '0' - 10 - 1 : adc #'0' jmp BSOUT plottext: PUSH_MEMCONFIG_AND_ENABLE_ALL_ROM stx POINTERS + $00 sty POINTERS + $01 ldy #$00 plotloop: lda (POINTERS + $00),y beq plotend jsr petsciiscr cmp #$1f; scrcode "_" fix bne :+ lda #$64 : jsr BSOUT iny bne plotloop plotend: POP_MEMCONFIG rts petsciiscr: ; convert to screen code cmp #$60 bcc :+ and #%01011111 SKIPWORD : and #%00111111 rts printword: .if PLATFORM = diskio::platform::COMMODORE_128 pha ENABLE_ALL_ROM pla tay txa pha tya pha .endif; PLATFORM = diskio::platform::COMMODORE_128 jsr LINPRT .if PLATFORM = diskio::platform::COMMODORE_128 jsr SWAPPER pla tay pla tax tya jsr LINPRT jsr SWAPPER lda #BANK_0 | SYSTEM_ROM | BASIC_HI | LOW_RAM | IO_SPACE sta MMU_CR .endif; PLATFORM = diskio::platform::COMMODORE_128 rts .if PLATFORM = diskio::platform::COMMODORE_16 setplotxy: txa pha lda #.lobyte(COLRAM + $0fe8) ldx #.hibyte(COLRAM + $0fe8) cpy #$00 beq :+ ; second stats char line lda #.lobyte(COLRAM + $0c10) ldx #.hibyte(COLRAM + $0c10) : sta POINTERS + $02 stx POINTERS + $03 pla clc adc POINTERS + $02 sta POINTERS + $02 bcc :+ inc POINTERS + $03 : rts .if NO_SPRITES_OR_IRQ printstatb: stx printxbuf sty printybuf jsr plotbitmap printxbuf = * + $01 ldx #$00 jmp printstatr .endif printstatc: sty printybuf pha lda DFLTO beq :+ pla bsout: jmp $00 : pla ldy #$00 sta (POINTERS + $02),y inc POINTERS + $02 bne :+ inc POINTERS + $03 : printstatr: printybuf = * + $01 ldy #$00 clc rts .else; PLATFORM <> diskio::platform::COMMODORE_16 setplotxy: clc lda plotxposlo,x adc plotypos,y sta POINTERS + $02 lda plotxposhi,x sta POINTERS + $03 rts plotxposlo: .lobytes SPRITES + $0000, SPRITES + $0001, SPRITES + $0002 .lobytes SPRITES + $0040, SPRITES + $0041, SPRITES + $0042 .lobytes SPRITES + $0080, SPRITES + $0081, SPRITES + $0082 .lobytes SPRITES + $00c0, SPRITES + $00c1, SPRITES + $00c2 .lobytes SPRITES + $0100, SPRITES + $0101, SPRITES + $0102 .lobytes SPRITES + $0140, SPRITES + $0141, SPRITES + $0142 .lobytes SPRITES + $0180, SPRITES + $0181, SPRITES + $0182 .lobytes SPRITES + $01c0, SPRITES + $01c1, SPRITES + $01c2 plotxposhi: .hibytes SPRITES + $0000, SPRITES + $0001, SPRITES + $0002 .hibytes SPRITES + $0040, SPRITES + $0041, SPRITES + $0042 .hibytes SPRITES + $0080, SPRITES + $0081, SPRITES + $0082 .hibytes SPRITES + $00c0, SPRITES + $00c1, SPRITES + $00c2 .hibytes SPRITES + $0100, SPRITES + $0101, SPRITES + $0102 .hibytes SPRITES + $0140, SPRITES + $0141, SPRITES + $0142 .hibytes SPRITES + $0180, SPRITES + $0181, SPRITES + $0182 .hibytes SPRITES + $01c0, SPRITES + $01c1, SPRITES + $01c2 plotypos: .byte $00 * $03, $08 * $03, $10 * $03 .if NO_SPRITES_OR_IRQ printstatb: sta POINTERS + $05 txa pha tya pha .if PLATFORM = diskio::platform::COMMODORE_128 lda MMU_CR pha lda #BANK_0 | SYSTEM_ROM | BASIC_HI | LOW_RAM | RAM_ROM sta MMU_CR .else; PLATFORM <> diskio::platform::COMMODORE_128 lda IO_PORT pha lda #MEMCONFIG_CHARGEN sta IO_PORT .endif; PLATFORM <> diskio::platform::COMMODORE_128 lda POINTERS + $05 jsr plotbitmap jmp printstatr .endif printstatc: sta POINTERS + $05 lda DFLTO beq :+ lda POINTERS + $05 bsout: jmp $00 : txa pha tya pha .if PLATFORM = diskio::platform::COMMODORE_128 lda MMU_CR pha lda #BANK_0 | SYSTEM_ROM | BASIC_HI | LOW_RAM | RAM_ROM sta MMU_CR .else; PLATFORM <> diskio::platform::COMMODORE_128 lda IO_PORT pha lda #MEMCONFIG_CHARGEN sta IO_PORT .endif; PLATFORM <> diskio::platform::COMMODORE_128 lda POINTERS + $05 ldy #$00 sty POINTERS + $05 asl rol POINTERS + $05 asl rol POINTERS + $05 asl sta POINTERS + $04 lda POINTERS + $05 rol adc #.hibyte(CHARSET_ADDR_UPPERLOWER) sta POINTERS + $05 ldx #$08 : lda (POINTERS + $04),y sta (POINTERS + $02),y iny inc POINTERS + $02 inc POINTERS + $02 dex bne :- lda POINTERS + $02 sbc #$0e sta POINTERS + $02 and #%00111111 cmp #$03 beq :+ cmp #$03 + $08 * 3 bne :++ : lda #$40 - 3 - 1 adc POINTERS + $02 sta POINTERS + $02 bcc :+ inc POINTERS + $03 : printstatr: pla .if PLATFORM = diskio::platform::COMMODORE_128 sta MMU_CR .else; PLATFORM <> diskio::platform::COMMODORE_128 sta IO_PORT .endif; PLATFORM <> diskio::platform::COMMODORE_128 pla tay pla tax rts .endif; PLATFORM <> diskio::platform::COMMODORE_16 .if PLATFORM = diskio::platform::COMMODORE_16 ramirq: pha txa pha tya pha sta TED_ROM_BANK_0 tsx inx inx inx inx lda STACK,x and #BREAK bne :+ jmp (CINV) : jmp (CBINV) clockirq: LOADER_IRQ_HANDLER_PROLOGUE jsr update_clk jmp irqendx ; IRQ handler to switch on bitmap mode after the upper border area irq0: LOADER_IRQ_HANDLER_PROLOGUE lda #INVALID_MODE | DISPLAY_ENABLE | LINES_25 | SCROLLY_3 sta TED_CTRL1; set scrolly consolswtc: lda #0 beq :+ ; display console lda #CHARSET_BITMAP_IN_ROM ora TED_BITMAP_ADDR tax lda TED_SCREEN_ADDR and #.lobyte(~SCREEN_ADDR_MASK) ora #MAKE_SCREEN_ADDR($0c00) ldy #TEXT_MODE | DISPLAY_ENABLE | LINES_25 | SCROLLY_3 bne :++ : lda #.lobyte(~(CHARSET_BITMAP_IN_ROM)) and TED_BITMAP_ADDR tax lda TED_SCREEN_ADDR and #.lobyte(~SCREEN_ADDR_MASK) ora #MAKE_SCREEN_ADDR(COLRAM) ldy #BITMAP_MODE | DISPLAY_ENABLE | LINES_25 | SCROLLY_3 : stx TED_BITMAP_ADDR sta TED_SCREEN_ADDR : lda TED_RASTERLINE_MSB lsr bcs :- lda #$01 : cmp TED_RASTERLINE bcs :- nop nop STABILIZE_RASTER ldx #$07 : dex bne :- sty TED_CTRL1; disable invalid mode lda #.lobyte(SCREEN_SIZE) sta TED_CURSOR_LO lda #.hibyte(SCREEN_SIZE) sta TED_CURSOR_HI lda #.lobyte(~IRQ_RASTERLINE_MSB) and TED_IMR sta TED_IMR ldx #1 lda consolswtc + 1 beq :+ dex stx BORDERCOLOUR : stx setborder + 1 txa beq :+ lda bordercol + 1 cmp BORDERCOLOUR beq :+ sta BORDERCOLOUR : ; the last piture display line is 200 + 3 - 1 = 202 ($ca), ; at the end of it, set the raster count back ; to 203 - 17 = 186 = $ba (NTSC) or ; to 203 - 33 = 170 = $aa (PAL) sec lda #$c7 sbc IRQSLACK ldx #.lobyte(irq1) ldy #.hibyte(irq1) jmp irqend ; IRQ handler to extend the screen irq1: LOADER_IRQ_HANDLER_PROLOGUE lda #$b0 sta TED_CURSOR_LO lda #$00 sta TED_CURSOR_HI lda #$10; NTSC ldx palntsc beq :+ lda #$18; PAL : sta lineoffset lda #$c9 : cmp TED_RASTERLINE bcs :- ; $ca nop nop STABILIZE_RASTER inc TED_CTRL1 lda TED_SCREEN_ADDR and #.lobyte(~SCREEN_ADDR_MASK) ora #MAKE_SCREEN_ADDR(COLRAM + $0800) sta TED_SCREEN_ADDR sec lda TED_RASTERLINE; $ca lineoffset = * + 1 sbc #$00; $10 (NTSC) or $18 (PAL) sta TED_RASTERLINE ldx #$08 : dex bne :- lda #CHARSET_BITMAP_IN_ROM ora TED_BITMAP_ADDR sta TED_BITMAP_ADDR lda #INVALID_MODE | DISPLAY_ENABLE | LINES_25 | SCROLLY_4 sta TED_CTRL1; hide garbage lda TED_CHARGEN_ADDR and #.lobyte(~CHARGEN_ADDR_MASK) ora #MAKE_CHARGEN_ADDR(CHARSET_ADDR_UPPERLOWER) sta TED_CHARGEN_ADDR lda #TEXT_MODE | DISPLAY_ENABLE | LINES_25 | SCROLLY_4 sta TED_CTRL1; switch to text mode lda #$07 ora TED_VERTSUBCOUNT sta TED_VERTSUBCOUNT lda #.lobyte(~MULTICOLOUR_MODE) and TED_CTRL2 sta TED_CTRL2 sec lda #$da sbc lineoffset; PAL: $da - $18 = $c2 ldx IRQSLACK bne :+ sbc IRQSLACK ldx #.lobyte(irq2) ldy #.hibyte(irq2) jmp irqend : cmp TED_RASTERLINE bcs :- jmp irq2main ; this handler is called just before the 2nd extra char row has finished displaying irq2: LOADER_IRQ_HANDLER_PROLOGUE irq2main: lda TED_CHARGEN_ADDR and #.lobyte(~CHARGEN_ADDR_MASK) ora #MAKE_CHARGEN_ADDR(COLRAM + $0c00) tax sec lda #$db sbc lineoffset tay lda palntsc bne :+++; branch if PAL ; NTSC : cpy TED_RASTERLINE bcs :- nop nop STABILIZE_RASTER lda #INVALID_MODE | DISPLAY_ENABLE | LINES_24 | SCROLLY_4 sta TED_CTRL1; open border ldy #$06 : dey bne :- nop lda #.lobyte(~CHARSET_BITMAP_IN_ROM) and TED_BITMAP_ADDR jmp :+++ : lda #.lobyte(~CHARSET_BITMAP_IN_ROM) and TED_BITMAP_ADDR : cpy TED_RASTERLINE bcs :- : stx TED_CHARGEN_ADDR sta TED_BITMAP_ADDR lda palntsc beq ntscborder lda TED_CHARGEN_ADDR and #.lobyte(~CHARGEN_ADDR_MASK) ora #MAKE_CHARGEN_ADDR(COLRAM + $0c00) sta TED_CHARGEN_ADDR lda #$ca ldx IRQSLACK bne :+ sec sbc IRQSLACK ldx #.lobyte(irq3) ldy #.hibyte(irq3) jmp irqend : cmp TED_RASTERLINE bcs :- jmp irq3main ; this handler is called just before the 3rd extra char row has finished displaying irq3: LOADER_IRQ_HANDLER_PROLOGUE irq3main: lda #FORCE_SINGLE_CLOCK ora TED_CHARGEN_ADDR sta TED_CHARGEN_ADDR lda #$ca : cmp TED_RASTERLINE bcs :- lda #INVALID_MODE | DISPLAY_ENABLE | LINES_24 | SCROLLY_4 sta TED_CTRL1; open border lda TED_RASTERLINE : cmp TED_RASTERLINE beq :- nop STABILIZE_RASTER ntscborder: lda TED_SCREEN_ADDR and #.lobyte(~SCREEN_ADDR_MASK) ora #MAKE_SCREEN_ADDR(COLRAM) sta TED_SCREEN_ADDR lda #.lobyte(~CHARSET_BITMAP_IN_ROM) and TED_BITMAP_ADDR sta TED_BITMAP_ADDR lda palntsc bne :++ ldx #$08 : dex bne :- : clc lda lineoffset adc TED_RASTERLINE sta TED_RASTERLINE jsr update_clk lda TED_CHARGEN_ADDR and #.lobyte(~(CHARGEN_ADDR_MASK | FORCE_SINGLE_CLOCK)) ora #MAKE_CHARGEN_ADDR(COLRAM + $0c00) tax lda #ALL_COLUMNS sta PIO_KEYBOARD_COLUMN sta TED_KEYBOARD_LATCH lda TED_KEYBOARD_LATCH eor #NO_ROWS sta consolswtc + 1 beq :+ lda TED_CHARGEN_ADDR and #.lobyte(~CHARGEN_ADDR_MASK) ora #MAKE_CHARGEN_ADDR(CHARSET_ADDR_UPPERLOWER) tax : stx TED_CHARGEN_ADDR lda IRQSLACK beq :++ lda #IRQ_RASTERLINE_MSB ora TED_IMR sta TED_IMR sec lda palntsc bne :+ lda #.lobyte(DISPLAY_LINES_NTSC) SKIPWORD : lda #.lobyte(DISPLAY_LINES_PAL) sbc IRQSLACK : ldx #.lobyte(irq0) ldy #.hibyte(irq0) irqend: sta TED_IRQ_RASTERLINE stx CINV sty CINV + 1 irqendx: lda #RASTER_IRQ sta TED_IRR irqendy: memcfgchks = * + $01 ldx #0 beq memchkok .if !LOAD_VIA_KERNAL_FALLBACK lda TED_CHARGEN_ADDR lsr bcc memchkok rol tax tay lda #MSGINVMCONF jmp error .endif memchkok: LOADER_IRQ_HANDLER_EPILOGUE pla tay pla tax pla rti update_clk: .if COUPLED_TIMERS = 0 jsr readctrfix tya pha txa pha sec lda prevctr3lo stx :+ + 1 : sbc #$00 tax lda prevctr3hi sty :+ + 1 : sbc #$00 tay txa clc adc cycles_lo sta cycles_lo tya adc cycles_mid sta cycles_mid bcc :+ inc cycles_hi : pla sta prevctr3lo pla sta prevctr3hi .endif; COUPLED_TIMERS = 0 sed ldx #$00 clc lda #$01 adc tod_frames sta tod_frames ldy palntsc beq :+ cmp #5 jmp :++ : cmp #6 : bne tod_done stx tod_frames clc lda #$01 adc tod_10s sta tod_10s cmp #$10 bne tod_done stx tod_10s clc lda #$01 adc tod_secs sta tod_secs cmp #$60 bne tod_done stx tod_secs clc lda #$01 adc tod_mins sta tod_mins cmp #$60 bne tod_done stx tod_mins clc lda #$01 adc tod_hrs sta tod_hrs tod_done: cld rts .if COUPLED_TIMERS = 0 readctr: ldy TED_COUNTER3_HI ldx TED_COUNTER3_LO cpy TED_COUNTER3_HI bne readctr rts readctrfix: lda TED_CHARGEN_ADDR and #FORCE_SINGLE_CLOCK pha bne :+ lda #FORCE_SINGLE_CLOCK php sei ora TED_CHARGEN_ADDR sta TED_CHARGEN_ADDR plp : ldx TED_COUNTER3_LO ldy TED_COUNTER3_HI cpx TED_COUNTER3_LO bcs :+ ldx TED_COUNTER3_LO ldy TED_COUNTER3_HI nop jmp :++ : txa sbc #$0e tax tya sbc #$00 tay : pla bne :+ lda #.lobyte(~FORCE_SINGLE_CLOCK) php sei and TED_CHARGEN_ADDR sta TED_CHARGEN_ADDR plp : rts readcycles: lda cycles_hi sta cycshibuf lda cycles_mid sta cycsmidbuf lda prevctr3lo sta prevctr3lb lda prevctr3hi sta prevctr3hb jsr readctr; counter runs backwards stx ctr3lobuf sty ctr3hibuf ldx cycles_lo cycsmidbuf = * + $01 lda #$00 cmp cycles_mid bne readcycles cycshibuf = * + $01 lda #$00 cmp cycles_hi bne readcycles stx cycslobuf sec prevctr3lb = * + $01 lda #$00 ctr3lobuf = * + $01 sbc #$00 tax prevctr3hb = * + $01 lda #$00 ctr3hibuf = * + $01 sbc #$00 tay clc txa cycslobuf = * + $01 adc #$00 pha tya adc cycsmidbuf tax lda #$00 adc cycshibuf tay pla rts docalibrte: jsr calibinits nop; ldx #byteslo nop; ldy #byteshi nop; jsr printstat nop nop nop; stx statxbuf nop nop; sty statybuf nop nop; jsr diffcycles nop nop ; fall through diffcycles: jsr readcycles sec sbc prvcycslo sta numcycles + $00 txa sbc prvcycsmid sta numcycles + $01 tya sbc prvcycshi sta numcycles + $02 lda #$00 sta numcycles + $03 sec lda numcycles + $00 adjustdiff = * + $01 sbc #$00 sta numcycles + $00 bcs :+ lda numcycles + $01 dec numcycles + $01 tax bne :+ lda numcycles + $02 dec numcycles + $02 tax bne :+ dec numcycles + $03 : rts .endif; COUPLED_TIMERS = 0 .else; PLATFORM <> diskio::platform::COMMODORE_16 ramirq: pha txa tsx pha tya pha .if PLATFORM = diskio::platform::COMMODORE_128 lda MMU_CR pha lda #BANK_0 | SYSTEM_ROM | BASIC_HI | BASIC_LO | IO_SPACE sta MMU_CR .endif; PLATFORM = diskio::platform::COMMODORE_128 inx inx lda STACK,x and #FLAG_B bne :+ jmp (CINV) : jmp (CBINV) consoleirq: .if PLATFORM <> diskio::platform::COMMODORE_128 lda IO_PORT pha lda #MEMCONFIG_IO sta IO_PORT .endif; PLATFORM <> diskio::platform::COMMODORE_128 lda #0 sta BORDERCOLOUR lda #TEXT_MODE | DISPLAY_ENABLE | LINES_25 | SCROLLY_3; $3b sta VIC2_CTRL1; set 25 rows bit ldx #VIC2_MAKE_ADDR($0400, CHARSET_ADDR_UPPERLOWER) bit drivetype bpl :++; branch if not generic drive ; KERNAL fallback active ; note: this may glitch due to a race condition, the KERNAL ROM's serial bus code does ; things like lda $dd00 : and/ora #value : sta $dd00, which may be interrupted ; between lda and sta by this IRQ, thus setting the previous VIC bank again lda CIA2_PRA and #.lobyte(~VIC2_BANK) ora #VIC2_MAKE_BANK $0400 tay lda #$09 - 1 : cmp VIC2_RASTERLINE bcs :- stx VIC2_ADDR sty CIA2_PRA .if PLATFORM = diskio::platform::COMMODORE_128 lda #IO_PORT_CHARGEN_ENABLED sta IO_PORT .endif; PLATFORM = diskio::platform::COMMODORE_128 jmp :++ : stx VIC2_ADDR SET_VIC_BANK VIC2_MAKE_BANK $0400 .if PLATFORM = diskio::platform::COMMODORE_128 lda #IO_PORT_CHARGEN_ENABLED sta IO_PORT .endif; PLATFORM = diskio::platform::COMMODORE_128 : .if !LOAD_TO_UPPER_MEM jmp prepirq .else ; LOAD_TO_UPPER_MEM sec lda #$f8 sbc IRQSLACK ldx #.lobyte(irq1) ldy #.hibyte(irq1) jmp irqend ; IRQ handler to switch back the bank setting, ; needed because the sprites are in another ; VIC bank than the bitmap irq0: .if PLATFORM <> diskio::platform::COMMODORE_128 lda IO_PORT pha lda #MEMCONFIG_IO sta IO_PORT .endif; PLATFORM <> diskio::platform::COMMODORE_128 lda #VIC2_MAKE_ADDR COLRAM, BITMAP sta VIC2_ADDR SET_VIC_BANK VIC2_MAKE_BANK BITMAP sec lda #$f8 sbc IRQSLACK ldx #.lobyte(irq1) ldy #.hibyte(irq1) jmp irqend .endif; LOAD_TO_UPPER_MEM ; IRQ handler to open the y-border irq1: .if PLATFORM <> diskio::platform::COMMODORE_128 lda IO_PORT pha lda #MEMCONFIG_IO sta IO_PORT .endif; PLATFORM <> diskio::platform::COMMODORE_128 .if USE_2_MHZ lda VIC2_C128_CLOCK pha lda #0 sta VIC2_C128_CLOCK .endif lda #$f8 : bit VIC2_CTRL1 bmi :+ cmp VIC2_RASTERLINE bcs :- : lda #.lobyte(~LINES_25) and VIC2_CTRL1 sta VIC2_CTRL1 lda #$f9 : cmp VIC2_RASTERLINE beq :- ldx #VIC2_MAKE_ADDR COLRAM, BITMAP bit drivetype bpl :++; branch if not generic drive ; KERNAL fallback active ; note: this may glitch due to a race condition, the KERNAL ROM's serial bus code does ; things like lda $dd00 : and/ora #value : sta $dd00, which may be interrupted ; between lda and sta by this IRQ, thus setting the previous VIC bank again ldy #$07 : dey bne :- lda CIA2_PRA and #.lobyte(~VIC2_BANK) ora #VIC2_MAKE_BANK BITMAP sta CIA2_PRA jmp :+++ : lda #VIC2_MAKE_BANK BITMAP ldy #$08 : dey bne :- sta CIA2_PRA,y : stx VIC2_ADDR .if PLATFORM = diskio::platform::COMMODORE_128 lda #IO_PORT_CHARGEN_DISABLED sta IO_PORT lda #%11111111 sta VIC2_SPR_ENABLE .endif; PLATFORM = diskio::platform::COMMODORE_128 .if LOAD_TO_UPPER_MEM lda #$fa : bit VIC2_CTRL1 bmi :+ cmp VIC2_RASTERLINE bcs :- : lda #VIC2_MAKE_ADDR SPRITESCR, BITMAP sta VIC2_ADDR bit drivetype bpl :+; branch if not generic drive ; KERNAL fallback active ; note: this may glitch due to a race condition, the KERNAL ROM's serial bus code does ; things like lda $dd00 : and/ora #value : sta $dd00, which may be interrupted ; between lda and sta by this IRQ, thus setting the previous VIC bank again lda CIA2_PRA and #.lobyte(~VIC2_BANK) ora #VIC2_MAKE_BANK SPRITES sta CIA2_PRA jmp :++ : SET_VIC_BANK VIC2_MAKE_BANK SPRITES : .endif .if USE_2_MHZ pla sta VIC2_C128_CLOCK .endif lda #$fb : bit VIC2_CTRL1 bmi :+ cmp VIC2_RASTERLINE bcs :- : lda #BITMAP_MODE | DISPLAY_ENABLE | LINES_25 | SCROLLY_3; $3b sta VIC2_CTRL1; set 25 rows bit lda #SINGLECOLOUR_MODE | COLUMNS_40 | SCROLLX_0; $08 sta VIC2_CTRL2 .if LITTLE_CPU_FOR_LOADER inc BORDERCOLOUR lda #$f5 : cmp VIC2_RASTERLINE bne :- dec BORDERCOLOUR .endif lda #ALL_COLUMNS sta CIA1_PRA lda CIA1_PRB cmp #NO_ROWS beq :++ bit drivetype bpl :+; branch if not generic drive lda #$00 SKIPWORD : lda #$08 ldx #.lobyte(consoleirq) ldy #.hibyte(consoleirq) bne irqend; jmp : lda #1 SKIPWORD prepirq: lda #0 sta setborder + 1 tax beq :+ lda BORDERCOLOUR eor bordercol + 1 and #%00001111 beq :+ lda bordercol + 1 sta BORDERCOLOUR : .if LOAD_TO_UPPER_MEM bit drivetype bmi :+ lda #$01 ldx #.lobyte(irq0) ldy #.hibyte(irq0) bne irqend; jmp : bit VIC2_CTRL1 bpl :- lda #$1c : cmp VIC2_RASTERLINE bcs :- lda #VIC2_MAKE_ADDR COLRAM, BITMAP sta VIC2_ADDR ; KERNAL fallback active ; note: this may glitch due to a race condition, the KERNAL ROM's serial bus code does ; things like lda $dd00 : and/ora #value : sta $dd00, which may be interrupted ; between lda and sta by this IRQ, thus setting the previous VIC bank again lda CIA2_PRA and #.lobyte(~VIC2_BANK) ora #VIC2_MAKE_BANK BITMAP sta CIA2_PRA .endif sec lda #$f8 sbc IRQSLACK ldx #.lobyte(irq1) ldy #.hibyte(irq1) irqend: sta VIC2_RASTERLINE stx CINV + $00 sty CINV + $01 .if KEY_FOR_WATCHDOG lda #ALL_COLUMNS sta CIA1_PRA ldx CIA1_PRB inx beq :++ lda #.lobyte(~(CIA_SERIAL_DATA_IN_OUTPUT | CIA_SERIAL_CLK_IN_OUTPUT)) sta CIA2_DDRA lda #VIC2_BANK_MASK and CIA2_PRA sta CIA2_PRA : inc BORDERCOLOUR jmp :- : .endif lda #RASTER_IRQ sta VIC2_IRR .if PLATFORM = diskio::platform::COMMODORE_128 pla pha memcfgchks = * + $01 ldx #$00 beq memchkok .if LOAD_TO_UPPER_MEM .if LOAD_VIA_KERNAL_FALLBACK cmp #BANK_0 | SYSTEM_ROM | MID_RAM | LOW_RAM | IO_SPACE; $0e beq memchkok cmp #BANK_0 | HIGH_RAM | MID_RAM | LOW_RAM | IO_SPACE; $3e beq memchkok cmp #BANK_0 | HIGH_RAM | MID_RAM | LOW_RAM | RAM_ROM; $3f beq memchkok .else cmp #BANK_0 | HIGH_RAM | MID_RAM | LOW_RAM | IO_SPACE; $3e beq memchkok cmp #BANK_0 | HIGH_RAM | MID_RAM | LOW_RAM | RAM_ROM; $3f beq memchkok .endif .else .if LOAD_VIA_KERNAL_FALLBACK cmp #BANK_0 | SYSTEM_ROM | MID_RAM | LOW_RAM | IO_SPACE; $0e beq memchkok cmp #BANK_0 | HIGH_RAM | MID_RAM | LOW_RAM | IO_SPACE; $3e beq memchkok cmp #BANK_0 | HIGH_RAM | MID_RAM | LOW_RAM | RAM_ROM; $3f beq memchkok .else cmp #BANK_0 | HIGH_RAM | MID_RAM | LOW_RAM | IO_SPACE; $3e beq memchkok cmp #BANK_0 | HIGH_RAM | MID_RAM | LOW_RAM | RAM_ROM; $3f beq memchkok .endif .endif tax; faulty config value displayed in x and y tay lda #MSGINVMCONF jmp error memchkok: .else; PLATFORM <> diskio::platform::COMMODORE_128 pla sta IO_PORT and #%00111111; mask out the upper 2 bits (C-128 CAPS LOCK (ASCII/DIN) and Flash8 clock control bits) ora #CASSETTE_SENSE; this is 0 on SX-64 memcfgchks = * + 1 ldx #$00 beq memchkok .if LOAD_TO_UPPER_MEM .if LOAD_VIA_KERNAL_FALLBACK cmp #MEMCONFIG_ALL_RAM beq memchkok cmp #MEMCONFIG_IO beq memchkok cmp #MEMCONFIG_IO_KERNAL_BASIC beq memchkok .else cmp #MEMCONFIG_ALL_RAM beq memchkok cmp #MEMCONFIG_IO beq memchkok .endif .else .if LOAD_VIA_KERNAL_FALLBACK cmp #MEMCONFIG_IO beq memchkok cmp #MEMCONFIG_IO_KERNAL_BASIC beq memchkok .else cmp #MEMCONFIG_IO beq memchkok .endif .endif tax; faulty config value displayed in x and y tay lda #MSGINVMCONF jmp error memchkok: .endif; PLATFORM <> diskio::platform::COMMODORE_128 .if PLATFORM = diskio::platform::COMMODORE_128 jmp BUF; leaveirq leaveirq: pla sta MMU_CR .endif; PLATFORM = diskio::platform::COMMODORE_128 pla tay pla tax pla rti leaveirqe: .endif; PLATFORM <> diskio::platform::COMMODORE_16 nmihandler: lda #SPURIOUSNMI jmp error brkhandler: pla sta brkyreg + 1 pla sta brkxreg + 1 pla sta printa pla pla .if PLATFORM = diskio::platform::COMMODORE_128 pla .endif; PLATFORM = diskio::platform::COMMODORE_128 cld sec sbc #$02 sta brkaddrlo pla sbc #$00 sta brkaddrhi lda #ERRBRKOPC brkxreg: ldx #0 brkyreg: ldy #0 jmp error .rodata startupmsg: .byte PETSCII_CLEAR, PETSCII_LO_UP_CASE .byte PETSCII_WHITE, "Loader test application", PETSCII_RETURN .byte PETSCII_CYAN, "by Krill/Plush", PETSCII_RETURN .byte PETSCII_GREEN, "Repository version ", REPOSITORY_VERSION_STRING, PETSCII_RETURN .byte PETSCII_LIGHTGREEN, "built on ", DATETIME, PETSCII_RETURN .byte PETSCII_RETURN, 0 detectedms: .byte PETSCII_YELLOW, "Detected ", PETSCII_CYAN, 0 systemmsg: .byte PETSCII_YELLOW, " system", PETSCII_RETURN, 0 acfreqmsg: .byte PETSCII_YELLOW, " Hz AC frequency", PETSCII_RETURN, 0 inssizemsg: .byte PETSCII_YELLOW, "Installer size is ", PETSCII_CYAN, "$" inssizebyt: .byte 0, 0, 0, 0 .byte PETSCII_YELLOW, " bytes", PETSCII_RETURN, 0 ressizemsg: .byte PETSCII_YELLOW, "Resident size is ", PETSCII_CYAN, "$" ressizebyt: .byte 0, 0, 0, 0 .byte PETSCII_YELLOW, " bytes", PETSCII_RETURN, 0 .if TEST_SAVE trnsizemsg: .byte PETSCII_YELLOW, "Transient size is ", PETSCII_CYAN, "$" trnsizebyt: .byte 0, 0, 0, 0 .byte PETSCII_YELLOW, " bytes", PETSCII_RETURN, 0 .endif installmsg: .byte PETSCII_YELLOW, "Installing loader on dev ", PETSCII_CYAN, "#", 0 installrst: .byte PETSCII_YELLOW, "... ", PETSCII_RETURN, 0 runningmsg: .byte PETSCII_YELLOW, "Running on ", 0 quotemsg: .byte PETSCII_LIGHTGREEN, '"', 0 returnmsg: .byte PETSCII_RETURN, 0 twobitatnm: .byte PETSCII_YELLOW, "Using ", PETSCII_CYAN, "2bit+ATN", PETSCII_YELLOW, " transfers", PETSCII_RETURN, 0 burstmsg: .byte PETSCII_YELLOW, "Using ", PETSCII_CYAN, "burst+ATN" .if ASYNCHRONOUS_BURST_HANDSHAKE .byte "+CLK" .endif .byte PETSCII_YELLOW, " transfers", PETSCII_RETURN, 0 loopmsg: .byte PETSCII_YELLOW, "Running test loop", PETSCII_RETURN .if PLATFORM <> diskio::platform::COMMODORE_128 .byte PETSCII_RETURN, PETSCII_RETURN, PETSCII_RETURN, PETSCII_RETURN .byte PETSCII_RETURN, PETSCII_RETURN .if TEST_SAVE .else .byte PETSCII_RETURN .endif .endif .byte 0 looprunmsg: .byte PETSCII_YELLOW, "Test loop run #", PETSCII_CYAN, 0 mhzmsg: .byte ", ", PETSCII_CYAN mhz: .byte "1", PETSCII_YELLOW, " MHz", 0 logmsg: .byte PETSCII_CYAN, 0 kbsspcmsg: .byte PETSCII_CYAN spacemsg: .byte " ", 0 paltext: .byte "PAL", 0 ntsctext: .byte "NTSC", 0 drivemsgsl: .byte .lobyte(msg1541), .lobyte(msg1541c), .lobyte(msg1541ii), .lobyte(msg1541u) .byte .lobyte(msg1570), .lobyte(msg1571), .lobyte(msg1571cr), .lobyte(msg1581), .lobyte(msgfd2000), .lobyte(msgfd4000) .byte .lobyte(msgenerics - 1) drivemsgsr: .byte .lobyte(msgenerics) drivemsgbr: .byte .lobyte(msgenericb) drivemsgpa: .byte .lobyte(msgenericp) drivemsgsh: .byte .hibyte(msg1541), .hibyte(msg1541c), .hibyte(msg1541ii), .hibyte(msg1541u) .byte .hibyte(msg1570), .hibyte(msg1571), .hibyte(msg1571cr), .hibyte(msg1581), .hibyte(msgfd2000), .hibyte(msgfd4000) .byte .hibyte(msgenerics - 1) .byte .hibyte(msgenerics) .byte .hibyte(msgenericb) .byte .hibyte(msgenericp) msg1541: .byte PETSCII_CYAN, "CBM 1541", 0 msg1541c: .byte PETSCII_CYAN, "CBM 1541-C", 0 msg1541ii: .byte PETSCII_CYAN, "CBM 1541-II", 0 msg1541u: .byte PETSCII_CYAN, "1541U", 0 msg1570: .byte PETSCII_CYAN, "CBM 1570", 0 msg1571: .byte PETSCII_CYAN, "CBM 1571", 0 msg1571cr: .byte PETSCII_CYAN, "CBM 1571CR", 0 msg1581: .byte PETSCII_CYAN, "CBM 1581", 0 msgfd2000: .byte PETSCII_CYAN, "CBM FD 2000", 0 msgfd4000: .byte PETSCII_CYAN, "CBM FD 4000", 0 msgenerics: .byte PETSCII_CYAN, "generic serial drive", 0 msgenericb: .byte PETSCII_CYAN, "generic burst drive", 0 msgenericp: .byte PETSCII_CYAN, "generic parallel drive", 0 drivtypesl: .byte .lobyte(str1541), .lobyte(str1541c), .lobyte(str1541ii), .lobyte(str1541u) .byte .lobyte(str1570), .lobyte(str1571), .lobyte(str1571cr), .lobyte(str1581), .lobyte(strfd2000), .lobyte(strfd4000) .byte .lobyte(strgenrics - 1) .byte .lobyte(strgenrics) .byte .lobyte(strgenricb) .byte .lobyte(strgenricp) drivtypesh: .byte .hibyte(str1541), .hibyte(str1541c), .hibyte(str1541ii), .hibyte(str1541u) .byte .hibyte(str1570), .hibyte(str1571), .hibyte(str1571), .hibyte(str1581), .hibyte(strfd2000), .hibyte(strfd4000) .byte .hibyte(strgenrics - 1) .byte .hibyte(strgenrics) .byte .hibyte(strgenricb) .byte .hibyte(strgenricp) ; "123456789" max length str1541: .byte "CBM1541" , 0 str1541c: .byte "CBM1541C" , 0 str1541ii: .byte "CBM1541II", 0 str1541u: .byte "1541U" , 0 str1570: .byte "CBM1570" , 0 str1571: .byte "CBM1571" , 0 str1571cr: .byte "CBM1571CR", 0 str1581: .byte "CBM1581" , 0 strfd2000: .byte "CMDFD2000", 0 strfd4000: .byte "CMDFD4000", 0 strgenrics: .byte "gn serial", 0 strgenricb: .byte "gen burst", 0 strgenricp: .byte "parallel", 0 kbscoltext: .byte PETSCII_YELLOW kbstext: .byte " kB/s", 0 .byte " " emptytexte: .byte 0 .if LOAD_TO_UPPER_MEM pic1unc: .byte "ab-pic1hiram.bin", 0 .if LOAD_VIA_KERNAL_FALLBACK | VERIFY pic2unc: .byte "bb-pic2hiram.bin", 0 .else pic2unc: .byte 0; use loadnext functionality .endif .if DECOMPRESSOR <> DECOMPRESSORS::NONE pic1compd: .byte "ap-pic1hiram.pak", 0 .if LOAD_VIA_KERNAL_FALLBACK | VERIFY pic2compd: .byte "bp-pic2hiram.pak", 0 .else pic2compd: .byte 0; use loadnext functionality .endif .else pic1compd: pic2compd: .byte 0 .endif .else; !LOAD_TO_UPPER_MEM pic1unc: .byte "r1-raw", 0 .if LOAD_VIA_KERNAL_FALLBACK | VERIFY pic2unc: .byte "r2-raw", 0 .else pic2unc: .byte 0; use loadnext functionality .endif .if DECOMPRESSOR <> DECOMPRESSORS::NONE pic1compd: .byte "p1-pak", 0 .if LOAD_VIA_KERNAL_FALLBACK | VERIFY pic2compd: .byte "p2-pak", 0 .else pic2compd: .byte 0; use loadnext functionality .endif .else pic1compd: pic2compd: .byte 0 .endif .endif bogusname: .byte $ff, $ff, $ff, $ff .byte $ff, $ff, $ff, $ff .byte $ff, $ff, $ff, $ff .byte $ff, $ff, $ff, $ff, 0 errormsgsl: .repeat $78, I .byte .lobyte(invaliderr) .endrep ERRPALNTSC = * - errormsgsl .byte .lobyte(emgpalntsc) ERRLOADADDR = * - errormsgsl .byte .lobyte(emsglodadd) ERRENDADDR = * - errormsgsl .byte .lobyte(emsgendadd) ERRBYTESLOADED = * - errormsgsl .byte .lobyte(emsgbytlod) ERRSAFETYMARGIN = * - errormsgsl .byte .lobyte(emsgsafety) MSGUNINST = * - errormsgsl .byte .lobyte(emsguninst) ERRBRKOPC = * - errormsgsl .byte .lobyte(emsgbrkopc) SPURIOUSNMI = * - errormsgsl .byte .lobyte(emsgspunmi) MEMCONFCHNG = * - errormsgsl .byte .lobyte(emsgmemcfg) MSGINVMCONF = * - errormsgsl .byte .lobyte(emsginvmcf) MSGVERIFAIL = * - errormsgsl .byte .lobyte(emsgverifl) .repeat $74, I .byte .lobyte(invaliderr) .endrep .byte .lobyte(emsgftoobg) .byte .lobyte(emsgftoosm) .byte .lobyte(emsgftoolr) .byte .lobyte(emsgwritep) .byte .lobyte(emsgdevinc) .byte .lobyte(emsgtoomd) .byte .lobyte(emsggenker) .byte .lobyte(emsgdevnp) .byte .lobyte(emsgfnotf); $ff errormsgsh: .repeat $78, I .byte .hibyte(invaliderr) .endrep .byte .hibyte(emgpalntsc) .byte .hibyte(emsglodadd) .byte .hibyte(emsgendadd) .byte .hibyte(emsgbytlod) .byte .hibyte(emsgsafety) .byte .hibyte(emsguninst) .byte .hibyte(emsgbrkopc) .byte .hibyte(emsgspunmi) .byte .hibyte(emsgmemcfg) .byte .hibyte(emsginvmcf) .byte .hibyte(emsgverifl) .repeat $74, I .byte .hibyte(invaliderr) .endrep .byte .hibyte(emsgftoobg) .byte .hibyte(emsgftoosm) .byte .hibyte(emsgftoolr) .byte .hibyte(emsgwritep) .byte .hibyte(emsgdevinc) .byte .hibyte(emsgtoomd) .byte .hibyte(emsggenker) .byte .hibyte(emsgdevnp) .byte .hibyte(emsgfnotf); $ff .assert errormsgsh - errormsgsl = $0100, error, "errormsgsl has wrong length" .assert * - errormsgsh = $0100, error, "errormsgsh has wrong length" emgpalntsc: .byte "PAL/NTSC detection mismatch. ", 0 emsglodadd: .byte "Wrong load address. ", 0 emsgendadd: .byte "Wrong end address. ", 0 emsgbytlod: .byte "Wrong amount of bytes loaded. ", 0 emsgsafety: .byte "Safety margin exceeded.", 0 emsginvmcf: .byte "Invalid memory configuration. ", 0 cmsguninst: .byte PETSCII_WHITE emsguninst: .byte "The loader is now uninstalled. ", 0 emsgbrkopc: .byte "Executed BRK instruction at $", 0 emsgspunmi: .byte "Spurious NMI. ", 0 emsgmemcfg: .byte "Memory config changed. ", 0 emsgverifl: .byte "Verify failed at $" verifysrc: .byte "0000/$" verifydest: .byte "0000. ", 0 emsgftoobg: .byte "File too large. ", 0 emsgftoosm: .byte "File on disk too small. ", 0 emsgftoolr: .byte "File on disk too large. ", 0 emsgwritep: .byte "Write protect on. ", 0 emsgdevinc: .byte "Device incompatible. ", 0 emsgtoomd: .byte "Too many devices. ", 0 emsggenker: .byte "Generic KERNAL error. ", 0 emsgdevnp: .byte "Device not present. ", 0 emsgfnotf: .byte "File not found. ", 0 invaliderr: .byte "Invalid error code. ", 0 numccpal: CYCLES_PER_SECOND_PAL numccntsc: CYCLES_PER_SECOND_NTSC .bss palntsc: .res 1 drivetype: .res 1 .if PLATFORM = diskio::platform::COMMODORE_16 tod_hrs: .res 1 tod_mins: .res 1 tod_secs: .res 1 tod_10s: .res 1 tod_frames: .res 1 .if COUPLED_TIMERS = 0 prevctr3lo: .res 1 prevctr3hi: .res 1 cycles_hi: .res 1 cycles_mid: .res 1 cycles_lo: .res 1 prvcycslo: .res 1 prvcycsmid: .res 1 prvcycshi: .res 1 .endif; COUPLED_TIMERS .endif numcycles: .res 4 cyclesperd: .res 5 hundred: .res 5 capsname: .segment "END"