Trailing-Edge
-
PDP-10 Archives
-
decuslib20-02
-
decus/20-0071/eyes.mac
There are 2 other files named eyes.mac in the archive. Click here to see a list.
TITLE EYES -- A PROGRAM TO CONVERT AN ASCII FILE TO BRAILLE.
SIXBIT /EYES/
BEGIN: TTCALL 3,[ASCIZ/
SPECIFY FILE TO BE BRAILLED>/]
MOVE 1,[SIXBIT/DSK/] ;ASSUME INPUT DEVICE IS DISK.
MOVEM 1,INITCH+1 ;MOVE IT TO FILE INIT SPECIFICATIONS.
SETZM LOKBLK+1 ;CLEAR WORD 2 OF LOOKUP BLOCK.
SETZM LOKBLK+2 ;CLEAR WORD 3 OF LOOKUP BLOCK.
SETZM LOKBLK+3 ;CLEAR WORD 4 OF LOOKUP BLOCK.
SETZB 2,3 ;CLEAR AC'S FOR PPN.
SETZB 0,10 ;CLEAR FILENAME AND TTY INPUT AC'S.
MOVSI 1,-7 ;MAXIMUM OF 6 CHARS IN FILENAME.
MOVE 11,FILPTR ;MOVE FILENAME POINTER TO FAST MEMORY.
TTCALL 4,10 ;INPUT A CHAR TO AC 10, LINE MODE.
JRST .+2 ;ON FIRST CHAR, SKIP.
FILEIN: TTCALL 0,10 ;INPUT ANOTHER CHAR TO AC 10.
CAIN 10,":" ;IS IT A ":"?
JRST GETDEV ;IF SO, JUMP TO GET DEVICE.
CAIN 10,"." ;IS IT A "."?
JRST GETEXT ;IF SO, JUMP TO GET EXTENSION.
CAIN 10,"[" ;IS IT A "["?
JRST PPN ;IF SO, JUMP TO GET PPN.
CAIN 10,015 ;IS IT A CR?
JRST READY ;IF SO, JUMP TO INPUT FILE.
AOBJP 1,FILEIN ;IF MORE THAN 6 CHARS, IGNORE REST.
CAIG 10,137 ;IS THE CHAR LOWER CASE?
ADDI 10,40 ;IF NOT, CONVERT FOR SIXBIT.
IDPB 10,11 ;STORE THE CHAR IN AC 0 IN SIXBIT.
JRST FILEIN ;GET NEXT CHAR.
GETDEV: MOVEM 0,INITCH+1 ;MOVE DEVICE SPECIFIED FOR FILE INIT
JRST BEGIN+7 ;JUMP TO GET FILENAME.
GETEXT: MOVSI 1,-4 ;MAXIMUM OF 3 CHARS IN EXTENSION.
MOVE 11,EXTPTR ;MOVE EXTENSION POINTER TO FAST MEMORY.
TTCALL 0,10 ;INPUT A CHAR OF EXTENSION TO AC 10.
CAIN 10,"[" ;IS IT A "["?
JRST PPN ;IF SO, JUMP TO GET PPN.
CAIN 10,015 ;IS IT A CR?
JRST READY ;IF SO, JUMP TO INPUT FILE
AOBJP 1,GETEXT+2 ;IF MORE THAN 3 CHARS, IGNORE REST.
CAIG 10,137 ;IS THE CHAR LOWER CASE?
ADDI 10,40 ;IF SO, MAKE IT UPPER CASE.
IDPB 10,11 ;STORE THE CHAR IN AC 0.
JRST GETEXT+2 ;GET NEXT CHAR.
PPN: MOVSI 1,-7 ;MAXIMUM OF 6 DIGITS IN PROJECT NUMBER.
TTCALL 0,10 ;INPUT A DIGIT TO AC 10.
CAIN 10,"," ;IS IT A ","?
JRST PN ;IF SO, JUMP TO GET PROGRAMMER NUMBER.
CAIN 10,"]" ;IS IT A "]"?
JRST PPN+1 ;IF SO, IGNORE IT.
CAIN 10,015 ;IS IT A CR?
JRST READY-1 ;IF SO, JUMP TO STORE PROJECT NUMBER.
AOBJP 1,PPN+1 ;IF MORE THAN 6 DIGITS, IGNORE REST.
ANDI 10,7 ;SAVE LAST 3 BITS.
LSH 2,3 ;MAKE ROOM IN AC 2,
IOR 2,10 ;AND STORE OCTAL DIGIT.
JRST PPN+1 ;GET NEXT DIGIT.
PN: MOVSI 1,-7 ;MAXIMUM OF 6 DIGITS IN PROG. NUMBER.
TTCALL 0,10 ;INPUT A DIGIT TO AC 10.
CAIN 10,"]" ;IS IT A "]"?
JRST PN+1 ;IF SO, IGNORE IT.
CAIN 10,015 ;IS IT A CR?
JRST READY-2 ;IF SO, JUMP TO STORE PPN AND DO INPUT.
AOBJP 1,PN+1 ;IF MORE THAN 6 DIGITS, IGNORE REST.
ANDI 10,7 ;SAVE LAST 3 BITS.
LSH 3,3 ;MAKE ROOM IN AC 3,
IOR 3,10 ;AND STORE OCTAL DIGIT.
JRST PN+1 ;GET NEXT DIGIT.
HRRM 3,LOKBLK+3 ;STORE PROGRAMMER NUMBER,
HRLM 2,LOKBLK+3 ;AND PROJECT NUMBER IN LOOKUP BLOCK.
PAGE
READY: TTCALL 11,0 ;CLEAR TTY INPUT BUFFER.
MOVEM 0,LOKBLK ;MOVE FILENAME TO LOOKUP BLOCK.
INITCH: INIT 0,17 ;INITIALIZE CHANNEL, DUMP MODE, INPUT.
0 ;DEVICE DEPENDS ON USER.
0 ;NO BUFFERING.
JRST .+2 ;ON ERROR, SKIP.
JRST .+3 ;OK, CONTINUE.
TTCALL 3,[ASCIZ/
?DEVICE DOES NOT EXIST.
/]
JRST BEGIN ;TRY AGAIN.
LOOKUP 0,LOKBLK ;PERFORM FILE LOOKUP.
JRST .+2 ;ON ERROR, SKIP.
JRST .+3 ;OK, CONTINUE.
TTCALL 3,[ASCIZ/
?FILE NOT FOUND OR PROTECTION FAILURE.
/]
JRST BEGIN ;TRY AGAIN.
SETZM TYPFLE ;SET FILE TYPE FLAG TO NON-DATA TYPE.
TTCALL 11,0 ;CLEAR TTY INPUT BUFFER.
TTCALL 3,[ASCIZ/
DATA FILE?(Y,N)>/]
TTCALL 4,10 ;INPUT A CHAR TO AC 10.
TTCALL 11,0 ;CLEAR TTY INPUT BUFFER.
CAIN 10,"Y" ;IS A DATA FILE SPECIFIED?
SETOM TYPFLE ;IF SO, SET FLAG SO BLANKS NOT IGNORED
INIT 1,0 ;INITIALIZE CHANNEL, ASCII, OUTPUT.
;[DECUS] CHANGE LPT TO DSK
SIXBIT /DSK/ ;DEVICE IS LPT.
XWD OBUF,0 ;SPECIFY OUTPUT RING HEADER BLOCK.
WAIT 1,0 ;ON ERROR, WAIT FOR INACTIVE DEVICE.
JSP 13,BLOKIN ;GET A BLOCK OF DATA.
JSP 16,BLINE ;BLANK OUT THE BRAILLE LINE.
MOVEI 17,STACK-1 ;SET UP STACK POINTER.
MOVEI 15,"." ;AC 15 WILL HOLD ASCII CODE FOR ".".
INCHAR: JSP 16,GETCHR ;GET A CHAR FROM FILE, PUT IN AC 10.
CAIN 10,015 ;IS IT A CR?
JRST INCHAR ;IF SO, IGNORE IT.
CAIE 10,012 ;IS IT A LF?
JRST .+3 ;IF NOT, CHECK NEXT CHAR.
JSP 7,SETUP ;IF SO, DONE WITH LINE.
JRST INCHAR ;THEN GET ANOTHER CHARACTER.
CAIN 10,011 ;IS IT A TAB?
JRST INCHAR ;IF SO, IGNORE IT.
CAIE 10,040 ;IS IT A BLANK?
JRST .+5 ;IF NOT, JUMP AHEAD.
SKIPN TYPFLE ;IF A BLANK AND A DATA FILE, SKIP.
JRST INCHAR ;IF ANOTHER TYPE OF FILE, IGNORE BLANK.
JSP 13,PUSHDN ;IF A DATA FILE, STACK ALL BLANKS.
JRST INCHAR ;GET ANOTHER CHARACTER.
CAIG 10,037 ;IS IT ANOTHER CONTROL CHARACTER?
JRST CTLCH ;IF SO, PROCESS IT.
JSP 13,PUSHDN ;IF NOT, STACK THE PRINTABLE CHARACTER.
JRST INCHAR ;GET ANOTHER CHARACTER.
PAGE
;A SUBROUTINE TO PROCESS CONTROL CHARACTERS EITHER BY TERMINATING THE
;LINE AND ALLOWING PAPER MOVEMENT OR BY SETTING UP THE CHARACTER TO
;BE PRINTED IN ARROW FORMAT.
CTLCH: CAIN 10,014 ;IS IT A FF?
JRST FF ;IF SO, JUMP TO PROCESS IT.
CAIN 10,000 ;IS IT NULL?
JRST INCHAR ;IF SO, IGNORE IT.
CAIN 10,013 ;IS IT A VT?
JRST VT ;IF SO, JUMP TO PROCESS IT.
CAIE 10,033 ;IS IT ESC?
JRST .+4 ;IF NOT, JUMP AHEAD.
MOVEI 10,"$" ;IF SO, ECHO AS A "$".
JSP 13,PUSHDN ;STACK THE "$".
JRST INCHAR ;GET ANOTHER CHARACTER.
MOVEM 10,SAVE ;ECHO ALL OTHERS IN ARROW FORMAT.
MOVEI 10,"^" ;MOVE "^" TO AC 10.
JSP 13,PUSHDN ;STACK THE "^".
MOVE 10,SAVE ;RESTORE THE CONTROL CHARACTER TO AC 10.
ADDI 10,100 ;CONVERT.
JSP 13,PUSHDN ;STACK THE PRINTABLE CHARACTER.
JRST INCHAR ;GET ANOTHER CHARACTER.
PAGE
;A SUBROUTINE WHICH WILL SET UP THE APPROPRIATE BRAILLE CELL(IN REVERSE)
;BY PLACING DOTS CORRECTLY IN THE BRAILLE LINE.
CELL: MOVSI 11,-2 ;2 COLUMNS IN 1 CELL.
LOOP: IBP 14 ;BYTE POINTER POINTS TO CORRECT COLUMN.
MOVSI 2,-3 ;3 ROWS IN 1 CELL.
LOOP1: CAIGE 12,0 ;IS A DOT PRESENT IN THIS POSITION?
DPB 15,14 ;IF SO, PUT THE DOT IN THE LINE.
LSH 12,1 ;SHIFT BRAILLE CODE FOR NEXT POSITION.
ADDI 14,30 ;ADD 30 TO ADDRESS POINTER FOR NEXT LINE.
AOBJN 2,LOOP1 ;IF NOT DONE WITH COLUMN, GET NEXT ROW.
SUBI 14,110 ;SET ADDRESS POINTER BACK TO FIRST ROW.
AOBJN 11,LOOP ;IF NOT DONE WITH CELL, GET NEXT COLUMN.
IBP 14 ;INCREMENT BYTE POINTER FOR SPACING.
JRSTF 0(16) ;RETURN.
PAGE
;A SUBROUTINE TO INPUT A 128 (DECIMAL) WORD BLOCK FROM DISK.
BLOKIN: MOVEI 3,1200 ;640 (DECIMAL) BYTES IN BLOCK.
MOVEM 3,COUNT ;SAVE IT.
MOVE 3,PIOWD ;MOVE PERMANENT IOWD TO AC 3.
MOVEM 3,TIOWD ;SAVE IT.
INPUT 0,TIOWD ;INPUT A BLOCK OF DATA.
STATZ 0,300000 ;CHECK FOR ERROR.
JRST .+2 ;ON ERROR, SKIP.
JRST .+3 ;OK, CONTINUE.
TTCALL 3,[ASCIZ/
?DEVICE OR DATA ERROR.
/]
CALLI 0,12 ;EXIT ON ERROR.
STATZ 0,020000 ;CHECK FOR END-OF-FILE.
JRST EOF ;AT EOF, JUMP TO FINISH UP.
MOVE 3,DPOINT ;MOVE DATA POINTER TO FAST MEMORY.
MOVEM 3,TPTR ;MOVE IT TO TEMPORARY POINTER.
JRSTF 0(13) ;RETURN.
PAGE
GETCHR: ILDB 10,TPTR ;LOAD A BYTE FROM INPUT FILE TO AC 10.
SOSG COUNT ;NEED MORE DATA?
JSP 13,BLOKIN ;IF SO, GET ANOTHER BLOCK.
JRSTF 0(16) ;RETURN.
PAGE
;THE FOLLOWING SET OF SUBROUTINES PROCESS SPECIAL CONDITIONS AND CERTAIN
;CONTROL CHARACTERS.
;
;
;A SUBROUTINE TO TERMINATE A LINE AND EJECT A PAGE
FF: TLNE 17,777777 ;IS STACK EMPTY?
JSP 7,SETUP+4 ;IF NOT, END OF LINE.
MOVEI 14,014 ;MOVE A FORM FEED CHARACTER TO AC 14,
JSP 13,PUT ;AND PUT IT IN OUTPUT LINE.
JRST INCHAR ;GET ANOTHER CHARACTER.
;
;A SUBROUTINE TO TERMINATE A LINE AND VERTICAL TAB THE PAGE.
VT: TLNE 17,777777 ;IS STACK EMPTY?
JSP 7,SETUP+4 ;IF NOT, END OF LINE.
MOVEI 14,013 ;MOVE A VERTICAL TAB CHAR TO AC 14,
JSP 13,PUT ;AND PUT IT IN OUTPUT LINE.
JRST INCHAR ;GET ANOTHER CHARACTER.
;A SUBROUTINE TO SKIP 1 BRAILLE LINE (3 PRINTER LINES).
SKPLIN: MOVSI 12,-3 ;3 PRINTER LINES TO BE SKIPPED.
MOVEI 14,015 ;PUT A CR IN AC 14.
JSP 13,PUT ;PUT IN OUTPUT LINE.
MOVEI 14,012 ;PUT A LF IN AC 14.
JSP 13,PUT ;PUT IN OUTPUT LINE.
AOBJN 12,SKPLIN+1 ;3 TIMES.
JRSTF 0(16) ;RETURN.
;
;A SUBROUTINE TO BLANK OUT 1 BRAILLE LINE (3 PRINTER LINES).
BLINE: MOVE 2,BLANK ;MOVE BLANKS TO AC 2.
MOVEM 2,LINE1 ;MOVE IT TO FIRST LINE LOCATION.
MOVEI 2,LINE1+1 ;PUT ADDRESS OF 2-ND LOCATION IN AC 2.
HRLI 2,LINE1 ;PUT ADDRESS OF 1-ST LOCATION IN AC 2.
BLT 2,LINE3+27 ;BLANK OUT BRAILLE LINE.
JRSTF 0(16) ;RETURN.
PAGE
;A SUBROUTINE TO REMOVE CHARACTERS FROM THE STACK AND SET UP THE BRAILLE
;LINE.
SETUP: TLNE 17,777777 ;IS STACK EMPTY?
JRST .+3 ;IF NOT, JUMP AHEAD TO CONVERT LINE.
JSP 16,SKPLIN ;IF SO, THEN JUMP TO SKIP BRAILLE LINE.
JRST INCHAR ;GET ANOTHER CHARACTER.
HLRZ 3,17 ;PUT NUMBER OF CHARS IN STACK IN AC 3
IMULI 3,3 ;3 COLUMNS IN CELL (ONE BLANK).
IDIVI 3,5 ;NUMBER OF WORDS FROM RIGHT END OF LINE
MOVE 2,LPTR ;MOVE LINE POINTER TO AC 2 TO MODIFY IT.
SUB 2,3 ;MODIFY THE ADDRESS FOR FIRST CELL.
MOVEM 2,14 ;PUT IT BACK WITH NEW ADDRESS.
MOVEI 2,5 ;MOVE 5 TO AC 2.
SUB 2,4 ;SUBTRACT NUMBER OF BYTES IN WORD (REM)
IMULI 2,7 ;MULTIPLY BY 7 GET NUMBER OF BITS.
MOVEI 5,44 ;MOVE 44 TO AC 5.
SUB 5,2 ;GET CORRECT BYTE POSITION P.
DPB 5,[POINT 6,14,5] ;CHANGE BYTE POSITION P IN POINTER.
POPUP: TLNE 17,777777 ;IS STACK EMPTY?
JRST .+2 ;IF NOT, SKIP.
JRST DONE ;IF SO, JUMP TO OUTPUT BRAILLE LINE.
POP 17,10 ;POP A CHARACTER INTO AC 10.
CAIL 10,141 ;IS IT LOWER CASE?
SUBI 10,40 ;IF SO, CONVERT TO UPPER CASE.
SUBI 10,40 ;SUBTRACT 40 FOR INDEXING.
MOVE 12,DOTCOD(10) ;MOVE THE CORRECT BRAILLE CODE TO AC 12.
JSP 16,CELL ;JUMP TO SET UP BRAILLE CELL
JRST POPUP ;GET NEXT CHARACTER FROM STACK.
DONE: JSP 1,PUTLIN ;WHEN STACK EMPTY, JUMP TO OUTPUT LINE.
JSP 16,SKPLIN ;JUMP TO SKIP 1 BRAILLE LINE.
JRSTF 0(7) ;RETURN
PAGE
;A SUBROUTINE TO STACK INPUTTED CHARACTERS.
PUSHDN: PUSH 17,10 ;STACK THE INPUTTED CHARACTER.
HLRZ 16,17 ;PUT STACK COUNT IN AC 16.
CAIE 16,50 ;IS STACK FULL?
JRSTF 0(13) ;IF NOT, RETURN.
JSP 7,SETUP+4 ;IF SO, END OF LINE.
JRST INCHAR ;GET ANOTHER CHARACTER.
PAGE
;A SUBROUTINE TO PUT 1 BRAILLE LINE (3 PRINTER LINES) IN THE OUTPUT
;BUFFER.
PUTLIN: MOVE 11,OUTPTR ;MOVE OUTPUT POINTER TO FAST MEMORY.
MOVSI 12,-3 ;3 LINES IN 1 BRAILLE LINE.
MOVE 6,LLIMIT ;MOVE NUMBER OF CHARS IN LINE TO AC 6.
ILDB 14,11 ;GET A CHAR FROM LINE.
JSP 13,PUT ;JUMP TO PUT IN BUFFER.
SOJG 6,.-2 ;DONE WITH A LINE?
MOVEI 14,015 ;TERMINATE LINE WITH A CR.
JSP 13,PUT ;PUT IN OUTPUT BUFFER.
MOVEI 14,012 ;AND A LF.
JSP 13,PUT ;PUT IN OUTPUT BUFFER.
AOBJN 12,PUTLIN+2 ;IF NOT DONE, GET NEXT LINE.
JSP 16,BLINE ;IF DONE, BLANK BRAILLE LINE.
JRSTF 0(1) ;RETURN
PUT: SOSG OBUF+2 ;IS BUFFER FULL?
JRST .+3 ;IF SO, OR FIRST TIME, CONTINUE.
IDPB 14,OBUF+1 ;PUT CHAR IN OUTPUT BUFFER,
JRSTF 0(13) ;AND RETURN.
OUT 1, ;EMPTY BUFFER AND SET UP HEADER.
JRST PUT+2 ;RESTART FILLING BUFFER.
TTCALL 3,[ASCIZ/
OUTPUT ERROR
/]
CALLI 0,12 ;EXIT ON ERROR.
PAGE
;END-OF-FILE ROUTINE.
EOF: CLOSE 0,0 ;CLOSE INPUT CHANNEL,
CLOSE 1,0 ;AND OUTPUT CHANNEL.
TTCALL 11,0 ;CLEAR TTY INPUT BUFFER.
TTCALL 3,[ASCIZ/
CONVERSION COMPLETE.
MORE?(Y,N)/]
TTCALL 4,10 ;WAIT FOR REPLY.
TTCALL 11,0 ;CLEAR TTY INPUT BUFFER.
CAIN 10,"Y" ;MORE CONVERSION?
JRST BEGIN ;IF SO, JUMP TO BEGIN.
CALLI 0,12 ;IF NOT, EXIT.
PAGE
;THIS BLOCK CONTAINS THE DOT CODE FOR THE BRAILLE CELL FOR EACH ASCII
;CHARACTER.
DOTCOD: 000000000000
360000000000 ;!
300000000000 ;"
710000000000 ;#
650000000000 ;$
760000000000 ;%
570000000000 ;&
100000000000 ;'
160000000000 ;(
610000000000 ;)
140000000000 ;*
510000000000 ;+
010000000000 ;,
110000000000 ;-
500000000000 ;.
410000000000 ;/
310000000000 ;0
020000000000 ;1
030000000000 ;2
220000000000 ;3
320000000000 ;4
120000000000 ;5
230000000000 ;6
330000000000 ;7
130000000000 ;8
210000000000 ;9
700000000000 ;:
600000000000 ;;
520000000000 ;<
340000000000 ;=
400000000000 ;>
770000000000 ;?
200000000000 ;@
040000000000 ;A
060000000000 ;B
440000000000 ;C
640000000000 ;D
240000000000 ;E
460000000000 ;F
660000000000 ;G
260000000000 ;H
420000000000 ;I
620000000000 ;J
050000000000 ;K
070000000000 ;L
450000000000 ;M
650000000000 ;N
250000000000 ;O
470000000000 ;P
670000000000 ;Q
270000000000 ;R
430000000000 ;S
630000000000 ;T
150000000000 ;U
170000000000 ;V
720000000000 ;W
550000000000 ;X
750000000000 ;Y
350000000000 ;Z
370000000000 ;[
140000000000 ;|
730000000000 ;]
740000000000 ;^
530000000000 ;_
100000000000 ;'
PAGE
;DATA SECTION
;
PIOWD: IOWD 200,DATBLK ;PERMANENT IOWD.
TIOWD: 0 ;TEMPORARY IOWD.
0 ;TERMINATES COMMAND LIST.
LINE1: BLOCK 30 ;FIRST LINE OF BRAILLE LINE.
LINE2: BLOCK 30 ;SECOND LINE OF BRAILLE LINE.
LINE3: BLOCK 30 ;THIRD LINE OF BRAILLE LINE.
DATBLK: BLOCK 200 ;HOLDS A DATA BLOCK FROM DISK
DPOINT: POINT 7,DATBLK ;BYTE POINTER TO INPUT ASCII CHARS.
EXTPTR: POINT 6,LOKBLK+1 ;BYTE POINTER TO STORE EXTENSION.
FILPTR: POINT 6,0 ;BYTE POINTER TO STORE FILENAME.
OUTPTR: POINT 7,LINE1 ;BYTE POINTER TO GET CHARS FOR OUTPUT.
LPTR: POINT 7,LINE1+27 ;BYTE POINTER FOR BRAILLE LINE.
TPTR: 0 ;TEMPORARY BYTE POINTER.
STACK: BLOCK 50 ;STACK FOR STORING INPUT CHARACTERS.
TYPFLE: 0 ;FILE TYPE FLAG.
LOKBLK: BLOCK 4 ;FILE LOOKUP BLOCK.
OBUF: BLOCK 3 ;OUTPUT FILE BUFFER RING HEADER BLOCK.
COUNT: 0 ;HOLDS BYTE COUNT.
SAVE: 0 ;SAVE WORD.
LLIMIT: 170 ;120 (DECIMAL) CHARS IN 1 LINE.
BLANK: ASCII / / ;FULLWORD OF BLANKS.
END BEGIN