about summary refs log tree commit diff stats
path: root/subx/examples/ex2.subx
blob: e44d5ea82cdb7c56eaf669fba07d40e084afe81d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## add 1 and 1, and return the result in the exit code
#
# To run (from the subx directory):
#   $ subx translate examples/ex2.subx -o examples/ex2
#   $ subx run examples/ex2
# Expected result:
#   $ echo $?
#   2

== code
bb/copy-to-EBX  1/imm32
43/inc-EBX
# exit(EBX)
b8/copy-to-EAX  1/imm32
cd/syscall  0x80/imm8

# vim:nowrap:textwidth=0
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
// Get the canvas and context
const canvas = document.getElementById('game');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
canvas.style.backgroundColor = '#f0f0f0';
const ctx = canvas.getContext('2d');

(function(){

    // Define game colors
    const COLORS = {
        player: '#2d2d2d',
        particles: '#2d2d2d',
        objects: '#2d2d2d',
        terrain: '#2d2d2d'
    };

    // Define game physics
    const physics = {
        gravity: 1,
        jumpForce: 0.5
    };

    // Define player properties
    const player = {
        x: 200,
        y: 0,
        vx: 0,
        vy: 10,
        vm: 32,
        jumpForce: physics.gravity + physics.jumpForce,
        onGround: false,
        width: 20,
        height: 20,
        distanceTraveled: 0
    };

    // Define terrain properties
    const terrain = {
        start: { x: 0, y: canvas.height - 40 },
        end: { x: canvas.width, y: canvas.height },
        height: 8
    };

    // Define game objects
    const objects = [];

    // Update game state
    function update() {
        // Update player
        player.x += player.vx;
        player.y += player.vy;

        // Check collision with terrain
        if (player.y + player.height >= terrain.start.y) {
            player.y = terrain.start.y - player.height;
            player.vy = 0;
            player.onGround = true;
        } else {
            player.onGround = false;
        }

        // Update objects
        for (let object of objects) {
            object.y += physics.gravity;
        }
    }

    // Render game state
    function draw() {
        // Clear canvas
        ctx.clearRect(0, 0, canvas.width, canvas.height);

        // Draw player
        ctx.fillStyle = COLORS.player;
        ctx.fillRect(player.x, player.y, player.width, player.height);

        // Draw terrain
        ctx.fillStyle = COLORS.terrain;
        ctx.fillRect(terrain.start.x, terrain.start.y, terrain.end.x - terrain.start.x, terrain.height);

        // Draw objects
        for (let object of objects) {
            ctx.fillStyle = COLORS.objects;
            ctx.fillRect(object.x, object.y, object.width, object.height);
        }
    }

    // Handle keydown event
    document.addEventListener('keydown', function(event) {
        if (event.code === 'Space' || event.code === 'ArrowUp') {
            if (player.onGround) {
                player.vy = -player.jumpForce;
                player.onGround = false;
            }
        }
    });

    // Game loop
    function gameLoop() {
        update();
        draw();

        // Request next frame
        requestAnimationFrame(gameLoop);
    }

    // Start game loop
    gameLoop();

})();