

       NAM D2MON
*MEK6800D2GP MONITOR VER 3.1A - 3/17/78
*WRITTENBY  WILLIAM E. WARREN
*FIRST HALF OF MONITOR IN $6000 EPROM
*SECONDHALF IN $C000 EPROM
       SPC 1
*EQUATESAND REGISTERS
TAPES  EQU $8008 TAPE PORT
ACIAS  EQU $8010 ACIA SERIAL TERMINAL PORT
ALTMON EQU $E08D JBUG MONITOR ENTRY
       ORG $A064
STACK  EQU *-1 TOP OF STACK AREA
BF4HEX RMB 2 GENERAL
TEMPX  RMB 2
TEMPX1 RMB 2 . INDEX REGISTER
TEMPX2 RMB 2
TEMPX3 RMB 2 . STORAGE
STARTX RMB 2 START ADDRESS VECTOR
ENDX   RMB 2 END ADDRESS VECTOR
FRMCNT RMB 1 FRAMECOUNT REGISTER
BYTCNT RMB 1 BYTE COUNT REGISTER
CHKSUM RMB 1 CHECKSUM REGISTER
COUNTU RMB 1 8 BIT COUNTER
BUFFER RMB 2 SPECIAL STORAGE
INPORT RMB 2 ADDRESS OF INPUT PORT
OTPORT RMB 2 ADDRESS OF OUTPUT PORT
SAVEX  RMB 2 OUTPUT X STORAGE
SAVEX2 RMB 2 INPUT X STORAGE
       SPC 1
*THIS  MONITOR COMMAND ROUTINE
*ACCEPTSTWO-INPUT COMMAND MNEMONICS
*THAT  CALL UP THE REQUIRED SUBROUTINE
*IF    AN ERROR IS MADE ON ENTRY
*THE   TERMINAL PRINTS 'INVALID COMMAND'
*AND   THE MONITOR IS REENTERED 
       ORG $6000
MONITR LDS #STACK SET STACK
       LDAA #%00010101 SET DATA
       STAA ACIAS INTO TERM ACIA
       LDX #ACIAS FETCH TERM VECTOR
       STX INPORT SET TERM I/O
       STX OTPORT SET TERM I/O
       BSR PREADY DO PROMPT
       JSR IN2ASC INPUT COMMANDS
       LDX #DATA6 POINT TO TABLE
FINDC  CMPB 0,X 1ST CHAR?
       BNE NEXT4 NOPE
       CMPA 1,X 2ND CHAR?
       BEQ FOUNDC YES
NEXT4  INX INCREMENT
       INX TO
       INX NEXT
       INX COMMAND
       CPX #DATA6E END YET?
       BNE FINDC KEEP LOOKING
       JSR INVALD INVALID COMMAND
       BRA MONITR BACK TO START
FOUNDC LDX 2,X FETCH ROUTINE ADDRESS
       JSR 0,X DO THE ROUTINE
       BRA MONITR GO BACK TO START
       SPC 1
*START A NEW LINE 
NEWLIN LDX #NEWLDT POINT TO DATA
PDATA1 JMP PDATA PRINT STRING
NEWLDT FCB $D,$A,0,0,4
       SPC 1
*      READY> PRINTOUT SUBROUTINE
PREADY BSR NEWLIN START NEW LINE FIRST
       LDX #DATA2
       BRA PDATA1 PRINT STRING
DATA2  FCC 'READY>'
       FCB $4
       SPC 1
*ABORT PRINTOUT SUBROUTINE
PABORT BSR PERROR
       LDX #DATA3
       BSR PDATA1
       BRA MONITR
DATA3  FCC '***ABORT***'
       FCB $4
       SPC 1
*ERROR PRINTOUT SUBROUTINE
PERROR STX BF4HEX SAVE ADDRESS OF ERROR
       LDX #DATA4 POINT AT MESSAGE
       BSR PDATA1 PRINT IT
       JMP LADDR PRINT ADDRESS
DATA4  FCB $D,$A,0,0,0
       FCC 'ERROR AT - '
       FCB 4
       SPC 1
*INVALIDCOMMAND MESSAGE
INVALD LDX #IVAPRT
       JMP PDATA
IVAPRT FCC ' INVALID COMMAND '
       FCB $4
       SPC 1
*PUNCH 64 NULL LEADER/TRAILER
P64NUL LDAB #64
PNUL   CLRA
       JSR CPRINT
       DECB
       BNE PNUL
       RTS
       SPC 1
*COMMANDTABLE
DATA6  FCC 'LD' LOAD DATA
       FDB LODAT
       FCC 'DD' DUMP DATA
       FDB DUDAT
       FCC 'LM' LOAD MEMORY
       FDB LOMEM
       FCC 'DM' DUMP MEMORY
       FDB DUMEM
       FCC 'SB' SEARCH MEMORY FOR 8 BIT BYTE
       FDB SERMEM
       FCC 'CM' CLEAR MEMORY
       FDB CLRMEM
       FCC 'CS' CALL SUBROUTINE
       FDB CALSUB
       FCC 'MM' MOVE MEMORY BLOCKS
       FDB MOVMEM
       FCC 'SW' SEARCH MEMORY FOR 16 BIT WORD
       FDB SERADD
       FCC 'LC' LOAD HEX CHECKSUM CASSETTE TAPE
       FDB OFLOAD
       FCC 'DC' DUMP HEX CHECKSUM CASSETTE TAPE
       FDB PUNTAB
       FCC 'TM' TEST MEMORY
       FDB TSTMEM
       FCC 'CO' CALCULATE HEX OFFSET
       FDB CALOFF
       FCC 'CA' CONVERT ASCII TO HEX
       FDB CONASC
       FCB $1B,$1B (ESC,ESC) GO TO ALTERNATE MONITOR
       FDB ALTMON
       FCC 'PB' PUNCH BNPF TAPE
       FDB PUNBNF
       FCC 'LT' LOAD TTY TAPE
       FDB PLSET
       FCC 'PT' PUNCH TTY TAPE
       FDB PPSET
       FCC 'GO' GO EXECUTE PROGRAM
       FDB CALSUB
DATA6E EQU * END OF COMMAND TABLE
       SPC 1
*INPUT 2 ASCII CHARACTERS INTO B AND A
IN2ASC BSR INASC FIRST CHAR
       TAB PUT IN B
       BSR INASC
       RTS
INASC  JMP CINPUT
       SPC 1
*MAKE  HEX FROM DATA IN A
*IF    NON HEX THEN DO ERROR
*AND   VECTOR BACK TO MONITOR
MAKHEX SUBA #$30 STRIP ASCII
       BMI NOTHEX
       CMPA #$09 0 TO 9 HEX?
       BLE HEX
       CMPA #$11
       BMI NOTHEX
       CMPA #$16
       BGT NOTHEX
       SUBA #$07
HEX    RTS OK, EXIT
NOTHEX CMPA #$EB 'ESC' KEY?
       BNE JUMP1 HEX ERROR
JUMP2  JMP MONITR
JUMP1  JMP PABORT
       SPC 1
*INPUT ONE HEX INTO A
IN1HEX BSR INASC FETCH CHAR
       BRA MAKHEX
       SPC 1
*INPUT 2 HEX INTO A
*UPDATECHECKSUM
IN2HEX PSHB SAVE B
       BSR IN1HEX
       ASLA
       ASLA
       ASLA
       ASLA
       TAB SHIFT TO UPPER B
       BSR IN1HEX GET LOWER
       ABA MAKE A BYTE
       PSHA SAVE DATA
       ADDA CHKSUM FETCH CHECKSUM
       STAA CHKSUM UPDATE
       PULA RESTORE DATA
       PULB RESTORE B
       RTS DONE
       SPC 1
*INPUT 4 HEX INTO X AND
*ALSO  STORE AT BF4HEX
IN4HEX PSHB
       PSHA SAVE ACC
       BSR IN2HEX FETCH HI BYTE
       TAB PUT IN B
       BSR IN2HEX FETCH LO BYTE
       LDX #BF4HEX POINT AT DATA
       STAB 0,X
       STAA 1,X PUT IN BUFFER
       LDX 0,X FETCH INTO X
       PULA
       PULB
       RTS
       SPC 1
*CONTINUE(,) OR ESCAPE (ESC)
CONTIN BSR INASC FETCH CHAR
       CMPA #$1B 'ESC ?'
       BEQ JUMP2
       CMPA #', COMMA ?
       BNE CONTIN NO JUST WAIT
       RTS DONE , GO
       SPC 1
*CONTROLLEDINPUT 2 HEX
*IN    FORM ,HH
CIN2HX BSR CONTIN 
       BRA IN2HEX FETCH BYTE
       SPC 1
*CONTROLLEDINPUT 4 HEX
*IN    FORM ,HHHH
CIN4HX BSR CONTIN WAIT FOR COMMA
       BRA IN4HEX
       SPC 1
*INPUT 3 SETS OF 4 HEX
*IN    FORM ,HHHH,HHHH,HHHH
I3HEX4 BSR CIN4HX
       STX TEMPX1
       BSR CIN4HX
       STX TEMPX2
       BSR CIN4HX
       STX TEMPX3
       RTS
       SPC 1
*CALL  SUBROUTINE POINTED TO
*BY    ADDRESS IN X
CALSUB BSR CIN4HX FETCH THE ADDRESS
       JSR 0,X JUMP TO IT
       JMP MONITR BACK TO MONITOR
       SPC 1
*INPUT TWO SETS OF 4 HEX
*IN    FORM ,HHHH,HHHH
IN2HX4 BSR CIN4HX
       STX STARTX FIRST ADDRESS
       BSR CIN4HX
       STX ENDX SECOND ADDRESS
       RTS
       SPC 1
*START NEW LINE AND PRINT ADDRESS 
NLADDR JSR NEWLIN
LADDR  LDX #BF4HEX POINT AT DATA
       JMP P4HEXS PRINT IT
       SPC 1
*MOVE  MEMORY BLOCK ROUTINE
MOVMEM BSR I3HEX4 FETCH PARAMETERS
DRCTMM LDX TEMPX1 DIRECT ENTRY POINT
       LDAA 0,X SOURCE DATA
       CPX TEMPX2
       BEQ LASTBY
       INX
       STX TEMPX1
       LDX TEMPX3 DESTINATION
       STAA 0,X STORE DATA
       CMPA 0,X CHECK IF THERE
       BEQ DRC1 ITS OK
       JMP PABORT NO MEMORY
DRC1   INX
       STX TEMPX3
       BRA DRCTMM
LASTBY LDX TEMPX3
       STAA 0,X
       JSR SPACE
       LDX #TEMPX3 POINT TO DATA
       JMP P4HEXS PRINT IT AND EXIT
       SPC 1
*LOAD  DATA INTO MEMORY
LODAT  BSR CIN4HX FETCH DESTINATION X
       CLR COUNTU
LODAT1 JSR CINPUT
       CMPA #$1B "ESC"?
       BEQ QUITDA
       LDX BF4HEX FETCH ADDR
       STAA 0,X
       CMPA 0,X
       BEQ LODAT2
       JMP PABORT NO RAM
LODAT2 INX
       STX BF4HEX RESTORE BUF
       INC COUNTU INCREMENT COUNT
       BEQ QUITDA YES EXIT
       BRA LODAT1 DO AGAIN
QUITDA BSR NLADDR PRINT ADDR
       LDAA COUNTU FETCH BYTE COUNT
       JMP P2HEXA PRINT IT AND RTS
       SPC 1
*DUMP  DATA ROUTINE
DUDAT  JSR CIN4HX
       JMP PDATA PRINT STRING UNTIL EOT
       SPC 1
*LOAD  MEMORY SEQUENTIALLY
*WITH  HEX DATA
LOMEM  JSR CIN4HX
LOMEM1 CLR COUNTU
       JSR NLADDR
       JSR CONTIN CONTIN
LOMEM2 JSR IN2HEX
       INC COUNTU INCREMENT BYTE COUNT
       LDX BF4HEX
       STAA 0,X
       CMPA 0,X IS IT THERE?
       BEQ LOMEM3 YES OK
       JMP PABORT NOT THERE
LOMEM3 INX
       STX BF4HEX
       LDAA COUNTU
       CMPA #16
       BEQ LOMEM1
       JSR SPACE
       BRA LOMEM2
       SPC 1
*CLEAR MEMORY ROUTINE
CLRMEM JSR IN2HX4
CLRME  LDX STARTX
CLRM   CLR 0,X CLEAR A LOCATION
       LDAA 0,X IS IT ZERO?
       BNE CLRERR SOMETHING WRONG
       CPX ENDX END YET?
       BEQ DONE YES EXIT
       INX
       BRA CLRM
DONE   RTS
CLRERR JMP PERROR ERROR HAPPENED
       SPC 1
*SEARCHMEMORY FOR 8 BIT BYTE 
SERMEM JSR IN2HX4
       LDX STARTX
       STX BF4HEX
       JSR CIN2HX
       TAB
       LDX BF4HEX
SEARCH LDAA 0,X
       CBA
       BEQ DISADD
       CPX ENDX
       BEQ DONE
SERINX INX
       BRA SEARCH
DISADD STX BF4HEX
       PSHB
       JSR NLADDR
       PULB
       LDX BF4HEX
       BRA SERINX
       SPC 1
*SEARCHFOR 16 BIT WORD IN MEMORY
SERADD JSR I3HEX4 INPUT PARAMETERS
LOOPDO LDX TEMPX1 START ADDR
LOOPAG CPX TEMPX2 END ADDR
       BEQ DONE FINISHED SO EXIT
       LDAA 0,X FETCH HI BYTE
       LDAB 1,X FETCH LO BYTE
       CMPA TEMPX3 COMPARE HIBYTE
       BNE SEREXC CONTINUE
       CMPB TEMPX3+1 COMPARE LO BYTE
       BEQ FONDSR FOUND ONE
SEREXC INX
       BRA LOOPAG DO AGAIN
FONDSR STX BF4HEX SAVE ADDRESS
       INX
       STX TEMPX1 SAVE NEXT ADDRESS
       JSR NLADDR PRINT ADDRESS WHERE FOUND
       BRA LOOPDO KEEP GOING
       SPC 1
*DUMP  MEMORY
DUMEM  JSR IN2HX4 FETCH ADDRESS LIMITS
       LDX STARTX FETCH START X
CONTDM STX BF4HEX SAVE ADDRESS
       JSR NLADDR START NEW LINE AND PRINT ADDRESS
       LDAA #16 SET BYTE COUNT
       STAA COUNTU INTO REGISTER
DUMLOP LDX BF4HEX FETCH POINTER
       DEX DOWN ONE
       CPX ENDX END YET?
       BEQ DONE YES EXIT
       INX BACK UP
       JSR HPRINT PRINT BYTE POINTED AT
       STX BF4HEX SAVE POINTER
       DEC COUNTU REDUCE BYTECOUNT
       BNE DUMLOP KEEP GOING
       BRA CONTDM LINE DONE , DO ANOTHER
       SPC 1
*CALCULATEOFFSETS AND PRINT RESULT
*IF    BRANCH IS OUT OF RANGE  
*AN    'X' WILL BE PRINTED
CALOFF JSR IN2HX4 FETCH ADDRESS LIMITS
       LDAB #$FE SET B COUNTER
       LDX STARTX FETCH POINTER
       LDAA STARTX HI BYTE
       CMPA ENDX UP OR DOWN ?
       BHI DECLOP NEGATIVE BRANCH
       BNE CNLOP POSITIVE BRANCH
       LDAA STARTX+1 LO BYTE
       CMPA ENDX+1 UP OR DOWN ?
       BHI DECLOP NEGATIVE BRANCH
CNLOP  CPX ENDX DONE YET?
       BEQ DONCAL YES EXIT
       INX INCREMENT POINTER
       INCB INCREMENT VALUE
       CMPB #$80 OUT OF RANGE?
       BEQ OUTRAN YES
       BRA CNLOP KEEP GOING
DECLOP CPX ENDX DONE YET?
       BEQ DONCAL YES EXIT
       DEX DECREMENT POINTER
       DECB DECREMENT COUNT
       CMPB #$7F OUT OF RANGE?
       BEQ OUTRAN YES EXIT
       BRA DECLOP KEEP GOING
DONCAL JSR SPACE PRINT A SPACE
       TBA TRANSFER VALUE
       JMP P2HEXA PRINT IT AND EXIT
OUTRAN JSR SPACE
       LDAA #'X SET ASCII
       JMP CPRINT PRINT IT AND EXIT
       SPC 1
*TEST  MEMORY
TSTMEM JSR IN2HX4 FETCH START AND END
       JSR CLRME CLEAR MEMORY FIRST
AGAIN  LDX STARTX
TEST   LDAA 0,X FETCH DATA
TEST1  INCA INCREMENT A
       STAA X
       STAA BUFFER
       INC 1,X INCREMENT NEXT LOCATION
       LDAB X
       STAB BUFFER+1 SAVE FETCHED VALUE
       CBA
       BNE TMERR
       DEC 1,X RESTORE NEXT BYTE
       CPX ENDX
       BEQ EXIT
       INX
       LDAA BUFFER RESTORE VALUE
       BRA TEST
TMERR  STX BF4HEX
       JSR PERROR
       LDX #BUFFER SET X TO VALUES
       JSR HPRINT PRINT FIRST TWO
       JSR HPRINT AND SECOND TWO
       LDX BF4HEX RESTORE X
       LDAA BUFFER RESTORE DATA
       DEC 1,X RESTORE NEXT BYTE
       BRA TEST1
EXIT   CMPA #$FF ALL PATTERNS YET?
       BNE AGAIN NO DO AGAIN
       RTS
       SPC 1
*CONVERTASCII TO HEX
CONASC JSR CONTIN
       JSR CINPUT
       PSHA
       JSR SPACE
       PULA
       JMP P2HEXA
       SPC 1
*HEX   CHECKSUM LOADER ROUTINE
OFLOAD BSR TLSET DO TAPE SET UP
OLIN   JSR CINPUT FETCH A CHARACTER
       CMPA #'S START?
       BNE OLIN NOT YET
       JSR CINPUT ANOTHER
       CMPA #'1
       BEQ LOAD OK START
       CMPA #'9 END?
       BNE OLIN NO KEEP LOOKING
OUT    JMP TAPOFF EXIT
INHEX2 JMP IN2HEX
LOAD   CLR CHKSUM RESET CHECKSUM
       BSR INHEX2 FETCH CHARACTER COUNT
       SUBA #2 SUBTRACT TWO
       STAA BYTCNT SET BYTE COUNT
       JSR IN4HEX FETCH ADDRESS
LOADST BSR INHEX2 FETCH A DATA BYTE
       DEC BYTCNT REDUCE BYTECOUNT
       BEQ CHECK IF LINE IS FULL
       STAA 0,X NO JUST PUT IN MEMORY
       CMPA 0,X IS IT THERE?
       BNE ABORT NO MUST BE ROM
       INX
       BRA LOADST OK KEEP STORING
CHECK  INC CHKSUM CHECKSUM OK?
       BEQ OLIN YES IT IS
ABORT  BSR OUT
       JMP PERROR
PRINT  JMP CPRINT
       SPC 1
*CASSETTETAPE LOAD SETUP ROUTINE
TLSET  JSR NEWLIN
       LDX #TMESSL
       JSR PDATA PRINT MESSAGE
       JSR CONTIN WAIT FOR GO
       LDAA #%00010000 SET DATA
       STAA TAPES INTO TAPE PORT
       LDX #TAPES SET TAPE VECTOR
       STX INPORT INTO PORT
       RTS DONE , GO
       SPC 1
TMESSL FCC 'SET TAPE TO PLAYBACK MODE-'
       FCC 'HIT "," TO LOAD TAPE'
       FCB 4
       SPC 1
*TTY   PUNCH SETUP ROUTINE
PPSET  JSR IN2HX4 FETCH PARAMETERS
       LDAA #$12 SET DATA
       JSR CPRINT TO TURN ON PUNCH
       JSR PUNTAP DO DUMP
       LDAA #$14 SET DATA
       JMP CPRINT TO TURN OFF PUNCH AND RTS
       SPC 1
*TTY   TAPE LOAD SETUP ROUTINE
PLSET  LDAA #$11 SET DATA
       JSR CPRINT TO TURN ON READER
       LDAA #$55 SET DATA TO
       STAA ACIAS TURN ON RELAY
       JMP OLIN DO LOADER
       SPC 1
*THIS  SOFTWARE CONTINUES ON SECOND
*EPROM LOCATED AT C000
       ORG $C000
*CASSETTETAPE DUMP SETUP ROUTINE
TPSET  JSR NEWLIN
       LDX #TMESSP
       JSR PDATA PRINT MESSAGE
       JSR CONTIN WAIT FOR GO
       LDAA #%01010001 SET DATA
       STAA TAPES INTO PORT
       LDX #TAPES SET TAPE VECTOR
       STX OTPORT INTO PORT
       RTS DONE , GO
       SPC 1
TMESSP FCC 'SET TAPE TO RECORD MODE-'
       FCC 'HIT "," TO PUNCH TAPE'
       FCB 4
       SPC 1
*CASSETTETAPE DONE MESSAGE
TAPOFF LDX #ACIAS SET TERM VECTOR
       STX INPORT INTO PORT
       STX OTPORT
       LDAA #$13 SET DATA
       JSR CPRINT TO TURN OFF READER
       LDAA #$15 SET DATA
       STAA ACIAS READER LINE OFF
       JSR NEWLIN START NEW LINE
       LDX #TAPMES
       JMP PDATA PRINT MESSAGE AND EXIT
       SPC 1
TAPMES FCB 7,7,7,7,7,7,7,7 A BUNCH OF BELLS
       FCC 'TURN OFF TAPE UNIT'
       FCB 4
       SPC 1
*OBJECTCODE DUMP ROUTINE
PUNTAB JSR IN2HX4 FETCH ADDRESS PARAMETERS
       JSR TPSET DO TAPE SETUP
PUNTAP JSR P64NUL FEED OUT LEADER
       LDX STARTX FETCH ADDRESS
       STX TEMPX SAVE IT
DUM1   LDAA ENDX+1
       SUBA TEMPX+1
       LDAB ENDX
       SBCB TEMPX
       BNE DUM2
       CMPA #32 32 BYTES PER RECORD
       BCS DUM3
DUM2   LDAA #31
DUM3   ADDA #4
       STAA FRMCNT SET FRAME COUNT
       SUBA #3
       STAA BYTCNT SET BYTE COUNT
       JSR NEWLIN START NEW LINE
       LDX #TPSTRG POINT AT TAPE STRING
       JSR PDATA PRINT THE STRING
       CLR CHKSUM
       LDX #FRMCNT 
       BSR OUT2H PRINT FRAMECOUNT
       LDX #TEMPX FETCH POINTER
       BSR OUT4HX PRINT ADDRESS
       LDX TEMPX SET POINTER
DUM4   BSR OUT2H PRINT THE DATA
       DEC BYTCNT REDUCE BYTE COUNT
       BNE DUM4 KEEP DUMPING
       STX TEMPX SAVE ADDRESS POINTER
       COM CHKSUM INVERT
       LDX #CHKSUM SET POINTER
       BSR OUT2H PRINT CHECKSUM
       LDX TEMPX FETCH ADDRESS
       DEX BACK ONE
       CPX ENDX WAS IT THE END?
       BNE DUM1 NO KEEP GOING
       LDAA #'S SET AN S
       JSR PRINT PRINT IT
       LDAA #'9 AND A NINE
       JSR PRINT PRINT ALSO
       JSR P64NUL FEED OUT TRAILER AND RTS
       JMP TAPOFF TURN OFF TAPE
       SPC 1
*OUTPUTTWO HEX FROM DATA IN A
*X     REGISTER ALTERED
P2HEXA PSHA SAVE A DATA
       TSX POINT AT DATA
       JSR P2HXDA PRINT IT
       PULA RESTORE STACK
       RTS EXIT
       SPC 1
*OUTPUTTWO HEX CHARACTERS
*FROM  DATA POINTED AT BY X
*CHECKSUMIS UPDATED
*X     IS INCREMENTED ONCE
OUT2H  PSHB SAVE B
       JSR P2HXDA PRINT THE DATA
       DEX BACK ONE ADDRESS
       LDAB 0,X
       INX
       ADDB CHKSUM
       STAB CHKSUM RESTORE CHECKSUM
       PULB RESTORE B REG
       RTS
       SPC 1
*OUTPUTFOUR HEX CHARACTERS
*FROM  ADDRESS POINTED AT BY X
*CHECKSUMUPDATED ACCORDINGLY
*X     IS INCREMENTED TWICE
OUT4HX BSR OUT2H DO FIRST BYTE
       BRA OUT2H DO THE SECOND AND EXIT
       SPC 1
*TAPE  FORMAT STRING
TPSTRG FCB 'S,'1,4
       SPC 1
*BNPF  TAPE PUNCH ROUTINE FOR 8 BIT PROMS
*SELECTPARAMETERS IN FORM PB,SSSS,EEEE
*WHERE S IS START ADDRESS AN E IS END ADDRESS
*INCLUSIVE.LEADERS AND TRAILERS ARE
*WRITTENTO TAPE AND THE TAPE IS PUNCHED
*WITH  8 1/2 INCH FOLD MARKS
PUNBNF JSR IN2HX4 FETCH PARAMETERS
       LDX ENDX FETCH END
       INX AND ADD ONE
       STX TEMPX1 TO IT AND STORE
       LDAA #$12 SET DATA
       JSR CPRINT TO TURN PUNCH ON
       JSR P64NUL DO NUL LEADER
       BSR RUBOUT DO RUBOUTS
       BRA BYTE2 SKIP NEW LINE
BYTE1  JSR NEWLIN START NEW LINE
       LDAA #$FF
       BSR CPRINT PRINT A RUBOUT
BYTE2  LDAB #8 SET BYTE COUNT PER LINE
BYTE3  LDX STARTX FETCH POINTER
       CPX ENDX END YET?
       BEQ ENDPUN YES IT IS
       LDAA #'B SET ASCII
       BSR CPRINT PRINT LETTER B
       LDAA 0,X FETCH THE DATA
       INX INCREMENT POINTER
       STX STARTX SAVE X AGAIN
       BSR BITLOP PRINT A BYTE
       LDAA #'F SET ASCII
       BSR CPRINT PRINT AN F
       DECB DECREMENT BYTE COUNT
       BNE BYTE3 KEEP GOING
       BRA BYTE1 LINE DONE DO ANOTHER
ENDPUN LDAB #100 SET COUNT
       BSR RUB1 DO RUBOUTS
       LDAA #$14 SET CONTROL
       BRA CPRINT TURN OFF PUNCH AND EXIT
RUBOUT LDAB #77 SET COUNT
RUB1   LDAA #$FF SET ALL ONES
       BSR CPRINT PRINT A RUBOUT
       DECB REDUCE COUNT
       BNE RUB1 AND KEEP GOING TILL DONE
       RTS ITS DONE
       SPC 1
*8     BIT PRINTER ROUTINE
BITLOP PSHB SAVE B REGISTER
       LDAB #8 SET BIT LOOP COUNT
PUNB1  PSHA PUSH ON STACK
       CLC CLEAR CARRY
       RORA SHIFT RIGHT
       DECB REDUCE COUNT
       BNE PUNB1 NOT DONE YET
       LDAB #8 SET BIT COUNT AGAIN
PUNB2  PULA FETCH A BYTE OFF STACK
       RORA SHIFT INTO CARRY
       BCC PUNB3 NOT A ONE
       LDAA #'P SET ASCII
       BSR CPRINT PRINT A P
       BRA PUNB4 SKIP
PUNB3  LDAA #'N SET ASCII
       BSR CPRINT PRINT AN N
PUNB4  DECB REDUCE BITCOUNT
       BNE PUNB2 NOT DONE YET
       PULB RESTORE B
POUT   RTS EXIT , BYTE DONE
       SPC 1
*PRINT AN ASCII DATA STRING
*INCREMENTX ONCE EACH CHARACTER
*EXIT  WHEN EOT ENCOUNTERED
PDATA  LDAA 0,X FETCH THE DATA
       CMPA #4 IS IT EOT?
       BEQ POUT YUP
       BSR CPRINT PRINT THE CHARACTER
       INX UP ONE ADDRESS
       BRA PDATA DO IT AGAIN
       SPC 1
*PRINT CHARACTER IN A
HEXPRT ANDA #%00001111 MASK UPPER BITS
       CMPA #9 CHECK RANGE
       BLS HEX1 0 TO 9
       ADDA #7 A TO F
HEX1   ADDA #%00110000 MAKE INTO ASCII
       BRA CPRINT PRINT THE HEX
       SPC 1
*PRINT TWO HEX CHARACTERS 
*FROM  DATA POINTED TO BY X
P2HXDA LDAA 0,X FETCH THE DATA
       ASRA
       ASRA
       ASRA
       ASRA DO UPPER NIBBLE
       BSR HEXPRT PRINT ONE HEX
       LDAA 0,X FETCH THE DATA AGAIN
       INX INCREMENT ADDRESS
       BRA HEXPRT PRINT SECOND HEX AND EXIT
       SPC 1
*PRINT TWO HEX PLUS SPACE
HPRINT BSR P2HXDA PRINT THE BYTE
SPACE  LDAA #$20 SET DATA
       BRA CPRINT PRINT SPACE AND EXIT
       SPC 1
*PRINT 4 HEX PLUS SPACE
P4HEXS BSR P2HXDA FIRST BYTE
       BRA HPRINT SECOND BYTE AND EXIT
       SPC 1
*OUTPUTONE CHARACTER IN 'A'
*B     AND X UNALTERED
CPRINT STX SAVEX SAVE X REGISTER
       PSHB SAVE B
       LDX OTPORT SET PORT VECTOR
C1     LDAB 0,X FETCH STATUS DATA
       ASRB
       ASRB
       BCC C1 WAIT TIL READY
       STAA 1,X OUTPUT DATA
       PULB RESTORE B
       LDX SAVEX RESTORE X
       RTS DONE EXIT
       SPC 1
*INPUT ONE CHARACTER INTO A
*B     AND X UNALTERED
CINPUT STX SAVEX2 SAVE X FIRST
       LDX INPORT SET PORT VECTOR
CIN1   LDAA 0,X FETCH STATUS
       ASRA
       BCC CIN1 WAIT TILL READY
       LDAA 1,X FETCH THE DATA
       LDX SAVEX2 RESTORE X
       RTS DONE EXIT
       END
