diff --git a/c64/basic/basic_execute_line.s b/c64/basic/basic_execute_line.s index 501beaa8..0bf25262 100644 --- a/c64/basic/basic_execute_line.s +++ b/c64/basic/basic_execute_line.s @@ -16,6 +16,19 @@ basic_execute_line: ;; The checks should be done in order of frequency, so that we are as ;; fast as possible. + cmp #$7f + bcc not_a_token + ;; It's a token: So get the jump table entry for it, push it on the stack + ;; and then RTS to start it. + asl + tax + lda basic_command_jump_table+1,x + pha + lda basic_command_jump_table+0,x + pha + rts + +not_a_token: ;; Space, which we can also just ignore cmp #$20 beq basic_skip_char @@ -45,3 +58,150 @@ basic_end_of_line: ;; one. jmp basic_main_loop + +basic_command_jump_table: + ;; $80 - $8F + .word cmd_end-1 + .word cmd_for-1 + .word cmd_next-1 + .word cmd_data-1 + .word cmd_inputhash-1 + .word cmd_input-1 + .word cmd_dim-1 + .word cmd_read-1 + .word cmd_let-1 + .word cmd_goto-1 + .word cmd_run-1 + .word cmd_if-1 + .word cmd_restore-1 + .word cmd_gosub-1 + .word cmd_return -1 + .word cmd_rem-1 + + ;; $90-$9F + .word cmd_stop-1 + .word cmd_on-1 + .word cmd_wait-1 + .word cmd_load-1 + .word cmd_save-1 + .word cmd_verify-1 + .word cmd_def-1 + .word cmd_poke-1 + .word cmd_printhash-1 + .word cmd_print-1 + .word cmd_cont-1 + .word cmd_list-1 + .word cmd_clr-1 + .word cmd_cmd-1 + .word cmd_sys-1 + .word cmd_open-1 + + ;; $A0-$AF + .word cmd_close-1 + .word cmd_get-1 + .word cmd_new-1 + .word cmd_tab-1 + .word cmd_to-1 + .word cmd_fn-1 + .word cmd_spc-1 + .word cmd_then-1 + .word cmd_not-1 + .word cmd_step-1 + .word cmd_plus-1 + .word cmd_minus-1 + .word cmd_mult-1 + .word cmd_div-1 + .word cmd_exponent-1 + .word cmd_and-1 + + ;; $B0-$BF + .word cmd_or-1 + .word cmd_greater-1 + .word cmd_equal-1 + .word cmd_less-1 + .word cmd_sgn-1 + .word cmd_int-1 + .word cmd_abs-1 + .word cmd_usr-1 + .word cmd_fre-1 + .word cmd_pos-1 + .word cmd_sqr-1 + .word cmd_rnd-1 + .word cmd_log-1 + .word cmd_exp-1 + .word cmd_cos-1 + .word cmd_sin-1 + + ;; $C0-$CF + .word cmd_tan-1 + .word cmd_atn-1 + .word cmd_peek-1 + .word cmd_len-1 + .word cmd_str-1 + .word cmd_val-1 + .word cmd_asc-1 + .word cmd_chr-1 + .word cmd_left-1 + .word cmd_right-1 + .word cmd_mid-1 + .word cmd_go-1 + ;; Undefined tokens + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + + ;; $D0-$DF + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + + ;; $E0-$EF + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + + ;; $F0-$FF + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + .word cmd_unimplemented-1 + diff --git a/c64/basic/cmd_unimplemented.s b/c64/basic/cmd_unimplemented.s new file mode 100644 index 00000000..69fbfc6d --- /dev/null +++ b/c64/basic/cmd_unimplemented.s @@ -0,0 +1,89 @@ + ;; Default handler for all not-yet-implemented commands + +cmd_end: +cmd_for: +cmd_next: +cmd_data: +cmd_inputhash: +cmd_input: +cmd_dim: +cmd_read: +cmd_let: +cmd_goto: +cmd_run: +cmd_if: +cmd_restore: +cmd_gosub: +cmd_return: +cmd_rem: + + ;; $90-$9F +cmd_stop: +cmd_on: +cmd_wait: +cmd_load: +cmd_save: +cmd_verify: +cmd_def: +cmd_poke: +cmd_printhash: +cmd_print: +cmd_cont: +cmd_list: +cmd_cmd: +cmd_sys: +cmd_open: + + ;; $A0-$AF +cmd_close: +cmd_get: +cmd_tab: +cmd_to: +cmd_fn: +cmd_spc: +cmd_then: +cmd_not: +cmd_step: +cmd_plus: +cmd_minus: +cmd_mult: +cmd_div: +cmd_exponent: +cmd_and: + + ;; $B0-$BF +cmd_or: +cmd_greater: +cmd_equal: +cmd_less: +cmd_sgn: +cmd_int: +cmd_abs: +cmd_usr: +cmd_fre: +cmd_pos: +cmd_sqr: +cmd_rnd: +cmd_log: +cmd_exp: +cmd_cos: +cmd_sin: + + ;; $C0-$CF +cmd_tan: +cmd_atn: +cmd_peek: +cmd_len: +cmd_str: +cmd_val: +cmd_asc: +cmd_chr: +cmd_left: +cmd_right: +cmd_mid: +cmd_go: + ;; Undefined tokens +cmd_unimplemented: + + ldx #36 + jmp do_basic_error diff --git a/c64/basic/packed_messages.s b/c64/basic/packed_messages.s index 39fd0f0b..2747aeda 100644 --- a/c64/basic/packed_messages.s +++ b/c64/basic/packed_messages.s @@ -6,10 +6,10 @@ packed_message_chars: .byte $49 ; 'I' = $5 (nybl) .byte $52 ; 'R' = $6 (nybl) .byte $41 ; 'A' = $7 (nybl) - .byte $53 ; 'S' = $8 (nybl) - .byte $4C ; 'L' = $9 (nybl) - .byte $46 ; 'F' = $a (nybl) - .byte $44 ; 'D' = $b (nybl) + .byte $4C ; 'L' = $8 (nybl) + .byte $53 ; 'S' = $9 (nybl) + .byte $44 ; 'D' = $a (nybl) + .byte $46 ; 'F' = $b (nybl) .byte $55 ; 'U' = $c (nybl) .byte $50 ; 'P' = $d (nybl) .byte $4D ; 'M' = $e (nybl) @@ -54,69 +54,71 @@ packed_message_tokens: .byte $ff,$30,$ff,$31,$ff,$32,$ff,$33 .byte $ff,$34,$ff,$35,$36,$ff,$1a,$37 .byte $ff + .byte $05 + .byte $38 + .byte $ff packed_message_words: - .byte $23,$30,$e7,$4f,$59,$00,$a5,$91 - .byte $80,$a5,$91,$00,$3d,$14,$00,$43 - .byte $20,$a3,$c4,$b0,$b1,$f4,$5f,$43 - .byte $10,$d6,$18,$14,$20,$54,$dc,$20 - .byte $3c,$2d,$c2,$00,$e5,$88,$54,$f2 - .byte $00,$a5,$91,$47,$e1,$00,$59,$91 - .byte $f2,$79,$00,$4c,$ef,$42,$16,$00 + .byte $23,$30,$e7,$4f,$59,$00,$b5,$81 + .byte $90,$b5,$81,$00,$3d,$14,$00,$43 + .byte $20,$b3,$c4,$a0,$a1,$f4,$5f,$43 + .byte $10,$d6,$19,$14,$20,$54,$dc,$20 + .byte $3c,$2d,$c2,$00,$e5,$99,$54,$f2 + .byte $00,$b5,$81,$47,$e1,$00,$58,$81 + .byte $f2,$78,$00,$4c,$ef,$42,$16,$00 .byte $41,$f7,$20,$f8,$52,$f6,$3c,$20 - .byte $a3,$60,$8f,$59,$42,$7f,$58,$00 - .byte $61,$2c,$64,$00,$f2,$38,$cf,$42 - .byte $00,$3c,$20,$3a,$00,$b7,$27,$00 + .byte $b3,$60,$9f,$59,$42,$7f,$58,$00 + .byte $61,$2c,$64,$00,$f2,$39,$cf,$42 + .byte $00,$3c,$20,$3b,$00,$a7,$27,$00 .byte $fc,$c7,$42,$52,$f3,$00,$3f,$56 - .byte $16,$a9,$3f,$57,$00,$e1,$e3,$6f - .byte $59,$00,$c4,$b1,$af,$27,$b0,$82 - .byte $72,$1e,$14,$20,$f5,$7b,$00,$8c - .byte $f5,$8f,$43,$65,$d2,$00,$61,$b5 - .byte $ef,$27,$b0,$76,$67,$f3,$00,$b5 - .byte $f4,$58,$53,$40,$f5,$f3,$00,$ff - .byte $5a,$16,$30,$b5,$61,$f1,$20,$2f - .byte $59,$d1,$00,$e5,$8e,$72,$f1,$f6 - .byte $00,$82,$65,$4f,$47,$00,$93,$4f - .byte $47,$00,$a3,$6e,$c9,$70,$f1,$3e - .byte $d9,$1f,$58,$00,$f1,$74,$fa,$20 - .byte $f1,$34,$25,$4c,$10,$ac,$4f,$43 - .byte $25,$34,$00,$f4,$16,$5a,$f3,$00 - .byte $93,$7b,$00,$61,$7b,$f3,$fd,$fb - .byte $00,$93,$7b,$54,$f2,$00,$f4,$16 - .byte $5a,$f3,$54,$f2,$00,$87,$f4,$54 + .byte $16,$b8,$3f,$57,$00,$e1,$e3,$6f + .byte $59,$00,$c4,$a1,$bf,$27,$a0,$92 + .byte $72,$1e,$14,$20,$f5,$7a,$00,$9c + .byte $f5,$9f,$43,$65,$d2,$00,$61,$a5 + .byte $ef,$27,$a0,$76,$67,$f3,$00,$a5 + .byte $f4,$59,$53,$40,$f5,$f3,$00,$ff + .byte $5a,$16,$30,$a5,$61,$f1,$20,$2f + .byte $59,$d1,$00,$e5,$9e,$72,$f1,$f6 + .byte $00,$92,$65,$4f,$47,$00,$83,$4f + .byte $47,$00,$b3,$6e,$c8,$70,$f1,$3e + .byte $d8,$1f,$58,$00,$f1,$74,$fa,$20 + .byte $f1,$34,$25,$4c,$10,$bc,$4f,$43 + .byte $25,$34,$00,$f4,$16,$5b,$f3,$00 + .byte $83,$7a,$00,$61,$7a,$f3,$fd,$fb + .byte $00,$83,$7a,$54,$f2,$00,$f4,$16 + .byte $5b,$f3,$54,$f2,$00,$97,$f4,$54 .byte $f2,$00,$16,$63,$60,$f5,$f3,$21 - .byte $80,$a6,$11,$fd,$fb,$fb,$00,$f1 - .byte $36 - .byte $6c - .byte $d2 - .byte $00 + .byte $90,$b6,$11,$fd,$fb,$fb,$00,$f1 + .byte $36,$6c,$d2,$00,$5e,$d8,$1e,$14 + .byte $21 + .byte $a0 packed_keywords: - .byte $14,$b0,$a3,$60,$41,$f7,$20,$b7 + .byte $14,$a0,$b3,$60,$41,$f7,$20,$a7 .byte $27,$00,$54,$dc,$2f,$23,$00,$54 - .byte $dc,$20,$b5,$e0,$61,$7b,$00,$91 - .byte $20,$f2,$32,$30,$6c,$40,$5a,$00 - .byte $61,$82,$36,$10,$f2,$38,$cf,$42 - .byte $00,$61,$2c,$64,$00,$61,$e0,$82 - .byte $3d,$00,$34,$00,$f8,$75,$20,$93 - .byte $7b,$00,$87,$f4,$10,$f4,$16,$5a - .byte $f3,$00,$b1,$a0,$d3,$ff,$4b,$10 + .byte $dc,$20,$a5,$e0,$61,$7a,$00,$81 + .byte $20,$f2,$32,$30,$6c,$40,$5b,$00 + .byte $61,$92,$36,$10,$f2,$39,$cf,$42 + .byte $00,$61,$2c,$64,$00,$61,$e0,$92 + .byte $3d,$00,$34,$00,$f8,$75,$20,$83 + .byte $7a,$00,$97,$f4,$10,$f4,$16,$5b + .byte $f3,$00,$a1,$b0,$d3,$ff,$4b,$10 .byte $d6,$54,$2f,$23,$00,$d6,$54,$20 - .byte $f1,$34,$20,$95,$82,$00,$f1,$96 - .byte $00,$f1,$eb,$00,$8f,$59,$80,$3d - .byte $14,$00,$f1,$93,$81,$00,$f2,$12 + .byte $f1,$34,$20,$85,$92,$00,$f1,$86 + .byte $00,$f1,$ea,$00,$9f,$59,$90,$3d + .byte $14,$00,$f1,$83,$91,$00,$f2,$12 .byte $00,$41,$f8,$00,$27,$f5,$fe,$28 - .byte $23,$00,$a4,$00,$8d,$f1,$fe,$28 - .byte $2f,$48,$14,$00,$43,$20,$82,$1d + .byte $23,$00,$b4,$00,$9d,$f1,$fe,$28 + .byte $2f,$48,$14,$00,$43,$20,$92,$1d .byte $00,$fe,$2b,$fe,$2d,$fe,$2a,$fe - .byte $2f,$fe,$5e,$74,$b0,$36,$00,$fe - .byte $3e,$fe,$3d,$fe,$3c,$8f,$47,$40 - .byte $54,$20,$7f,$42,$80,$c8,$60,$a6 - .byte $10,$d3,$80,$8f,$51,$60,$64,$b0 - .byte $93,$f2,$00,$1f,$58,$d0,$f1,$38 - .byte $00,$85,$40,$27,$40,$72,$40,$d1 - .byte $1f,$4b,$00,$91,$40,$82,$6f,$24 - .byte $00,$f4,$79,$00,$78,$f1,$00,$f1 - .byte $f6,$6f,$24,$00,$91,$a2,$f9,$00 - .byte $65,$f2,$f6,$2f,$24,$00,$e5,$bf + .byte $2f,$fe,$5e,$74,$a0,$36,$00,$fe + .byte $3e,$fe,$3d,$fe,$3c,$9f,$47,$40 + .byte $54,$20,$7f,$42,$90,$c9,$60,$b6 + .byte $10,$d3,$90,$9f,$51,$60,$64,$a0 + .byte $83,$f2,$00,$1f,$58,$d0,$f1,$39 + .byte $00,$95,$40,$27,$40,$72,$40,$d1 + .byte $1f,$4b,$00,$81,$40,$92,$6f,$24 + .byte $00,$f4,$78,$00,$79,$f1,$00,$f1 + .byte $f6,$6f,$24,$00,$81,$b2,$f9,$00 + .byte $65,$f2,$f6,$2f,$24,$00,$e5,$af .byte $24 .byte $00 .byte $f2 diff --git a/src/compress_text.c b/src/compress_text.c index 2beae876..64a365ba 100644 --- a/src/compress_text.c +++ b/src/compress_text.c @@ -165,6 +165,7 @@ char *error_list[]={ "ERROR", // #33 // Simply the word error that is attached to the other parts of messages https://fjkraan.home.xs4all.nl/comp/apple2faq/app2asoftfaq.html "BYTES FREE.\r\r", // #34 // https://github.com/stefanhaustein/expressionparser "MEMORY CORRUPT", // #35 + "NOT IMPLEMENTED", // #36 NULL}; // Token $FF is end of message, so we can have only 255 unique words