Initial commit
This commit is contained in:
commit
ddbf083d1b
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
.direnv
|
||||||
|
inc
|
||||||
|
ultlf
|
||||||
|
xenrom/data
|
459
flake.lock
Normal file
459
flake.lock
Normal file
|
@ -0,0 +1,459 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1694529238,
|
||||||
|
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils_2": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1694529238,
|
||||||
|
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils_3": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems_3"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1694529238,
|
||||||
|
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils_4": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems_4"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1694529238,
|
||||||
|
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils_5": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems_5"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1694529238,
|
||||||
|
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils_6": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems_6"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1694529238,
|
||||||
|
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils_7": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems_7"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1694529238,
|
||||||
|
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fox32": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils_2",
|
||||||
|
"fox32rom": "fox32rom",
|
||||||
|
"nixpkgs": "nixpkgs_3"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"dirtyRev": "7777dfd3ae2dd85b12dcd60335214a78c7774c60-dirty",
|
||||||
|
"dirtyShortRev": "7777dfd-dirty",
|
||||||
|
"lastModified": 1690147702,
|
||||||
|
"narHash": "sha256-Tn99hPzeOzZ2PaU/22HNO7VoZlMbWUAzPuMV/hfYxS8=",
|
||||||
|
"type": "git",
|
||||||
|
"url": "file:../fox32"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "file:../fox32"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fox32asm": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils_4",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1706813730,
|
||||||
|
"narHash": "sha256-U1fg1EId3JOl5hKvMMBGKTMBJ/b94TCL7Z0+NLa/m6M=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "30da72b3c70a1f43b0de4ee8e2e9d190be1d9bb9",
|
||||||
|
"revCount": 58,
|
||||||
|
"type": "git",
|
||||||
|
"url": "file:../fox32asm/"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "file:../fox32asm/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fox32asm_2": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils_5",
|
||||||
|
"nixpkgs": "nixpkgs_4"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"dirtyRev": "30da72b3c70a1f43b0de4ee8e2e9d190be1d9bb9-dirty",
|
||||||
|
"dirtyShortRev": "30da72b-dirty",
|
||||||
|
"lastModified": 1706813730,
|
||||||
|
"narHash": "sha256-HfMO2G4V3RiGrAPrhlpi5yziTONpyxs/M4RjyuGmMHE=",
|
||||||
|
"type": "git",
|
||||||
|
"url": "file:../fox32asm"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "file:../fox32asm"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fox32asm_3": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils_7",
|
||||||
|
"nixpkgs": "nixpkgs_5"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1706813730,
|
||||||
|
"narHash": "sha256-U1fg1EId3JOl5hKvMMBGKTMBJ/b94TCL7Z0+NLa/m6M=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "30da72b3c70a1f43b0de4ee8e2e9d190be1d9bb9",
|
||||||
|
"revCount": 58,
|
||||||
|
"type": "git",
|
||||||
|
"url": "file:../fox32asm/"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "file:../fox32asm/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fox32rom": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils_3",
|
||||||
|
"fox32asm": "fox32asm",
|
||||||
|
"nixpkgs": "nixpkgs_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1706819209,
|
||||||
|
"narHash": "sha256-yOOADll1zrrpuVtLC1SS/bSTzmNTZBUUXhAAiTVz7PU=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "b53476353d99cadafba216cddcb29e83326685e4",
|
||||||
|
"revCount": 180,
|
||||||
|
"type": "git",
|
||||||
|
"url": "file:../fox32rom/"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "file:../fox32rom/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fox32rom_2": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils_6",
|
||||||
|
"fox32asm": "fox32asm_3",
|
||||||
|
"nixpkgs": "nixpkgs_6"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1706819209,
|
||||||
|
"narHash": "sha256-yOOADll1zrrpuVtLC1SS/bSTzmNTZBUUXhAAiTVz7PU=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "b53476353d99cadafba216cddcb29e83326685e4",
|
||||||
|
"revCount": 180,
|
||||||
|
"type": "git",
|
||||||
|
"url": "file:../fox32rom"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "file:../fox32rom"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1697009197,
|
||||||
|
"narHash": "sha256-viVRhBTFT8fPJTb1N3brQIpFZnttmwo3JVKNuWRVc3s=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "01441e14af5e29c9d27ace398e6dd0b293e25a54",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1697009197,
|
||||||
|
"narHash": "sha256-viVRhBTFT8fPJTb1N3brQIpFZnttmwo3JVKNuWRVc3s=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "01441e14af5e29c9d27ace398e6dd0b293e25a54",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_3": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1697009197,
|
||||||
|
"narHash": "sha256-viVRhBTFT8fPJTb1N3brQIpFZnttmwo3JVKNuWRVc3s=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "01441e14af5e29c9d27ace398e6dd0b293e25a54",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_4": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1697009197,
|
||||||
|
"narHash": "sha256-viVRhBTFT8fPJTb1N3brQIpFZnttmwo3JVKNuWRVc3s=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "01441e14af5e29c9d27ace398e6dd0b293e25a54",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_5": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1697009197,
|
||||||
|
"narHash": "sha256-viVRhBTFT8fPJTb1N3brQIpFZnttmwo3JVKNuWRVc3s=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "01441e14af5e29c9d27ace398e6dd0b293e25a54",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_6": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1697009197,
|
||||||
|
"narHash": "sha256-viVRhBTFT8fPJTb1N3brQIpFZnttmwo3JVKNuWRVc3s=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "01441e14af5e29c9d27ace398e6dd0b293e25a54",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_7": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1697009197,
|
||||||
|
"narHash": "sha256-viVRhBTFT8fPJTb1N3brQIpFZnttmwo3JVKNuWRVc3s=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "01441e14af5e29c9d27ace398e6dd0b293e25a54",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"fox32": "fox32",
|
||||||
|
"fox32asm": "fox32asm_2",
|
||||||
|
"fox32rom": "fox32rom_2",
|
||||||
|
"nixpkgs": "nixpkgs_7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems_3": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems_4": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems_5": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems_6": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems_7": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
80
flake.nix
Normal file
80
flake.nix
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
{
|
||||||
|
description = "test stuff for fox32";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
fox32asm.url = "git+file:../fox32asm";
|
||||||
|
fox32.url = "git+file:../fox32";
|
||||||
|
fox32rom.url = "git+file:../fox32rom";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, fox32asm, fox32, fox32rom, flake-utils }:
|
||||||
|
flake-utils.lib.eachDefaultSystem (sys:
|
||||||
|
let pkgs = import nixpkgs { system = sys; };
|
||||||
|
asm = fox32asm.packages.${sys}.fox32asm;
|
||||||
|
emulator = fox32.packages.${sys}.fox32;
|
||||||
|
romdev = fox32rom.packages.${sys}.fox32rom-dev;
|
||||||
|
py = pkgs.python310;
|
||||||
|
|
||||||
|
ultlf = pkgs.stdenv.mkDerivation {
|
||||||
|
name = "ultlf";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "ultlang"; repo = "ultlf";
|
||||||
|
rev = "9b867a6cd04a2daf6d44ab9731ecf426d535a8a2";
|
||||||
|
hash = "sha256-Y7WrkvC+GNZluqzIuXm/2WIlFj/nvJNWTXU6gCvOf5E=";
|
||||||
|
};
|
||||||
|
dontBuild = true;
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/data
|
||||||
|
cp ultlf-data/{codepoints.json,trimmed_baselines.json,data.json} $out/data
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
rom = pkgs.stdenv.mkDerivation rec {
|
||||||
|
pname = "xen32";
|
||||||
|
version = "0.0-alpha";
|
||||||
|
|
||||||
|
src = ./. ;
|
||||||
|
|
||||||
|
buildPhase = ''
|
||||||
|
mkdir -p inc
|
||||||
|
mkdir -p xenrom/data
|
||||||
|
cp ${romdev}/dev/fox32rom.def inc
|
||||||
|
mkdir -p ultlf
|
||||||
|
cp ${ultlf}/data/* ultlf
|
||||||
|
|
||||||
|
mkdir -p $out/bin/
|
||||||
|
${py}/bin/python3 ./gen/fontgen.py
|
||||||
|
${py}/bin/python3 ./gen/logogen.py
|
||||||
|
${py}/bin/python3 ./gen/vergen.py
|
||||||
|
${asm}/bin/fox32asm xenrom/main.asm $out/bin/xen32.rom
|
||||||
|
'';
|
||||||
|
|
||||||
|
NIX_SEMVER = version;
|
||||||
|
NIX_GIT_SHA_SHORT = if self ? rev then builtins.substring 0 7 self.rev else "dirty";
|
||||||
|
};
|
||||||
|
|
||||||
|
in rec {
|
||||||
|
packages.rom = rom;
|
||||||
|
|
||||||
|
packages.run = pkgs.writeScriptBin "xen32-run" ''
|
||||||
|
${emulator}/bin/fox32 --rom ${packages.rom}/bin/xen32.rom
|
||||||
|
'';
|
||||||
|
|
||||||
|
packages.ultlf = ultlf;
|
||||||
|
|
||||||
|
devShells.default = pkgs.mkShell {
|
||||||
|
packages = [ asm emulator py ];
|
||||||
|
shellHook = ''
|
||||||
|
mkdir -p inc
|
||||||
|
mkdir -p xenrom/data
|
||||||
|
cp ${romdev}/dev/fox32rom.def inc
|
||||||
|
mkdir -p ultlf
|
||||||
|
cp ${ultlf}/data/* ultlf
|
||||||
|
${py}/bin/python3 ./gen/fontgen.py
|
||||||
|
${py}/bin/python3 ./gen/logogen.py
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
66
gen/fontgen.py
Normal file
66
gen/fontgen.py
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
import json
|
||||||
|
import struct
|
||||||
|
|
||||||
|
# generates:
|
||||||
|
# font_data.dat (binary file, expected to load at location 0xf000_0100)
|
||||||
|
# font_data.inc (fox32 assembly)
|
||||||
|
# font_data.inc defines constants
|
||||||
|
# N_CHARS: number of defined characters (u32)
|
||||||
|
# CHAR_TABLE: pointer to main char table (&Char)
|
||||||
|
# UNKNOWN_CHAR: pointer to unknown character (&Char)
|
||||||
|
#
|
||||||
|
# struct Char {
|
||||||
|
# width: u8, height: u8, baseline: u8,
|
||||||
|
# data_ptr: &[u8],
|
||||||
|
# } (7 bytes)
|
||||||
|
|
||||||
|
DATA_FILE_ORIGIN = 0xf000_0100
|
||||||
|
|
||||||
|
BASELINE = 7
|
||||||
|
N_CHARS = 127
|
||||||
|
|
||||||
|
codepoints = json.load(open("ultlf/codepoints.json"))
|
||||||
|
font_data = json.load(open("ultlf/data.json"))
|
||||||
|
baselines = json.load(open("ultlf/trimmed_baselines.json"))
|
||||||
|
|
||||||
|
UNKNOWN = [
|
||||||
|
"# ### #",
|
||||||
|
"# # # #",
|
||||||
|
"# # #",
|
||||||
|
"# # #",
|
||||||
|
"# # #",
|
||||||
|
"# #",
|
||||||
|
"# # #",
|
||||||
|
]
|
||||||
|
|
||||||
|
with open("xenrom/data/font_data.inc", "w") as inc, open("xenrom/data/font_data.dat", "wb") as dat:
|
||||||
|
table = b''
|
||||||
|
char_data = b''
|
||||||
|
|
||||||
|
for ch in [None] + list(range(N_CHARS)):
|
||||||
|
if ch in codepoints:
|
||||||
|
i = codepoints.index(ch)
|
||||||
|
glyph = font_data[i]
|
||||||
|
baseline = baselines[i]
|
||||||
|
if '?' in "".join(glyph):
|
||||||
|
print(f"Font doesn't have char {ch}")
|
||||||
|
glyph = UNKNOWN
|
||||||
|
baseline = 6
|
||||||
|
else:
|
||||||
|
glyph = UNKNOWN
|
||||||
|
baseline = 6
|
||||||
|
print(f"Couldn't find char {ch}")
|
||||||
|
|
||||||
|
table += struct.pack("BBBI", len(glyph[0]), len(glyph), baseline, DATA_FILE_ORIGIN + len(char_data))
|
||||||
|
|
||||||
|
for line in glyph:
|
||||||
|
for ch in glyph:
|
||||||
|
char_data += b'\x00' if ch == ' ' else b'\x01'
|
||||||
|
|
||||||
|
dat.write(char_data + table)
|
||||||
|
|
||||||
|
inc.write(f'''
|
||||||
|
const N_CHARS: {N_CHARS}
|
||||||
|
const CHAR_TABLE: {hex(DATA_FILE_ORIGIN + len(char_data))}
|
||||||
|
const UNKNOWN_CHAR: {hex(DATA_FILE_ORIGIN)}
|
||||||
|
''')
|
73
gen/logogen.py
Normal file
73
gen/logogen.py
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
import struct
|
||||||
|
import math
|
||||||
|
import random
|
||||||
|
random.seed(0)
|
||||||
|
|
||||||
|
LOGO = '''
|
||||||
|
BBBB BBBB BB B
|
||||||
|
B B B
|
||||||
|
BB BBBB B B
|
||||||
|
B B B
|
||||||
|
BBBB BBBB B BB
|
||||||
|
|
||||||
|
|
||||||
|
WWWW WWWW
|
||||||
|
W W
|
||||||
|
WWWW WWWW
|
||||||
|
W W
|
||||||
|
WWWW WWWW
|
||||||
|
'''[1:-1]
|
||||||
|
|
||||||
|
LOGO = '''
|
||||||
|
RRRR RRRR RR R BBBB BBBB
|
||||||
|
R R R B B
|
||||||
|
RR RRRR R R BBBB BBBB
|
||||||
|
R R R B B
|
||||||
|
RRRR RRRR R RR BBBB BBBB
|
||||||
|
|
||||||
|
|
||||||
|
WWWW WWWW
|
||||||
|
W W W
|
||||||
|
W W WWWW
|
||||||
|
W W W
|
||||||
|
WWWW WWWW
|
||||||
|
'''[1:-1]
|
||||||
|
LOGO = LOGO.split("\n")
|
||||||
|
print(LOGO)
|
||||||
|
|
||||||
|
width = max(len(row) for row in LOGO)
|
||||||
|
height = len(LOGO)
|
||||||
|
print("width =", width)
|
||||||
|
print("height =", height)
|
||||||
|
|
||||||
|
with open("xenrom/data/logo.dat", "wb") as data_out, open("xenrom/data/logo.inc", "w") as inc:
|
||||||
|
for y in range(height):
|
||||||
|
row = LOGO[y]
|
||||||
|
for x in range(width):
|
||||||
|
c = row[x] if x < len(row) else ' '
|
||||||
|
data_out.write(b'\x00' if c == ' ' else b'\x01' if c == 'B' else b'\x02' if c == 'W' else b'\x03')
|
||||||
|
inc.write(f"const LOGO_WIDTH: {hex(width)}\n")
|
||||||
|
inc.write(f"const LOGO_HEIGHT: {hex(height)}\n")
|
||||||
|
|
||||||
|
with open("xenrom/data/logo_cycle.dat", "wb") as data, open("xenrom/data/logo_cycle.inc", "w") as inc:
|
||||||
|
|
||||||
|
T = 60
|
||||||
|
N = T * 4
|
||||||
|
r = 0
|
||||||
|
|
||||||
|
for i in range(N):
|
||||||
|
if i < T or i > 3 * T:
|
||||||
|
f = 0.5 - (1/2 * math.cos((i/T) * math.pi))
|
||||||
|
elif i < 180:
|
||||||
|
f = 0.75 - (1/4 * math.cos((i/T) * math.pi))
|
||||||
|
|
||||||
|
if i == 3 * T - 10:
|
||||||
|
r = 1
|
||||||
|
if i == 3 * T:
|
||||||
|
r = 2
|
||||||
|
if i == 3 * T + 10:
|
||||||
|
r = 0
|
||||||
|
|
||||||
|
data.write(struct.pack("BB", min(255, int(256 * f)), r))
|
||||||
|
|
||||||
|
inc.write(f"const LOGO_LENGTH: {N}")
|
8
gen/vergen.py
Normal file
8
gen/vergen.py
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import os
|
||||||
|
|
||||||
|
with open("xenrom/data/version.inc", "w") as f:
|
||||||
|
version = os.getenv("NIX_SEMVER", "(unknown version)")
|
||||||
|
git_sha = os.getenv("NIX_GIT_SHA_SHORT", "(unknown git hash)")
|
||||||
|
|
||||||
|
f.write(f'version_str: data.str "{version}" data.8 0\n')
|
||||||
|
f.write(f'sha_str: data.str "{git_sha}" data.8 0\n')
|
183
xenrom/logo.asm
Normal file
183
xenrom/logo.asm
Normal file
|
@ -0,0 +1,183 @@
|
||||||
|
show_logo:
|
||||||
|
icl ; disable interrupts
|
||||||
|
|
||||||
|
; Save old interrupt handler
|
||||||
|
mov r0, [0x3fc]
|
||||||
|
push r0
|
||||||
|
|
||||||
|
; Set vsync interrupt handler to logo display
|
||||||
|
mov [0x3fc], intr_vsync_logo
|
||||||
|
|
||||||
|
mov [SHOWING_LOGO], 1
|
||||||
|
mov [FRAMENR], 0
|
||||||
|
|
||||||
|
ise ; Enable interrupts
|
||||||
|
|
||||||
|
; Wait for logo display interrupt to return
|
||||||
|
show_logo_wait:
|
||||||
|
cmp [SHOWING_LOGO], 1
|
||||||
|
ifz jmp show_logo_wait
|
||||||
|
|
||||||
|
icl ; Restore interrupt handler
|
||||||
|
pop r0
|
||||||
|
mov [0x3fc], r0
|
||||||
|
|
||||||
|
; Draw logo in black (clear)
|
||||||
|
mov r0, 0
|
||||||
|
mov r1, 0
|
||||||
|
call draw_logo
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
cycle_data: #include_bin "data/logo_cycle.dat"
|
||||||
|
; defines LOGO_LENGTH
|
||||||
|
#include "data/logo_cycle.inc"
|
||||||
|
|
||||||
|
intr_vsync_logo:
|
||||||
|
; [rsp] = interrupt number
|
||||||
|
; [rsp+4] = flags
|
||||||
|
; [rsp+8] = previous instuction
|
||||||
|
|
||||||
|
inc [FRAMENR]
|
||||||
|
|
||||||
|
mov r2, [FRAMENR]
|
||||||
|
cmp r2, LOGO_LENGTH
|
||||||
|
ifgteq mov [SHOWING_LOGO], 0
|
||||||
|
|
||||||
|
; fetch brightness and glitchiness
|
||||||
|
mul r2, 2
|
||||||
|
add r2, cycle_data
|
||||||
|
movz.8 r0, [r2]
|
||||||
|
inc r2
|
||||||
|
movz.8 r1, [r2]
|
||||||
|
|
||||||
|
call draw_logo
|
||||||
|
|
||||||
|
add rsp, 4 ; pop interrupt number
|
||||||
|
reti
|
||||||
|
|
||||||
|
|
||||||
|
boot_logo: #include_bin "data/logo.dat"
|
||||||
|
; defines LOGO_WIDTH, LOGO_HEIGHT:
|
||||||
|
#include "data/logo.inc"
|
||||||
|
|
||||||
|
const LOGO_SCALE: 8 ; pixels per pixel in logo
|
||||||
|
|
||||||
|
; input: r0: 0-255 color multiplier
|
||||||
|
; input: r1: glitch effect
|
||||||
|
draw_logo:
|
||||||
|
mov r31, r0
|
||||||
|
mov r30, r1
|
||||||
|
|
||||||
|
; r0: x counter
|
||||||
|
; r1: y counter
|
||||||
|
; r2: pointer to current boot logo index
|
||||||
|
; r5: x on screen start
|
||||||
|
; r6: y on screen start
|
||||||
|
|
||||||
|
mov r5, SCREEN_WIDTH
|
||||||
|
mov r6, LOGO_WIDTH
|
||||||
|
mul r6, LOGO_SCALE
|
||||||
|
sub r5, r6
|
||||||
|
ror r5, 1
|
||||||
|
|
||||||
|
mov r6, SCREEN_HEIGHT
|
||||||
|
mov r7, LOGO_HEIGHT
|
||||||
|
mul r7, LOGO_SCALE
|
||||||
|
sub r6, r7
|
||||||
|
ror r6, 1
|
||||||
|
|
||||||
|
mov r2, boot_logo
|
||||||
|
|
||||||
|
mov r1, 0
|
||||||
|
draw_loop_y:
|
||||||
|
cmp r1, LOGO_HEIGHT
|
||||||
|
ifz jmp draw_logo_done
|
||||||
|
|
||||||
|
mov r0, 0
|
||||||
|
draw_loop_x:
|
||||||
|
cmp r0, LOGO_WIDTH
|
||||||
|
ifz jmp draw_loop_x_done
|
||||||
|
|
||||||
|
; r3: color to draw
|
||||||
|
mov r3, 0x00000000 ; black
|
||||||
|
|
||||||
|
xor r2, r30
|
||||||
|
cmp.8 [r2], 1
|
||||||
|
ifz mov r3, 0x00040401 ; blue
|
||||||
|
cmp.8 [r2], 2
|
||||||
|
ifz mov r3, 0x00040403; white
|
||||||
|
cmp.8 [r2], 3
|
||||||
|
ifz mov r3, 0x00010204; orange
|
||||||
|
xor r2, r30
|
||||||
|
|
||||||
|
cmp r30, 0
|
||||||
|
ifz jmp no_color_glitch
|
||||||
|
cmp r3, 0
|
||||||
|
ifnz xor r3, r0
|
||||||
|
ifnz xor r3, r1
|
||||||
|
|
||||||
|
no_color_glitch:
|
||||||
|
|
||||||
|
mov r28, r31
|
||||||
|
srl r28, 2
|
||||||
|
mul r3, r28 ; brightness
|
||||||
|
|
||||||
|
xor r3, r29
|
||||||
|
|
||||||
|
or r3, 0xff000000
|
||||||
|
|
||||||
|
; r4: screen buffer index of top left
|
||||||
|
mov r4, r6
|
||||||
|
mov r7, r1
|
||||||
|
mul r7, LOGO_SCALE
|
||||||
|
add r4, r7
|
||||||
|
mul r4, 640
|
||||||
|
|
||||||
|
add r4, r5
|
||||||
|
mov r7, r0
|
||||||
|
mul r7, LOGO_SCALE
|
||||||
|
add r4, r7
|
||||||
|
mul r4, 4
|
||||||
|
add r4, BG_FRAMEBUFFER
|
||||||
|
|
||||||
|
; r7: paint x
|
||||||
|
; r8: point y
|
||||||
|
|
||||||
|
mov r7, 0
|
||||||
|
draw_loop_px:
|
||||||
|
cmp r7, LOGO_SCALE
|
||||||
|
ifz jmp draw_loop_px_done
|
||||||
|
|
||||||
|
mov r8, 0
|
||||||
|
draw_loop_py:
|
||||||
|
cmp r8, LOGO_SCALE
|
||||||
|
ifz jmp draw_loop_py_done
|
||||||
|
|
||||||
|
mov r9, r8
|
||||||
|
mul r9, 640
|
||||||
|
add r9, r7
|
||||||
|
mul r9, 4
|
||||||
|
add r9, r4
|
||||||
|
|
||||||
|
mov [r9], r3
|
||||||
|
|
||||||
|
inc r8
|
||||||
|
jmp draw_loop_py
|
||||||
|
draw_loop_py_done:
|
||||||
|
|
||||||
|
inc r7
|
||||||
|
jmp draw_loop_px
|
||||||
|
draw_loop_px_done:
|
||||||
|
|
||||||
|
|
||||||
|
inc r2
|
||||||
|
inc r0
|
||||||
|
jmp draw_loop_x
|
||||||
|
draw_loop_x_done:
|
||||||
|
inc r1
|
||||||
|
jmp draw_loop_y
|
||||||
|
|
||||||
|
draw_logo_done:
|
||||||
|
ret
|
||||||
|
|
99
xenrom/main.asm
Normal file
99
xenrom/main.asm
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
; Constants
|
||||||
|
|
||||||
|
const SYS_STACK_START: 0x03fffff0
|
||||||
|
const BG_FRAMEBUFFER: 0x2000000
|
||||||
|
|
||||||
|
const SCREEN_WIDTH: 640
|
||||||
|
const SCREEN_HEIGHT: 480
|
||||||
|
|
||||||
|
|
||||||
|
; Globals
|
||||||
|
const FRAMENR: 0x00000000
|
||||||
|
const SHOWING_LOGO: 0x00000004
|
||||||
|
|
||||||
|
org 0xf0000000
|
||||||
|
|
||||||
|
entry:
|
||||||
|
mcl ; disable MMU
|
||||||
|
mov rsp, SYS_STACK_START ; set stack pointer
|
||||||
|
|
||||||
|
mov r0, entry_str
|
||||||
|
call serial_print
|
||||||
|
mov r0, version_str_1
|
||||||
|
call serial_print
|
||||||
|
mov r0, version_str
|
||||||
|
call serial_print
|
||||||
|
mov r0, version_str_2
|
||||||
|
call serial_print
|
||||||
|
mov r0, sha_str
|
||||||
|
call serial_print
|
||||||
|
mov r0, version_str_3
|
||||||
|
call serial_print
|
||||||
|
|
||||||
|
call show_logo
|
||||||
|
|
||||||
|
mov r0, booting_str
|
||||||
|
call serial_print
|
||||||
|
|
||||||
|
halt
|
||||||
|
|
||||||
|
entry_str: data.str "== Welcome to Xen32OS" data.8 0
|
||||||
|
; defines version_str, sha_str
|
||||||
|
#include "data/version.inc"
|
||||||
|
|
||||||
|
version_str_1: data.str " - version " data.8 0
|
||||||
|
version_str_2: data.str " (" data.8 0
|
||||||
|
version_str_3: data.str ") ==" data.8 10 data.8 0
|
||||||
|
|
||||||
|
booting_str: data.str "booting..." data.8 10 data.8 0
|
||||||
|
|
||||||
|
; input:
|
||||||
|
; str: &str0 @ r0
|
||||||
|
; returns:
|
||||||
|
; nothing
|
||||||
|
; clobbers:
|
||||||
|
; r0
|
||||||
|
serial_print:
|
||||||
|
cmp.8 [r0], 0
|
||||||
|
ifz ret
|
||||||
|
out 0x00000000, [r0]
|
||||||
|
inc r0
|
||||||
|
jmp serial_print
|
||||||
|
|
||||||
|
; input:
|
||||||
|
; n: u64 @ r0
|
||||||
|
; returns
|
||||||
|
; nothing
|
||||||
|
; clobbers:
|
||||||
|
; r0
|
||||||
|
serial_print_num:
|
||||||
|
cmp r0, 0
|
||||||
|
ifz jmp serial_print_num_zero
|
||||||
|
call serial_print_num_nonzero
|
||||||
|
ret
|
||||||
|
|
||||||
|
serial_print_num_nonzero:
|
||||||
|
cmp r0, 0
|
||||||
|
ifz ret
|
||||||
|
|
||||||
|
push r0
|
||||||
|
div r0, 10
|
||||||
|
call serial_print_num_nonzero
|
||||||
|
pop r0
|
||||||
|
rem r0, 10
|
||||||
|
add r0, 48
|
||||||
|
out 0x00000000, r0
|
||||||
|
ret
|
||||||
|
|
||||||
|
serial_print_num_zero:
|
||||||
|
mov r0, serial_print_num_str_zero
|
||||||
|
jmp serial_print ; tail call
|
||||||
|
|
||||||
|
serial_print_num_str_zero: data.str "0" data.8 0
|
||||||
|
|
||||||
|
serial_print_nl:
|
||||||
|
out 0x00000000, 10
|
||||||
|
ret
|
||||||
|
|
||||||
|
#include "logo.asm"
|
||||||
|
|
1
xenrom/text.asm
Normal file
1
xenrom/text.asm
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
Loading…
Reference in New Issue
Block a user