#[ macro_use ]
extern crate log ;
use crsn ::asm ::error ::CrsnError ;
use crsn ::asm ::instr ::op ::OpKind ;
use crsn ::asm ::parse ::arg_parser ::TokenParser ;
use crsn ::module ::{ CrsnExtension , ParseRes } ;
use crsn ::sexp ::SourcePosition ;
use crsn ::asm ::data ::literal ::Value ;
use crate ::exec ::{ OPT_AUTO_BLIT , OPT_FRAME_RATE , OPT_UPSCALE } ;
use minifb ::Key ;
mod defs ;
mod parse ;
mod exec ;
#[ derive(Debug, Clone) ]
pub struct ScreenOps ;
impl ScreenOps {
pub fn new ( ) -> Box < dyn CrsnExtension > {
Box ::new ( Self )
}
}
impl CrsnExtension for ScreenOps {
fn name ( & self ) -> & ' static str {
"screen"
}
fn parse_op < ' a > ( & self , pos : & SourcePosition , keyword : & str , args : TokenParser < ' a > ) -> Result < ParseRes < ' a , OpKind > , CrsnError > {
parse ::parse ( pos , keyword , args )
}
/// Get value of an extension-provided constant.
/// This constant may be an object handle, or a constant value used as argument in some other instruction.
fn get_constant_value < ' a > ( & self , name : & str ) -> Option < Value >
{
match name {
"SCREEN_AUTO_BLIT" | "SCREEN_AUTOBLIT" = > Some ( OPT_AUTO_BLIT ) ,
"SCREEN_FPS" = > Some ( OPT_FRAME_RATE ) ,
"SCREEN_UPSCALE" = > Some ( OPT_UPSCALE ) ,
"MBTN_LEFT" = > Some ( 0 ) ,
"MBTN_RIGHT" = > Some ( 1 ) ,
"MBTN_MIDDLE" | "MBTN_MID" = > Some ( 2 ) ,
"KEY_0" = > Some ( Key ::Key0 as Value ) , // 0
"KEY_1" = > Some ( Key ::Key1 as Value ) ,
"KEY_2" = > Some ( Key ::Key2 as Value ) ,
"KEY_3" = > Some ( Key ::Key3 as Value ) ,
"KEY_4" = > Some ( Key ::Key4 as Value ) ,
"KEY_5" = > Some ( Key ::Key5 as Value ) ,
"KEY_6" = > Some ( Key ::Key6 as Value ) ,
"KEY_7" = > Some ( Key ::Key7 as Value ) ,
"KEY_8" = > Some ( Key ::Key8 as Value ) ,
"KEY_9" = > Some ( Key ::Key9 as Value ) , // 9
"KEY_A" = > Some ( Key ::A as Value ) , // 10
"KEY_B" = > Some ( Key ::B as Value ) ,
"KEY_C" = > Some ( Key ::C as Value ) ,
"KEY_D" = > Some ( Key ::D as Value ) ,
"KEY_E" = > Some ( Key ::E as Value ) ,
"KEY_F" = > Some ( Key ::F as Value ) , // 15
"KEY_G" = > Some ( Key ::G as Value ) ,
"KEY_H" = > Some ( Key ::H as Value ) ,
"KEY_I" = > Some ( Key ::I as Value ) ,
"KEY_J" = > Some ( Key ::J as Value ) ,
"KEY_K" = > Some ( Key ::K as Value ) , // 20
"KEY_L" = > Some ( Key ::L as Value ) ,
"KEY_M" = > Some ( Key ::M as Value ) ,
"KEY_N" = > Some ( Key ::N as Value ) ,
"KEY_O" = > Some ( Key ::O as Value ) ,
"KEY_P" = > Some ( Key ::P as Value ) , // 25
"KEY_Q" = > Some ( Key ::Q as Value ) ,
"KEY_R" = > Some ( Key ::R as Value ) ,
"KEY_S" = > Some ( Key ::S as Value ) ,
"KEY_T" = > Some ( Key ::T as Value ) ,
"KEY_U" = > Some ( Key ::U as Value ) , // 30
"KEY_V" = > Some ( Key ::V as Value ) ,
"KEY_W" = > Some ( Key ::W as Value ) ,
"KEY_X" = > Some ( Key ::X as Value ) ,
"KEY_Y" = > Some ( Key ::Y as Value ) ,
"KEY_Z" = > Some ( Key ::Z as Value ) , // 35
"KEY_F1" = > Some ( Key ::F1 as Value ) , // 36
"KEY_F2" = > Some ( Key ::F2 as Value ) ,
"KEY_F3" = > Some ( Key ::F3 as Value ) ,
"KEY_F4" = > Some ( Key ::F4 as Value ) ,
"KEY_F5" = > Some ( Key ::F5 as Value ) , // 40
"KEY_F6" = > Some ( Key ::F6 as Value ) ,
"KEY_F7" = > Some ( Key ::F7 as Value ) ,
"KEY_F8" = > Some ( Key ::F8 as Value ) ,
"KEY_F9" = > Some ( Key ::F9 as Value ) ,
"KEY_F10" = > Some ( Key ::F10 as Value ) , // 45
"KEY_F11" = > Some ( Key ::F11 as Value ) ,
"KEY_F12" = > Some ( Key ::F12 as Value ) ,
"KEY_F13" = > Some ( Key ::F13 as Value ) ,
"KEY_F14" = > Some ( Key ::F14 as Value ) ,
"KEY_F15" = > Some ( Key ::F15 as Value ) , // 50
"KEY_Down" = > Some ( Key ::Down as Value ) , // 51
"KEY_Left" = > Some ( Key ::Left as Value ) , // 52
"KEY_Right" = > Some ( Key ::Right as Value ) , // 53
"KEY_Up" = > Some ( Key ::Up as Value ) , // 54
"KEY_Apos" = > Some ( Key ::Apostrophe as Value ) ,
"KEY_Backtick" = > Some ( Key ::Backquote as Value ) , // 56 (a backtick)
"KEY_Backslash" = > Some ( Key ::Backslash as Value ) , // 57
"KEY_Comma" = > Some ( Key ::Comma as Value ) ,
"KEY_Equal" = > Some ( Key ::Equal as Value ) ,
"KEY_BracketL" = > Some ( Key ::LeftBracket as Value ) , // 60 [
"KEY_Minus" = > Some ( Key ::Minus as Value ) ,
"KEY_Period" = > Some ( Key ::Period as Value ) ,
"KEY_BracketR" = > Some ( Key ::RightBracket as Value ) , // 63 ] *This does not work due to a bug in the library we use - PR is sent upstream https://github.com/emoon/rust_minifb/pull/222*
"KEY_Semicolon" = > Some ( Key ::Semicolon as Value ) ,
"KEY_Slash" = > Some ( Key ::Slash as Value ) , // 65
"KEY_Backspace" = > Some ( Key ::Backspace as Value ) ,
"KEY_Delete" = > Some ( Key ::Delete as Value ) ,
"KEY_End" = > Some ( Key ::End as Value ) ,
"KEY_Enter" = > Some ( Key ::Enter as Value ) ,
"KEY_Escape" = > Some ( Key ::Escape as Value ) , // 70
"KEY_Home" = > Some ( Key ::Home as Value ) ,
"KEY_Insert" = > Some ( Key ::Insert as Value ) ,
"KEY_Menu" = > Some ( Key ::Menu as Value ) ,
"KEY_PageDown" = > Some ( Key ::PageDown as Value ) ,
"KEY_PageUp" = > Some ( Key ::PageUp as Value ) ,
"KEY_Pause" = > Some ( Key ::Pause as Value ) , // 76
"KEY_Space" = > Some ( Key ::Space as Value ) ,
"KEY_Tab" = > Some ( Key ::Tab as Value ) ,
"KEY_NumLock" = > Some ( Key ::NumLock as Value ) ,
"KEY_CapsLock" = > Some ( Key ::CapsLock as Value ) ,
"KEY_ScrollLock" = > Some ( Key ::ScrollLock as Value ) ,
"KEY_ShiftL" = > Some ( Key ::LeftShift as Value ) ,
"KEY_ShiftR" = > Some ( Key ::RightShift as Value ) ,
"KEY_CtrlL" = > Some ( Key ::LeftCtrl as Value ) ,
"KEY_CtrlR" = > Some ( Key ::RightCtrl as Value ) ,
"KEY_KP0" = > Some ( Key ::NumPad0 as Value ) , // 86
"KEY_KP1" = > Some ( Key ::NumPad1 as Value ) ,
"KEY_KP2" = > Some ( Key ::NumPad2 as Value ) ,
"KEY_KP3" = > Some ( Key ::NumPad3 as Value ) ,
"KEY_KP4" = > Some ( Key ::NumPad4 as Value ) ,
"KEY_KP5" = > Some ( Key ::NumPad5 as Value ) ,
"KEY_KP6" = > Some ( Key ::NumPad6 as Value ) ,
"KEY_KP7" = > Some ( Key ::NumPad7 as Value ) ,
"KEY_KP8" = > Some ( Key ::NumPad8 as Value ) ,
"KEY_KP9" = > Some ( Key ::NumPad9 as Value ) ,
"KEY_KPDot" = > Some ( Key ::NumPadDot as Value ) ,
"KEY_KPSlash" = > Some ( Key ::NumPadSlash as Value ) ,
"KEY_KPAsterisk" = > Some ( Key ::NumPadAsterisk as Value ) ,
"KEY_KPMinus" = > Some ( Key ::NumPadMinus as Value ) ,
"KEY_KPPlus" = > Some ( Key ::NumPadPlus as Value ) ,
"KEY_KPEnter" = > Some ( Key ::NumPadEnter as Value ) , // 100
"KEY_AltL" = > Some ( Key ::LeftAlt as Value ) ,
"KEY_AltR" = > Some ( Key ::RightAlt as Value ) ,
"KEY_WinL" | "KEY_SuperL" | "KEY_MetaL" = > Some ( Key ::LeftSuper as Value ) ,
"KEY_WinR" | "KEY_SuperR" | "KEY_MetaR" = > Some ( Key ::RightSuper as Value ) ,
_ = > None
}
}
}