mirror of
https://github.com/digarok/Appy.git
synced 2024-09-28 22:55:02 +00:00
Compare commits
No commits in common. "main" and "v0.1.0" have entirely different histories.
6
.gitignore
vendored
6
.gitignore
vendored
@ -1,6 +0,0 @@
|
|||||||
# cadius disk files
|
|
||||||
*.2mg
|
|
||||||
*.po
|
|
||||||
# merlin assembly listings
|
|
||||||
*_output.txt
|
|
||||||
*.exe
|
|
39
README.md
39
README.md
@ -27,13 +27,9 @@ Appy abstracts the tools away from a script mindset, and into a project mindset.
|
|||||||
|
|
||||||
## The project file
|
## 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
|
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
|
disks: # <--- define disks, can be more than one, handy for 140K + 800K
|
||||||
- name: mydiskimage # <---- each disk has a name (ProDOS volume name)
|
- name: mydiskimage # <---- each disk has a name (ProDOS volume name)
|
||||||
file: mydiskimage800.2mg # <---- each disk has a filename for the image it creates
|
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
|
## 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
|
# local system settings/overrides
|
||||||
programs:
|
programs:
|
||||||
@ -76,39 +72,8 @@ $ appy build # assemble files and make disk, aka 'asm'+'disk'
|
|||||||
|
|
||||||
$ appy brun # assemble files, make disk, and launch emulator
|
$ appy brun # assemble files, make disk, and launch emulator
|
||||||
# aka 'asm'+'disk'+'run'
|
# 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
|
### Version Notes
|
||||||
This is an early experimental version not intended for public use.
|
This is an early experimental version not intended for public use.
|
||||||
|
|
||||||
|
@ -1,7 +1,4 @@
|
|||||||
assemble: [testsrc/sp.s, testsrc/pc.s, testsrc/fmt.s]
|
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:
|
disks:
|
||||||
- name: mydiskimage
|
- name: mydiskimage
|
||||||
file: mydiskimage800.2mg
|
file: mydiskimage800.2mg
|
||||||
|
@ -13,9 +13,8 @@ func Assemble() {
|
|||||||
// assemble all files in list
|
// assemble all files in list
|
||||||
for _, filename := range project.AppyProj.Assemble {
|
for _, filename := range project.AppyProj.Assemble {
|
||||||
fmt.Printf("Assembling %v\n", filename)
|
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 {
|
if err != nil {
|
||||||
color.Cyan(string(out))
|
color.Cyan(string(out))
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
@ -6,15 +6,14 @@ import (
|
|||||||
"os/exec"
|
"os/exec"
|
||||||
|
|
||||||
"github.com/digarok/appy/core/project"
|
"github.com/digarok/appy/core/project"
|
||||||
"github.com/fatih/color"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func CreateDisk(name string, file string, size string) {
|
func CreateDisk(name string, file string, size string) {
|
||||||
fmt.Printf("Creating Disk: \"%s\" -> %s \tSize: %s\n", name, file, size)
|
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 {
|
if err != nil {
|
||||||
color.Cyan(string(out))
|
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -22,11 +21,12 @@ func CreateDisk(name string, file string, size string) {
|
|||||||
func AddFiles(disk project.Disk) {
|
func AddFiles(disk project.Disk) {
|
||||||
fmt.Printf("Add files to: \"%s\"\n", disk.Name)
|
fmt.Printf("Add files to: \"%s\"\n", disk.Name)
|
||||||
for _, file := range disk.Files {
|
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)
|
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 {
|
if err != nil {
|
||||||
color.Cyan(string(out))
|
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,21 +8,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func Format(args []string) {
|
func Format(args []string) {
|
||||||
// merlingo.Status()
|
|
||||||
if project.AppyProj.FormatFlags != "" {
|
|
||||||
merlingo.ParseModeline(project.AppyProj.FormatFlags)
|
|
||||||
}
|
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
// format all assembly files in appy.yaml
|
// format all assembly files in appy.yaml
|
||||||
for _, filename := range project.AppyProj.Assemble {
|
for _, filename := range project.AppyProj.Assemble {
|
||||||
fmt.Printf("Formatting %v\n", filename)
|
fmt.Printf("Formatting %v\n", filename)
|
||||||
merlingo.FmtFile(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 {
|
} else {
|
||||||
// format all assembly files in args
|
// format all assembly files in args
|
||||||
for _, filename := range args {
|
for _, filename := range args {
|
||||||
@ -30,5 +21,4 @@ func Format(args []string) {
|
|||||||
merlingo.FmtFile(filename)
|
merlingo.FmtFile(filename)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// merlingo.Status()
|
|
||||||
}
|
}
|
||||||
|
@ -13,9 +13,6 @@ type Project struct {
|
|||||||
name string
|
name string
|
||||||
Disks []Disk
|
Disks []Disk
|
||||||
Assemble []string
|
Assemble []string
|
||||||
Indent []string
|
|
||||||
AssembleFlags string
|
|
||||||
FormatFlags string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Disk struct {
|
type Disk struct {
|
||||||
@ -40,8 +37,8 @@ type Programs struct {
|
|||||||
Gsplus string
|
Gsplus string
|
||||||
}
|
}
|
||||||
|
|
||||||
const Merlin32Path = "merlin32"
|
const Merlin32Path = "/usr/local/bin/merlin32"
|
||||||
const CadiusPath = "cadius"
|
const CadiusPath = "/usr/local/bin/cadius"
|
||||||
const GsplusPath = "gsplus"
|
const GsplusPath = "gsplus"
|
||||||
|
|
||||||
var AppyProj Project
|
var AppyProj Project
|
||||||
@ -49,7 +46,6 @@ var LocalConf LocalConfig
|
|||||||
|
|
||||||
func SelfConfigure() {
|
func SelfConfigure() {
|
||||||
AppyProj.name = "Default"
|
AppyProj.name = "Default"
|
||||||
AppyProj.AssembleFlags = ""
|
|
||||||
LocalConf.Programs.Merlin32 = Merlin32Path
|
LocalConf.Programs.Merlin32 = Merlin32Path
|
||||||
LocalConf.Programs.Cadius = CadiusPath
|
LocalConf.Programs.Cadius = CadiusPath
|
||||||
LocalConf.Programs.Gsplus = GsplusPath
|
LocalConf.Programs.Gsplus = GsplusPath
|
||||||
|
24
go.mod
24
go.mod
@ -1,33 +1,13 @@
|
|||||||
module github.com/digarok/appy
|
module github.com/digarok/appy
|
||||||
|
|
||||||
go 1.17
|
go 1.16
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/digarok/merlingo v1.0.5
|
github.com/digarok/merlingo v1.0.0
|
||||||
github.com/fatih/color v1.13.0
|
github.com/fatih/color v1.13.0
|
||||||
github.com/mitchellh/go-homedir v1.1.0
|
github.com/mitchellh/go-homedir v1.1.0
|
||||||
github.com/spf13/cobra v1.1.3
|
github.com/spf13/cobra v1.1.3
|
||||||
github.com/spf13/viper v1.7.1
|
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
|
//replace github.com/digarok/merlingo => ../merlingo
|
||||||
|
4
go.sum
4
go.sum
@ -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/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/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/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.0 h1:T+J2dzDV1ShhXEAlZxmNkReJML7iMGAbp97T/y80vEE=
|
||||||
github.com/digarok/merlingo v1.0.5/go.mod h1:rdReR6enl/63dfkssdM4xwg0gXw3j4QprK9e+e8mX9U=
|
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.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
|
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
|
||||||
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
|
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
org $300 ; start
|
org $300 ; start
|
||||||
|
|
||||||
main nop
|
main nop
|
||||||
|
|
||||||
* what about this
|
* what about this
|
||||||
|
|
||||||
; and this
|
; and this
|
||||||
@ -9,20 +10,9 @@ main nop
|
|||||||
sta :jo+1
|
sta :jo+1
|
||||||
|
|
||||||
|
|
||||||
:jo lda $400
|
:jo+1 lda $400
|
||||||
lda $400
|
lda $400
|
||||||
rts
|
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....
|
ReallyThisisaLoooooongLabelwith stal $e12000,y ; look at this long line
|
||||||
* $D5 $0008 sequence [Application Specific]
|
|
||||||
DEC8 ds 24
|
|
||||||
|
@ -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
|
|
Loading…
Reference in New Issue
Block a user