@@ -17,6 +17,7 @@ const https = require('https');
17
17
const cert_path = "./certs/" ;
18
18
const parser = require ( './parser' ) ;
19
19
const gifsicle = require ( 'gifsicle' ) ;
20
+ const beebjit = require ( './beebjit' ) ;
20
21
21
22
var mastodon = TRY ? null : require ( TEST ? './test' : './mastodon' ) ;
22
23
@@ -54,12 +55,12 @@ var clientID = "Cli0";
54
55
'jsunzip' : 'lib/jsunzip' ,
55
56
'promise' : 'lib/promise-6.0.0' ,
56
57
'underscore' : 'lib/underscore-min' ,
57
- 'emulator' :'../../emulator '
58
+ 'emulator' :'../../jsbeeb '
58
59
}
59
60
} ) ;
60
61
61
62
requirejs ( [ 'emulator' ] ,
62
- function ( emulator ) {
63
+ function ( jsbeeb ) {
63
64
"use strict" ;
64
65
65
66
async function run ( tweet ) {
@@ -69,86 +70,41 @@ var clientID = "Cli0";
69
70
var c = parser . parseTweet ( tweet ) ;
70
71
71
72
console . log ( "Parser output" , c ) ;
73
+
72
74
// If rude or not basic, skip it
73
75
if ( ! c . isBASIC ) {
74
76
console . log ( "No BASIC detected" ) ;
75
77
setTimeout ( requestTweet , POLL_DELAY ) ;
76
78
return ;
77
79
}
80
+
78
81
if ( c . rude ) {
79
82
console . warn ( "BLOCKED @" + tweet . user . screen_name )
80
83
await mastodon . block ( tweet ) ;
81
84
setTimeout ( requestTweet , POLL_DELAY ) ;
82
85
return ;
83
86
}
84
87
85
- var start = new Date ( )
88
+ let start = new Date ( )
89
+ let media_path = "./tmp/" + tweet . id ;
86
90
87
- var media_path = "./tmp/" + tweet . id ;
88
- // Emulate
91
+ // Emulate on Beebjit
89
92
if ( c . emulator == "beebjit" ) {
93
+
90
94
var frame_path = "./tmp/beebjit_frame_" ;
91
95
var audio_file = null ;
92
96
var pixel_format = "bgra" ;
93
97
var emu_name = "beebjit" ;
94
98
95
- // Run tweet on emulator
96
- var tokenised ;
97
- try {
98
- var basic = c . input ;
99
- var tmp = basic . replace ( / \# \w + / g, "" ) . trim ( ) ; // get rid of tags and white space
100
- if ( tmp . match ( / ^ \d / ) != null ) {
101
- // If there are line numbers remove a trailing explicit "RUN".
102
- basic = basic . replace ( / \n \s * R U N [ \s \n ] * $ / , "" ) ;
103
- }
99
+ await beebjit ( c , jsbeeb ) ;
104
100
105
- console . log ( basic )
106
- tokenised = await emulator . tokenise ( basic ) ;
107
- await fs . writeFileSync ( "./tmp/tweet.bas" , tokenised , { encoding :"binary" } ) ;
108
- await fs . writeFileSync ( "./tmp/keys.bin" , "RUN\r" , { encoding :"binary" } ) ;
109
-
110
- var keyboardBuffer = "03e0" ; // BBC Micro OS 1.20
111
- var IBP = 0x02E1 ; // input pointer
112
- var OBP = 0x02D8 ; // output pointer
113
-
114
- var page = ( c . flags . includes ( "gxr.rom" ) ) ? "1c00" : "1900" ;
115
- var end = parseInt ( page , 16 ) + tokenised . length ;
116
- var endLow = ( end & 0xff ) . toString ( 16 ) ;
117
- var endHigh = ( ( end >>> 8 ) & 0xff ) . toString ( 16 ) ;
118
-
119
- // beebjit debug commands
120
- var commands = "'" +
121
- [ "breakat 725000" ,
122
- "c" ,
123
- "loadmem ../tmp/tweet.bas " + page , // paste tokenised program into PAGE
124
- "loadmem ../tmp/keys.bin " + keyboardBuffer , // 0x03E0 OS 1.2
125
- "writem 02e1 e4" , // Advance pointer 4 bytes
126
- "writem 0000 " + endLow , // LOWMEM
127
- "writem 0001 " + endHigh ,
128
- "writem 0002 " + endLow , // VARTOP
129
- "writem 0003 " + endHigh ,
130
- "writem 0012 " + endLow , // TOP
131
- "writem 0013 " + endHigh ,
132
- "c"
133
- ] . join ( ";" ) + "'" ;
134
-
135
- } catch ( e ) {
136
- console . log ( "Tokenisation FAILED" ) ;
137
- console . log ( e ) ;
138
- setTimeout ( requestTweet , POLL_DELAY ) ;
139
- return ;
140
- }
141
-
142
- let beebjit_cmd = "cd beebjit && ./beebjit -fast -headless -frames-dir ../tmp/ " + c . flags + " -commands " + commands ;
143
- await exec ( beebjit_cmd ) ;
144
- console . log ( beebjit_cmd ) ;
145
101
} else // JSbeeb
146
102
{
147
103
var frame_path = media_path + "frame" ;
148
- var audio_file = media_path + "audiotrack.raw" ;
104
+ audio_file = media_path + "audiotrack.raw" ;
149
105
var pixel_format = "rgba" ;
150
106
var emu_name = "jsbeeb" ;
151
- var frames = await emulator . emulate ( c . input , frame_path , audio_file , emulationDuration , startFrame ) ;
107
+ var frames = await jsbeeb . emulate ( c . input , frame_path , audio_file , emulationDuration , startFrame ) ;
152
108
if ( ! fs . existsSync ( audio_file ) ) audio_file = null ;
153
109
}
154
110
@@ -162,14 +118,14 @@ var clientID = "Cli0";
162
118
console . log ( emu_name + " DONE in %ds " , end / 1000 ) ;
163
119
164
120
// Count unique video frames
165
- var shasum_check = ( await exec ( "sha1sum client.js | awk '{print $1}' | wc -l" ) ) ; // should equal 1
166
- var shasum = ( shasum_check > 0 ) ? "sha1sum" : "shasum" ;
121
+ var shasum_check = ( await exec ( "sha1sum client.js | awk '{print $1}' | wc -l" ) ) ; // should equal 1
122
+ var shasum = ( shasum_check > 0 ) ? "sha1sum" : "shasum" ;
167
123
var frames = ( await exec ( shasum + " " + frame_path + "*." + pixel_format + " | awk '{print $1}' | wc -l" ) ) ;
168
124
var uniqueFrames = ( await exec ( shasum + " " + frame_path + "*." + pixel_format + " | awk '{print $1}' | sort | uniq | wc -l" ) ) ;
169
125
170
126
console . log ( "Captured " + frames + " frames (" + uniqueFrames + " unique) " + frame_path ) ;
171
127
172
- start = new Date ( ) ;
128
+ start = new Date ( ) ;
173
129
174
130
if ( frames == 0 ) {
175
131
// NO VIDEO -> NOTHING
@@ -179,6 +135,7 @@ var clientID = "Cli0";
179
135
var mediaFilename = media_path + '.png' ;
180
136
var mediaType = 'image/png' ;
181
137
var ffmpegCmd = './ffmpeg -hide_banner -y -f rawvideo -pixel_format ' + pixel_format + ' -video_size 640x512 -i ' + frame_path + ( frames - 1 ) + '.' + pixel_format + ' -vf "scale=1280:1024" ' + mediaFilename
138
+
182
139
} else {
183
140
// ANIMATION OR STATIC IMAGE WITH SOUND -> GIF
184
141
var mediaFilename = media_path + '.gif' ;
@@ -196,7 +153,9 @@ var clientID = "Cli0";
196
153
} else {
197
154
var checksum = '' ;
198
155
}
156
+
199
157
exec ( 'rm -f ' + frame_path + '*.' + pixel_format ) ;
158
+
200
159
if ( audio_file !== null ) {
201
160
fs . unlinkSync ( audio_file ) ;
202
161
}
0 commit comments