package Ġnet . tor val d . ts vm . per ipheral Ċ Ċ import Ġcom . badlogic . gdx . G dx Ċ import Ġcom . badlogic . gdx . Input Ċ import Ġcom . badlogic . gdx . Input Processor Ċ import Ġnet . tor val d . Unsafe Helper Ċ import Ġnet . tor val d . ts vm . VM Ċ import Ġnet . tor val d . util . Circular Array Ċ import Ġjava . io . File Ċ import Ġkotlin . experimental . and Ċ Ċ class ĠIO Space ( val Ġvm : ĠVM ) Ġ: ĠPer i Base , ĠInput Processor Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget VM (): ĠVM Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvm ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAbsolute Ġx - position Ġof Ġthe Ġcomputer ĠGUI Ġ*/ ĊĠĠĠ Ġvar Ġgui Pos X Ġ= Ġ 0 ĊĠĠĠ Ġ/** ĠAbsolute Ġy - position Ġof Ġthe Ġcomputer ĠGUI Ġ*/ ĊĠĠĠ Ġvar Ġgui Pos Y Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĠAccept s Ġa Ġkey code Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġkeyboard Buffer Ġ= ĠCircular Array < Byte >( 3 2 , Ġtrue ) ĊĊĠĠĠ Ġinternal Ġval Ġblock Transfer Rx Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠ ĠUnsafe Helper . allocate ( 4 0 9 6 ), ĊĠĠĠĠĠĠĠ ĠUnsafe Helper . allocate ( 4 0 9 6 ), ĊĠĠĠĠĠĠĠ ĠUnsafe Helper . allocate ( 4 0 9 6 ), ĊĠĠĠĠĠĠĠ ĠUnsafe Helper . allocate ( 4 0 9 6 ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġinternal Ġval Ġblock Transfer Tx Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠ ĠUnsafe Helper . allocate ( 4 0 9 6 ), ĊĠĠĠĠĠĠĠ ĠUnsafe Helper . allocate ( 4 0 9 6 ), ĊĠĠĠĠĠĠĠ ĠUnsafe Helper . allocate ( 4 0 9 6 ), ĊĠĠĠĠĠĠĠ ĠUnsafe Helper . allocate ( 4 0 9 6 ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġ/* private */ Ġval Ġblock Transfer Ports Ġ= ĠArray ( 4 ) Ġ{ ĠBlock Transfer Port ( vm , Ġit ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġperipheral Fast Ġ= ĠUnsafe Helper . allocate ( 1 0 2 4 ) ĊĊĠĠĠ Ġprivate Ġval Ġkey Event Buffers Ġ= ĠByteArray ( 8 ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// block Transfer Ports [ 1 ]. attach Device ( Test Function Generator ()) ĊĠĠĠĠĠĠĠ Ġ// block Transfer Ports [ 0 ]. attach Device ( Test Disk Drive ( vm , Ġ 0 , ĠFile (" assets "))) ĊĠĠĠĠĠĠĠ Ġ// block Transfer Ports [ 0 ]. attach Device ( Test Disk Drive ( vm , Ġ 0 , ĠFile (" assets / disk 0 "))) ĊĊĠĠĠĠĠĠĠ Ġ// Ġfor Ġtest ers : Ġuse ĠE mul Instance ĊĊĠĠĠĠĠĠĠ Ġperipheral Fast . fill With ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompose Block Transfer Status ( port no : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġblock Transfer Ports [ port no ]. is Master . toInt (). sh l ( 5 ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Transfer Ports [ port no ]. is Slave . toInt (). sh l ( 4 ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Transfer Ports [ port no ]. get Mode (). toInt (). sh l ( 3 ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Transfer Ports [ port no ]. busy . toInt (). sh l ( 2 ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Transfer Ports [ port no ]. are You Ready (). toInt (). sh l ( 1 ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Transfer Ports [ port no ]. c able Connected (). toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Block Transfer Port Status ( port no : ĠInt , Ġbits : ĠByte ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock Transfer Ports [ port no ]. set Mode ( bits . and ( 0 b 0 0 0 0 _ 1 0 0 0 ) Ġ!= Ġ 0 . to Byte ()) ĊĠĠĠĠĠĠĠ Ġblock Transfer Ports [ port no ]. ready Ġ= Ġbits . and ( 0 b 0 0 0 0 _ 0 0 1 0 ) Ġ!= Ġ 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġif Ġ( bits . and ( 0 b 0 0 0 0 _ 0 1 0 0 ) Ġ!= Ġ 0 . to Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Transfer Ports [ port no ]. get Mode ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ("[ IO Space ] Ġstart Send () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Transfer Ports [ port no ]. start Send () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ("[ IO Space ] Ġstart Read () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Transfer Ports [ port no ]. start Read () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpeek ( addr : ĠLong ): ĠByte ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmm io _ read ( addr ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpoke ( addr : ĠLong , Ġbyte : ĠByte ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmm io _ write ( addr , Ġbyte ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmm io _ read ( addr : ĠLong ): ĠByte ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa di Ġ= Ġaddr . toInt () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( addr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 0 .. 3 1 Ġ-> Ġkeyboard Buffer [( addr . toInt ()) ] Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 3 2 .. 3 3 Ġ-> Ġ( mouse X . toInt () Ġshr Ġ( adi Ġ- Ġ 3 2 ). times ( 8 )). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 3 4 .. 3 5 Ġ-> Ġ( mouse Y . toInt () Ġshr Ġ( adi Ġ- Ġ 3 4 ). times ( 8 )). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 6 L Ġ-> Ġmouse Down . toInt (). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 7 L Ġ-> Ġkeyboard Buffer . remove Tail () Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 8 L Ġ-> Ġkeyboard Input Requested . toInt (). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 9 L Ġ-> Ġraw Input Function Lat ched . toInt (). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 4 0 .. 4 7 Ġ-> Ġkey Event Buffers [ adi Ġ- Ġ 4 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 8 L Ġ-> Ġ(( vm . reset Down . toInt () Ġshl Ġ 7 ) Ġor Ġ( vm . stop Down . toInt ())). to Byte () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 6 4 .. 6 7 Ġ-> Ġvm . me ms ize . shr (( adi Ġ- Ġ 6 4 ) Ġ* Ġ 8 ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 6 8 L Ġ-> Ġ( uptime Counter Lat ched . toInt () Ġor ĠRT Cl atched . toInt (). sh l ( 1 )). to Byte () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 7 2 .. 7 9 Ġ-> Ġsystem U ptime . ush r (( adi Ġ- Ġ 7 2 ) Ġ* Ġ 8 ). and ( 2 5 5 ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 8 0 .. 8 7 Ġ-> Ġr tc . ush r (( adi Ġ- Ġ 8 0 ) Ġ* Ġ 8 ). and ( 2 5 5 ). to Byte () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ 8 8 L Ġ-> Ġvm . rom Mapping . to Byte () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 0 2 4 .. 2 0 4 7 Ġ-> Ġperipheral Fast [ addr Ġ- Ġ 1 0 2 4 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 7 6 L Ġ-> Ġblock Transfer Ports [ 0 ]. statusCode . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 7 7 L Ġ-> Ġblock Transfer Ports [ 1 ]. statusCode . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 7 8 L Ġ-> Ġblock Transfer Ports [ 2 ]. statusCode . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 7 9 L Ġ-> Ġblock Transfer Ports [ 3 ]. statusCode . to Byte () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 0 L Ġ-> Ġblock Transfer Ports [ 0 ]. get Your StatusCode (). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 1 L Ġ-> Ġblock Transfer Ports [ 1 ]. get Your StatusCode (). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 2 L Ġ-> Ġblock Transfer Ports [ 2 ]. get Your StatusCode (). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 3 L Ġ-> Ġblock Transfer Ports [ 3 ]. get Your StatusCode (). to Byte () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 4 L Ġ-> Ġ( block Transfer Ports [ 0 ]. your BlockSize (). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 5 L Ġ-> Ġ( block Transfer Ports [ 0 ]. do You Have Next (). toInt (). sh l ( 7 ) Ġor Ġblock Transfer Ports [ 0 ]. your BlockSize (). ush r ( 8 ). and ( 1 5 )). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 6 L Ġ-> Ġ( block Transfer Ports [ 1 ]. your BlockSize (). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 7 L Ġ-> Ġ( block Transfer Ports [ 1 ]. do You Have Next (). toInt (). sh l ( 7 ) Ġor Ġblock Transfer Ports [ 1 ]. your BlockSize (). ush r ( 8 ). and ( 1 5 )). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 8 L Ġ-> Ġ( block Transfer Ports [ 2 ]. your BlockSize (). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 9 L Ġ-> Ġ( block Transfer Ports [ 2 ]. do You Have Next (). toInt (). sh l ( 7 ) Ġor Ġblock Transfer Ports [ 2 ]. your BlockSize (). ush r ( 8 ). and ( 1 5 )). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 9 0 L Ġ-> Ġ( block Transfer Ports [ 3 ]. your BlockSize (). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 9 1 L Ġ-> Ġ( block Transfer Ports [ 3 ]. do You Have Next (). toInt (). sh l ( 7 ) Ġor Ġblock Transfer Ports [ 3 ]. your BlockSize (). ush r ( 8 ). and ( 1 5 )). to Byte () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 4 0 9 2 .. 4 0 9 5 Ġ-> Ġcompose Block Transfer Status ( adi Ġ- Ġ 4 0 9 2 ). to Byte () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 4 0 9 6 .. 8 1 9 1 Ġ-> Ġblock Transfer Rx [ 0 ][ addr Ġ- Ġ 4 0 9 6 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 8 1 9 2 .. 1 2 2 8 7 Ġ-> Ġblock Transfer Rx [ 1 ][ addr Ġ- Ġ 8 1 9 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 2 2 8 8 .. 1 6 3 8 3 Ġ-> Ġblock Transfer Rx [ 2 ][ addr Ġ- Ġ 1 2 2 8 8 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 6 3 8 4 .. 2 0 4 7 9 Ġ-> Ġblock Transfer Rx [ 3 ][ addr Ġ- Ġ 1 6 3 8 4 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 6 5 5 3 6 .. 1 3 1 0 7 1 Ġ-> Ġif Ġ( vm . rom Mapping Ġ== Ġ- 1 ) Ġ 2 5 5 . to Byte () Ġelse Ġvm . rom s [ vm . rom Mapping ]?. get ( adi Ġ- Ġ 6 5 5 3 6 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 3 1 0 7 2 .. 2 6 2 1 4 3 Ġ-> Ġvm . per ipheral Table [ 1 ]. per ipheral ?. mmio _ read ( addr Ġ- Ġ 1 3 1 0 7 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 2 6 2 1 4 4 .. 3 9 3 2 1 5 Ġ-> Ġvm . per ipheral Table [ 2 ]. per ipheral ?. mmio _ read ( addr Ġ- Ġ 2 6 2 1 4 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 3 9 3 2 1 6 .. 5 2 4 2 8 7 Ġ-> Ġvm . per ipheral Table [ 3 ]. per ipheral ?. mmio _ read ( addr Ġ- Ġ 3 9 3 2 1 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 5 2 4 2 8 8 .. 6 5 5 3 5 9 Ġ-> Ġvm . per ipheral Table [ 4 ]. per ipheral ?. mmio _ read ( addr Ġ- Ġ 5 2 4 2 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 6 5 5 3 6 0 .. 7 8 6 4 3 1 Ġ-> Ġvm . per ipheral Table [ 5 ]. per ipheral ?. mmio _ read ( addr Ġ- Ġ 6 5 5 3 6 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 7 8 6 4 3 2 .. 9 1 7 5 0 3 Ġ-> Ġvm . per ipheral Table [ 6 ]. per ipheral ?. mmio _ read ( addr Ġ- Ġ 7 8 6 4 3 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 9 1 7 5 0 4 .. 1 0 4 8 5 7 5 Ġ-> Ġvm . per ipheral Table [ 7 ]. per ipheral ?. mmio _ read ( addr Ġ- Ġ 9 1 7 5 0 4 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmm io _ write ( addr : ĠLong , Ġbyte : ĠByte ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa di Ġ= Ġaddr . toInt () ĊĠĠĠĠĠĠĠ Ġval Ġbi Ġ= Ġbyte . toInt (). and ( 2 5 5 ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( addr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 7 L Ġ-> Ġkeyboard Buffer . append Head ( byte ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 8 L Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyboard Input Requested Ġ= Ġ( byte . is Non Zero ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keyboard Input Requested ) Ġkeyboard Buffer . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 9 L Ġ-> Ġraw Input Function Lat ched Ġ= Ġ( byte . is Non Zero ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 4 0 .. 4 7 Ġ-> Ġkey Event Buffers [ adi Ġ- Ġ 4 0 ] Ġ= Ġbyte ĊĠĠĠĠĠĠĠĠĠĠĠĠ 6 8 L Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu ptime Counter Lat ched Ġ= Ġbyte . and ( 0 b 0 1 ). is Non Zero () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRT Cl atched Ġ= Ġbyte . and ( 0 b 1 0 ). is Non Zero () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ 8 8 L Ġ-> Ġvm . rom Mapping Ġ= Ġbi ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 0 2 4 .. 2 0 4 7 Ġ-> Ġperipheral Fast [ addr Ġ- Ġ 1 0 2 4 ] Ġ= Ġbyte ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 7 6 L Ġ-> Ġblock Transfer Ports [ 0 ]. statusCode Ġ= Ġbi ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 7 7 L Ġ-> Ġblock Transfer Ports [ 1 ]. statusCode Ġ= Ġbi ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 7 8 L Ġ-> Ġblock Transfer Ports [ 2 ]. statusCode Ġ= Ġbi ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 7 9 L Ġ-> Ġblock Transfer Ports [ 3 ]. statusCode Ġ= Ġbi ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 4 L Ġ-> Ġblock Transfer Ports [ 0 ]. block Size Ġ= Ġblock Transfer Ports [ 0 ]. block Size . and ( 0 xFF 0 0 ) Ġor Ġbyte . toInt (). and ( 2 5 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 5 L Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Transfer Ports [ 0 ]. hasNext Ġ= Ġ( byte Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Transfer Ports [ 0 ]. block Size Ġ= Ġblock Transfer Ports [ 0 ]. block Size . and ( 0 x 0 0 FF ) Ġor Ġbyte . toInt (). and ( 1 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 6 L Ġ-> Ġblock Transfer Ports [ 1 ]. block Size Ġ= Ġblock Transfer Ports [ 1 ]. block Size . and ( 0 xFF 0 0 ) Ġor Ġbyte . toInt (). and ( 2 5 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 7 L Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Transfer Ports [ 1 ]. hasNext Ġ= Ġ( byte Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Transfer Ports [ 1 ]. block Size Ġ= Ġblock Transfer Ports [ 1 ]. block Size . and ( 0 x 0 0 FF ) Ġor Ġbyte . toInt (). and ( 1 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 8 L Ġ-> Ġblock Transfer Ports [ 2 ]. block Size Ġ= Ġblock Transfer Ports [ 2 ]. block Size . and ( 0 xFF 0 0 ) Ġor Ġbyte . toInt (). and ( 2 5 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 9 L Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Transfer Ports [ 2 ]. hasNext Ġ= Ġ( byte Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Transfer Ports [ 2 ]. block Size Ġ= Ġblock Transfer Ports [ 2 ]. block Size . and ( 0 x 0 0 FF ) Ġor Ġbyte . toInt (). and ( 1 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 9 0 L Ġ-> Ġblock Transfer Ports [ 3 ]. block Size Ġ= Ġblock Transfer Ports [ 3 ]. block Size . and ( 0 xFF 0 0 ) Ġor Ġbyte . toInt (). and ( 2 5 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 9 1 L Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Transfer Ports [ 3 ]. hasNext Ġ= Ġ( byte Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Transfer Ports [ 3 ]. block Size Ġ= Ġblock Transfer Ports [ 3 ]. block Size . and ( 0 x 0 0 FF ) Ġor Ġbyte . toInt (). and ( 1 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 4 0 9 2 .. 4 0 9 5 Ġ-> Ġset Block Transfer Port Status ( adi Ġ- Ġ 4 0 9 2 , Ġbyte ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 4 0 9 6 .. 8 1 9 1 Ġ-> Ġblock Transfer Tx [ 0 ][ addr Ġ- Ġ 4 0 9 6 ] Ġ= Ġbyte ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 8 1 9 2 .. 1 2 2 8 7 Ġ-> Ġblock Transfer Tx [ 1 ][ addr Ġ- Ġ 8 1 9 2 ] Ġ= Ġbyte ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 2 2 8 8 .. 1 6 3 8 3 Ġ-> Ġblock Transfer Tx [ 2 ][ addr Ġ- Ġ 1 2 2 8 8 ] Ġ= Ġbyte ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 6 3 8 4 .. 2 0 4 7 9 Ġ-> Ġblock Transfer Tx [ 3 ][ addr Ġ- Ġ 1 6 3 8 4 ] Ġ= Ġbyte ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 3 1 0 7 2 .. 2 6 2 1 4 3 Ġ-> Ġvm . per ipheral Table [ 1 ]. per ipheral ?. mmio _ write ( addr Ġ- Ġ 1 3 1 0 7 2 , Ġbyte ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 2 6 2 1 4 4 .. 3 9 3 2 1 5 Ġ-> Ġvm . per ipheral Table [ 2 ]. per ipheral ?. mmio _ write ( addr Ġ- Ġ 2 6 2 1 4 4 , Ġbyte ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 3 9 3 2 1 6 .. 5 2 4 2 8 7 Ġ-> Ġvm . per ipheral Table [ 3 ]. per ipheral ?. mmio _ write ( addr Ġ- Ġ 3 9 3 2 1 6 , Ġbyte ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 5 2 4 2 8 8 .. 6 5 5 3 5 9 Ġ-> Ġvm . per ipheral Table [ 4 ]. per ipheral ?. mmio _ write ( addr Ġ- Ġ 5 2 4 2 8 8 , Ġbyte ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 6 5 5 3 6 0 .. 7 8 6 4 3 1 Ġ-> Ġvm . per ipheral Table [ 5 ]. per ipheral ?. mmio _ write ( addr Ġ- Ġ 6 5 5 3 6 0 , Ġbyte ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 7 8 6 4 3 2 .. 9 1 7 5 0 3 Ġ-> Ġvm . per ipheral Table [ 6 ]. per ipheral ?. mmio _ write ( addr Ġ- Ġ 7 8 6 4 3 2 , Ġbyte ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 9 1 7 5 0 4 .. 1 0 4 8 5 7 5 Ġ-> Ġvm . per ipheral Table [ 7 ]. per ipheral ?. mmio _ write ( addr Ġ- Ġ 9 1 7 5 0 4 , Ġbyte ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġblock Transfer Rx . forEach Ġ{ Ġit . destroy () Ġ} ĊĠĠĠĠĠĠĠ Ġblock Transfer Tx . forEach Ġ{ Ġit . destroy () Ġ} ĊĠĠĠĠĠĠĠ Ġperipheral Fast . destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġmouse X : ĠShort Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar ĠmouseY : ĠShort Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġmouse Down Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġsystem U ptime Ġ= Ġ 0 L ĊĠĠĠ Ġprivate Ġvar Ġr tc Ġ= Ġ 0 L ĊĊĠĠĠ Ġfun Ġupdate ( delta : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( raw Input Function Lat ched ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraw Input Function Lat ched Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstore Ġmouse Ġinfo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmouse X Ġ= Ġ( G dx . input . x Ġ+ Ġgui Pos X ). to Short () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmouseY Ġ= Ġ( G dx . input . y Ġ+ Ġgui Pos Y ). to Short () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmouse Down Ġ= ĠG dx . input . is Tou ched ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġst ro be Ġkeys Ġto Ġfill Ġthe Ġkey Ġread Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġkeys P ushed Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event Buffers . fill ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( k Ġin Ġ 1 .. 2 5 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( G dx . input . is Key Pressed ( k )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event Buffers [ keys P ushed ] Ġ= Ġk . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys P ushed Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keys P ushed Ġ>= Ġ 8 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( uptime Counter Lat ched ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu ptime Counter Lat ched Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsystem U ptime Ġ= Ġvm . get U ptime () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( RT Cl atched ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRT Cl atched Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Ġ= Ġvm . world Interface . currentTime In M ills () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSIG TERM Ġkey Ġcombination : ĠCtrl + Shift + T + R ĊĠĠĠĠĠĠĠ Ġvm . stop Down Ġ= ĠG dx . input . is Key Pressed ( Input . Keys . SHIFT _ LEFT ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG dx . input . is Key Pressed ( Input . Keys . CONTROL _ LEFT ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG dx . input . is Key Pressed ( Input . Keys . T ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG dx . input . is Key Pressed ( Input . Keys . R ) ĊĠĠĠĠĠĠĠ Ġif Ġ( vm . stop Down ) Ġprintln ("[ VM -${ vm . id }] ĠSIG TERM Ġrequested ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠRESET Ġkey Ġcombination : ĠCtrl + Shift + R + S ĊĠĠĠĠĠĠĠ Ġvm . reset Down Ġ= ĠG dx . input . is Key Pressed ( Input . Keys . SHIFT _ LEFT ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG dx . input . is Key Pressed ( Input . Keys . CONTROL _ LEFT ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG dx . input . is Key Pressed ( Input . Keys . R ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG dx . input . is Key Pressed ( Input . Keys . S ) ĊĠĠĠĠĠĠĠ Ġif Ġ( vm . reset Down ) Ġprintln ("[ VM -${ vm . id }] ĠRESET Ġrequested ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtouch Up ( p 0 : ĠInt , Ġp 1 : ĠInt , Ġp 2 : ĠInt , Ġp 3 : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmouse Moved ( p 0 : ĠInt , Ġp 1 : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġkey Typed ( p 0 : ĠChar ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( keyboard Input Requested Ġ&& Ġp 0 . toInt () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ("[ IO ] Ġkey Ġtyped Ġ= Ġ${ p 0 . toInt () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeyboard Buffer . append Head ( p 0 . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsc rolled ( p 0 : ĠFloat , Ġp 1 : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġkey Up ( p 0 : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// tty Special Key Lat ched Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtouch Drag ged ( p 0 : ĠInt , Ġp 1 : ĠInt , Ġp 2 : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġkeyboard Input Requested Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġu ptime Counter Lat ched Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar ĠRT Cl atched Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġraw Input Function Lat ched Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġspecial Keys Ġ= Ġhash Map Of ( ĊĠĠĠĠĠĠĠ ĠInput . Keys . HOME Ġto Ġ 1 9 9 . to Byte (), ĊĠĠĠĠĠĠĠ ĠInput . Keys . UP Ġto Ġ 2 0 0 . to Byte (), ĊĠĠĠĠĠĠĠ ĠInput . Keys . PAGE _ UP Ġto Ġ 2 0 1 . to Byte (), ĊĠĠĠĠĠĠĠ ĠInput . Keys . LEFT Ġto Ġ 2 0 3 . to Byte (), ĊĠĠĠĠĠĠĠ ĠInput . Keys . RIGHT Ġto Ġ 2 0 5 . to Byte (), ĊĠĠĠĠĠĠĠ ĠInput . Keys . END Ġto Ġ 2 0 7 . to Byte (), ĊĠĠĠĠĠĠĠ ĠInput . Keys . DOWN Ġto Ġ 2 0 8 . to Byte (), ĊĠĠĠĠĠĠĠ ĠInput . Keys . PAGE _ DOWN Ġto Ġ 2 0 9 . to Byte (), ĊĠĠĠĠĠĠĠ ĠInput . Keys . INSERT Ġto Ġ 2 1 0 . to Byte (), ĊĠĠĠĠĠĠĠ ĠInput . Keys . FORWARD _ DEL Ġto Ġ 2 1 1 . to Byte () ĊĠĠĠ Ġ) ĊĠĠĠ Ġoverride Ġfun Ġkey Down ( p 0 : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( keyboard Input Requested ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p 0 Ġin ĠInput . Keys . A .. Input . Keys . Z Ġ&& Ġ( G dx . input . is Key Pressed ( Input . Keys . CONTROL _ LEFT ) Ġ|| ĠG dx . input . is Key Pressed ( Input . Keys . CONTROL _ RIGHT ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyboard Buffer . append Head (( p 0 Ġ- Ġ 2 8 ). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspecial Keys [ p 0 ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ("[ IO ] Ġkey Ġspecial Ġ= Ġ${ it . to UInt () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyboard Buffer . append Head ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtouch Down ( p 0 : ĠInt , Ġp 1 : ĠInt , Ġp 2 : ĠInt , Ġp 3 : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠBoolean . toInt () Ġ= Ġif Ġ( this ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠ Ġprivate Ġfun ĠByte . is Non Zero () Ġ= Ġthis Ġ!= Ġ 0 . to Byte () Ċ } Ċ