;**************************** ;* THE MICRO WORKS * ;* PROM UTILITY * ;* U2708 * ;* * ;* C. 1977 V1.0 * ;* 20 SEP 80 FLEX 2.0 * ;**************************** ; ; NAM U2708/C000 ; OPT NOG ;* I/O ADDRESSES .ORG $8010 ;PORT 4 PIAADR .BLOCK 1 PIACRA .BLOCK 1 PIADAT .BLOCK 1 PIACRB .BLOCK 1 ; ; .ORG $7000 U2708 LDS #$A042 ;GET STACKED LDAA #$38 ;A SIDE DDR STAA PIACRA LDAA #$FF ;TO OUTPUTS STAA PIAADR LDAA #$3C ;A SIDE DATA REC STAA PIACRA STAA PIACRB ;B SIDE DATA REC LDAA #$04 ;PROM TO READ STAA CW JSR DISCH ;ADDR & CTL WORD JMP CNTRL BURN LDAA #$30 ;ASCII # STAA T ;FOR TRY COUNTER LDX #HVON ;TURN ON SWITCH JSR STRING ;TYPE SUMTHING JSR INEEE ;TO CONFIRM BLOOP3 INC T ;NEXT TRY LDX #BHDR ;PRINT HDR JSR PDATA1 LDAA T ;PRINT TRY COUNT JSR OUTEE JSR CR LDAA #$08 ;WE=12V STAA CW ;PROM TO WRITE LDAB #$FF ;PIA FOR OUTPUT BSR PCTLB ;ALSO INITS PCNTR BLOOP2 JSR DISCH ;INIT ADRS BLOOP1 LDAA 0,X ;GET RAM DATA STAA PIADAT ;PUT TO PROM LDAA #$34 ;ZAP STAA PIACRB BSR DELAY ;WAIT BSR PCTL1 ;ZAP OFF BSR NEXT ;NEXT ADR BCC BLOOP1 ;END OF PASS? DECB ;PASS=PASS-1 BNE BLOOP2 ;NEXT PASS BSR PCTLB ;PIA TO READ LDAA #$04 ;PROM TO READ STAA CW JSR VERIFY ;CHECK IT OUT TST E ;ANY GOOFS? BEQ JMPC ;NO, SPLIT TST H ;HARD ERRORS? BNE ERRH LDAA T CMPA #$33 ;THREE TRIES BNE BLOOP3 ;TRY HARDER ERRT LDX #TERR ;TOO MANY TRIES BRA ERP ;TOO BAD ERRH LDX #HERR ;HARD ERRORS ERP JSR STRING ;PRINT UH OH JMPC LDX #HVOFF ;TURN OFF ZAPPER JSR STRING ;;TYPE ANYTHING JSR INEEE ;TO CONFIRM BRA CNTRL ;AND DIE ; PCTLB LDAA #$38 ;STUFF DDRB STAA PIACRB ;WITH WHATEVER'S STAB PIADAT ;IN ACC B PCTL1 LDAA #$3C STAA PIACRB RTS ; DELAY LDAA #$43 ;500 USEC DELAY DLOOP DECA ;(FOR 1 MHZ CLOCK) BNE DLOOP RTS ; CHECK STAA ROMDAT ;SAVE TESTEE EORA RAMDAT ;=TESTOR? BEQ NEXT ;ATTABOY ANDA RAMDAT ;HARD ERROR STAA E ;H FLAG FLAG BEQ RECOV ;WHEW STAA H ;HARD ERR FLAG RECOV LDX #RAMAD ;PRINT ERROR JSR OUT4HS ;INFO FOR USERS JSR OUT2HS JSR OUT2HS LDX #CRLF ;FOXY TRICK TST E ;TO FLAG HARD BEQ OUT ;ERRORS W/H DEX ;GET IT? OUT JSR PDATA1 ;NO? STAA E ;BOO FLAG NEXT LDX RAMAD ;INC ADDRESS INX CLC ;SEE IF END CPX EA ;OF BUFFER BNE PUTAD SEC ;CARRY SET IF SO PUTAD STX RAMAD LDAA RAMAD ;MSB ANDA #$03 ORAA CW ;AND CONTROL STAA PIAADR ;TO LATCHES LDAA #$34 ;STROBE 'EM STAA PIACRA LDAA #$3C ;WITH CA2 STAA PIACRA LDAA RAMAD+1 ;LSB TO PIA STAA PIAADR LDX RAMAD RTS ; CNTRL BSR CR ;CONTROL HANDLER BSR CR ;FEED SOME LINES LDX #IHDR ;AKE UP USER BSR STRING JSR INEEE ;GET USER WHIM TAB BSR CR LDX #TABLE ;LOOK UP COMMAND CMDLP CMPB 0,X ;IN TABLE BEQ POUNCE INX ;NEXT ENTRY INX INX CPX #TABEND ;IS ALL? BEQ CNTRL ;YES BRA CMDLP ;NO POUNCE INX ;CLIMB ONTO ADDR LDAB 0,X ;GET LO-BYTE INX ;INC X TO POINT TO HI-BYTE LDAA 0,X ;GET HI-BYTE STAB 0,X ;PUT THE HI-BYTE IN BIG-ENDIAN DEX ;DEC TO POINT TO LO-BYTE STAA 0,X ;PUT THE LO-BYTE IN BIG-ENDIAN ; LDX 0,X ;GET INDEX ADDR IN BIG-ENDIAN JMP 0,X ;AND GO ; TABLE .TEXT "B" .DW BURN .TEXT "S" .WORD SET .TEXT "M" .WORD MOVE .TEXT "X" .WORD XFER .TEXT "L" .WORD LOAD .TEXT "*" .WORD MIKBUG .TEXT "E" .WORD ERASE .TEXT "V" .WORD TABEND TABEND BSR VERIFY BRA CNTRL ; STRING JSR PDATA1 ;PRINT STRING CR LDX #CRLF ;AND CRLF JSR PDATA1 ;BIG DEAL LDX RAMAD RTS ; DISCH LDX #$0400 ;READ 03FF STX EA ;(RESTORE END) DEX JSR PUTAD ;TO DISCHARGE JSR DELAY ;1/2 OF BUSSES LDX #$0000 ;THEN DO OTHER STX H ;(CLEAR ERRORS) JMP PUTAD ;HALF OF BUSSES ; VERIFY BSR DISCH ;EXERCISE FOR LDX #VHDR ;THE READER BSR STRING LDX #VHDR1 BSR STRING VLOOP LDAA 0,X STAA RAMDAT LDAA PIADAT JSR CHECK BCC VLOOP BRA CR ; ERASE BSR DISCH ;CHECK PROM FOR LDX #EHDR ;VIRGINITY BSR STRING ;BEFORE BURNING LDX #EHDR1 BSR STRING LDAB #$FF STAB RAMDAT ELOOP LDAA PIADAT JSR CHECK BCC ELOOP JMP CNTRL ; MOVE LDX #MHDR ;SHUFFES RANDOM JSR STRING LDX #MHDR1 BSR TWOADS ;BLOCKS OF STUFF INX STX EA ;AROUND IN RAM BSR ONEADS STX DA LDX RAMAD MLOOP LDAA 0,X LDX DA STAA 0,X INX STX DA JSR NEXT BCC MLOOP JMP CNTRL ; SET LDX #SHDR ;SET BLOCKS OF JSR STRING LDX #SHDR1 BSR TWOADS ;RAM TO INPUT INX STX EA ;VALUE JSR BYTE TAB LDX RAMAD SLOOP STAB 0,X JSR NEXT BCC SLOOP JMP CNTRL ; XFER JSR DISCH ;TRANSFERS FROM LDX #XHDR ;CONTENTS TO JSR STRING ;RAM 0000-3FFF XLOOP LDAA PIADAT STAA 0,X JSR NEXT BCC XLOOP JMP CNTRL ; TWOADS JSR STRING ;GET 2 2 BYTES ADS JSR BADDR ;ONE FOR RAMAD STX RAMAD JSR OUTS ;(PRINT A SPACE) ONEADS JSR BADDR ;AND ONE FOR X JMP OUTS ;'NOTHER SPACE LOAD LDX #LHDR ;MIKBUG TAPE READER JSR STRING ;WITH OFFSET LDX #LHDR1 ;ADDR PROMPT JSR STRING JSR BADDR ;GET PGM START ADR STX OFFSET ;AND SAVE IT JSR OUTS ;SPACE OUT JSR INHEX ;GETS LENGTH ANDA #$0F ;MASK OFF GARBAGE ASLA ;TIMES 4 ASLA ;TO CONVERT STAA LEN ;AND PUT AWAY JSR CR ;FEED A LINE ; ;* SWTBUG PATCH ; LDAA #$00 ;DON'T ECHO STAA PORECH LDAA #$11 JSR OUTEE LOAD3 JSR INEEE ;READ CHARACTER CMPA #'S' ;TEST FOR VALID BNE LOAD3 JSR INEEE ;RECORD OR END CMPA #'9' ;OF TAPE BEQ LOAD21 ;END OF TAPE = S9 CMPA #'1' ;RECORD = S1 BNE LOAD3 CLR CKSUM ;INT CHECKSUM JSR BYTE ;GET WORD COUNT SUBA #2 STAA BYTCT JSR BADDR ;GET TAPE ADDR LDAB XLOW LDAA XHI SUBB OFFSET+1 ;SUBTRACT OFFSET SBCA OFFSET ;TO PUT CODE BCS OFERR ;IN PROM BUFFER STAB XLOW ;AND TEST FOR STAA XHI ;WRAP AROUND TO LDX XHI ;HIGH MEMORY LOAD11 JSR BYTE ;READ DATA RECORD DEC BYTCT BEQ LOAD15 ;'TILL END STAA 0,X ;STORING IT AND INX ;TESTING FOR STX XHI ;END OF BUFFER LDAA XHI ;TO AVOID CLOBBER DECA ;(FIX A SINCE INX) CMPA LEN ;OF PROTECTED AREA BLT LOAD11 OFERR LDX #OERR ;HERE ON OFFSET BRA LOAD20 ;ERROR LOAD15 INC CKSUM ;CHECK CHECKSUM BEQ LOAD3 ;IF OK, NEXT RECORD LOAD19 LDX #CERR ;HERE ON CKSUM ERR LOAD20 JSR STRING LOAD21 LDAA #$13 ;RDR OFF JSR OUTEE ; ;* SWTBUG PATCH ; LDAA #$00 STAA PORECH JMP CNTRL ; ;* STRINGS, BELLS AND WHISTLES ; IHDR .TEXT "THE MICRO WORKS" .BYTE $D,$A,0,0 .TEXT "2708 UTILITY" .BYTE $4 HVON .TEXT "HV ON?" .BYTE $4 BHDR .TEXT "BURNING, TRY#" .BYTE $4 ; .ORG U2708+$30F ; HVOFF .TEXT "HV OFF?" .BYTE $4 VHDR .TEXT "VERIFY" .BYTE $4 VHDR1 .TEXT "ADDR RA PR HS" .BYTE $4 EHDR .TEXT "ERASURE TEST" .BYTE $4 EHDR1 .TEXT "ADDR FF PR HS" .BYTE $4 MHDR .TEXT "BLOCK MOVE" .BYTE $4 MHDR1 .TEXT "SRC END DEST" .BYTE $4 SHDR .TEXT "SET MEMORY" .BYTE $4 SHDR1 .TEXT "FROM TO HEX" .BYTE $4 XHDR .TEXT "TRANSFER PROM TO RAM" .BYTE $4 LHDR .TEXT "OFFSET LOADER" .BYTE $4 LHDR1 .TEXT "ADDR K" .BYTE $4 TERR .TEXT "ERRORS PERSIST..." .BYTE $4 HERR .TEXT "HARD ERRORS" .BYTE $4 OERR .TEXT "OFFSET ERROR" .BYTE $4 CERR .TEXT "CHECKSUM ERROR" .BYTE $4 CRLF1 .TEXT "H" CRLF .BYTE $D,$A,0,0,0,$4 ; ;* RESTART VECTORS ; .ORG U2708+$3F8 IO .WORD $E000 ;*E28B FOR RT-68 SFE .WORD $E113 ;*E280 POWDWN .WORD $E005 ;*E298 START .WORD $E0D0 ;*E147 ; ;* .EQUATES AND STORAGE ; .ORG $A050 T .BLOCK 1 LEN .BLOCK 1 CW .BLOCK 1 H .BLOCK 1 E .BLOCK 1 RAMAD .BLOCK 2 RAMDAT .BLOCK 1 ROMDAT .BLOCK 1 EA .BLOCK 2 DA .BLOCK 2 OFFSET .BLOCK 2 BYTCT .BLOCK 1 CKSUM .BLOCK 1 ; ;* VECTORS TO SWTBUG ; PORECH .EQU $A00C XHI .EQU $A00D XLOW .EQU $A00E MIKBUG .EQU $E0E3 OUT4HS .EQU $E0C8 OUT2HS .EQU $E0CA PDATA1 .EQU $E07E BYTE .EQU $E055 OUTS .EQU $E0CC BADDR .EQU $E047 INEEE .EQU $E1AC OUTEE .EQU $E1D1 INHEX .EQU $E0AA .END ;=============================================================================