diff options
author | Laurent Carlier | 2023-08-19 14:44:13 +0200 |
---|---|---|
committer | Laurent Carlier | 2023-08-19 14:44:13 +0200 |
commit | 54faa0d8e328d0a43d7dc01907ec4706a0b01560 (patch) | |
tree | ae7d16f9f739ebb49de5fe3a22062dcfa60bf3b6 | |
download | aur-dsk-lua.tar.gz |
initial commit
-rw-r--r-- | .SRCINFO | 18 | ||||
-rw-r--r-- | PKGBUILD | 34 | ||||
-rw-r--r-- | dsk-lua.csh | 1 | ||||
-rw-r--r-- | dsk-lua.sh | 1 | ||||
-rw-r--r-- | upstream-fixes.patch | 256 |
5 files changed, 310 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO new file mode 100644 index 000000000000..57158ebe961b --- /dev/null +++ b/.SRCINFO @@ -0,0 +1,18 @@ +pkgbase = dsk-lua + pkgdesc = Lets you write/read data to an Amstrad DSK file, for use into SJASMPlus + pkgver = 1.0.0 + pkgrel = 1 + url = https://github.com/ClaireCheshireCat/dsk-lua + arch = any + license = GPL3 + source = dsk-lua-1.0.0.tar.gz::https://github.com/ClaireCheshireCat/dsk-lua/archive/refs/tags/v1.0.0.tar.gz + source = dsk-lua.sh + source = dsk-lua.csh + source = upstream-fixes.patch + sha256sums = f4aba5ecbc725eeb7ec4c351b9a74da82fe80e4e5c8bfa9b18406bed36624681 + sha256sums = 80ac7f39cdd5b2e75b9ce82140987ca4869eca6cc1cc99e8248efc984e01b44e + sha256sums = 4647c572d4729922a0196dd2e024dad30fa9dc14b4ab9394d6f5ba94168be01b + sha256sums = b3e001730f1cfd181f9f0b54cdb3dd372d6e012e515ff76ff62a79cf635d1a79 + +pkgname = dsk-lua + depends = sjasmplus-z00m128 diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 000000000000..0d5b9af98573 --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,34 @@ +# Maintainer: Laurent Carlier <lordheavym@archlinux.org> + +pkgname=dsk-lua +pkgver=1.0.0 +pkgrel=1 +pkgdesc="Lets you write/read data to an Amstrad DSK file, for use into SJASMPlus" +arch=('any') +url="https://github.com/ClaireCheshireCat/${pkgname}" +license=(GPL3) +source=("${pkgname}-${pkgver}.tar.gz::${url}/archive/refs/tags/v$pkgver.tar.gz" + dsk-lua.sh + dsk-lua.csh + upstream-fixes.patch) +sha256sums=('f4aba5ecbc725eeb7ec4c351b9a74da82fe80e4e5c8bfa9b18406bed36624681' + '80ac7f39cdd5b2e75b9ce82140987ca4869eca6cc1cc99e8248efc984e01b44e' + '4647c572d4729922a0196dd2e024dad30fa9dc14b4ab9394d6f5ba94168be01b' + 'b3e001730f1cfd181f9f0b54cdb3dd372d6e012e515ff76ff62a79cf635d1a79') + +prepare() { + cd ${pkgname}-${pkgver} + + patch -Np1 -i ../upstream-fixes.patch +} + +package() { + depends=(sjasmplus-z00m128) + + cd ${pkgname}-${pkgver} + + install -m644 -Dt "${pkgdir}/usr/share/doc/${pkgname}" README.md + install -m644 -Dt "${pkgdir}/usr/share/sjasmplus/${pkgname}" dsk.* + + install -m644 -Dt "${pkgdir}/etc/profile.d" ${srcdir}/dsk-lua.{c,}sh +} diff --git a/dsk-lua.csh b/dsk-lua.csh new file mode 100644 index 000000000000..6ef3b06b6d8e --- /dev/null +++ b/dsk-lua.csh @@ -0,0 +1 @@ +setenv LUA_PATH "/usr/share/sjasmplus/dsk-lua/?.lua;${LUA_PATH}" diff --git a/dsk-lua.sh b/dsk-lua.sh new file mode 100644 index 000000000000..323078d38bf9 --- /dev/null +++ b/dsk-lua.sh @@ -0,0 +1 @@ +export LUA_PATH="/usr/share/sjasmplus/dsk-lua/?.lua;"$LUA_PATH diff --git a/upstream-fixes.patch b/upstream-fixes.patch new file mode 100644 index 000000000000..f831e0d293c7 --- /dev/null +++ b/upstream-fixes.patch @@ -0,0 +1,256 @@ +From 97a1ff6aa683411091785aa162f35381adcd7a47 Mon Sep 17 00:00:00 2001 +From: Claire CheshireCat <94008195+ClaireCheshireCat@users.noreply.github.com> +Date: Sat, 19 Aug 2023 10:33:01 +0200 +Subject: [PATCH 1/3] Added filetypes constants + +Instead of using numbers 0, 1 or 2 to describe the AMSDOS filetype, one could now use "constants" instead. Thanks to Lordheavy for pointing this ! +dsk.AMSDOS_FILETYPE_BASIC, dsk.AMSDOS_FILETYPE_PROTECTED, dsk.AMSDOS_FILETYPE_BINARY + +Signed-off-by: Laurent Carlier <lordheavym@gmail.com> +--- + dsk.lua | 95 ++++++++++++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 80 insertions(+), 15 deletions(-) + +diff --git a/dsk.lua b/dsk.lua +index 8141dc9..e5f3688 100644 +--- a/dsk.lua ++++ b/dsk.lua +@@ -3,6 +3,10 @@ print("DSK Management tool - CheshireCat/Flush") + local dsk = {} + dsk.verbose = false -- Displays various informations while reading/writing + ++dsk.AMSDOS_FILETYPE_BASIC=0 -- FILETYPE constants, thanks to Lordheavy ++dsk.AMSDOS_FILETYPE_PROTECTED=1 ++dsk.AMSDOS_FILETYPE_BINARY=2 ++ + --======================================================================================= + function dsk.init() + dsk.datafile = nil +@@ -35,7 +39,7 @@ function dsk.read(filename) + end + end + +- creator = dsk.datafile:read(14) ++ local creator = dsk.datafile:read(14) + dsk.tracksnumber = string.byte(dsk.datafile:read(1)) + dsk.sidesnumber = string.byte(dsk.datafile:read(1)) + dsk.tracksize = string.byte(dsk.datafile:read(1))+string.byte(dsk.datafile:read(1))*256 +@@ -90,7 +94,7 @@ function dsk.read(filename) + + end + +- pos=((dsk.datafile:seek()>>8)+1)<<8 ++ local pos=((dsk.datafile:seek()>>8)+1)<<8 + dsk.datafile:seek("set",pos) + + for cpt_sectors = 0,dsk.tracks[tracknum][sidenum].sectorsnumber-1,1 +@@ -188,7 +192,7 @@ function dsk.write(filename) + dsk.datafile:write(string.char(sizeofsector>>8)) + end + +- pos=dsk.datafile:seek() ++ local pos=dsk.datafile:seek() + dsk.datafile:write(string.rep(string.char(0),(((pos>>8)+1)<<8)-pos)) + + for cpt_sectors = 0,dsk.tracks[cpt_tracks][cpt_sides].sectorsnumber-1,1 +@@ -269,10 +273,10 @@ end + + --======================================================================================= + function dsk.setblock(blocknum,data) +- sectornum = blocknum*2 +- tracknum = math.floor(sectornum/9) +- sectorid = 0xc1+(sectornum%9) +- res = dsk.setsector(tracknum,0,sectorid,string.sub(data,1,512)) ++ local sectornum = blocknum*2 ++ local tracknum = math.floor(sectornum/9) ++ local sectorid = 0xc1+(sectornum%9) ++ local res = dsk.setsector(tracknum,0,sectorid,string.sub(data,1,512)) + + if(res == false) then + return false +@@ -291,8 +295,8 @@ function dsk.initializefreeblocks() + for i = 2,(dsk.tracksnumber*dsk.tracksize)>>10,1 do + dsk.freeblocks[i] = true + end +--- dsk.freeblocks[0] = false -- Room for the directory +--- dsk.freeblocks[1] = false ++ dsk.freeblocks[0] = false -- Room for the directory ++ dsk.freeblocks[1] = false + end + + --======================================================================================= +@@ -414,7 +418,7 @@ end + --======================================================================================= + -- user : a byte (usually 0) + -- filename : Filename (11 chars max) in uppercase +--- filetype : 0 => BASIC, 1=> Protected, 2 => BINARY ++-- filetype : 0 => BASIC, 1=> Protected, 2 => BINARY / Please use the contants AMSDOS_FILETYPE_BASIC, AMSDOS_FILETYPE_PROTECTED or AMSDOS_FILETYPE_BINARY + -- loadaddr : Loading address + -- length : Length of the file + function dsk.generateheader(user,filename,filetype,loadaddr,entryaddr,length) +@@ -425,7 +429,7 @@ function dsk.generateheader(user,filename,filetype,loadaddr,entryaddr,length) + ..string.char(length&255,length>>8) + ..string.char(0) + +- checksum=0 ++ local checksum=0 + for cpt=1,66,1 do + checksum = checksum + string.byte(header,cpt,cpt) + end +@@ -437,6 +441,49 @@ function dsk.generateheader(user,filename,filetype,loadaddr,entryaddr,length) + return header + end + ++--======================================================================================= ++-- header : The 128 bytes of a header we need to patch ++-- user : a byte (usually 0) ++-- filename : Filename (11 chars max) in uppercase ++-- filetype : 0 => BASIC, 1=> Protected, 2 => BINARY / Please use the contants AMSDOS_FILETYPE_BASIC, AMSDOS_FILETYPE_PROTECTED or AMSDOS_FILETYPE_BINARY ++-- loadaddr : Loading address ++-- length : Length of the file ++function dsk.populateheader(header,user,filename,filetype,loadaddr,entryaddr,length) ++ if (string.len(header)>128) then ++ sj.error("dsk.populateheader : The provided header must have a maximum length of 128 bytes") ++ return false ++ end ++ ++ header=header..string.rep(string.char(0),128-string.len(header)) ++ ++ local headerpatched = string.char(user) ++ ..string.upper(string.sub(filename.." ",1,11)) ++ ..string.char(0,0,0,0,0,0,filetype,0,0,loadaddr&255,loadaddr>>8,0,length&255,length>>8,entryaddr&255,entryaddr>>8) ++ ..string.sub(header,29) ++ ++ print("populateheader") ++ print(string.len(headerpatched)) ++ ++ headerpatched2=string.sub(headerpatched,1,0x40)..string.char(length&255)..string.char(length>>8) ++ ..string.char(0)..string.sub(headerpatched,0x44) ++ headerpatched=headerpatched2 ++ ++ local checksum=0 ++ for cpt=1,66,1 do ++ checksum = checksum + string.byte(headerpatched,cpt,cpt) ++ end ++ ++ headerpatched2=string.sub(headerpatched,1,0x43)..string.char(checksum&255)..string.char(checksum>>8)..string.sub(headerpatched,0x46) ++ ++ headerpatched=headerpatched2 ++ print(string.len(headerpatched)) ++ ++-- headerpatched[0x43+1]=length&255 ++-- headerpatched[0x43+2]=length>>8 ++ ++ return headerpatched ++end ++ + --======================================================================================= + function dsk.adddirectoryentry(user,filename,nbrecords,blockslist) + +@@ -487,7 +534,7 @@ function dsk.adddirectoryentry(user,filename,nbrecords,blockslist) + end + + --======================================================================================= +-function dsk.saveamsdosfile(user,filename,filetype,loadaddr,entryaddr,data) ++function dsk.saveamsdosfile(user,filename,blockdata) + + if (dsk.freeblocks == nil) then + dsk.cat() +@@ -495,8 +542,6 @@ function dsk.saveamsdosfile(user,filename,filetype,loadaddr,entryaddr,data) + + dsk.deletefile(filename) + +- local blockdata = dsk.generateheader(user,filename,filetype,loadaddr,entryaddr,string.len(data))..data +- + local nbrecords = (string.len(blockdata)+127)>>7 + local nbblocks = (string.len(blockdata)+1023)>>10 + blockdata = blockdata..string.rep(string.char(0),nbblocks*1024-string.len(blockdata)) +@@ -547,7 +592,27 @@ function dsk.save(filename,filetype,frombyte,tobyte,entryaddr) + data = data .. string.char(sj.get_byte(cpt)) + end + +- return dsk.saveamsdosfile(0,amsdosfilename,filetype,frombyte,entryaddr,data) ++ local blockdata = dsk.generateheader(0,amsdosfilename,filetype,frombyte,entryaddr,string.len(data))..data ++ ++ return dsk.saveamsdosfile(0,amsdosfilename,blockdata) ++end ++ ++--======================================================================================= ++function dsk.savewithcustomheader(header,filename,filetype,frombyte,tobyte,entryaddr) ++ ++ local data = "" ++ local amsdosfilename = string.upper(filename) ++ local pointpos = string.find(amsdosfilename,"%.") ++ ++ amsdosfilename = string.sub(amsdosfilename,1,pointpos-1)..string.rep(" ",9-pointpos)..string.sub(amsdosfilename,pointpos-string.len(amsdosfilename)) ++ ++ for cpt = frombyte,tobyte-1,1 do ++ data = data .. string.char(sj.get_byte(cpt)) ++ end ++ ++ local blockdata = dsk.populateheader(header,0,amsdosfilename,filetype,frombyte,entryaddr,string.len(data))..data ++ ++ return dsk.saveamsdosfile(0,amsdosfilename,blockdata) + end + + +-- +2.41.0 + +From 9809c81318a81e7f71e62543c041b957ee2bba44 Mon Sep 17 00:00:00 2001 +From: Claire CheshireCat <94008195+ClaireCheshireCat@users.noreply.github.com> +Date: Sat, 19 Aug 2023 10:34:52 +0200 +Subject: [PATCH 2/3] Update README.md + +Signed-off-by: Laurent Carlier <lordheavym@gmail.com> +--- + README.md | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/README.md b/README.md +index 724ad99..dce7edf 100644 +--- a/README.md ++++ b/README.md +@@ -24,12 +24,12 @@ end: + ``` + + - **Filename** in the AMSDOS format : 8 chars, a dot, then 3 chars for the extension. For example "TEST.BIN" is fine +-- **File type** : 0=Basic, 1=Binary. Usually Binary ++- **File type** : AMSDOS_FILETYPE_BASIC, AMSDOS_FILETYPE_PROTECTED,AMSDOS_FILETYPE_BINARY. Usually Binary + - **Start address** : Address where your program starts. Usually the same address than the ORG you set up at the start of your source + - **End address** : Address where your program ends. + - **Entry address** : The address where the CPC has to jump as soon as it has loaded your file. In most cases, it's the same address than the start address + + ...So the save line would look like : +-```dsk.save("test.bin",1,sj.get_label("start"),sj.get_label("end"),sj.get_label("start"))``` ++```dsk.save("test.bin",AMSDOS_FILETYPE_BINARY,sj.get_label("start"),sj.get_label("end"),sj.get_label("start"))``` + + +-- +2.41.0 + +From d86d00bb36a822138877051f587515ad6da820be Mon Sep 17 00:00:00 2001 +From: Claire CheshireCat <94008195+ClaireCheshireCat@users.noreply.github.com> +Date: Sat, 19 Aug 2023 11:00:52 +0200 +Subject: [PATCH 3/3] Update README.md + +Signed-off-by: Laurent Carlier <lordheavym@gmail.com> +--- + README.md | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/README.md b/README.md +index dce7edf..1992bc1 100644 +--- a/README.md ++++ b/README.md +@@ -30,6 +30,6 @@ end: + - **Entry address** : The address where the CPC has to jump as soon as it has loaded your file. In most cases, it's the same address than the start address + + ...So the save line would look like : +-```dsk.save("test.bin",AMSDOS_FILETYPE_BINARY,sj.get_label("start"),sj.get_label("end"),sj.get_label("start"))``` ++```dsk.save("test.bin",dsk.AMSDOS_FILETYPE_BINARY,sj.get_label("start"),sj.get_label("end"),sj.get_label("start"))``` + + +-- +2.41.0 + |