AIST2R * /--- FILE TYPE = E * /--- BLOCK TITLE 00 000 82/10/27 09.21 IDENT AIST2R,ORIGIN ABS ORIGIN EQU 0000 ORG ORIGIN TITLE ASCII IST2 ROM PROGRAM * * * * * * * * * * * * * * * * * * * * 'INFORMATION 'SYSTEMS 'TERMINAL 2 'R'O'M 'PROGRAM * * COPYRIGHT CONTROL DATA CORPERATION 1982 * * PROCESSOR MOSTEK Z80 * PROGRAMMER T E LARSOM ** * * REVISION 00 * * THIS IS A REWRITE OF THE IST2 ROM RESIDENT FOR * THE ASCII PROTOCAL. THE 21/12 BIT COMM PORT IS * NOT USED. THE SERIAL PORT WILL BE USED TO * COMMUNICATE TO THE HOST. * * * * * * * * * * * * * * * * * * * TITLE I/O * * * * * * * * * * * * * * * * * * * * THE FOLLOWING DESCRIBES THE SERIAL PORT AND * DEFAULT CONDITIONS. * * S2-6 1 = ENABLE PARITY, 0 = DISABLE PARITY * S2-1 ON = CONSTANT RTS, OFF = SWITCHED RTS * S2-8 ON = 1 STOP BIT, OFF = 2 STOP BITS * * DEFAULT SWITCHES, (PROGRAM INTERPRETE) * SE-4,5 00 = 300 BAUD * 01 = 1200 BAUD * 10 = 2400 BAUD * 11 = 4800 BAUD * S2-9 ON = EVEN PARITY, OFF = ODD PARITY * IF SE-1 = SKIP DIAGNOSTICS * THEN SE-2 ON = PROD. LOAD FILE, OFF EXPERIM. * SE-3 ON = AUTO SELECT, OFF = OPERATOR SEL * * OUTPUT (07) * BIT 0 = ENABLE CREQ * BIT 1 = ENABLE CRDY * BIT 2,3 = WORD LENGTH * BIT 4 = ODD/EVEN PARITY * BIT 5,6,7 = BAUD RATE * * INPUT (00) * BIT 0 SE-1 ON = 0 = SKIP DIAGNOSTICS * OFF = 1 = RUN DIAGNOSTICS * BIT 1 SE-2 ON = 0 = SKIP KEYBOARD TEST * = PRODUCTION LOAD FIL * OFF = 1 = RUN KEYBOARD TEST * = EXP. LOAD FILE * BIT 2 SE-3 ON = 0 = EXIT DIAGNOSTICS * = AUTO SELECT * OFF = 1 = REPEAT DIAGNOSTICS * = OPERATOR SELECT * BITS 3,4 SE-4,5 ON = 0, OFF = 1 * 00 = 300 BAUD * 01 = 1200 BAUD * 10 = 2400 BAUD * 11 = 4800 BAUD * BIT 5 S2-10 ON = 0 = 16K RAM * OFF = 1 = 32K RAM * BIT 6 S2-9 ON = 0 = EVEN PARITY * OFF = 1 = ODD PARITY * * * * * * * * * * * * * * * * * * * * * * /--- BLOCK EQUATES 00 000 82/04/27 08.46 TITLE EQUATE TABLES * * EQUATE TABLE * * INPUT MNTSW EQU 00 MAINTAINENCE SWITCHES * BIT 0 SE-1 * BIT 1 SE-2 * BIT 2 SE-3 * BIT 3 SE-4 * BIT 4 SE-5 * BIT 5 S2-10 * BIT 6 S2-9 * BIT 7 S2-8 KBDATA EQU 01 KEY BOARD DATA TPDATA EQU 02 TOUCH PANEL DATA SERDATI EQU 05 SERIAL CHANNEL DATA INPUT SERSTAT EQU 06 INPUT SERIAL CHANNEL STATUS * BIT 0 INTERRUPT PENDING (1) * BIT 1 CREQ (1) * BIT 2 CRDY (1) * BIT 3 RECEIVE ERROR (1) * BIT 4 CARRIER DETECT (0) * BIT 5 CTS (1) * BIT 6 DSR (1) SYSSTAT EQU 07 TERMINAL INTERNAL STATUS * BIT 0 COMM CRDY * BIT 1 HARDWARE FLAG * BIT 2 COMM CREQ * BIT 3 KEY BOARD DATA READY * BIT 4 TOUCH PANEL DATA READY * BIT 5 TIMEOUT * BIT 6 RESET SWITCH * BIT 7 BULK WRITE/ERASE BUSY CLADATA EQU 08 CLA DATA * OUTPUT PNLLTS EQU 00 MAINTAINENCE PANEL LIGHTS * BIT 0 ERROR LIGHT * BIT 1 TRANSMIT LIGHT * BIT 2 RECEIVE LIGHT * BIT 3 RTS LIGHT * BIT 4 DSR LIGHT * BIT 5 DTR LIGHT * BIT 6 0 = TEST MODE, 1 = NORMAL MODE * BIT 7 0 = ROM SELECT, 1 = RAM SELECT CLAL EQU 01 OUTPUT LOWER DATA BITS CLAU EQU 02 OUTPUT UPPER DATA BITS BLKERS EQU 03 DISPLAY BULK ERASE * BIT 2 BIT 1 BIT 0 * 0 0 X DISBLE VIDEO * 0 1 X ENABLE VIDEO * 1 0 0 BULK ERASE - DISABLE VIDEO * 1 0 1 BULK WRITE - DISABLE VIDEO * 1 1 0 BULK ERASE - ENABLE VIDEO * 1 1 1 BULK WRITE - ENABLE VIDEO * BITS 3 THRU 7 IGNORED INTMSK EQU 04 SYSTEM INTERRUPT MASK * BIT 0 SERIAL CHANNEL * BIT 1 COMM LINE CHAR READY * BIT 2 COMM LINE CHAR REQUEST * BIT 3 KEYBOARD DATA READY * BIT 4 TOUCH PANEL DATA READY * BIT 5 SHORT INTERVAL TIMER * BIT 6 EXTERNAL INTERRUPT * BIT 7 LONG INTERVAL TIMER MISCTL EQU 05 MISCELLANEOUS CONTROL * BIT 0 0 = NOOPERATION, 1 = SOUND ALARM * BIT 1 0 = DTR ON, 1 = DTR OFF * BIT 2 0 = RESET FLAG, 1 = SET FLAG SERDATO EQU 06 OUTPUT SERIAL DATA SERCTRL EQU 07 OUTPUT SERIAL CHANNEL CONTROL * FDCMND EQU 0EFH FLOPPY DISK COMMAND FDSTAT EQU 0EFH FLOPPY DISK STATUS FDDATA EQU 0EEH FLOPPY DISK DATA * /--- BLOCK EQUATES 00 000 82/05/24 11.14 * EQUATES USED BY LOADER STX EQU 82H ETX EQU 03H DLE EQU 90H ETB EQU 17H SLASH EQU 0AFH IST2SBTP EQU 00 IST2 SUBTYPE * ZSTACK EQU 3000H PROCESSOR STACK * R.INIT EQU 0040H RESIDENT ENTRY POINT * LOADER VARS CKSUMTBL EQU 22C8H CHECKSUM TABLE FWA CHECKSUM EQU 22CAH CHECKSUM STORED BY LOADER LOADFLAG EQU 22CBH LOAD FLAG, 3CH = LOAD COMPLETE RESETFLG EQU 22CCH RESET FLAG 3CH = SHORT RESET MODEFLG EQU 22CDH 00 = PLATO, 01 = TS LOADINFO EQU 22CEH LOAD PARAMETERS * BIT 0 0 = RS232, 1 = LONG LIN * BIT 1 0=INTERNAL, 1=EXTERNAL * BIT 2 ALWAYS 1 FOR ASCII * BIT 3,4 00=HOST,10=ROM,11=DIS * BIT 5,6,7 BAUD RATE,(S5-6,7,8 RUNINFO EQU 22CFH SAME AS LOADINFO * MICRO PLATO VARS M.LDFILE EQU 22E5H LOAD FILE NUMBER * * * * * * * * * * * * * * * * * * * * * * ASCII LOAD VARIABLES AND SCRATCH AREA * * * * * * * * * * * * * * * * * * * * * * * THE FOLLOWING FLAGS ARE USE FOR ASCII LOAD. * VARIABLES SEQ1..A3 MUST BE IN THE ORDER SHOWN. SEQ1 EQU 3300H 16 BIT LOAD BLOCK SEQ2 EQU 3301H SEQUENCE NUMBER LDN EQU 3302H LOAD FILE NUMBER ADR1 EQU 3303H 24 BIT STARTING ADDRESS ADR2 EQU 3304H OF LOAD DATA ADR3 EQU 3305H ABORT EQU 3306H HEADER ABORT FLAG CLOCK EQU 3307H CLOCK TIMER, 250 MS PERIOD TIMER1 EQU 3309H OVERALL TIMER FOR LOAD FLAGREG EQU 330AH ETX RECEIVED FLAG CNTR EQU 330BH RETRY COUNTER CHAR EQU 330CH INPUT DATA SAVE CRC1 EQU 330DH 16 BIT CRC CRC2 EQU 330EH REMAINDER SAVE EQU 330FH BYTE COUNTER SAVADR EQU 3311H FWASAVE EQU 3314H LOAD FWA SAVE AREA LITES EQU 3316H LIGHTS REGISTER MADDR EQU 3400H SADDR EQU 3500H RESIDENT SAVE AREA * /--- BLOCK BEGIN 00 000 82/05/25 13.23 TITLE INITIALIZE ROM PROGRAM * * * * * * * * * * * * * * * * * * * * * * ROM RESIDENT PROGRAM * * * * * * * * * * * * * * * * * * * * BEGIN EQU * DI LD A,00 DISABLE INTERRUPTS OUT (INTMSK),A LD SP,ZSTACK LD A,02 OUT (BLKERS),A ENABLE VIDEO LD B,6 SET 3 SECOND TIMEOUT BEGIN1 EQU * LD HL,38462 BEGIN2 EQU * IN A,(SYSSTAT) IS RESET SWITCH ON BIT 6,A JR NZ,BEGIN4 JUMP IF NO DEC HL LD A,L OR H JR NZ,BEGIN2 DJNZ BEGIN1 LD (RESETFLG),A 3 SECONDS HAVE ELAPSED, SO BEGIN3 EQU * IN A,(SYSSTAT) BIT 6,A LOOP TILL RESET OFF JR Z,BEGIN3 JR BEGIN5 CLEAR SHORT RESET FLAG BEGIN4 EQU * XOR A CLEAR HARDWARE FLAG AND OUT (MISCTL),A SET DTR ON. LD A,(LOADFLAG) IS CODE ALREADY LOADED XOR 3CH JR NZ,BEGIN5 FORCE LOAD IF NO LD A,(RESETFLG) IS THIS A SHORT RESET XOR 3CH JP Z,AEXIT BEGIN5 EQU * LD HL,SEQ1 LD DE,SEQ2 LD BC,0040 LD (HL),00 LDIR CLEAR LOADER VARIABLES IN A,(MNTSW) SKIP DIAGNOSTICS IF BIT 0,A SWITCH 0 IS OFF JP NZ,DIAG * /--- BLOCK COMSET 00 000 82/05/25 08.04 TITLE COMM SET * SET UP SERIAL PORT FOR COMM TO ASCII PLATO * ACCORDING TO THE SWITCH SETTINGS. COMSET EQU * CALL D.CLEAR CLEAR THE SCREEN. LD A,5FH CLEAR TEST MODE TO ENABLE LD (LITES),A SAVE LIGHTS REGISTER OUT (PNLLTS),A THE ASCII COMM CHANNEL IN A,(MNTSW) GET SWITCH SETTINGS LD C,A LD B,20H AND 18H MASK BAUD RATE JR Z,COMSET1 TEST FOR 300 BAUD LD B,60H CP 08 TEST FOR 1200 BAUD JR Z,COMSET1 LD B,80H CP 10H TEST FOR 2400 BAUD JR Z,COMSET1 LD B,0A0H SET 4800 BAUD COMSET1 EQU * LD A,0CH SET WORD LENGTH OR B AND INCLUDE IN CONTROL BYTE OUT (SERCTRL),A LD HL,BACKMSG POINT TO BACKOUT MESSAGE LD BC,0300H * SEND BACKOUT MESSAGE TO PLATO BACKOUT EQU * IN A,(SERSTAT) READ ASCII COMM STATUS AND 12H TEST FOR CREQ, CARRIER CP 02 JR Z,BACKOUT1 WAIT FOR CHAR REQUEST DEC C JR Z,FLOAD EXIT IF NO CO, CREQ. JR BACKOUT BACKOUT1 EQU * LD A,(HL) OUTPUT CHARACTER OUT (SERDATO),A INC HL POINT TO NEXT CHAR LD C,00 DJNZ BACKOUT LOOP TILL ALL CHARS ARE OUTPUT * /--- BLOCK FLOAD 00 000 82/05/25 09.11 TITLE LOAD FILE * * DETERMINE LOAD SOURCE AND LOAD FILE * FLOAD EQU * XOR A CLEAR CODE LOADED FLAG LD (LOADFLAG),A LD (RESETFLG),A CLEAR SHORT RESET FLAG IN A,(MNTSW) BIT 2,A TEST FOR AUTO SELECT JR NZ,FLOAD2 JUMP IF MANUAL LD A,01 SET LOAD FILE 01 LD (M.LDFILE),A STORE LOAD FILE NUMBER CALL DISKLOAD TRY TO LOAD FROM DISK FIRST JR HLOAD ELSE LOAD FROM HOST FLOAD2 EQU * CALL GETLFN GET LOAD FILE NUMBER LD (M.LDFILE),A STORE LOAD FILE NUMBER TITLE ASCII LOAD * * * * * * * * * * * * * * * * * * * * * * LOAD FROM ASCII COMMUNICATIONS PORT * * * * * * * * * * * * * * * * * * * * * HLOAD EQU * LD A,(M.LDFILE) LD (LDN),A LD HL,SADDR SET FWA OF LOAD CALL S100 DO THE LOAD POP DE PUT SAVED LOAD INFO INTO D JP C,COMSET TRY AGAIN IF LOAD FAILED AEXIT EQU * LD HL,MOVE PUT RESIDENT MOVE LD DE,MADDR ROUTINE OUT IN LD BC,ENDMV-MOVE RAM AREA. LDIR JP MADDR AND JUMP TO MOVE ROUTINE. * /--- BLOCK S100 00 000 82/05/25 08.07 TITLE LOAD SEQUENCE * * * * * * * * * * * * * * * * * * * * * CALLABLE ENTRY FOR ASCII LOAD ROUTINE * ON ENTRY, * FWA OF LOAD IS IN HL REG. * ON EXIT, CARRY SET SAYS LOAD FAILED. * CARRY CLEAR SAYS LOAD WAS SUCCESSFUL. * IF CARRY IS CLEAR, C-REG CONTAINS THE * COMPUTED MEMORY CHECKSUM OF THE LOADED DATA. * * * * * * * * * * * * * * * * * * * * S100 EQU * LD (FWASAVE),HL SAVE LOAD FWA LD HL,VARBEG INITIALIZE LOAD MESSAGES LD DE,LNN LD BC,VAREND-VARBEG LDIR S102 EQU * LD HL,6600 RESET CLOCK LD (CLOCK),HL LD A,4 START 1 SECOND TIMER LD (TIMER1),A * LOOK FOR INITIAL / (STATE 0) S103 EQU * CALL INDATA GET NEXT CHARACTER JR C,S107 INPUT FAILED CP SLASH JR NZ,S103 WAIT FOR / CODE * /--- BLOCK S105 00 000 82/05/26 11.36 * / RECEIVED OR / TIMEOUT HAS OCCURRED S105 EQU * LD A,2 SET RETRY COUNT LD (CNTR),A JR S200 LOOK FOR DLE STX NEXT S107 EQU * CALL D.CLEAR CLEAR SCREEN. IN A,(SERSTAT) BIT 4,A TEST FOR CARRIER JR Z,S105 CALL D.NOCARR JR S102 * CALLABLE ROUTINE TO TERMINATE THE LOAD IF THE RETRY COUNT * IN (CNTR) HAS EXPIRED. ROUTINE WILL JUMP TO TERLD IF * RETRY COUNT HAS EXPIRED. OTHERWISE IT WILL RETURN TO * THE CALLER. CHKRETRY EQU * LD A,(LITES) SET ERR LIGHT (DTR LIGHT ON) RES 0,A OUT (PNLLTS),A LD A,(CNTR) CHECK RETRY COUNTER OR A JR Z,TERLD TERMINATE IF =0 DEC A DECREMENT COUNTER LD (CNTR),A JR S200 * TERMINATE THE LOAD TERLD CALL D.LFAIL DISPLAY - LOAD FAILURE - JR HLOAD * SEND LOAD REQUEST AND INITIALIZE FOR NEW LOAD S200 EQU * CALL LOADREQ SEND LOAD REQUEST JR NC,TERLD TERMINATE IF ERROR XOR A CLEAR LOAD VARIABLES LD (SEQ1),A LD (SEQ2),A LD (ADR1),A LD (ADR2),A LD A,R.INIT LD (ADR3),A * /--- BLOCK S201 00 000 82/04/30 15.29 * START A NEW BLOCK S201 EQU * LD A,120 START 30 SECOND TIMER LD (TIMER1),A * LOOK FOR DLE-STX (STATE 1) S202 EQU * CALL INDATA GET NEXT CHARACTER JR C,CHKRETRY S205 CP DLE IS CHAR A DLE JR NZ,S202 IF NOT, CONTINUE LOOKING * DLE RECEIVED, LOOK FOR STX (STATE 2) S206 EQU * CALL INDATA GET NEXT CHAR JR C,CHKRETRY CP STX IS IT AN STX JR NZ,S205 JUMP IF NOT * DLE-STX HAS BEEN RECEIVED, SO PROCESS HEADER. S210 LD A,5FH CLEAR ERR LIGHT (DTR LIGHT ON) OUT (PNLLTS),A LD A,1 SET ABORT FLAG LD (ABORT),A XOR A CLEAR CRC LD (CRC1),A LD (CRC2),A LD (FLAGREG),A CLEAR ETX FLAG CALL D.LDBLK - BLOCK XX- LD HL,SEQ1 PRESET HEADER POINTER LD B,6 HEADER LENGTH IN BYTES LD A,2 PRESET BYTE COUNTER LD (SAVE),A * /--- BLOCK B001 00 000 82/04/30 15.35 * WAIT FOR NEXT HEADER CHARACTER. (STATE 3) B001 CALL INDATA GET NEXT CHAR B001A JR C,CHKRETRY CP DLE IS IT A DLE JR Z,B004 JUMP IF YES B002 LD A,(SAVE) TEST BYTE COUNT OR A JR NZ,B005 JUMP IF FIRST OR SECOND BYTE LD A,(HL) BYTE 3-6, SO COMPARE = CP C JR NZ,C000 SEND NAK IF NOT = B003 CALL CRCGEN ACCUMULATE CRC DEC B JR Z,D000 JUMP IF DONE WITH HEADER INC HL STEP TO NEXT HEADER BYTE JR B001 LOOP * DLE DETECTED. (STATE 5) B004 CALL INDATA HAVE DLE, GET NEXT CHAR JR C,B001A CP DLE IS IT A DLE JR Z,B002 TREAT AS DATA IF YES JP E000 OTHERWISE, END OF THIS BLOCK B005 LD A,(HL) BYTES 1-2, SO COMPARE CP C JR NZ,B006 ERROR IF NOT EQUAL LD A,(SAVE) DECREMENT BYTE COUNTER DEC A LD (SAVE),A JR B003 COMPARE OK, SO CONTINUE B006 EQU * JR NC,S202 IGNORE BLOCK IF TOO SMALL * /--- BLOCK C000 00 000 82/04/23 14.20 * SEND NAK,SEQ1,SEQ2,/SEQ1,/SEQ2 MESSAGE C000 LD A,5EH SET ERR LIGHT OUT (PNLLTS),A LD HL,(SEQ1) HL=SEQ2,SEQ1 LD (NAKXY+1),HL SAVE SEQ1,SEQ2 LD A,H HL=NOT SEQ2,NOT SEQ1 CPL LD H,A LD A,L CPL LD L,A LD (NAKXY+3),HL SAVE NOT SEQ1,NOT SEQ2 LD HL,NAKXY POINT TO MESSAGE LD B,5 MESSAGE LENGTH C001 CALL OUTDATA OUTPUT ONE CHAR JP NC,TERLD TERMINATE IF ERROR INC HL DJNZ C001 LOOP TILL ALL CHARS ARE SENT JP S202 LOOK FOR DLE STX * /--- BLOCK D000 00 000 82/05/26 15.15 TITLE LOAD DATA TO RAM * DONE WITH HEADER. LOAD DATA TO RAM. * (SAVE) BYTE COUNT OF CHARS STORED THIS BLOCK * B REG BYTE COUNT OF CHARS IN THIS BLOCK * HL REG DATA STORE ADDRESS * THERE IS A MAXIMUM OF 240 DATA CHARS IN A RECEIVED BLOCK. D000 EQU * LD HL,(FWASAVE) HL = LOAD ADDRESS XOR A CLEAR BYTE COUNTERS LD B,A LD (SAVE),A LD (ABORT),A CLEAR ABORT FLAG * WAIT FOR DATA CHARACTER. (STATE 4) D001 EQU * CALL INDATA GET NEXT DATA BYTE JR C,C000 ERROR IF TIME OUT CP DLE IS IT A DLE JR NZ,D002 JUMP IF NO * DLE DETECTED. (STATE 5) CALL INDATA HAVE DLE, GET NEXT BYTE JR C,C000 ERROR IF TIME OUT CP DLE IS IT A DLE JR NZ,E000 END OF BLOCK IF NOT INC B UPDATE BYTE COUNT D002 EQU * LD A,B CHECK BYTE COUNT CP 240 JR NC,C000 SEND NAK IF BLOCK TOO LONG LD (HL),C STORE COMM DATA D003 EQU * CALL CRCGEN ACCUMULATE CRC INC HL INCREMENT STORE POINTER INC B INCREMENT BYTE COUNTERS LD A,(SAVE) INC A LD (SAVE),A JR D001 LOOP * /--- BLOCK E000 00 000 82/04/28 13.51 * END OF BLOCK. DLE-XXX DETECTED. E000 CP ETB IS CHAR AN ETB JR Z,E001 JUMP IF YES CP ETX IS CHAR AN ETX JR Z,E000A JUMP IF YES CP STX IS CHAR AN STX JP Z,S210 NEW BLOCK IF YES JP C000 OTHERWISE SEND NAK MESSAGE E000A LD A,01 HAVE ETX, SET ETX FLAG LD (FLAGREG),A E001 CALL CRCGEN ACCUMULATE CRC * PROCESS FIRST CRC CHARACTER (STATE 6) CALL INDATA GET NEXT CHAR LD HL,CRC1 CHECK CHAR AGAINST CRC CP (HL) JP NZ,C000 SEND NAK IF BAD * PROCESS SECOND CRC CHARACTER (STATE 7) CALL INDATA GET NEXT CHAR LD HL,CRC2 CHECK CHAR AGAINST CRC CP (HL) JP NZ,C000 SEND NAK IF BAD LD A,(ABORT) SEND NAK IF ABORT FLAG IS OR A STILL ON FROM HEADER JP NZ,C000 * /--- BLOCK E000 00 000 82/05/26 07.59 * GOOD BLOCK RECEIVED LD HL,(FWASAVE) LD A,(SAVE) LD E,A LD D,00 ADD HL,DE LD (FWASAVE),HL LD HL,ADR3 IN A2,A3 ADD A,(HL) LD (HL),A LD E,A JR NC,E002 DEC HL INC (HL) LD A,(HL) AND 0F8H TEST FOR LOAD ABOVE 800 HEX JR Z,E002 LD A,(SAVADR) OR A TEST IF SET ALREADY JR NZ,E002 LD D,(HL) GET ADDRESS IF OVER 800 HEX LD HL,(FWASAVE) LD (SAVADR),HL SAVE TOP ADDRESS FOR LATER LD (FWASAVE),DE E002 EQU * LD HL,SEQ2 UPDATE BLOCK SEQUENCE NUMBER LD A,01 ADD A,(HL) LD (HL),A JR NC,E004 DEC HL INC (HL) E004 EQU * LD A,(FLAGREG) CHECK ETX FLAG. OR A JP Z,S201 NEXT BLOCK IF NOT ETX * DLE-ETX RECEIVED. LD C,2 SET RETRY COUNTER * SEND DLE-EOT MESSAGE. E006 LD HL,DLEEOT LD B,2 E007 CALL OUTDATA JP NC,TERLD TERMINATE IF ERROR INC HL DJNZ E007 LOOP UNTIL BOTH CHARS SENT LD A,120 START 30 SECOND TIMER LD (TIMER1),A * /--- BLOCK G000 00 000 82/04/30 11.00 * WAIT FOR PRE-SIGN-ON SLASH (STATE 8) G000 EQU * CALL INDATA GET NEXT CHARACTER CP SLASH JR NZ,G001 WAIT FOR SLASH OR A CLEAR CARRY RET AND EXIT (DONE WITH LOAD) * / TIMEOUT G001 EQU * XOR A OR C TEST RESEND COUNT JR Z,G000 DEC C JR E006 SEND DLE-EOT AGAIN TITLE LOAD REQUEST * CALLABLE ROUTINE TO OUTPUT L,N,N,CR MESSAGE (LOAD REQUEST) LOADREQ EQU * CALL D.LDFILE -LOADING FILE XX- LD HL,LNN+1 CONVERT UPPER HEX DIG TO ASCII LD A,(M.LDFILE) LD C,A RLCA RLCA RLCA RLCA CALL HEXASC LD A,C CONVERT LOWER HEX DIG TO ASCII CALL HEXASC LD HL,LNN OUTPUT THE MESSAGE LD B,4 LOADREQ1 CALL OUTDATA RET NC EXIT IF ERROR INC HL DJNZ LOADREQ1 LOOP UNTIL DONE RET SPACE 4 * CALLABLE ROUTINE TO CONVERT LOWER HEX DIGIT IN A-REG * TO ASCII IN (HL) AND THEN INCREMENT HL. HEXASC EQU * AND 0FH GET HEX DIGIT ADD A,90H CONVERT TO ASCII DAA ADC A,40H DAA JP PE,HEXASC1 SET EVEN PARITY XOR 80H HEXASC1 LD (HL),A STORE THE CHAR INC HL INCREMENT ADDRESS POINTER RET * /--- BLOCK INDATA 00 000 82/05/24 14.45 TITLE INPUT DATA * CALLABLE ROUTINE TO INPUT COMMUNICATIONS DATA. * DATA INPUT IS REGULATED BY COMM. STATUS. * ON ENTRY, TIMER VALUES CAN BE IN EITHER (TIMER1) OR * (TIMER2) OR BOTH. VALUES IN (TIMER1) AND (TIMER2) ARE * IN MULTIPLES OF 250 MILLISECONDS. THE ROUTINE COUNTS * A TIMER IF ITS VALUE IS NONZERO ON ENTRY. OTHERWISE THE * TIMER IS CONSIDERED TO BE STOPPED. IF A TIMER GOES TO * ZERO, THE APPROPRIATE TIMEOUT EXIT IS TAKEN. * IF NO TIMEOUT OCCURS WHILE WAITING FOR A CHARACTER, * THE ROUTINE INPUTS THE CHARACTER TO THE A-REGISTER AND * LOCATION (CHAR). UPON NORMAL EXIT, INPUT CHARACTER IS * IN REGISTERS A AND C. INDATA EQU * PUSH HL PUSH BC INDATA1 EQU * LD HL,(CLOCK) ADVANCE THE CLOCK LD A,L OR H DEC HL LD (CLOCK),HL JR NZ,INDATA2 LD HL,6600 RESET CLOCK LD (CLOCK),HL LD HL,TIMER1 COUNT TIMER IF RUNNING DEC (HL) JR Z,INDATA3 JUMP IF TIMED OUT INDATA2 EQU * IN A,(SERSTAT) CHECK STATUS LD B,A BIT 2,B TEST FOR CRDY JR Z,INDATA1 LOOP FOR CHARACTER READY IN A,(SERDATI) GET CHAR BIT 3,B TEST FOR DATA ERROR JR NZ,INDATA3 POP BC POP HL LD C,A SAVE CHARACTER RET INDATA3 EQU * POP BC POP HL SCF RET * /--- BLOCK OUTDATA 00 000 82/05/25 13.25 TITLE OUTPUT DATA * CALLABLE ROUTINE TO OUTPUT COMMUNICATIONS DATA. * OUTPUT IS REGULATED BY COMM. STATUS. * ON ENTRY HL POINTS TO THE CHAR IN MEMORY TO BE TRANSMITTED * ON EXIT CARRY FLAG INDICATES DATA TRANSMITTED. OUTDATA EQU * LD DE,20000 PRESET TIMER FOR 400 MSECS. OUT1 EQU * DEC DE DECREMENT TIMER COUNT LD A,D OR E (CLEARS CARRY) RET Z EXIT IF TIMER EXPIRED IN A,(SERSTAT) CHECK STATUS BIT 5,A JR Z,OUT1 LOOP IF NO CTS OUT2 EQU * BIT 1,A JR Z,OUT1 LOOP IF NO CHAR REQUEST LD A,(HL) GET DATA OR A TEST PARITY JP PE,OUT3 SET 7,A OUT3 EQU * OUT (SERDATO),A OUTPUT DATA SCF SET DATA TRANSMITTED FLAG RET * /--- BLOCK CRCGEN 00 000 82/04/28 09.52 TITLE CRC GENERATOR * CRC GENERATOR CALLABLE ROUTINE * POLYNOMIAL DIVISOR IS X**16+X**15+X**2+1 * CRC REMAINDER IN (CRC1),(CRC2) IS UPDATED * DATA CHAR IS IN (CHAR) ON ENTRY * B REG AND HL REG ARE NOT CHANGED. CRCGEN LD A,(CRC1) XOR C LD C,A RRA AND 7FH XOR C LD C,A RRA RRA XOR C LD D,A RRA RRA RRA RRA XOR D AND 03H LD D,A LD A,C RLCA RLCA LD E,A AND 0FCH OR D LD D,A LD A,E RLCA AND 06H LD E,A LD A,D RRA LD A,E RRA LD C,A LD A,(CRC2) XOR C LD (CRC1),A LD A,D LD (CRC2),A RET * /--- BLOCK GETLFN 00 000 82/04/30 08.23 TITLE GET LOAD FILE NUMBER * CALLABLE ROUTINE TO GET LOAD FILE NUMBER IN A-REGISTER * FROM KEYBOARD. OPERATOR ENTERS ONE OR TWO HEX DIGITS * FOLLOWED BY -NEXT- TO SELECT THE LOAD FILE. IF AN ERROR * IS MADE THE ENTRY CAN BE CLEARED BY PRESSING -ERASE-. * IF NO FILE NUMBER IS ENTERED BEFORE PRESSING -NEXT-, THE * ROUTINE WILL SET A=0FFH TO INDICATE NO ENTRY WAS DONE. * LOAD FILE NUMBERS ARE LIMITED TO 01-FF HEX. * * GETLFN EQU * CALL D.SELLDF DISPLAY -SELECT LOAD FILE - LD BC,0300H SET CTR=3, CLEAR LOAD FILE NO. GETLFN1 EQU * IN A,(SYSSTAT) WAIT FOR KB DATA READY BIT 3,A JR Z,GETLFN1 IN A,(KBDATA) GET KB KEY AND 5FH IGNORE CTRL AND SHIFT CP 16H JR Z,GETLFN4 DONE IF -NEXT- KEY CP 13H JR Z,GETLFN START OVER IF -ERASE- KEY CP 10 JR C,GETLFN2 JUMP IF 00-09 (OK) SUB 41H JR C,GETLFN1 IGNORE IF 0A-40 CP 6 JR NC,GETLFN1 IGNORE IF 47-5F ADD A,10 41-46 IS OK (A-F) GETLFN2 EQU * HAVE A VALID HEX DIGIT DJNZ GETLFN3 INC B SET CTR BACK TO 1 JR GETLFN1 IGNORE EXTRA DIGITS OVER TWO GETLFN3 EQU * LD H,A INSERT NEW DIGIT INTO LD A,C LOAD FILE NUMBER ADD A,A ADD A,A ADD A,A ADD A,A OR H LD C,A LD A,H PUSH BC CALL D.DIG DISPLAY DIGIT AT (DE) POP BC JR GETLFN1 * /--- BLOCK GETLFN 00 000 82/04/30 09.06 * PROCESS -NEXT- KEY * GETLFN4 EQU * LD A,B CHECK FOR DEFAULT FILE CP 3 JR Z,GETLFN5 LD A,C PUT LOAD FILE NO. INTO A-REG. RET GETLFN5 EQU * LD A,01 FLAG AS DEFAULT FILE RET TITLE PRESET HOST MESSAGES * THE FOLLOWING LOCATIONS ARE PRESET MESSAGES * AND MUST BE IN THE ORDER SHOWN. LNN EQU 3325H DLEEOT EQU 3329H NAKXY EQU 332BH VARBEG EQU * HEX CC,00,00,8D LOAD REQUEST MESSAGE HEX 90,84 DLE EOT MESSAGE HEX 95,00,00,00,00 NAK MESSAGE VAREND EQU * * BACKOUT MESSAGE TO PLATO BACKMSG EQU * HEX 1B,FF,CF BACKOUT MESSAGE FOR PLATO * THIS ROUTINE IS MOVED TO RAM AND MOVES THE * RESIDENT INTO THE ROM AREA AFTER THE LOAD IS * COMPLETED. MOVE EQU * LD A,(LITES) SET 7,A SELECT RAM MEMORY OUT (PNLLTS),A LD DE,SADDR GET ADDRESS OF SAVE AREA LD HL,(SAVADR) SBC HL,DE GET LENGTH OF DATA TO MOVE LD C,L LD B,H EX DE,HL LD DE,R.INIT LDIR MOVE RESIDENT LD HL,R.INIT LD DE,0050H ADD HL,DE POINT TO HOST LOAD ADDRESS LD E,(HL) INC HL LD D,(HL) GET ENTRY POINT ADDRESS EX DE,HL LD C,00 LOAD SUBTYPE FOR IST2 LD A,(M.LDFILE) LD B,A LOAD LOAD FILE NUMBER JP (HL) EXIT HOST LOAD ENDMV EQU * * /--- BLOCK LDRMSG 00 000 82/04/30 09.20 TITLE LOADER MESSAGE DISPLAY * * * * * * * * * * * * * * * * * * * * * * LOADER DISPLAY ROUTINES * * * * * * * * * * * * * * * * * * * * * D.NOCARR EQU * LD HL,W.HOST DISPLAY -HOST - JR D.P D.SELLDF EQU * LD DE,0ABF8H POINT TO DISPLAY AREA LD HL,W.SELECT DISPLAY -SELECT LOAD - JR D.P1 D.LFAIL EQU * LD HL,W.FAILUR DISPLAY -FAILURE- D.P EQU * LD DE,0ADF8H POINT TO DISPLAY AREA D.P1 EQU * CALL D.CLEAR CLEAR THE SCREEN DISPLAY EQU * LD A,(HL) GET CHARACTER CODE OR A RET Z DONE IF CODE = 00 PUSH HL CALL DISP DISPLAY THE CHARACTER POP HL INC HL JR DISPLAY D.LDBLK EQU * LD DE,0C5F8H SET DISPLAY ADDRESS LD HL,W.BLOCK DISPLAY - BLOCK - CALL DISPLAY LD A,(SEQ2) JR D.TWODIG D.LDFILE EQU * LD DE,0A7F8H POINT TO DISPLAY AREA CALL D.CLEAR CLEAR THE SCREEN LD HL,W.LOADIN DISPLAY -LOADING - CALL DISPLAY LD A,(SEQ2+1) * /--- BLOCK LDRMSG 00 000 82/04/13 15.05 D.TWODIG EQU * PUSH AF DISPLAY 2 HEX DIGITS IN A-REG RLCA UPPER DIGIT RLCA RLCA RLCA CALL D.DIG POP AF LOWER DIGIT D.DIG EQU * AND 0FH GET HEX DIGIT LD C,A GET DIGIT*7 IN A-REG ADD A,A ADD A,A ADD A,A SUB C DISP EQU * LD HL,CHARBASE INDEX TO FIND CHAR DATA ADD A,L LD L,A JR NC,DISP1 INC H DISP1 LD BC,7 INC D MOVE ONE CHAR POSITION RIGHT INC D EX DE,HL OR A CLEAR CARRY SBC HL,BC EX DE,HL LDIR DISPLAY THE CHARACTER RET D.CLEAR EQU * LD A,06H BULK ERASE OUT (BLKERS),A D.CLEAR1 IN A,(SYSSTAT) WAIT UNTIL COMPLETED BIT 7,A JR NZ,D.CLEAR1 RET * /--- BLOCK LDRMSG 00 000 82/04/30 08.06 W.BLOCK HEX BD,4D,8C,9A,54,85,BD,00 W.FAILUR HEX 8C,9A,46,5B,7E,93,70,BD LOADING HEX 69,46,7E,8C,B6,A1,62,00 FAILURE W.LOADIN HEX 8C,9A,46,5B,7E,93,70,BD LOADING HEX 69,7E,8C,62,BD,00 FILE W.HOST HEX 77,9A,A8,AF,BD HOST HEX 93,9A,AF,BD NOT HEX 54,9A,93,93,62,54,AF,62,5B,00 CONNECTED W.SELECT HEX A8,62,8C,62,54,AF,BD SELECT HEX 8C,9A,46,5B,BD LOAD HEX 69,7E,8C,62,BD,00 FILE CHARBASE EQU * HEX 0E,11,19,15,13,11,0E 00 0 HEX 04,06,04,04,04,04,0E 07 1 HEX 0E,11,10,08,04,02,1F 0E 2 HEX 0E,11,10,0C,10,11,0E 15 3 HEX 09,09,09,1F,08,08,08 1C 4 HEX 1F,01,01,0F,10,11,0E 23 5 HEX 0E,11,01,0F,11,11,0E 2A 6 HEX 1F,10,08,08,04,04,04 31 7 HEX 0E,11,11,0E,11,11,0E 38 8 HEX 0E,11,11,1E,10,08,06 3F 9 HEX 04,0A,11,1F,11,11,11 46 A HEX 0F,11,11,0F,11,11,0F 4D B HEX 0E,11,01,01,01,11,0E 54 C HEX 0F,11,11,11,11,11,0F 5B D HEX 1F,01,01,0F,01,01,1F 62 E HEX 1F,01,01,0F,01,01,01 69 F HEX 0E,11,01,01,19,11,0E 70 G HEX 11,11,11,1F,11,11,11 77 H HEX 0E,04,04,04,04,04,0E 7E I HEX 11,09,05,03,05,09,11 85 K HEX 01,01,01,01,01,01,1F 8C L HEX 11,13,15,15,15,19,11 93 N HEX 0E,11,11,11,11,11,0E 9A O HEX 0F,11,11,0F,05,09,11 A1 R HEX 0E,11,01,0E,10,11,0E A8 S HEX 1F,04,04,04,04,04,04 AF T HEX 11,11,11,11,11,11,0E B6 U HEX 00,00,00,00,00,00,00 BD SPACE * /--- BLOCK DISKLD 00 000 82/04/22 14.30 TITLE DISK LOADER * * * * * * * * * * * * * * * * * * * * FLOPPY DISK LOADER * * LOAD FORMAT. * FIRST DATA ADDRESS (2 BYTES, LSB FIRST) * DATA LENGTH IN BYTES (2 BYTES, LSB FIRST) * DATA * CHECKSUM (2 BYTES) * * CHECKSUM ALGORITHM. * START WITH HL=0 * FOR EACH DATA BYTE, * H = (H .XOR. DATA) CLS 1 * L = (L .XOR. DATA) CRS 1 * CHECK FOR FIRST CHECKSUM BYTE = L * CHECK FOR SECOND CHECKSUM BYTE = H * * AFTER SUCCESSFUL LOAD, CONTROL IS TRANSFERRED * TO FIRST DATA ADDRESS. * * * * * * * * * * * * * * * * * * * DISKLOAD EQU * CALL D.CLEAR CLEAR THE SCREEN CALL FDWAIT IN A,(FDSTAT) XOR 40H CHECK IF FDC IS LOADED JR Z,WLOOPD JUMP IF OK CALL FDWAIT WAIT AND THEN TRY AGAIN IN A,(FDSTAT) XOR 40H SCF RET NZ RETURN IF DISK LOAD FAILED. * /--- BLOCK DISKLD 00 000 82/05/27 07.18 WLOOPD LD B,40H LD A,0EH OUT (FDCMND),A OUTPUT COMMAND WLOOPA DEC B JR Z,DISKFAIL CALL FDWAIT IN A,(FDSTAT) XOR 48H JR NZ,WLOOPA LD A,0F1H OUT (FDCMND),A OUTPUT INVERSE COMMAND LD B,40H WLOOPC DEC B JR Z,DISKFAIL CALL FDWAIT IN A,(FDSTAT) XOR 4AH JR NZ,WLOOPC * IN A,(FDDATA) ADDRESS LD E,A IN A,(FDDATA) LD D,A LD (FWASAVE),DE IN A,(FDDATA) LENGTH LD C,A IN A,(FDDATA) LD B,A LD HL,00 WLOOPB IN A,(FDDATA) INPUT DATA LD (DE),A AND STORE IT XOR H UPDATE BLOCK CHECK IN HL RLCA LD H,A LD A,(DE) XOR L RRCA LD L,A INC DE UPDATE COUNTERS DEC BC LD A,B OR C JR NZ,WLOOPB IN A,(FDDATA) SEE IF BLOCK CHECK IS OK XOR L JR NZ,DISKFAIL IN A,(FDDATA) XOR H JR NZ,DISKFAIL LD A,3CH SET CODE LOADED FLAG LD (LOADFLAG),A LD BC,8000H PUT IST2 ASCII SUBTYPE IN BC. LD HL,(FWASAVE) JP (HL) GO TO LOADED PROGRAM DISKFAIL EQU * SCF RET * WAIT ROUTINE FOR FLOPPY DISK FDWAIT LD HL,1000H FDWAIT1 DEC HL LD A,H OR L JR NZ,FDWAIT1 RET * /--- BLOCK DIAG 00 000 82/04/29 09.36 TITLE DIAGNOSTIC TESTS * * * * * * * * * * * * * * * * * * * * * 'DIAGNOSTICS TEST - 'SECTION 1 * * 'THIS SECTION WRITES AND READS 55 HEX THROUGHOUT * 'R'A'M 'MEMORY. 'PANEL 'LIGHTS WILL 'DISPLAY CODE 01 HEX * WHILE RUNNING. * * 'THE ALARM WILL SOUND IF AN ERROR IS DETECTED AND * WILL SOUND UNTIL ANY KEYBOARD KEY IS DEPRESSED * AT WHICH TIME THE ALARM STOPS AND THE ERROR CODE * IS DISPLAYED.. 'THE MICROPROCESSOR IS NOW HALTED * AND ONLY THE RESET SWITCH CAN RESTART THE TERMINAL. * * 'THE VALUE OF THE 'L'E'D INDICATORS ARE * 'D'T'R = 2**5 (10 0000) * 'D'S'R = 2**4 (01 0000) * 'R'T'S = 2**3 (00 1000) * 'R'C'V = 2**2 (00 0100) * 'X'M'T = 2**1 (00 0010) * 'E'R'R = 2**0 (00 0001) * * 'THE MEANING OF THE ERROR CODES ARE * 'FIRST HEX 'BYTE = 0 'MEMORY 'ADDRESS 0000 - 3FFF * 1 'MEMORY 'ADDRESS 4000 - 7FFF * 2 'MEMORY 'ADDRESS 8000 - BFFF * 3 'MEMORY 'ADDRESS C000 - FFFF * 'SECOND 'BYTE = 1 'DATA 'BIT 0 * 2 'DATA 'BIT 1 * 3 'DATA 'BIT 2 * 4 'DATA 'BIT 3 * 5 'DATA 'BIT 4 * 6 'DATA 'BIT 5 * 7 'DATA 'BIT 6 * 8 'DATA 'BIT 7 * * * * * * * * * * * * * * * * * * * * * DEFS 05B3H+BEGIN-* * /--- BLOCK DIAG 00 000 82/04/09 14.17 DIAG EQU * LD A,3EH OUT (PNLLTS),A DISPLAY CODE 01 LD A,55H ENTER DATA TO WRITE LD IX,DIAG01 SAVE RETURN ADDRESS JP DWR1 GO TO WRITE ROUTINE * DIAG01 EQU * LD HL,0FFFFH LOAD HIGHEST ADDRESS LD DE,7FFEH LOAD BLOCK LENGTH LD C,55H LOAD EXPECTED DATA LD IX,DIAG02 SAVE RETURN ADDRESS JP DREAD1 GO TO READ ROUTINE * * * * * * * * * * * * * * * * *@ * * * 'DIAGNOSTICS 'TEST - 'SECTION 2 * * 'THIS SECTION WRITES AND READS 'A'A HEX THROUGHTOUT * MEMORY. 'PANEL 'LIGHTS WILL DISPLAY CODE 02 HEX WHILE * RUNNING. 'ERROR STOPS SAME AS SECTION 1 * * * * * * * * * * * * * * * * * * * * DIAG02 EQU * LD A,3DH OUT (PNLLTS),A OUTPUT CODE 02 LD HL,8000H LD A,0AAH LD IX,DIAG0201 SAVE RETURN ADDRESS JP DWR1 * DIAG0201 EQU * LD HL,0FFFFH LOAD HIGHEST ADDRESS LD DE,7FFEH BLOCK LENGTH LD C,0AAH EXPECTED DATA LD IX,DIAG03 SAVE RETURN ADDRESS JP DREAD1 GO TO READ ROUTINE * * * * * * * * * * * * * * * * * * * * * 'DIAGNOSTICS 'TEST - 'SECTION 3 * * * * * * * * * * * * * * * * * * * * * * * /--- BLOCK DIAG 00 000 82/04/13 13.32 DIAG03 EQU * LD A,3CH OUT (PNLLTS),A OUTPUT CODE 03 LD DE,8001H LD C,00H LD A,06H OUT (BLKERS),A BULK ERASE * JP DIAG04 * DWR1 EQU * LD HL,0FFFFH SET HL TO HIGHEST ADDRESS LD DE,0FFFEH SET DE TO HL MINUS ONE LD BC,0F700H SET COUNTER LD (HL),A STORE DATA LDDR MOVE DATA TO ALL LOCATIONS LD A,(0FFFFH) LD HL,3FFFH SET HL TO HIGHEST ADDRESS LD DE,3FFEH SET DE TO HL MINUS ONE LD BC,3700H SET COUNTER LD (HL),A STORE DATA LDDR MOVE DATA TO ALL LOCATIONS JP (IX) RETURN * DREAD1 EQU * LD A,(HL) LOAD DATA LD B,A SAVE ACTUAL DATA IN B REG XOR C COMPARE WITH EXPECTED JP Z,DREAD2 CONTINUE JR DERROR * DREAD2 EQU * DEC HL DEC DE LD A,E OR D JR NZ,DREAD1 LD A,H BIT 7,A JR NZ,DREAD3 JP (IX) DREAD3 EQU * IN A,(MNTSW) BIT 5,A JR NZ,DREAD4 LD HL,3FFFH LD DE,3700H JR DREAD1 DREAD4 LD HL,7FFFH LD DE,7700H JR DREAD1 * DERROR EQU * IN A,(KBDATA) CLEAR KEYBOARD DERROR1 EQU * SET 0,A OUT (MISCTL),A SOUND BEEPER IN A,(SYSSTAT) BIT 3,A TEST FOR KEYBOARD INPUT JR Z,DERROR1 WAIT * LD A,B LOAD BAD DATA XOR C SET FAILING BITS LD B,37H SET B TO START FORMING NUMBER * DERROR2 EQU * RLA ROTATE DATA JR C,DERROR3 DJNZ DERROR2 DECREASE CHIP NUMBER * DERROR3 EQU * LD A,B MOVE CHIP NUMBER TO A BIT 7,H JR NZ,DERROR4 REFRESSH MEMORY - ERROR CODE 2X OR 3X RES 5,A BIT 6,H JR NZ,DERROR5 CODE 0X RES 4,A JR DERROR5 * DERROR4 EQU * BIT 1,H TEST FOR UPPPER BANK JR NZ,DERROR5 YES - CODE 3X RES 4,A LOWER BANK - 2X DERROR5 EQU * CPL * /--- BLOCK DIAG 00 000 73/00/00 00.00 RES 7,A RES 6,A OUT (PNLLTS),A OUTPUT CHIP NUMBER HALT1 JR HALT1 * * * * * * * * * * * * * * * * * * * * * 'D'I'A'G'N'O'S'T'I'C'S 'T'E'S'T - 'SECTION 4 * * 'THIS SECTION CHECKS THE 'P'L'A'T'O SERIAL 'INTERFACE * * 'PANEL 'DISPLAYS CODE 04 WHILE RUNNING. * * 'IF AN ERROR IS DETECTED THE ALARM WILL SOUND DISPLAYING * THE SECTION NUMBER UNTIL ANY KEYBOARD KSY IS DEPRESSED. * 'THE ALARM WILL THEN STOP AND THE ERROR CODE DISPLAYED. * * 'CODE 01 = 'NO CHARACTER REQUEST STATUS * 02 = CHREQ DROPPED AFTER LOWER BITS OUTPUT * 03 = CHREQ ACTIVE AFTER UPPER BITS OUTPUT * 04 = FIRST BYTE FLAG NOT SET * 05 = START BIT NOT RECEIVED * 06 = NO CHARACTER READY STATUS * 07 = DATA ERROR * * 'THE PROCESSOR WILL HALT AND THE RESET SWITCH IS THE ONLY * WAY TO RESTART THE TERMINAL * * * * * * * * * * * * * * * * * * * * DIAG04 EQU * LD A,3BH OUT (PNLLTS),A LOOPBACK MODE, DISPLAY 06 LD IY,DIAG0401 SAVE CONTINUE ADDRESS LD DE,3F80H INITIALIZE DATA IN A,(CLADATA) CLEAR CHAR READY STATUS JP PCR WAIT FOR 'P'L'A'T'O CHARACTER REQUEST * DIAG0401 EQU * LD A,E LOAD LOWER DATA BITS OUT (CLAL),A AND OUTPUT IN A,(SYSSTAT) INPUT STATUS BIT 2,A TEST FOR CHAR REQ STILL ACTIVE JR NZ,DIAG0402 LD A,3DH JP LED DISPLAY OUTPUT * DIAG0402 EQU * LD A,D LOAD UPPER BITS SET 3,A SET START BIT OUT (CLAU),A AND OUTPUT IN A,(SYSSTAT) BIT 2,A TEST CHARACTER REQ DROPPED JR Z,DIAG0403 LD A,3CH JP LED OUTPUT ERROR CODE 03 * DIAG0403 EQU * LD HL,DIAG0404 JP PRCV GO TO 'P'L'A'T'O RECEIVER * DIAG0404 EQU * BIT 7,A TEST FOR FIRST BYTE JR NZ,DIAG0405 OK LD A,3BH JP LED OUTPUT ERROR CODE 04 * DIAG0405 EQU * BIT 6,A TEST FOR START BIT JR NZ,DIAG0406 LD A,3AH JP LED OUTPUT ERROR CODE 05 * DIAG0406 EQU * XOR D COMPARE WITH EXPECTED DATA AND 3FH MASK OFF UNWANTED BITS JR NZ,DIAG0409 ERROR * * /--- BLOCK DIAG 00 000 82/04/13 13.33 LD HL,DIAG0407 SAVE GOOD RETURN ADDRESS JP PRCV GET SECOND BYTE * DIAG0407 EQU * RLCA ROTATE DATA XOR E COMPARE WITH AND 0F8H JR NZ,DIAG0409 ERROR * LD HL,DIAG0408 SAVE GOOD RETURN ADDRESS JP PRCV GET THIRD BYTE * DIAG0408 EQU * XOR 00H SET ZERO FLAG JR Z,DIAG0410 OK * DIAG0409 EQU * LD A,38H JR LED OUTPUT ERROR CODE 07 * DIAG0410 EQU * LD A,E ADD A,08H LD E,A JR NC,DIAG0401 JR DIAG05 * PCR EQU * LD HL,0FFFFH LOAD COUNTER * PCR1 EQU * IN A,(SYSSTAT) INPUT STATUS BIT 2,A TEST FOR CHARACTER REQUEST JR Z,PCR2 JP (IY) RETURN * PCR2 EQU * DEC HL LD A,H OR L TEST FOR TIMEOUT JR NZ,PCR1 NO LD A,3EH LOAD ERROR CODE JR LED AND OUTPUT * PRCV EQU * LD BC,0FFFFH LOAD COUNTER * PRCV1 EQU * IN A,(SYSSTAT) BIT 0,A TEST FOR CHARACTER READY JP NZ,PRCV2 YES DEC BC LD A,B OR C JR NZ,PRCV1 LD A,39H TIME-OUT ERROR JR LED OUTPUT CODE * PRCV2 EQU * IN A,(CLADATA) INPUT DATA JP (HL) RETURN * LED EQU * LD B,A * LED1 EQU * SET 0,A OUT (MISCTL),A SOUND BEEPER IN A,(SYSSTAT) BIT 3,A TEST FOR KEYBOARD DATA JR Z,LED1 WAIT * LD A,B RESTORE DATA OUT (PNLLTS),A HALT2 JR HALT2 * * * * * * * * * * * * * * * * * * * * * * 'D'I'A'G'N'O'S'T'I'C'S 'T'E'S'T - 'SECTION 5 * * * * * * * * * * * * * * * * * * * * * DIAG05 EQU * LD A,3AH OUT (PNLLTS),A LOOPBACK AND CODE 07 * * * * * * * * * * * * * * * * * * * * * 'D'I'A'G'N'O'S'T'I'C'S 'T'E'S'T - 'SECTION 6 * * 'THIS SECTION CHECKS THE KEYBOARD, TOUCHPANEL AND * DISPLAYS AN ALIGNMENT PATTERN. 'PANEL LIGHTS WILL * /--- BLOCK DIAG 00 000 73/00/00 00.00 * DISPLAY CODE 06 HEX WHILE RUNNING. * * 'PRESS SHIFT-STOP TO EXIT DIAGNOTICS PROGRAM. * * * * * * * * * * * * * * * * * * * * * DIAG06 EQU * LD A,39H OUT (PNLLTS),A DISPLAY SECTION 8 IN A,(MNTSW) BIT 1,A TEST FOR KEYBOARD/TOUCHPANEL JP Z,DIAG07 LD A,06H OUT (BLKERS),A DO BULK ERASE * DIAG0601 EQU * IN A,(SYSSTAT) BIT 7,A JR NZ,DIAG0601 WAIT FOR BULK COMPLETED LD HL,8000H LD DE,8001H LD BC,01FFH LD A,01H LD (HL),A LDIR WRITE BOTTOM LINE * LD HL,8000H LD A,0FFH * DIAG0602 EQU * LD (HL),A INC H DEC L LD (HL),A INC HL BIT 7,H JR NZ,DIAG0602 WRITE LEFT AND RIGHT BOUNDARIES * LD HL,0FFFEH LD DE,0FFFDH LD BC,01FDH LD A,80H LD (HL),A LDDR WRITE TOP LINE * LD HL,8001H LD DE,81FEH LD C,02H DIAG0603 EQU * LD A,C LOAD MASK OR (HL) LD (HL),A STORE FIRST QUADRANT POINT LD (DE),A STORE THIRD QUADRANT POINT INC HL DEC DE RLC C JR NC,DIAG0603 INC H INC H INC D INC D BIT 7,H JR NZ,DIAG0603 * IN A,(KBDATA) CLEAR KEYBOARD IN A,(TPDATA) CLEAR TOUCHPANEL * DIAG0604 EQU * IN A,(SYSSTAT) BIT 3,A TEST FOR KYBD READY JR NZ,DIAG0605 YES - PROCESS BIT 4,A TEST TOUCHPANEL READY JR Z,DIAG0604 NO - CHECK AGAIN * * * * * * * * * * * * * * * * * * * * 'TOUCHPANEL 'PROCESSOR * * * * * * * * * * * * * * * * * * * * IN A,(TPDATA) INPUT DATA * RLCA ROTATE A RRCA RRCA RRCA XOR 0E1H LD B,A SAVE DATA AND 0E0H SAVE UPPER BITS LD L,A LOWER BITS OF HL LD A,B GET ROTATED DATA AND 01H SAVE LOWER BIT LD C,A SAVE X8 * /--- BLOCK DIAG 00 000 82/04/13 13.34 LD A,B ROTATED DATA RLCA ROTATE TWICE TO RLCA ADJUST UPPER BITS AND 78H SAVE Y BITS OR C ADD X8 SET 7,A LD H,A UPPER BITS OF HL LD D,02H SET PASS COUNTER * DIAG0610 EQU * LD B,20H SET WORD COUNTER * DIAG0611 EQU * LD A,(HL) XOR 0FFH LD (HL),A INC HL DJNZ DIAG0611 LD B,20H INC H INC H * DIAG0612 EQU * DEC HL LD A,(HL) XOR 0FFH LD (HL),A DJNZ DIAG0612 INC H INC H DEC D JR NZ,DIAG0610 SET 0,A OUT (MISCTL),A SOUND BEEPER JP DIAG0604 GO BACK TO STATUS ROUTINE * * * * * * * * * * * * * * * * * * * * 'KEYBOARD 'PROCESSOR * * * * * * * * * * * * * * * * * * * DIAG0605 EQU * LD D,02H SET COUNTER IN A,(KBDATA) COMPARE WITH SHIFT-STOP CODE CP 3AH JP Z,DIAG07 * LD HL,0C1B0H HL TO CENTER OF BOTTOM LINE LD B,03H SET BIT COUNTER RLCA THROW AWAY BIT SEVEN LD C,A * DIAG0606 EQU * LD A,C RLCA ROTATE DATA LD C,A AND SAVE LD A,03H ZERO PATTERN JR NC,DIAG0607 WRITE PATTERN LD A,7FH ONE PATTERN * DIAG0607 EQU * LD (HL),A STORE PATTERN INC HL IN FOUR CONSECUTIVE LD (HL),A LOCATIONS INC HL LD (HL),A INC HL LD (HL),A XOR A ADD TWO SPACES INC HL BETWEEN CHARACTERS LD (HL),A INC HL LD (HL),A INC HL DJNZ DIAG0606 DEC D JP Z,DIAG0604 GOT TO STATUS LOOP LD B,05H SET BIT COUNTER XOR A CLEAR A JR DIAG0607 WRITE GAP BETWEEN BYTES AND DO BYTE 2 * * * * * * * * * * * * * * * * * * * * * * 'END OF 'DIAGNOSTICS PROGRAM * * * * * * * * * * * * * * * * * * * * * DIAG07 EQU * IN A,(MNTSW) * /--- BLOCK DIAG 00 000 82/04/29 10.42 BIT 2,A TEST FOR REPEAT BIT JP NZ,DIAG JP COMSET * END BEGIN