diff --git a/README.markdown b/README.markdown index 4445bf1..bda15d7 100644 --- a/README.markdown +++ b/README.markdown @@ -559,4 +559,28 @@ Installing an interrupt handler (at the Kernal level, i.e. with CINV) | inc screen | jmp save_cinv | } - = story checks out + = .org 0 + = .word $0801 + = .org $0801 + = .byte $10, $08, $c9, $07, $9e, $32, $30, $36, $31, $00, $00, $00 + = jmp main + = .alias screen 1024 + = .alias cinv 788 + = save_cinv: .word 0 + = main: + = sei + = lda cinv + = sta save_cinv + = lda cinv+1 + = sta save_cinv+1 + = lda #our_cinv + = sta cinv+1 + = cli + = rts + = + = our_cinv: + = inc screen + = jmp (save_cinv) + = rts diff --git a/eg/cinv.60pical b/eg/cinv.60pical new file mode 100644 index 0000000..4d9ab6c --- /dev/null +++ b/eg/cinv.60pical @@ -0,0 +1,15 @@ +assign byte screen 1024 +assign vector cinv 788 +reserve vector save_cinv + +routine main { + sei { + copy vector cinv to save_cinv + copy routine our_cinv to cinv + } +} + +routine our_cinv { + inc screen + jmp save_cinv +} diff --git a/src/SixtyPical/Emitter.hs b/src/SixtyPical/Emitter.hs index 858ea6a..d2470d5 100644 --- a/src/SixtyPical/Emitter.hs +++ b/src/SixtyPical/Emitter.hs @@ -89,13 +89,19 @@ emitInstr p r (REPEAT iid branch blk) = emitInstr p r (SEI blk) = "sei\n" ++ emitInstrs p r blk ++ - "cli" + " cli" emitInstr p r (COPYVECTOR (NamedLocation src) (NamedLocation dst)) = - "COPYVECTOR " ++ src ++ " " ++ dst + "lda " ++ src ++ "\n" ++ + " sta " ++ dst ++ "\n" ++ + " lda " ++ src ++ "+1\n" ++ + " sta " ++ dst ++ "+1" emitInstr p r (COPYROUTINE src (NamedLocation dst)) = - "COPYROUTINE " ++ src ++ " " ++ dst + "lda #<" ++ src ++ "\n" ++ + " sta " ++ dst ++ "\n" ++ + " lda #>" ++ src ++ "\n" ++ + " sta " ++ dst ++ "+1" emitInstr p r (JMPVECTOR (NamedLocation dst)) = "jmp (" ++ dst ++ ")"