From f9365ef482e9b4fff92a5620b660c5346e93c594 Mon Sep 17 00:00:00 2001 From: Peter Ferrie Date: Tue, 30 Oct 2018 22:59:03 -0700 Subject: [PATCH] winmake, proboot, start on mini ProDOS, fix DHGR->HGR colour --- bin/buildfileinfo.js | 7 ++ bin/buildproboot.js | 7 ++ bin/do2po.js | 39 +++++++ res/demo/WAVY.NAVY | Bin 45824 -> 119 bytes res/demo/WAVY.NAVY.1 | Bin 0 -> 45824 bytes res/demo/WAVY.NAVY.LOADER | Bin 119 -> 0 bytes res/demo/_FileInformation.txt | 2 +- res/proboothd | Bin 0 -> 512 bytes res/proboothd.s | 135 ++++++++++++++++++++++ src/4cade.a | 35 ++++++ src/glue.prorwts2.a | 209 ++++++++++++++++++++++++++++++++++ src/prorwts2.a | 12 ++ winmake.bat | 78 +++++++++++++ 13 files changed, 523 insertions(+), 1 deletion(-) create mode 100644 bin/buildfileinfo.js create mode 100644 bin/buildproboot.js create mode 100644 bin/do2po.js create mode 100644 res/demo/WAVY.NAVY.1 delete mode 100644 res/demo/WAVY.NAVY.LOADER create mode 100644 res/proboothd create mode 100644 res/proboothd.s create mode 100644 winmake.bat diff --git a/bin/buildfileinfo.js b/bin/buildfileinfo.js new file mode 100644 index 000000000..7abd73a57 --- /dev/null +++ b/bin/buildfileinfo.js @@ -0,0 +1,7 @@ +a = new ActiveXObject("scripting.filesystemobject") +fileinfo = "" +for (b = new Enumerator(a.GetFolder(WScript.Arguments(0)).files); !b.atEnd(); b.moveNext()) +{ + fileinfo += "\r\n" + b.item().Name.toUpperCase() + "=Type(06),AuxType(4000),Access(C3)" +} +a.createtextfile(WScript.Arguments(0)+"\\_FileInformation.txt", 1).write(fileinfo.substring(2)) diff --git a/bin/buildproboot.js b/bin/buildproboot.js new file mode 100644 index 000000000..8a1f1e6f3 --- /dev/null +++ b/bin/buildproboot.js @@ -0,0 +1,7 @@ +a = new ActiveXObject("scripting.filesystemobject") +b = a.opentextfile(WScript.Arguments(0)) +c = b.read(0x40) +b.skip(0x200) +d = b.read(0x1fff600) +b.close() +b=a.createtextfile(WScript.Arguments(0), 1).write(c+a.opentextfile("res\\proboothd").read(512)+d) diff --git a/bin/do2po.js b/bin/do2po.js new file mode 100644 index 000000000..846523ce5 --- /dev/null +++ b/bin/do2po.js @@ -0,0 +1,39 @@ +kMap = [0x00, + 0x0E, + 0x0D, + 0x0C, + 0x0B, + 0x0A, + 0x09, + 0x08, + 0x07, + 0x06, + 0x05, + 0x04, + 0x03, + 0x02, + 0x01, + 0x0F + ] + +a = new ActiveXObject("scripting.filesystemobject") +for (b = new Enumerator(a.GetFolder(WScript.Arguments(0)).files); !b.atEnd(); b.moveNext()) +{ + if (a.GetExtensionName(b.item()).toLowerCase() == "dsk") + { + fi = a.opentextfile(b.item()) + fo = a.createtextfile(WScript.Arguments(1)+"\\"+a.GetBaseName(b.item())+".po", 1) + for (track = 0; track < 0x23; ++track) + { + sectors = new Array(0x10) + for (dos_sector = 0; dos_sector < 0x10; ++dos_sector) + { + sectors[kMap[dos_sector]] = fi.read(256) + } + for (dos_sector = 0; dos_sector < 0x10; ++dos_sector) + { + fo.write(sectors[dos_sector]) + } + } + } +} diff --git a/res/demo/WAVY.NAVY b/res/demo/WAVY.NAVY index b96a3a6f74818e1d1438fdbf58625101b317e16a..78c2ebb331d301823b4a2a217a13489503b2bdbb 100644 GIT binary patch literal 119 zcmY#j*nixSV;uwY1%Udc$gIh~>O~&|^Gf|*M&@(O92c%G5}zBf z|CGS51^PSPIcEN6>bUUThk==qftiVckr}A%geZtSB@H6a$T0gba4;(~Gwj~Y!pOk! Q9|*X^9m68^{6K^u0Hl>CtpET3 literal 45824 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 diff --git a/res/demo/WAVY.NAVY.1 b/res/demo/WAVY.NAVY.1 new file mode 100644 index 0000000000000000000000000000000000000000..b96a3a6f74818e1d1438fdbf58625101b317e16a GIT binary patch literal 45824 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 literal 0 HcmV?d00001 diff --git a/res/demo/WAVY.NAVY.LOADER b/res/demo/WAVY.NAVY.LOADER deleted file mode 100644 index 78c2ebb331d301823b4a2a217a13489503b2bdbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcmY#j*nixSV;uwY1%Udc$gIh~>O~&|^Gf|*M&@(O92c%G5}zBf z|CGS51^PSPIcEN6>bUUThk==qftiVckr}A%geZtSB@H6a$T0gba4;(~Gwj~Y!pOk! Q9|*X^9m68^{6K^u0Hl>CtpET3 diff --git a/res/demo/_FileInformation.txt b/res/demo/_FileInformation.txt index 480803375..507e5f778 100644 --- a/res/demo/_FileInformation.txt +++ b/res/demo/_FileInformation.txt @@ -1,2 +1,2 @@ WAVY.NAVY=Type(06),AuxType(0800),Access(C3) -#WAVY.NAVY.1=Type(06),AuxType(0000),Access(C3) +WAVY.NAVY.1=Type(06),AuxType(0000),Access(C3) diff --git a/res/proboothd b/res/proboothd new file mode 100644 index 0000000000000000000000000000000000000000..105727915fbcac4cb5e15e0bddea5ca64268cf94 GIT binary patch literal 512 zcmZQv(WOxRgY&>lgMGci9KBr}YyY3`?c~@wnSCb5z7rQ7^%?B%VPIOsv{J6swbfps zg<~a4tK9;Ijdq&+t6tok%<(~7VyRuGdaK<8rf2pi|6h2rj!A9}v)qRBCpOxhx^S=U z{{q2{cB_D#6+peuT%Wlv`Ty+yJ_fm+4Du^3yy?2|(uYBz&8@}V=idirbuf + sta adrhi + sta A2H + jsr seekread + lda #4 + sta A2L +nextent ldy #0 + + ;match name lengths before attempting to match names + + lda (A2L), y + and #$0f + tax + inx +- cmp filename, y + beq foundname + + ;move to next directory in this block + + clc + lda A2L + adc #$27 + sta A2L + bcc + + + ;there can be only one page crossed, so we can increment instead of adc + + inc A2H ++ cmp #$ff ;4+($27*$0d) + bne nextent + + ;read next directory block when we reach the end of this block + + ldx dirbuf+2 + ldy dirbuf+3 + bcs firstent + +foundname iny + lda (A2L), y + dex + bne - + stx $ff + + ;cache KEY_POINTER + + ldy #$11 + lda (A2L), y + tax + iny + lda (A2L), y + tay + +readfile jsr seekread + inc adrhi + inc adrhi + + ;fetch data block and read it + +blockind ldy $ff + inc $ff + ldx dirbuf, y + lda dirbuf+256, y + tay + bne readfile + txa + bne readfile + +readdone jmp $2000 + +seekread stx bloklo + sty blokhi +entry jmp $d1d1 + +fakeMLI pla + tax + inx + inx + inx + txa + pha + rts +fakeMLI_e + +filename !byte filename_e - filename_b +filename_b !text "LAUNCHER.SYSTEM" ;your start-up file, file is max 40kb +filename_e + +*=$9f8 +!byte $D3,$C1,$CE,$A0,$C9,$CE,$C3,$AE diff --git a/src/4cade.a b/src/4cade.a index 57677c443..935e5d912 100644 --- a/src/4cade.a +++ b/src/4cade.a @@ -149,6 +149,11 @@ AttractMode sta $100,x dex bpl - + ldx #(end_promote-promote-1) +- lda promote,x ; copy tiny ProDOS to main memory + sta $bf00,x + dex + bpl - jmp $100 ; jump to pre-launch code @prelaunch ; this runs from main memory +READ_ROM_NO_WRITE @@ -249,6 +254,35 @@ WaitOnScreenshot @burn3 jsr Exit Exit rts +promote +!pseudopc $bf00 { + lda $c08b + clc + bcc @do_enter +;$bf06 + rts ;clock interface, must be RTS on real ProDOS if program uses $20x +@do_enter + lda $c08b + jmp ProDOS_enter + !text "q4!" +;$bf10 + !word $c1d1, $c2d1, $c3d1, $c4d1, $c5d1, $c6d1, $c7d1 +ProDOS_exit + lda $c081 + pla ;saved inside ProDOS_enter + tay + pla + tax + lda #0 + rts +ProDOS_fatal ;only for debugging, will be removed + lda $c081 + jsr $fe89 + jsr $fe93 + jmp $ff3a +} +end_promote + Reboot ldx #(@end-@start-1) - lda @start,x @@ -272,6 +306,7 @@ Home ; this will be run from main memory +READ_ROM_NO_WRITE sta $C00C ; get out of DHGR mode + sta $C05F ; get out of DHGR mode jsr $FB2F ; TEXT jsr $FC58 ; HOME +READ_RAM1_WRITE_RAM1 diff --git a/src/glue.prorwts2.a b/src/glue.prorwts2.a index 504bd13c3..e3e216f42 100644 --- a/src/glue.prorwts2.a +++ b/src/glue.prorwts2.a @@ -10,6 +10,8 @@ gRootDirectory !word $FDFD +gPrefix + !word $FDFD ;------------------------------------------------------------------------------ ; LoadFile @@ -27,6 +29,7 @@ LoadFile +PARAMS_ON_STACK 2 +LDPARAM 1 +STAY namlo ; set filename + +STAY gPrefix ; remember path jsr traverse ; go to subdirectory, set up filename for read @@ -179,3 +182,209 @@ traverse sta (namlo), y @go rts + +;------------------------------------------------------------------------------ +; ProDOS_enter +; intercept certain ProDOS requests +; wrap them to ProRWTS2 file requests +; +; in: return address+1 is command and pointer to parameter block +; out: all flags clobbered +; A=0, X and Y preserved +; stack set to next instruction after parameters +; +; to do: preserve non-$4x zpage locations for titles that open files after start +; enable seek +; enable < 512 bytes reads +;------------------------------------------------------------------------------ +packet = $40 ;word +buffer = $42 ;word +ProDOS_enter + pla + sta @fetchaddr+1 + pla + sta @fetchaddr+2 + jsr @fetchbyte + sta @request+1 + jsr @fetchbyte + sta packet + jsr @fetchbyte + sta packet+1 + lda @fetchaddr+2 + pha + lda @fetchaddr+1 + pha + txa + pha + tya + pha +@request + lda #$d1 + cmp #$c7 + beq @do_prefix + cmp #$c8 + beq @do_open + cmp #$ca + beq @do_read + cmp #$cb + beq @do_write + cmp #$cc + beq @do_close +;; cmp #$ce +;; beq @do_seek + ;;any others?? + jmp ProDOS_fatal +@do_prefix + jsr @imp_prefix + jmp ProDOS_exit +@do_open + jsr @imp_open + jmp ProDOS_exit +@do_read + jsr @imp_read + jmp ProDOS_exit +@do_write + jsr @imp_write + jmp ProDOS_exit +@do_close + jsr @imp_close + jmp ProDOS_exit +;;@do_seek +;; jsr @imp_seek +;; jmp ProDOS_exit + + +PREV_BLOCK_LO = $0 ;ProDOS constant +PREV_BLOCK_HI = $1 ;ProDOS constant +@imp_prefix + ldx #buffer + jsr @setbuffer1 + lda gPrefix + sta packet + lda gPrefix+1 + sta packet+1 + ldy #0 + lda (packet), y + tax + inx + !byte $2c +@copy_prefix + lda (packet), y + iny + iny + iny + cmp #$2e + bcs @skip_slash1 + lda #'/' +@skip_slash1 + sta (buffer), y + bcs @skip_slash2 + tya + ldy #0 + sta (buffer), y + tay +@skip_slash2 + dey + dey + dex + bne @copy_prefix + ldy #1 + lda #'/' + sta (buffer), y + iny + lda #'X' + sta (buffer), y + rts + +@imp_open + ldx #namlo + jsr @setbuffer1 + iny + inc @handles+1 +@handles + ldx #0 + iny + lda (packet), y + sta @handle-1, x + iny + txa + sta (packet), y + rts + +@imp_read + lda #cmdread + !byte $2c +@imp_write + lda #cmdwrite + sta reqcmd + jsr @set_rdwrbuff + jmp hddopendir + +@imp_close + dec @handles+1 + bne @close_ret + lda #$b1 + sta overridepatch1 + sta overridepatch2 + lda #bloklo + sta overridepatch1+1 + sta overridepatch2+1 + lda #>hdddirbuf + +@patch_buffer + sta bufferpatch2+2 + sta bufferpatch3+2 + sta bufferpatch4+2 + sta bufferpatch6+1 + sta bufferpatch7+2 + sta bufferpatch9+2 + sta bufferpatch10+1 + tax + inx + stx bufferpatch5+2 + stx bufferpatch8+2 + dex + dex + stx bufferpatch1+1 +@close_ret + rts + +@fetchbyte + inc @fetchaddr+1 + bne @fetchaddr + lda @fetchaddr+2 +@fetchaddr + lda $d1d1 + rts + +@set_rdwrbuff + ldy #1 + lda (packet), y + tax + lda @handle-1,x + jsr @patch_buffer + lda #$a9 + sta overridepatch1 + sta overridepatch2 + iny + lda (packet), y + sta overridepatch1+1 + iny + lda (packet), y + sta overridepatch2+1 + ldx #sizelo + iny + !byte $2c +@setbuffer1 + ldy #1 + +@setbuffer + lda (packet), y + sta $0,x + iny + lda (packet), y + sta $1,x + rts + +@handle + !byte 0, 0 ;only up to two handles at a time diff --git a/src/prorwts2.a b/src/prorwts2.a index f29bb4c6c..5ed62a33e 100644 --- a/src/prorwts2.a +++ b/src/prorwts2.a @@ -1925,6 +1925,7 @@ unrhddblockhi = unrelochdd + (* - reloc) hddreaddir ;note that calling this location directly limits subdirectories to 14 entries! lda #NAME_LENGTH + ENTRY_SIZE hddfirstent sta bloklo +bufferpatch1 lda #>(hdddirbuf - 1) sta blokhi @@ -1999,7 +2000,9 @@ hddnextent ldy #0 ;read next directory block when we reach the end of this block +bufferpatch2 ldx hdddirbuf + NEXT_BLOCK_LO +bufferpatch3 lda hdddirbuf + NEXT_BLOCK_HI jsr hddreaddirsec lda #NAME_LENGTH @@ -2088,11 +2091,13 @@ hddfoundname iny !if override_adr = 0 { ldy #AUX_TYPE +overridepatch1 lda (bloklo), y !if (allow_subdir + allow_saplings + allow_trees + (aligned_read xor 1)) > 0 { sta ldrlo sta ldrlo2 iny +overridepatch2 lda (bloklo), y sta ldrhi sta ldrhi2 @@ -2110,12 +2115,14 @@ hddfoundname iny lda (bloklo), y tax !if (allow_subdir + allow_saplings + allow_trees) > 0 { +bufferpatch4 sta hdddirbuf !if (allow_trees + (fast_trees xor 1)) > 1 { sta treeblklo } ;allow_trees = 1 and fast_trees = 0 iny lda (bloklo), y +bufferpatch5 sta hdddirbuf + 256 !if (allow_trees + (fast_trees xor 1)) > 1 { sta treeblkhi @@ -2187,6 +2194,7 @@ hddrdwrfilei bcc + ldy #2 sty sizehi +bufferpatch6 ldx #>hdddirbuf lda #0 !if aligned_read = 0 { @@ -2478,7 +2486,9 @@ skiptree sty lastblk } ;rwts_mode +bufferpatch7 ldx hdddirbuf, y +bufferpatch8 lda hdddirbuf + 256, y !if detect_treof = 1 { bne noteof2 @@ -2492,6 +2502,7 @@ noteof2 } ;detect_treof !if allow_sparse = 1 { pha +bufferpatch9 ora hdddirbuf, y tay pla @@ -2663,6 +2674,7 @@ hddreaddirsel hddreaddirsec !if allow_trees = 0 { +bufferpatch10 hddreaddirsect ldy #>hdddirbuf } else { ;allow_trees = 1 ldy #>hdddirbuf diff --git a/winmake.bat b/winmake.bat new file mode 100644 index 000000000..e0dac4a10 --- /dev/null +++ b/winmake.bat @@ -0,0 +1,78 @@ +@echo off +rem +rem 4cade Makefile for Windows +rem assembles source code, optionally builds a disk image +rem +rem a qkumba monstrosity from 2018-10-29 +rem + +set DISK=4cade.2mg +set VOLUME=A.4AM.PACK + +rem third-party tools required to build (must be in path) +rem https://sourceforge.net/projects/acme-crossass/ +set ACME=acme +rem https://www.brutaldeluxe.fr/products/crossdevtools/cadius/ +rem https://github.com/mach-kernel/cadius +set CADIUS=cadius + +if "%1" equ "asm" ( +:asm +2>nul md build +2>nul md build\po +2>nul md build\X +2>nul md build\HGR +2>nul md build\DHGR +2>nul md build\SS +2>nul md build\DEMO +2>nul md build\FX + +%ACME% -r build\4cade.lst src\4cade.a +%ACME% src\fx\fx.hgr.diagonal.a +%ACME% src\fx\fx.hgr.iris.a +%ACME% src\fx\fx.hgr.interlock.ud.a +%ACME% src\fx\fx.hgr.interlock.lr.a +%ACME% src\fx\fx.hgr.spiral.a +%ACME% src\fx\fx.hgr.fizzle.a +%ACME% src\fx\fx.hgr.bar.dissolve.a +goto :EOF +) + +if "%1" equ "clean" ( +:clean +echo y|1>nul 2>nul rd build /s +goto :EOF +) + +if "%1" equ "dsk" ( +:dsk +call :asm +2>nul del build\log +%CADIUS% CREATEVOLUME "build\%DISK%" "%VOLUME%" 32766KB >>build\log +1>nul copy /y res\_FileInformation.txt build\ >>build\log +cscript /nologo bin/buildproboot.js "build\%DISK%" +%CADIUS% ADDFILE "build\%DISK%" "/%VOLUME%/" "res\PRODOS" >>build\log +%CADIUS% ADDFILE "build\%DISK%" "/%VOLUME%/" "build\LAUNCHER.SYSTEM" >>build\log +%CADIUS% CREATEFOLDER "build\%DISK%" "/%VOLUME%/X/" >>build\log +%CADIUS% ADDFILE "build\%DISK%" "/%VOLUME%/" "res\GAMES.CONF" >>build\log +%CADIUS% ADDFILE "build\%DISK%" "/%VOLUME%/" "res\ATTRACT.CONF" >>build\log +%CADIUS% ADDFILE "build\%DISK%" "/%VOLUME%/" "res\FX.CONF" >>build\log +%CADIUS% ADDFILE "build\%DISK%" "/%VOLUME%/" "res\COVER" >>build\log +%CADIUS% ADDFILE "build\%DISK%" "/%VOLUME%/" "res\COVER.A2FC" >>build\log +1>nul copy /y res\hgr\* build\HGR >>build\log +cscript /nologo bin/buildfileinfo.js build\HGR >>build\log +%CADIUS% ADDFOLDER "build\%DISK%" "/%VOLUME%/HGR" "build/HGR" >>build/log +1>nul copy /y res\dhgr\* build\DHGR >>build\log +cscript /nologo bin/buildfileinfo.js build\DHGR >>build\log +%CADIUS% ADDFOLDER "build\%DISK%" "/%VOLUME%/DHGR" "build/DHGR" >>build\log +1>nul copy /y res\ss\* build\SS >>build\log +%CADIUS% ADDFOLDER "build\%DISK%" "/%VOLUME%/SS" "build/SS" >>build\log +1>nul copy /y res\demo\* build\DEMO >>build\log +%CADIUS% ADDFOLDER "build\%DISK%" "/%VOLUME%/DEMO" "build/DEMO" >>build\log +1>nul copy /y res\fx\* build\FX >>build\log +%CADIUS% ADDFOLDER "build\%DISK%" "/%VOLUME%/FX" "build/FX" >>build\log +cscript /nologo bin/do2po.js res\dsk\ build\po\ +goto :EOF +) + +echo usage: %0 clean / asm / dsk