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:
84
src/imlac/maze.print
Normal file
84
src/imlac/maze.print
Normal 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>)>>>
|
||||
Reference in New Issue
Block a user