Compare commits

..

No commits in common. "main" and "v0.1.0" have entirely different histories.
main ... v0.1.0

11 changed files with 28 additions and 145 deletions

6
.gitignore vendored
View File

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

View File

@ -27,13 +27,9 @@ Appy abstracts the tools away from a script mindset, and into a project mindset.
## The project file
Appy uses an `appy.yaml` file in the current project directory. The basic format is as follows:
Currently it uses an `appy.yaml` file in the current project directory. The format is as follows:
```
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
assemble: [main.s, grafix.s, snd.s, a.s, b.s] # <--- list of files to assemble with Merlin
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
@ -49,7 +45,7 @@ disks: # <--- define disks, can be more
```
## User Overrides
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:
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:
```
# local system settings/overrides
programs:
@ -76,39 +72,8 @@ $ 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,7 +1,4 @@
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,9 +13,8 @@ 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, project.AppyProj.AssembleFlags, filename).Output()
out, err := exec.Command(project.LocalConf.Programs.Merlin32, "-V", filename).Output()
if err != nil {
color.Cyan(string(out))
log.Fatal(err)

View File

@ -6,15 +6,14 @@ 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)
out, err := exec.Command(project.LocalConf.Programs.Cadius, "CREATEVOLUME", file, name, size).Output()
cmd := exec.Command(project.LocalConf.Programs.Cadius, "CREATEVOLUME", file, name, size)
err := cmd.Run()
if err != nil {
color.Cyan(string(out))
log.Fatal(err)
}
}
@ -22,11 +21,12 @@ 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)
out, err := exec.Command(project.LocalConf.Programs.Cadius, "ADDFILE", disk.File, file.Output, file.Input).Output()
cmd := exec.Command(project.LocalConf.Programs.Cadius, "ADDFILE", disk.File, file.Output, file.Input)
err := cmd.Run()
if err != nil {
color.Cyan(string(out))
log.Fatal(err)
}
}

View File

@ -8,21 +8,12 @@ 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 {
@ -30,5 +21,4 @@ func Format(args []string) {
merlingo.FmtFile(filename)
}
}
// merlingo.Status()
}

View File

@ -10,12 +10,9 @@ import (
)
type Project struct {
name string
Disks []Disk
Assemble []string
Indent []string
AssembleFlags string
FormatFlags string
name string
Disks []Disk
Assemble []string
}
type Disk struct {
@ -40,8 +37,8 @@ type Programs struct {
Gsplus string
}
const Merlin32Path = "merlin32"
const CadiusPath = "cadius"
const Merlin32Path = "/usr/local/bin/merlin32"
const CadiusPath = "/usr/local/bin/cadius"
const GsplusPath = "gsplus"
var AppyProj Project
@ -49,7 +46,6 @@ 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,33 +1,13 @@
module github.com/digarok/appy
go 1.17
go 1.16
require (
github.com/digarok/merlingo v1.0.5
github.com/digarok/merlingo v1.0.0
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.5 h1:XjKLWHk3Cemh4UlgVLEojwA2WUp8ZjZcLA/BUMc1htI=
github.com/digarok/merlingo v1.0.5/go.mod h1:rdReR6enl/63dfkssdM4xwg0gXw3j4QprK9e+e8mX9U=
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/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,28 +1,18 @@
* formatting test
org $300 ; start
org $300 ; start
main nop
* what about this
main nop
; and this
* what about this
sta :jo+1
; and this
sta :jo+1
:jo lda $400
lda $400
rts
: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,x ; look at this long line
* TABS....
* $D5 $0008 sequence [Application Specific]
DEC8 ds 24
ReallyThisisaLoooooongLabelwith stal $e12000,y ; look at this long line

View File

@ -1,28 +0,0 @@
* 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