mirror of
https://github.com/catseye/SixtyPical.git
synced 2025-02-10 23:30:32 +00:00
Fix jmp (vector) syntax. Filename extension is .60p
.
--HG-- rename : eg/cinv.60pical => eg/cinv.60p rename : eg/demo.60pical => eg/demo.60p rename : eg/hi.60pical => eg/hi.60p rename : eg/screen.60pical => eg/screen1.60p rename : eg/screen2.60pical => eg/screen2.60p rename : eg/screen3.60pical => eg/screen3.60p
This commit is contained in:
parent
55a5ee85e3
commit
571b3d403b
@ -180,4 +180,6 @@ TODO
|
|||||||
* Character tables ("strings" to everybody else)
|
* Character tables ("strings" to everybody else)
|
||||||
* Work out the analyses again and document them
|
* Work out the analyses again and document them
|
||||||
* Addressing modes; rename instructions to match
|
* Addressing modes; rename instructions to match
|
||||||
* fix jmp (vector) syntax
|
* `jsr (vector)`
|
||||||
|
* `jmp routine`
|
||||||
|
* insist on EOL after each instruction. need spacesWOEOL production
|
||||||
|
@ -142,27 +142,27 @@ No duplicate routine names, including externals.
|
|||||||
| }
|
| }
|
||||||
? duplicate routine name
|
? duplicate routine name
|
||||||
|
|
||||||
We can jump to a vector.
|
We can jump indirectly through a vector.
|
||||||
|
|
||||||
| reserve vector blah
|
| reserve vector blah
|
||||||
| routine main {
|
| routine main {
|
||||||
| jmp blah
|
| jmp (blah)
|
||||||
| }
|
| }
|
||||||
= True
|
= True
|
||||||
|
|
||||||
We can't jump to a word.
|
We can't jump indirectly through a word.
|
||||||
|
|
||||||
| reserve word blah
|
| reserve word blah
|
||||||
| routine main {
|
| routine main {
|
||||||
| jmp blah
|
| jmp (blah)
|
||||||
| }
|
| }
|
||||||
? jmp to non-vector
|
? jmp to non-vector
|
||||||
|
|
||||||
We can't jump to a byte.
|
We can't jump indirectly through a byte.
|
||||||
|
|
||||||
| assign byte screen 1024
|
| assign byte screen 1024
|
||||||
| routine main {
|
| routine main {
|
||||||
| jmp screen
|
| jmp (screen)
|
||||||
| }
|
| }
|
||||||
? jmp to non-vector
|
? jmp to non-vector
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ Installing an interrupt handler (at the Kernal level, i.e. with CINV)
|
|||||||
|
|
|
|
||||||
| routine our_cinv {
|
| routine our_cinv {
|
||||||
| inc screen
|
| inc screen
|
||||||
| jmp save_cinv
|
| jmp (save_cinv)
|
||||||
| }
|
| }
|
||||||
= main:
|
= main:
|
||||||
= sei
|
= sei
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
assign byte table screen 1024
|
|
||||||
|
|
||||||
assign byte table actor_x 49152
|
|
||||||
assign byte table actor_x 49152
|
|
@ -11,5 +11,5 @@ routine main {
|
|||||||
|
|
||||||
routine our_cinv {
|
routine our_cinv {
|
||||||
inc screen
|
inc screen
|
||||||
jmp save_cinv
|
jmp (save_cinv)
|
||||||
}
|
}
|
@ -1,24 +0,0 @@
|
|||||||
reserve byte m_high
|
|
||||||
reserve byte m_low
|
|
||||||
reserve byte n_high
|
|
||||||
reserve byte n_low
|
|
||||||
|
|
||||||
routine compare_16_bit {
|
|
||||||
lda m_high
|
|
||||||
cmp n_high
|
|
||||||
if beq {
|
|
||||||
lda m_low
|
|
||||||
cmp n_low
|
|
||||||
} else {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
routine compare_16_bit {
|
|
||||||
lda >m
|
|
||||||
cmp >n
|
|
||||||
if beq {
|
|
||||||
lda <m
|
|
||||||
cmp <n
|
|
||||||
} else {
|
|
||||||
}
|
|
||||||
}
|
|
@ -54,7 +54,7 @@ routine our_cinv {
|
|||||||
jsr reset_position
|
jsr reset_position
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
jmp save_cinv
|
jmp (save_cinv)
|
||||||
}
|
}
|
||||||
|
|
||||||
routine increment_pos {
|
routine increment_pos {
|
@ -66,7 +66,7 @@ routine our_cinv {
|
|||||||
jsr reset_position
|
jsr reset_position
|
||||||
} else { }
|
} else { }
|
||||||
}
|
}
|
||||||
jmp save_cinv
|
jmp (save_cinv)
|
||||||
}
|
}
|
||||||
|
|
||||||
routine reset_position {
|
routine reset_position {
|
||||||
|
@ -1,160 +0,0 @@
|
|||||||
assign byte table actor_0_sprite_x 60
|
|
||||||
assign byte table actor_0_sprite_y 68
|
|
||||||
assign byte table vic_sprite_0_x 53281
|
|
||||||
assign byte table vic_sprite_0_y 53289
|
|
||||||
|
|
||||||
reserve byte actor_msb
|
|
||||||
reserve byte msb_counter
|
|
||||||
|
|
||||||
reserve vector logic_vector
|
|
||||||
|
|
||||||
assign byte vic_sprite_x_msb 55555
|
|
||||||
|
|
||||||
routine main {
|
|
||||||
jsr display_actors
|
|
||||||
}
|
|
||||||
|
|
||||||
routine display_actors {
|
|
||||||
ldy #0
|
|
||||||
ldx #0
|
|
||||||
|
|
||||||
repeat bne {
|
|
||||||
lda actor_0_sprite_x, y
|
|
||||||
sta vic_sprite_0_x, x
|
|
||||||
lda actor_0_sprite_y, y
|
|
||||||
sta vic_sprite_0_y, x
|
|
||||||
|
|
||||||
iny
|
|
||||||
inx
|
|
||||||
inx
|
|
||||||
cpy #8
|
|
||||||
}
|
|
||||||
|
|
||||||
lda actor_msb
|
|
||||||
sta vic_sprite_x_msb
|
|
||||||
}
|
|
||||||
|
|
||||||
routine update_actors {
|
|
||||||
|
|
||||||
lda #1
|
|
||||||
sta msb_counter
|
|
||||||
lda #0
|
|
||||||
sta actor_msb
|
|
||||||
|
|
||||||
ldy #0
|
|
||||||
repeat ... {
|
|
||||||
|
|
||||||
lda actor_0_logic_high, y
|
|
||||||
if bne {
|
|
||||||
sta logic_vector+1
|
|
||||||
lda actor_0_logic_low, y
|
|
||||||
sta logic_vector
|
|
||||||
|
|
||||||
save y
|
|
||||||
jsr logic_vector
|
|
||||||
restore y
|
|
||||||
}
|
|
||||||
|
|
||||||
// update_xvel
|
|
||||||
|
|
||||||
clc
|
|
||||||
lda actor_0_xvel, y
|
|
||||||
adc actor_0_xacc, y
|
|
||||||
cmp #max_vel
|
|
||||||
bcc xvel_within_limit ; branch if accumulator is less
|
|
||||||
cmp #min_vel
|
|
||||||
bcs xvel_within_limit ; branch if accumulator is greater or equal
|
|
||||||
jmp update_xpos
|
|
||||||
|
|
||||||
xvel_within_limit:
|
|
||||||
sta actor_0_xvel, y
|
|
||||||
|
|
||||||
update_xpos:
|
|
||||||
clc
|
|
||||||
lda actor_0_xpos_low, y
|
|
||||||
adc actor_0_xvel, y
|
|
||||||
sta actor_0_xpos_low, y
|
|
||||||
|
|
||||||
lda #0
|
|
||||||
sta sign_extend
|
|
||||||
lda actor_0_xvel, y
|
|
||||||
and #$80
|
|
||||||
beq carry_x
|
|
||||||
dec sign_extend
|
|
||||||
|
|
||||||
carry_x:
|
|
||||||
lda actor_0_xpos_high, y
|
|
||||||
adc sign_extend ; $00, or $ff if xvel < 0
|
|
||||||
sta actor_0_xpos_high, y
|
|
||||||
|
|
||||||
update_yvel:
|
|
||||||
clc
|
|
||||||
lda actor_0_yvel, y
|
|
||||||
adc actor_0_yacc, y
|
|
||||||
cmp #max_vel
|
|
||||||
bcc yvel_within_limit ; branch if accumulator is less
|
|
||||||
cmp #min_vel
|
|
||||||
bcs yvel_within_limit ; branch if accumulator is greater or equal
|
|
||||||
jmp update_ypos
|
|
||||||
|
|
||||||
yvel_within_limit:
|
|
||||||
sta actor_0_yvel, y
|
|
||||||
|
|
||||||
update_ypos:
|
|
||||||
clc
|
|
||||||
lda actor_0_ypos_low, y
|
|
||||||
adc actor_0_yvel, y
|
|
||||||
sta actor_0_ypos_low, y
|
|
||||||
|
|
||||||
lda #0
|
|
||||||
sta sign_extend
|
|
||||||
lda actor_0_yvel, y
|
|
||||||
and #$80
|
|
||||||
beq carry_y
|
|
||||||
dec sign_extend
|
|
||||||
|
|
||||||
carry_y:
|
|
||||||
lda actor_0_ypos_high, y
|
|
||||||
adc sign_extend
|
|
||||||
sta actor_0_ypos_high, y
|
|
||||||
|
|
||||||
precompute_sprite_position:
|
|
||||||
|
|
||||||
lda actor_0_xpos_low, y
|
|
||||||
sta temp_low
|
|
||||||
lda actor_0_xpos_high, y
|
|
||||||
sta temp_high
|
|
||||||
|
|
||||||
jsr shift_temp
|
|
||||||
jsr shift_temp
|
|
||||||
jsr shift_temp
|
|
||||||
sta actor_0_sprite_x, y
|
|
||||||
|
|
||||||
lda temp_high ; calculate the sprite's msb
|
|
||||||
beq advance_msb_counter
|
|
||||||
lda actor_msb
|
|
||||||
ora msb_counter
|
|
||||||
sta actor_msb
|
|
||||||
|
|
||||||
advance_msb_counter:
|
|
||||||
asl msb_counter
|
|
||||||
|
|
||||||
set_sprite_y:
|
|
||||||
lda actor_0_ypos_low, y
|
|
||||||
sta temp_low
|
|
||||||
lda actor_0_ypos_high, y
|
|
||||||
sta temp_high
|
|
||||||
|
|
||||||
jsr shift_temp
|
|
||||||
jsr shift_temp
|
|
||||||
jsr shift_temp
|
|
||||||
sta actor_0_sprite_y, y
|
|
||||||
|
|
||||||
next_actor:
|
|
||||||
cpy #$07
|
|
||||||
beq exit_actor_loop
|
|
||||||
iny
|
|
||||||
jmp update_actor_loop
|
|
||||||
|
|
||||||
exit_actor_loop:
|
|
||||||
rts
|
|
@ -15,7 +15,7 @@ import SixtyPical.Emitter (emitProgram)
|
|||||||
-- -- -- -- driver -- -- -- --
|
-- -- -- -- driver -- -- -- --
|
||||||
|
|
||||||
usage = do
|
usage = do
|
||||||
putStrLn "Usage: sixtypical (parse|check|analyze|emit) filename.60pical"
|
putStrLn "Usage: sixtypical (parse|check|analyze|emit) filename.60p"
|
||||||
exitWith $ ExitFailure 1
|
exitWith $ ExitFailure 1
|
||||||
|
|
||||||
main = do
|
main = do
|
||||||
|
@ -490,7 +490,11 @@ jmp :: Parser Instruction
|
|||||||
jmp = do
|
jmp = do
|
||||||
string "jmp"
|
string "jmp"
|
||||||
spaces
|
spaces
|
||||||
|
string "("
|
||||||
|
spaces
|
||||||
l <- locationName
|
l <- locationName
|
||||||
|
string ")"
|
||||||
|
spaces
|
||||||
return $ JMPVECTOR (NamedLocation Nothing l)
|
return $ JMPVECTOR (NamedLocation Nothing l)
|
||||||
|
|
||||||
jsr :: Parser Instruction
|
jsr :: Parser Instruction
|
||||||
|
Loading…
x
Reference in New Issue
Block a user