diff --git a/components/badge23/display.c b/components/badge23/display.c
index 8210c72d9d263cb3fce3acfc7dd80d22ab2f6e16..1da50b987fed6bc81a75f872926704224bb7c61c 100644
--- a/components/badge23/display.c
+++ b/components/badge23/display.c
@@ -67,13 +67,8 @@ void display_fill(uint16_t col){
 }
 
 void display_draw_scope(){
-    uint16_t line[240];
-    begin_scope_read();
-    for(int y=0; y<240; y++){
-        read_line_from_scope(&(line[0]), y);
-        memcpy(&ScreenBuff[y * 240], line, sizeof(line));
-    }
-    end_scope_read();
+    if(!scope_active) return;
+    scope_write_to_framebuffer(&ScreenBuff);
     GC9A01_Update();
 }
 
diff --git a/components/badge23/include/badge23/scope.h b/components/badge23/include/badge23/scope.h
index 302bea447ac39ca1d1ff029f3be08feebfd6b50b..024ccde97786fce796d22df234b73572cf914f64 100644
--- a/components/badge23/include/badge23/scope.h
+++ b/components/badge23/include/badge23/scope.h
@@ -10,6 +10,4 @@ typedef struct {
 
 void init_scope(uint16_t size);
 void write_to_scope(int16_t value);
-void begin_scope_read();
-void end_scope_read();
-void read_line_from_scope(uint16_t * line, int16_t point);
+void scope_write_to_framebuffer(uint16_t * framebuffer);
diff --git a/components/badge23/scope.c b/components/badge23/scope.c
index dc92395dd2987625eb0cac9092d3719f25d17fd4..8eb1f39805c0d60cc622ad0f71871198b85682ac 100644
--- a/components/badge23/scope.c
+++ b/components/badge23/scope.c
@@ -30,34 +30,40 @@ void begin_scope_read(){
     scope->is_being_read = 1; //best mutex
 }
 
-void read_line_from_scope(uint16_t * line, int16_t point){
-    memset(line, 0, 480);
-    int16_t startpoint = scope->write_head_position - point;
-    while(startpoint < 0){
-        startpoint += scope->buffer_size;
-    }
-    int16_t stoppoint = startpoint - 1;
-    if(stoppoint < 0){
-        stoppoint += scope->buffer_size;
-    }
-    int16_t start = (scope->buffer[point]/32 + 120);
-    int16_t stop = (scope->buffer[point+1]/32 + 120);
-    if(start>240)   start = 240;
-    if(start<0)     start = 0;
-    if(stop>240)    stop = 240;
-    if(stop<0)     stop = 0;
-
-    if(start > stop){
-        int16_t inter = start;
-        start = stop;
-        stop = inter;
-    }
-    for(int16_t i = start; i <= stop; i++){
-        line[i] = 255;
-    }
-}
-
 void end_scope_read(){
     if(scope == NULL) return;
     scope->is_being_read = 0; //best mutex
 }
+
+void scope_write_to_framebuffer(uint16_t * framebuffer){
+    //assumes 240x240 16bit framebuffer for now
+    begin_scope_read();
+    memset(framebuffer, 0, 240*240*sizeof(uint16_t));
+
+    for(int point = 0; point < 240; point++){
+        int16_t startpoint = scope->write_head_position - point;
+        while(startpoint < 0){
+            startpoint += scope->buffer_size;
+        }
+        int16_t stoppoint = startpoint - 1;
+        if(stoppoint < 0){
+            stoppoint += scope->buffer_size;
+        }
+        int16_t start = (scope->buffer[point]/32 + 120);
+        int16_t stop = (scope->buffer[point+1]/32 + 120);
+        if(start>240)   start = 240;
+        if(start<0)     start = 0;
+        if(stop>240)    stop = 240;
+        if(stop<0)     stop = 0;
+
+        if(start > stop){
+            int16_t inter = start;
+            start = stop;
+            stop = inter;
+        }
+        for(int16_t i = start; i <= stop; i++){
+            framebuffer[point + i*240] = 255;
+        }
+    }
+    end_scope_read();
+}