1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-30 05:34:01 +00:00

Add Muddle code or printing a maze.

As per the specification in the Imlac portion of the Maze game.
This commit is contained in:
Lars Brinkhoff
2020-09-06 21:26:07 +02:00
parent 8e870bf8e7
commit 66dac82f59

84
src/imlac/maze.print Normal file
View File

@@ -0,0 +1,84 @@
; " -*- muddle -*- "
; "Print an imtraned maze."
<SETG MAZE <IVECTOR 34>>
<SETG WEST [!<IVECTOR 13 " "> "W" "E" "S" "T" !<IVECTOR 15 " ">]>
<SETG EAST [!<IVECTOR 13 ""> " E" " A" " S" " T"
!<IVECTOR 15 "">]>
<DEFINE GET4 ("AUX" (C <ASCII <READCHR>>))
;"Read 4 bits from an imtraned file."
;"Ignore all characters outside @-O."
<COND (<AND <G=? .C 64> <L=? .C 79>> <- .C 64>)
(ELSE <GET4>)>>
<DEFINE GET8 ()
<+ <* <GET4> 16> <GET4>>>
<DEFINE GET16 ()
<+ <* <GET8> 256> <GET8>>>
<DEFINE GET-BLKLDR ()
;"Skip over the block loader."
<REPEAT ((N 0))
<GET16>
<SET N <+ .N 1>>
<COND (<=? .N 65> <RETURN>)>>>
<DEFINE READ-MAZE ()
;"Read an imtraned maze."
<GET-BLKLDR>
<REPEAT ((I 1) N)
;"Get block length."
<SET N <+ <GET8> .I>>
;"Get block address. All ones means end."
<COND (<=? <GET16> 65535> <RETURN>)>
<REPEAT ()
<PUT ,MAZE .I <GET16>>
<SET I <+ .I 1>>
<COND (<=? .I .N> <RETURN>)>>
;"Get block checksum."
<GET16>>>
<DEFINE WRITE-LINE (S)
<PRINC .S>
<TERPRI>>
<DEFINE ZERO? (X)
<=? .X #WORD 0>>
<DEFINE WRITE-ROW (I W E "AUX" (DATA <GET ,MAZE .I>))
;"Print one row of the maze."
<PRINC "; ">
<PRINC .W>
<PRINC " ">
<REPEAT ((BIT <LSH 1 15>))
<COND (<ZERO? <ANDB .DATA .BIT>> <PRINC " ">)
(ELSE <PRINC "$$$">)>
<SET BIT <LSH .BIT -1>>
<COND (<ZERO? .BIT> <RETURN>)>>
<WRITE-LINE .E>>
<DEFINE WRITE-MAZE ()
;"Print the maze data."
<WRITE-LINE "; N O R T H">
<WRITE-LINE ";">
<WRITE-LINE ";">
<REPEAT ((I 1))
<WRITE-ROW .I <GET ,WEST .I> <GET ,EAST .I>>
<WRITE-ROW .I " " "">
<COND (<=? .I 32> <RETURN>)>
<SET I <+ .I 1>>>
<WRITE-LINE ";">
<WRITE-LINE ";">
<WRITE-LINE "; S O U T H">>
<DEFINE PRINT-MAZE (INPUT "OPTIONAL" (OUTPUT <>))
;"Read an imtraned maze and print it."
<PROG ((INCHAN <OPEN "READ" .INPUT>)
(OUTCHAN <COND (.OUTPUT <OPEN "PRINT" .OUTPUT>)
(ELSE .OUTCHAN)>))
<READ-MAZE>
<CLOSE .INCHAN>>
<WRITE-MAZE>
<COND (.OUTPUT <CLOSE .OUTCHAN>)>>>