summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Carlier2023-08-19 14:44:13 +0200
committerLaurent Carlier2023-08-19 14:44:13 +0200
commit54faa0d8e328d0a43d7dc01907ec4706a0b01560 (patch)
treeae7d16f9f739ebb49de5fe3a22062dcfa60bf3b6
downloadaur-dsk-lua.tar.gz
initial commit
-rw-r--r--.SRCINFO18
-rw-r--r--PKGBUILD34
-rw-r--r--dsk-lua.csh1
-rw-r--r--dsk-lua.sh1
-rw-r--r--upstream-fixes.patch256
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
+