Compare commits

...

11 Commits
v0.1.0 ... main

Author SHA1 Message Date
Dagen Brock 0c9a3d7210 better (pathless) bin defaults 2023-04-10 17:32:39 -05:00
Dagen Brock 5d546a6c81 fix go.mod 2023-04-08 11:44:31 -05:00
Dagen Brock cb15aa2a5f update default indentation via merlingo 1.0.5 2023-04-08 11:41:38 -05:00
Dagen Brock 9083586502 updates for new format logic 2023-02-15 21:33:12 -06:00
Dagen Brock 5c1390ac57 Add assembler macro variable 2023-02-11 09:01:48 -06:00
Dagen Brock 35c693212e Merge branch 'main' of github.com:digarok/Appy 2023-01-01 11:30:55 -06:00
Dagen Brock 52f839cd7d
Improvements (#3)
* bump for more formatter fixes (DUPE, woops)

* Add `indent` option and improve cadius errors
2023-01-01 11:30:24 -06:00
Dagen Brock 137a52f643 bump for more formatter fixes 2022-07-08 20:48:28 -05:00
Dagen Brock 3f01a77fca bump merlingo for tabs issue 2022-07-04 07:10:56 -05:00
Dagen Brock 1b2a55a6f7 bump merlingo for whitespace fix 2022-07-03 21:12:32 -05:00
Dagen Brock 4008cda19c add git fmt documentation 2022-07-03 20:42:57 -05:00
11 changed files with 145 additions and 28 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
# cadius disk files
*.2mg
*.po
# merlin assembly listings
*_output.txt
*.exe

View File

@ -27,9 +27,13 @@ Appy abstracts the tools away from a script mindset, and into a project mindset.
## The project file
Currently it uses an `appy.yaml` file in the current project directory. The format is as follows:
Appy uses an `appy.yaml` file in the current project directory. The basic format is as follows:
```
assemble: [main.s, grafix.s, snd.s, a.s, b.s] # <--- list of files to assemble with Merlin
assemble: [main.s, grafix.s, snd.s, a.s, b.s] # <--- list of files to assemble with Merlin
assembleflags: "-V" # <--- optional flags to Merlin, including macro directory
indent: [c.s] # <--- optional additional files to indent when running `appy fmt`
formatflags: "mc:10 oc:14 cc:30 ms:1 bs:2" # <--- optional flags to indent
disks: # <--- define disks, can be more than one, handy for 140K + 800K
- name: mydiskimage # <---- each disk has a name (ProDOS volume name)
file: mydiskimage800.2mg # <---- each disk has a filename for the image it creates
@ -45,7 +49,7 @@ disks: # <--- define disks, can be more
```
## User Overrides
What if your copy of Merlin32 (assembler) is in a different location than your teammates? You can set up local binary overrides with an `appy.user.yaml` file in the same directory. It allows the following 3 program settings:
What if your copy of Merlin32 (assembler) is in a different location than your teammate's? You can set up local binary overrides with an `appy.user.yaml` file in the same directory. It allows the following 3 program settings:
```
# local system settings/overrides
programs:
@ -72,8 +76,39 @@ $ appy build # assemble files and make disk, aka 'asm'+'disk'
$ appy brun # assemble files, make disk, and launch emulator
# aka 'asm'+'disk'+'run'
$ appy fmt # format/indent your assembly file in appy.yaml
# you can also pass in filename(s) to format
```
### About the built-in code formatter
Appy uses the [MerlinGo](https://github.com/digarok/merlingo) formatter to indent source code. You can override the default indentation with the various options documented here.
- `mc`: mnemonic column, where instructions start
- `oc`: opcode column
- `cc`: comment column
- `ms`: min space, the minimum amount of space it will allow between two columns
You can define these in your `appy.yaml` project file like so:
```
formatflags: "mc:10 oc:14 cc:30 ms:1"
```
You can also set it in files directly by adding it as a comment marked `ed:` on any line of the file like:
```
* ed: mc=40 oc=26 cc=48 ms=5 <- indentation modeline
```
OR
```
org $2000
; ed: mc=40 oc=26 cc=48 ms=5 <- indentation modeline
lda ...
```
Again either comment style works on any line of the file, but don't add more than one modeline per file.
Also, if you set format options at the project AND file level, then Appy will use the project defaults except when a file specifies its own settings, then it will respect the file settings instead.
### Version Notes
This is an early experimental version not intended for public use.

View File

@ -1,4 +1,7 @@
assemble: [testsrc/sp.s, testsrc/pc.s, testsrc/fmt.s]
assembleflags: "-V"
formatflags: "mc:10 oc:14 cc:30 ms:1 bs:2"
indent: [testsrc/fmt2.s]
disks:
- name: mydiskimage
file: mydiskimage800.2mg

View File

@ -13,8 +13,9 @@ func Assemble() {
// assemble all files in list
for _, filename := range project.AppyProj.Assemble {
fmt.Printf("Assembling %v\n", filename)
fmt.Printf(">> %v %v %v\n", project.LocalConf.Programs.Merlin32, project.AppyProj.AssembleFlags, filename)
out, err := exec.Command(project.LocalConf.Programs.Merlin32, "-V", filename).Output()
out, err := exec.Command(project.LocalConf.Programs.Merlin32, project.AppyProj.AssembleFlags, filename).Output()
if err != nil {
color.Cyan(string(out))
log.Fatal(err)

View File

@ -6,14 +6,15 @@ import (
"os/exec"
"github.com/digarok/appy/core/project"
"github.com/fatih/color"
)
func CreateDisk(name string, file string, size string) {
fmt.Printf("Creating Disk: \"%s\" -> %s \tSize: %s\n", name, file, size)
cmd := exec.Command(project.LocalConf.Programs.Cadius, "CREATEVOLUME", file, name, size)
err := cmd.Run()
out, err := exec.Command(project.LocalConf.Programs.Cadius, "CREATEVOLUME", file, name, size).Output()
if err != nil {
color.Cyan(string(out))
log.Fatal(err)
}
}
@ -21,12 +22,11 @@ func CreateDisk(name string, file string, size string) {
func AddFiles(disk project.Disk) {
fmt.Printf("Add files to: \"%s\"\n", disk.Name)
for _, file := range disk.Files {
// fmt.Printf("%s ADDFILE %s %s %s\n", CadiusPath, disk.File, file.Output, file.Input)
fmt.Printf(" Adding file: -----> %s\n", file.Input)
cmd := exec.Command(project.LocalConf.Programs.Cadius, "ADDFILE", disk.File, file.Output, file.Input)
err := cmd.Run()
out, err := exec.Command(project.LocalConf.Programs.Cadius, "ADDFILE", disk.File, file.Output, file.Input).Output()
if err != nil {
color.Cyan(string(out))
log.Fatal(err)
}
}

View File

@ -8,12 +8,21 @@ import (
)
func Format(args []string) {
// merlingo.Status()
if project.AppyProj.FormatFlags != "" {
merlingo.ParseModeline(project.AppyProj.FormatFlags)
}
if len(args) == 0 {
// format all assembly files in appy.yaml
for _, filename := range project.AppyProj.Assemble {
fmt.Printf("Formatting %v\n", filename)
merlingo.FmtFile(filename)
}
// format all indent files in appy.yaml
for _, filename := range project.AppyProj.Indent {
fmt.Printf("Formatting %v\n", filename)
merlingo.FmtFile(filename)
}
} else {
// format all assembly files in args
for _, filename := range args {
@ -21,4 +30,5 @@ func Format(args []string) {
merlingo.FmtFile(filename)
}
}
// merlingo.Status()
}

View File

@ -10,9 +10,12 @@ import (
)
type Project struct {
name string
Disks []Disk
Assemble []string
name string
Disks []Disk
Assemble []string
Indent []string
AssembleFlags string
FormatFlags string
}
type Disk struct {
@ -37,8 +40,8 @@ type Programs struct {
Gsplus string
}
const Merlin32Path = "/usr/local/bin/merlin32"
const CadiusPath = "/usr/local/bin/cadius"
const Merlin32Path = "merlin32"
const CadiusPath = "cadius"
const GsplusPath = "gsplus"
var AppyProj Project
@ -46,6 +49,7 @@ var LocalConf LocalConfig
func SelfConfigure() {
AppyProj.name = "Default"
AppyProj.AssembleFlags = ""
LocalConf.Programs.Merlin32 = Merlin32Path
LocalConf.Programs.Cadius = CadiusPath
LocalConf.Programs.Gsplus = GsplusPath

24
go.mod
View File

@ -1,13 +1,33 @@
module github.com/digarok/appy
go 1.16
go 1.17
require (
github.com/digarok/merlingo v1.0.0
github.com/digarok/merlingo v1.0.5
github.com/fatih/color v1.13.0
github.com/mitchellh/go-homedir v1.1.0
github.com/spf13/cobra v1.1.3
github.com/spf13/viper v1.7.1
)
require (
github.com/fsnotify/fsnotify v1.4.7 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/magiconair/properties v1.8.1 // indirect
github.com/mattn/go-colorable v0.1.9 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mitchellh/mapstructure v1.1.2 // indirect
github.com/pelletier/go-toml v1.2.0 // indirect
github.com/spf13/afero v1.1.2 // indirect
github.com/spf13/cast v1.3.0 // indirect
github.com/spf13/jwalterweatherman v1.0.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/subosito/gotenv v1.2.0 // indirect
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect
golang.org/x/text v0.3.2 // indirect
gopkg.in/ini.v1 v1.51.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)
//replace github.com/digarok/merlingo => ../merlingo

4
go.sum
View File

@ -37,8 +37,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/digarok/merlingo v1.0.0 h1:T+J2dzDV1ShhXEAlZxmNkReJML7iMGAbp97T/y80vEE=
github.com/digarok/merlingo v1.0.0/go.mod h1:rdReR6enl/63dfkssdM4xwg0gXw3j4QprK9e+e8mX9U=
github.com/digarok/merlingo v1.0.5 h1:XjKLWHk3Cemh4UlgVLEojwA2WUp8ZjZcLA/BUMc1htI=
github.com/digarok/merlingo v1.0.5/go.mod h1:rdReR6enl/63dfkssdM4xwg0gXw3j4QprK9e+e8mX9U=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=

View File

@ -1,18 +1,28 @@
* formatting test
org $300 ; start
org $300 ; start
main nop
main nop
* what about this
* what about this
; and this
; and this
sta :jo+1
sta :jo+1
:jo+1 lda $400
lda $400
rts
:jo lda $400
lda $400
rts
** 24 (bit) hex to 8 (nibble) / 4 byte BCD
** 24 (bit) hex to
HEXDEC mx %11
LDA #0 ; Ensure the result is clear
STA DEC8+0
STA DEC8+1
STA DEC8+2
STA DEC8+3
ReallyThisisaLoooooongLabelwith stal $e12000,x ; look at this long line
ReallyThisisaLoooooongLabelwith stal $e12000,y ; look at this long line
* TABS....
* $D5 $0008 sequence [Application Specific]
DEC8 ds 24

28
testsrc/fmt2.s Normal file
View File

@ -0,0 +1,28 @@
* formatting test
org $300 ; start
main nop
* what about this
; and this
sta :jo+1
:jo+1 lda $400
lda $400
rts
** 24 (bit) hex to 8 (nibble) / 4 byte BCD
** 24 (bit) hex to
HEXDEC mx %11
LDA #0 ; Ensure the result is clear
STA DEC8+0
STA DEC8+1
STA DEC8+2
STA DEC8+3
ReallyThisisaLoooooongLabelwith stal $e12000,y ; look at this long line
* TABS....
* $D5 $0008 sequence [Application Specific]
; ed: mc=40 oc=26 cc=48 ms=5 bs=2 <- indentation modeline