random stuff added by ovenpasta on Thu Mar 5 14:26:14 2015

(use utils)
(use traversal)

(define boot3 (read-all "boot3.txt"))

(define lines (map string-split (string-split boot3 "\n")))
;(string-chop boot3 (* 14 49))
(call-with-output-file "boot3-lines.txt" 
  (lambda (out)
    (for-each (lambda (l)
		(write l out)
		(newline out))
	      lines)))
(define boot3-code 
  (reverse (let loop ((i 0)
		      (l lines)
		      (bsl '())
		      (size 0))
	     (if (null? l)
		 bsl
		 (let* ((rem (remainder i 14))
			(size (if (= rem 0) 
				  (+ (string->number (list-ref (car l) 5) 16) 0)
				  size))
			(ok (case rem
				((1)	
				 (append (reverse (sublist (car l) 6 (+ 6 (min size 6)))) bsl))			
				(( 2 3 4 5 6 7 8 9 10) 
				 (append (reverse (sublist (car l) 5 (+ 5 (min size 7)))) bsl))				(else bsl))))
		   (loop (+ 1 i) (cdr l) ok (max 0 (- size (if (= rem 1) 6 7)))))))))

(define (output name list)
  (call-with-output-file name
    (lambda (out)
      (for-each-indexed 
       (lambda (x n)
	 (if  (not (= n 0))
	      (if (= (remainder n 16) 0) 
		  (newline out)
		  (display " " out)))
	 (display x out))
       list))))
(output "boot3-code.txt" boot3-code)


(define boot3-keys
  (reverse (let loop ((i 0)
		      (l lines)
		      (bsl '())
		      (size 0))
	     (if (null? l)
		 bsl
		 (let* ((rem (remainder i 14))
			(size (if (= rem 11) 
				  16
				  size))
			(ok (case rem
			      ((11)
			       (append (reverse (sublist (car l) 7 (+ 7 5))) bsl))				
			      ((12 13) 
				(append (reverse (sublist (car l) 5 (+ 5 (min size 7)))) bsl))				(else bsl))))
		   (loop (+ 1 i) (cdr l) ok (max 0 (- size (if (= rem 11) 5 7)))))))))

(output "boot3-keys.txt" boot3-keys)