.pabs .phex .xlink .xsym ; INPUT-OUTPUT EQUATES CRTD == 0E0H CRTS == CRTD+1 LPTD == 0E2H LPTS == LPTD+1 ; ascii characters STX=2 ESC=1BH EOT=4 CR=0dh LF=0ah ACK=6 NAK=15h ETX=3 .loc 100h LXI SP,STACK CALL PRINTF .ASCIS / Tinkerbell Prom Programmer Program/ BRESET: IN LPTD IN LPTD MVI A,'X' MVI A,'X' CALL LPTOUT CALL LPTGET CALL LPTGET CALL LPTGET CALL WASTE4 IN LPTD CALL PRINTF .ASCIS / Baud rate reset/ COMLOOP: CALL PRINTF .ASCIS / Reset the prom programmer, then type: P-program, L-list, R-reset, Q-quit - / CALL INCHAR CALL CRLF CPI 'P' JZ PROGRAM CPI 'L' JZ LIST CPI 'R' JZ BRESET CPI 'Q' JZ 0 CALL PRINTF .ASCIS /Nasty Command Error!! / JMP COMLOOP ABORT: LXI SP,STACK IN CRTD MVI A,ESC CALL LPTOUT CALL LPTGET CALL LPTGET CALL LPTGET CALL PRINTF .ASCIS / Command Aborted!/ JMP COMLOOP ; PROGRAM COMMAND PROGRAM: CALL SENDADDR CALL PRINTF .ASCIS /Ram address: / CALL INHEX MVI A,'P' CALL PSEND CALL LPTGET CPI NAK JRNZ ..POK CALL PRINTF .ASCIS /WARNING! Prom not clear. Type Y to proceed, anything else to abort. - / CALL INCHAR CPI 'Y' JNZ ABORT CALL CRLF ..POK: CALL LPTGET CPI CR JRNZ ..POK ; AWAIT CR CHAR LXI D,2048 ..PLOOP: MOV A,M CALL SENDHEX CALL LPTGET CPI NAK JRNZ ..BOK CALL PRINTF .ASCIS /Programming error at / MOV A,H CALL HEXBYT MOV A,L CALL HEXBYT CALL PRINTF .ASCIS / type Y to proceed, anything else to abort -/ CALL INCHAR CPI 'Y' JNZ ABORT CALL CRLF ..BOK: INX H DCX D MOV A,D ORA E JRNZ ..PLOOP CALL LPTGET ; GET EOT JMP COMLOOP ; LIST COMMAND LIST: CALL SENDADDR MVI A,'L' CALL PSEND ..LOOP: CALL LPTGET CPI EOT JZ COMLOOP CPI '*' JZ COMLOOP CALL CRTOUT JMPR ..LOOP ; ROUTINE TO SEND ADDRESSES TO PROM PROGRAMMER SENDADDR: MVI A,'0' CALL PSEND CALL WASTE4 MVI A,'0' CALL PSEND CALL WASTE4 MVI A,'0' CALL PSEND CALL WASTE4 MVI A,'7' CALL PSEND CALL WASTE4 MVI A,'F' CALL PSEND CALL WASTE4 MVI A,'F' CALL PSEND CALL WASTE4 RET PSEND: CALL LPTOUT CALL LPTGET RET ; GET 16 BIT HEX NUMBER FROM USER INHEX: PUSH B ..FIX: LXI H,0 ..LOOP: CALL INCHAR CPI CR JRZ ..DONE ; YEP-QUIT CPI '0' ; <0? JRC ..BAD ; YES CPI '9'+1 ; <=9? JRC ..GOOD ; YES CPI 'A' ; CHARACTER ; ** ; ** EXIT - EVERYTHING RESTORED ; ** PUNCH: CONOUT: MOV A,C CRTOUT: PUSH B MVI C,CRTS JMPR UART ; ************************************************** ; ** ; ** LPTOUT - SEND CHARACTER TO PRINTER, EAT CR'S ; ** WAIT FOR DATASET READY. ; ** ; ** ENTRY - A -> CHARACTER ; ** ; ** EXIT - ALL RESTORED ; ** ; ************************************************** LPTOUT: PUSH B MVI C,LPTS ..LPT: INP B BIT 7,B ; DATA SET READY JRZ ..LPT UART: INP B BIT 0,B JRZ UART DCR C OUTP A POP B RET ; TYPE MESSAGE FOLLOWING INLINE AFTER CALL PRINTF: XTHL CALL CONOMSG INX H XTHL RET ; *********************************** ; ** ; ** CONOMSG - PRINT MESSAGE ON CONSOLE ; ** ; ** ENTRY - HL -> STRING ENDD BY BYTE WITH SIGN BIT ON ; ** ; ** EXIT - A -> ZORKED ; **H -> ZORKED ; ** ; *********************************** CONOMSG:MOV A,M CALL CRTOUT BIT 7,A ; TERMINATED BY BIT 7 ON RNZ INX H JMPR CONOMSG ; INPUT CHARACTER AND ECHO INCHAR: CALL GETCHR CALL CRTOUT RET ; ********************************* ; ** ; ** GETCHR - GET A CHARACTER FROM THE CRT AND ; ** FORCE TO UPPER CASE ; ** ; ** EXIT - A -> CHARACTER ; ** ; ********************************* GETCHR: CALL CRTIN CPI 060H ;IS CHAR LOWER CASE??? RM ;RETURN IF CHAR OK ANI 05FH ;FORCE IT TO UPPER CASE RET CONIN: READER: CRTIN: CALL CRTSTAT JRZ CRTIN IN CRTD ANI 7FH CPI 5FH RNZ MVI A,7FH RET LPTGET: CALL LPTSTAT JRNZ LPTGT1 CALL CRTSTAT JNZ ABORT JMPR LPTGET LPTIN: CALL LPTSTAT JRZ LPTIN LPTGT1: IN LPTD ANI 7FH RET CONSTAT: CRTSTAT: PUSH B MVI C,CRTS JMPR UARTSTAT LPTSTAT: PUSH B MVI C,LPTS UARTSTAT: INP A POP B ANI 2 ; DATA READY? RZ MVI A,0FFH ; TRUE FOR CP\M RET ; TYPE OUT BYTE IN A IN HEX FORMAT HEXBYT: PUSH H LXI H,CRTOUT CALL XMITHEX POP H RET PFUCK: CALL LPTOUT CALL LPTIN RET SENDHEX: PUSH H LXI H,PFUCK CALL XMITHEX POP H RET XMITHEX: PUSH PSW RRC RRC RRC RRC CALL ..HNIB POP PSW ..HNIB: ANI 0FH CPI 10 JRC ..LT10 ADI 'A'-'9'-1 ..LT10: ADI '0' PCHL ; WASTE 4 MILLIES WASTE4: MVI A,0 ..TIT1: DCR A JRNZ ..TIT1 ..TIT2: DCR A JRNZ ..TIT2 RET .BLKW 64 STACK: .END