/ DECMATE II ROM CONTENTS / DECODED AND DISASSEMBLED BY CHARLES J. LASNER. / LAST EDIT: 02-DEC-1991 02:00:00 CJL / MAY BE ASSEMBLED WITH '/J' (PAL8 '/F') SWITCH SET. / THIS IS THE CODE USED IN THE DECMATE II PRIMARY CONTROL ROM. IT RESIDES IN / THREE 2716 PACKAGES KNOWN AS E113, E114, E115. THE THREE ROMS ARE ENCODED / INTO A 12-BIT IMAGE OF AN ENTIRE FIELD IN THE PARTICULAR ORGANIZATION / ILLUSTRATED BELOW. FOR ALL ROM CONTENTS: 0.X=BIT X IN THE SPACE 0000-3777, / 4.X=BIT X IN THE SPACE 4000-7777. / E113: 0 1 2 3 4 5 6 7 / BIT: 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 / E114: 0 1 2 3 4 5 6 7 / BIT: 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 / E115: 0 1 2 3 4 5 6 7 / BIT: 0.8 4.8 0.9 4.9 0.10 4.10 0.11 4.11 / THIS IS THE ASSEMBLY OF THE RELEASED ROM SET KNOWN AS 358E2, 359E2, 360E2. / WHEN THE DECMATE II IS FIRST POWERED UP, ROM CONTROL IS ENABLED FOR ALL DIRECT / (IF) AND INDIRECT (DF) REFERENCES TO CP MEMORY, THUS THE CPU STARTS AT / ROM-BASED ADDRESS CP07777. THE ROM CODE MOVES A LOADING PROGRAM TO PAGE ZERO / OF THE CORRESPONDING RAM IN FIELD ZERO OF CP MEMORY, WHICH IS THEN STARTED. / TO ACCOMPLISH THE INITIAL MOVE OF THE LOADER, THE DF CONTROL IS CHANGED TO RAM / WHILE RETAINING IF CONTROL IN THE ROM. / THE LOADER MOVES THE BULK OF THE ROM CODE TO CP FIELD SEVEN AND THEN STARTS IT / THERE. NO CODE IS MOVED TO ANY ADDRESS LOWER THAN 0100, SINCE THE CODE IMAGE / IS STORED OFFSET BY 100. THIS MEANS THAT ROM LOCATION 0000 WINDS UP IN FIELD / 7 LOCATION 0100 AND SO ON. DURING THE LOAD OPERATION, THE IF CONTROL IS / ALWAYS SET TO RAM BECAUSE AT THIS POINT THE LOADER IS RUNNING. THE DF IS / SWITCHED BETWEEN ROM AND RAM AS NECESSARY TO ACCOMPLISH THE LOAD OPERATION. / AFTER LOADING IS COMPLETE, THE ROM IS TOTALLY DISABLED. / DEFINITIONS. / OPERATE INSTRUCTIONS. R3L= 7014 /ROTATE AC LEFT THREE WITHOUT AFFECTING LINK / COMBINED OPERATE INSTRUCTIONS. NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL002A= CLA CLL IAC RAL /LOAD AC WITH 0002 ON 8/I OR NEWER NL0003= CLA CLL CML IAC RAL /LOAD AC WITH 0003 NL0004= CLA CLL IAC RTL /LOAD AC WITH 0004 NL0006= CLA CLL CML IAC RTL /LOAD AC WITH 0006 NL0010= CLA IAC R3L /LOAD AC WITH 0010 NL0100= CLA IAC BSW /LOAD AC WITH 0100 NL2000= CLA CLL CML RTR /LOAD AC WITH 2000 NL3777= CLA CLL CMA RAR /LOAD AC WITH 3777 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL5777= CLA CLL CMA RTR /LOAD AC WITH 5777 NL6000= CLA CLL CML IAC RTR /LOAD AC WITH 6000 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 NL7777= CLA CMA /LOAD AC WITH 7777 / PROCESSOR I/O INSTRUCTIONS. CPD= 6266 /FORCE DF TO REFER TO MAIN MEMORY GCF= 6256 /GET CURRENT FIELDS PEX= 6004 /EXIT FROM CP TO MAIN MEMORY PG0= 6003 /RESET HLTFLG FLIP-FLOP PRQ3= 6236 /TYPE 3 PANEL REQUEST PRS= 6000 /READ PANEL STATUS RSP1= 6207 /READ FIRST STACK POINTER RSP2= 6227 /READ SECOND STACK POINTER SPD= 6276 /FORCE DF TO REFER TO CP MEMORY WSR= 6246 /WRITE SWITCH REGISTER (ROM CONTROL), CLEAR AC / INTERNAL I/O INSTRUCTIONS. KEY= 03 /KEYBOARD DEVICE CODE TTY= 04 /SCREEN DEVICE CODE / VIDEO INTERRUPT INSTRUCTIONS. VIDINT= 06 /VIDEO INTERRUPT DEVICE CODE VFL= VIDINT^10+6000 /SET VIDEO INTERRUPT FLAG VSF= VIDINT^10+6001 /SKIP ON, CLEAR VIDEO INTERRUPT FLAG VCL= VIDINT^10+6002 /NOP (CLEAR THE AC?) VNOP1= VIDINT^10+6003 /(NOP?) VDUMM1= VIDINT^10+6004 /(NOP?) VIE= VIDINT^10+6005 /WRITE INTERRUPT ENABLE PER AC[11] VDUMM2= VIDINT^10+6006 /(NOP?) VDUMM3= VIDINT^10+6007 /(NOP?) / VIDEO CONTROLLER INSTRUCTION. VIDDEV= 12 /VIDEO CONTROLLER DEVICE CODE APTFL= VIDDEV^10+6000 /SET APT INTERRUPT FLAG APTSKP= VIDDEV^10+6001 /SKIP ON, CLEAR APT INTERRUPT FLAG LSCREG= VIDDEV^10+6002 /LOAD VIDEO REGISTER SELECT CGLOAD= VIDDEV^10+6003 /LOAD CHARACTER GENERATOR ADDRESS/DATA VLOAD= VIDDEV^10+6004 /LOAD SELECTED REGISTER FROM AC[4-11] APTIE= VIDDEV^10+6005 /WRITE INTERRUPT ENABLE PER AC[11] VIDCON= VIDDEV^10+6006 /AC TO VIDEO CONTROL VREAD= VIDDEV^10+6007 /READ SELECTED REGISTER / PRINTER INTERFACE INSTRUCTIONS. PRICON= 32 /PRINTER INPUT DEVICE CODE PRIFL= PRICON^10+6000 /SET PRINTER INPUT FLAG PRISKP= PRICON^10+6001 /SKIP ON, CLEAR PRINTER INPUT FLAG PRICLR= PRICON^10+6002 /CLEAR THE AC PRINO1= PRICON^10+6003 /NOP PRIRS= PRICON^10+6004 /OR INPUT BUFFER WITH AC PRIIE= PRICON^10+6005 /WRITE INTERRUPT ENABLE PER AC[11] PRIRB= PRICON^10+6006 /LOAD INPUT BUFFER INTO AC PRINO2= PRICON^10+6007 /NOP PROCON= 33 /PRINTER OUTPUT DEVICE CODE PROFL= PROCON^10+6000 /SET PRINTER OUTPUT FLAG PROSKP= PROCON^10+6001 /SKIP ON, CLEAR PRINTER OUTPUT FLAG PRONO1= PROCON^10+6002 /NOP PRSB= PROCON^10+6003 /LOAD BAUD RATE PER AC[8-11] PROPC= PROCON^10+6004 /OUTPUT CHARACTER FROM AC[4-11] PROIE= PROCON^10+6005 /WRITE INTERRUPT ENABLE PER AC[11] PROLS= PROCON^10+6006 /OUTPUT CHARACTER FROM AC[4-11], CLEAR AC PRONO2= PROCON^10+6007 /NOP / RD51D I/O INSTRUCTIONS. RDNOP= 6700 /RESERVED INSTRUCTION RDSR= 6701 /SKIP ON, CLEAR DATA REQUEST FLAG RDSC= 6702 /SEND COMMAND PER AC RDSD= 6703 /SKIP ON, CLEAR DONE FLAG RDTD= 6704 /TRANSFER DATA TO/FROM AC RDWE= 6705 /WRITE INTERRUPT ENABLE PER AC[11] RDSE= 6706 /SKIP ON, CLEAR ERROR FLAG RDTEST= 6707 /RESERVED TEST INSTRUCTION THAT CLEARS THE AC /ONLY IF THE RD51D IS INSTALLED. / COMMUNICATIONS PORT DEFINITIONS. PORTIN= 30 /COMMUNICATIONS PORT INPUT DEVICE CODE IFL= PORTIN^10+6000 /SET COMMUNICATIONS PORT INPUT/OUTPUT FLAG ISF= PORTIN^10+6001 /SKIP ON, CLEAR PORT INPUT/OUTPUT FLAG ICF= PORTIN^10+6002 /NOP (CLEAR THE AC?) INOP1= PORTIN^10+6003 /(NOP?) IRS= PORTIN^10+6004 /READ COMMUNICATIONS PORT RECEIVE BUFFER IIE= PORTIN^10+6005 /PORT I/O INTERRUPT ENABLE PER AC[11] IRB= PORTIN^10+6006 /READ COMMUNICATIONS PORT RECEIVE BUFFER INOP2= PORTIN^10+6007 /(NOP?) PORTOUT=31 /COMMUNICATIONS PORT OUTPUT DEVICE CODE DUMBFL= PORTOUT^10+6000 /SET COMMUNICATIONS PORT DUMMY FLAG DUMBSF= PORTOUT^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT DUMMY FLAG DUMBCF= PORTOUT^10+6002 /NOP (CLEAR THE AC?) ONOP1= PORTOUT^10+6003 /(NOP?) OPC= PORTOUT^10+6004 /LOAD COMMUNICATIONS PORT TRANSMIT BUFFER DUMBIE= PORTOUT^10+6005 /PORT DUMMY INTERRUPT ENABLE PER AC[11] OLS= PORTOUT^10+6006 /LOAD COMMUNICATIONS PORT TRANSMIT BUFFER ONOP2= PORTOUT^10+6007 /(NOP?) PORTCON=36 /COMMUNICATIONS PORT CONTROL DEVICE CODE MFL= PORTCON^10+6000 /SET MODEM CHANGE FLAG MSF= PORTCON^10+6001 /SKIP ON, CLEAR MODEM CHANGE FLAG MLC= PORTCON^10+6002 /LOAD MODEM CONTROL REGISTER MSB= PORTCON^10+6003 /LOAD BAUD RATE REGISTER MRS= PORTCON^10+6004 /READ MODEM STATUS REGISTER MIE= PORTCON^10+6005 /MODEM CHANGE INTERRUPT ENABLE PER AC[11] MPSCC= PORTCON^10+6006 /ACCESS MULTIPROTOCOL SERIAL CONTROLLER MPRESET=PORTCON^10+6007 /RESET MULTIPROTOCOL SERIAL CONTROLLER / TTY: TRAP DEFINITIONS. TTYCON= 07 /DEVICE CODE FOR TTY: TRAP TTYFL= TTYCON^10+6000 /SET TTY: TRAP FLAG TTYSF= TTYCON^10+6001 /SKIP ON, CLEAR TTY: TRAP FLAG TTYCLR= TTYCON^10+6002 /CLEAR THE AC TTNOP1= TTYCON^10+6003 /NOP TTNOP2= TTYCON^10+6004 /NOP TTYIE= TTYCON^10+6005 /WRITE INTERRUPT ENABLE PER AC[11] TTNOP3= TTYCON^10+6006 /NOP TTNOP4= TTYCON^10+6007 /NOP / CLOCK DEFINITIONS. CLKCON= 13 /REAL-TIME CLOCK DEVICE CODE CLFL= CLKCON^10+6000 /SET CLOCK FLAG CLSK= CLKCON^10+6001 /SKIP ON, CLEAR CLOCK FLAG CLNOP1= CLKCON^10+6002 /NOP CLNOP2= CLKCON^10+6003 /NOP CLNOP3= CLKCON^10+6004 /NOP CLIE= CLKCON^10+6005 /WRITE INTERRUPT ENABLE PER AC[11] CLNOP4= CLKCON^10+6006 /NOP CLNOP5= CLKCON^10+6007 /NOP / KEYBOARD DEFINITIONS. KBICON= 11 /KEYBOARD INPUT DEVICE CODE KBIFL= KBICON^10+6000 /SET KEYBOARD INPUT FLAG KBISF= KBICON^10+6001 /SKIP ON, CLEAR KEYBOARD INPUT FLAG KBICLR= KBICON^10+6002 /CLEAR THE AC KINOP1= KBICON^10+6003 /NOP KBIRS= KBICON^10+6004 /OR AC WITH KEYBOARD INPUT DATA KBIIE= KBICON^10+6005 /WRITE INTERRUPT ENABLE PER AC[11] KBIRB= KBICON^10+6006 /READ KEYBOARD INPUT DATA INTO AC KINOP2= KBICON^10+6007 /NOP KBOCON= 05 /KEYBOARD OUTPUT DEVICE CODE KBOFL= KBOCON^10+6000 /SET KEYBOARD OUTPUT FLAG KBOSF= KBOCON^10+6001 /SKIP ON, CLEAR KEYBOARD OUTPUT FLAG KONOP1= KBOCON^10+6002 /NOP KONOP2= KBOCON^10+6003 /NOP KBOPC= KBOCON^10+6004 /OUTPUT AC TO KEYBOARD KBOIE= KBOCON^10+6005 /WRITE INTERRUPT ENABLE PER AC[11] KBOLS= KBOCON^10+6006 /OUTPUT AC TO KEYBOARD, CLEAR AC KONOP3= KBOCON^10+6007 /NOP / RX50/RX01/RX02 DEFINITIONS. RXCON= 75 /RX50 DEVICE CODE SEL= RXCON^10+6000 /SELECT DISKETTE PAIR PER AC[0] AND AC[11] LCD= RXCON^10+6001 /LOAD COMMAND REGISTER, CLEAR AC XDR= RXCON^10+6002 /TRANSFER DATA STR= RXCON^10+6003 /SKIP ON TRANSFER FLAG, CLEAR TRANSFER FLAG SER= RXCON^10+6004 /SKIP ON ERROR FLAG, CLEAR ERROR FLAG SDN= RXCON^10+6005 /SKIP ON DONE FLAG, CLEAR DONE FLAG INTR= RXCON^10+6006 /WRITE INTERRUPT ENABLE PER AC[11] RXINIT= RXCON^10+6007 /INITIALIZE CONTROLLER AND DRIVES / MRI DEFINITIONS. JMPIC= JMP I . /CURRENT PAGE JMP I / OTHER DEFINITIONS. A= 0 /EVEN HALF OF COMMUNICATIONS CHIP APUCON= 14 /APU/XPU DEVICE CODE B= 1 /ODD HALF OF COMMUNICATIONS CHIP DTIME= 400 /DISK WAIT TIME-OUT FACTOR ROWADR= 3660 /ROWTABLE ADDRESS IN FIELD 1 T0S3BUF=5350 /TRACK 0, SECTOR 3 BUFFER IN FIELD 1 FIELD 7 /MOST OF THE CODE EXECUTES IN FIELD 7 PAGE 37 /STARTUP PAGE / THE ROM STARTS UP HERE (JUMPED TO FROM THE END OF THE PAGE). SINCE WE ARE / STARTING FROM POWERUP, BOTH CONTROL BITS ARE CLEARED. THE ROM IS REFERENCED / WHEN MEMORY IS READ VIA BOTH THE INSTRUCTION AND DATA FIELDS INITIALLY. / FURTHER, FORCE-ZERO MODE IS IN EFFECT WHICH MUST BE CLEARED TO USE EXTENDED / MEMORY. ROMGO= . /ROM STARTS HERE ROMGO, CIF 00 /SET OUR OWN FIELD; START CLEARING FZ MODE JMP .+1 /THIS JUST LOADS OUR FIELD, BUT CLEARS FZ MODE NL4000 /SETUP PATTERN FOR RAM DATA FIELD WSR /ROM IS ONLY IF NOW, DF IS RAM / APPARENTLY THE RAM MAY NOT YET BE WORKING, SO VARIOUS TESTS ARE DONE UNTIL IT / RESPONDS CORRECTLY. MEMTST, CLA STL /CLEAN UP AND SET A STOP BIT WATLUP, ISZ I ATABLE+0/(L4001) /BUMP UP TEST LOCATION NOP /IN CASE IT SKIPS RAL /MOVE PATTERN OVER SMA /DONE ENOUGH? JMP WATLUP /NO, KEEP GOING CLA /CLEAN UP SPD /FORCE INDIRECT REFERENCES TO CP MEMORY / TRY TO STORE ALL ZEROES INTO THE RAM TEST LOCATION. DCA I ATABLE+0/(L4001) /ATTEMPT TO STORE CLEAR PATTERN TAD I ATABLE+0/(L4001) /GET IT BACK SZA CLA /SKIP IF ACTUALLY CLEAR JMP MEMTST /GO BACK IF IT FLUNKS / TRY TO STORE ALTERNATING ZEROES AND ONES INTO THE RAM TEST LOCATION. TAD L2525/(2525) /GET A DATA PATTERN DCA I ATABLE+0/(L4001) /ATTEMPT TO STORE IT TAD I ATABLE+0/(L4001) /GET IT BACK TAD L5252/(5252) /ADD ON NEGATED PATTERN IAC /ADD ONE TO FINISH THE COMPARISON SZA CLA /SKIP IF IT MATCHES JMP MEMTST /GO DO IT AGAIN IF IT FLUNKS / TRY TO STORE ALTERNATING ONES AND ZEROES INTO THE RAM TEST LOCATION. TAD L5252/(5252) /GET A DATA PATTERN DCA I ATABLE+0/(L4001) /ATTEMPT TO STORE IT TAD I ATABLE+0/(L4001) /GET IT BACK TAD L2525/(2525) /ADD ON NEGATED PATTERN IAC /ADD ONE TO FINISH THE COMPARISON SZA CLA /SKIP IF IT MATCHES JMP MEMTST /GO DO IT AGAIN IF IT FLUNKS / TRY TO STORE ALL ONES INTO THE RAM TEST LOCATION. NL7777 /SET DATA PATTERN DCA I ATABLE+0/(L4001) /ATTEMPT TO STORE IT NL0001 CLL /SET NEGATED PATTERN FOR COMPARISON TAD I ATABLE+0/(L4001) /ADD ON TEST VALUE SZA CLA /SKIP IF IT MATCHES JMP MEMTST /GO DO IT AGAIN IF IT FLUNKS / MOVE THE IMAGE OF THE LOADING PROGRAM TO PAGE ZERO OF RAM. TAD LPROGM+0/(4001) /GET A WORD DCA I ATABLE+0/(L4001) /PUT A WORD TAD LPROGM+1/(CODEXC-1) /GET A WORD DCA I ATABLE+1/(XR6) /PUT A WORD TAD LPROGM+2/(-ROMGO+1) /GET A WORD DCA I ATABLE+2/(MOVCNT) /PUT A WORD TAD LPROGM+3/(NL7777 CLL) /GET A WORD DCA I ATABLE+3/(LOADIT+0) /PUT A WORD TAD LPROGM+4/(DCA XR1) /GET A WORD DCA I ATABLE+4/(LOADIT+1) /PUT A WORD TAD LPROGM+5/(CDF 00) /GET A WORD DCA I ATABLE+5/(LOADLP+0) /PUT A WORD TAD LPROGM+6/(NL0001) /GET A WORD DCA I ATABLE+6/(LOADLP+1) /PUT A WORD TAD LPROGM+7/(WSR) /GET A WORD DCA I ATABLE+7/(LOADLP+2) /PUT A WORD TAD LPROGM+10/(TAD I XR1) /GET A WORD DCA I ATABLE+10/(LOADLP+3) /PUT A WORD TAD LPROGM+11/(MQL) /GET A WORD DCA I ATABLE+11/(LOADLP+4) /PUT A WORD TAD LPROGM+12/(TAD L4001) /GET A WORD DCA I ATABLE+12/(LOADLP+5) /PUT A WORD TAD LPROGM+13/(WSR) /GET A WORD DCA I ATABLE+13/(LOADLP+6) /PUT A WORD TAD LPROGM+14/(CLA MQA) /GET A WORD DCA I ATABLE+14/(LOADLP+7) /PUT A WORD TAD LPROGM+15/(CDF 70) /GET A WORD DCA I ATABLE+15/(LOADLP+10) /PUT A WORD TAD LPROGM+16/(DCA I XR6) /GET A WORD DCA I ATABLE+16/(LOADLP+11) /PUT A WORD TAD LPROGM+17/(ISZ MOVCNT) /GET A WORD DCA I ATABLE+17/(LOADLP+12) /PUT A WORD TAD LPROGM+20/(JMP LOADLP) /GET A WORD DCA I ATABLE+20/(LOADLP+13) /PUT A WORD TAD LPROGM+21/(CIF 70) /GET A WORD DCA I ATABLE+21/(LOADLP+14) /PUT A WORD TAD LPROGM+22/(JMP I .+1) /GET A WORD DCA I ATABLE+22/(LOADLP+15) /PUT A WORD TAD LPROGM+23/(CODESTART) /GET A WORD DCA I ATABLE+23/(LOADLP+16) /PUT A WORD / NOW STARTUP THE LOADER TO MOVE THE CODE TO RAM. NL0001 /SETUP FOR WSR /RAM IF AND ROM DF JMP LOADIT /GO START IT UP L2525, 2525 /DATA L5252, 5252 /PATTERNS LPROGM= . /IMAGE OF LOADING PROGRAM HERE RELOC 11 /FOOL THE ASSEMBLER XR1, /AUTO-INDEX USED FOR MOVING THE ROM RELOC 15 /FOOL THE ASSEMBLER SOME MORE LOADER= . /LOADER EXECUTES FROM HERE L4001, 4001 /ROM DISABLE CONSTANT XR6, CODEXC-1 /RAM STORE POINTER MOVCNT, -ROMGO+1 /MOVE COUNTER / THE LOADER STARTS HERE. ALL IF REFERENCES ARE NOW IN RAM. THE CODE IN THE / ROM WILL BE MOVED TO FIELD 7. LOADIT, NL7777 CLL /SET (AUTO-INCREMENTED) POINTER DCA XR1 /TO LOWEST ROM LOCATION LOADLP, CDF 00 /ROM CODE IS IN FIELD ZERO NL0001 /SETUP FOR WSR /RAM IF AND ROM DF TAD I XR1 /GET A ROM WORD MQL /SAVE IT FOR NOW TAD L4001/(4001) /SETUP FOR WSR /RAM IF AND RAM DF CLA MQA /GET THE ROM VALUE CDF 70 /CODE LOADS INTO FIELD SEVEN DCA I XR6 /STORE INTO RAM ISZ MOVCNT /DONE YET? JMP LOADLP /NO, KEEP GOING CIF 70 /GOTO NEW EXECUTION FIELD JMP I .+1/(CODESTART) /GO START IT UP CODESTART /THROUGH HERE RELOC /UN-FOOL THE ASSEMBLER ATABLE, LOADER+00 /TABLE OF LOADING ADDRESSES FOR MOVED LOADER LOADER+01 / LOADER+02 / LOADER+03 / LOADER+04 / LOADER+05 / LOADER+06 / LOADER+07 / LOADER+10 / LOADER+11 / LOADER+12 / LOADER+13 / LOADER+14 / LOADER+15 / LOADER+16 / LOADER+17 / LOADER+20 / LOADER+21 / LOADER+22 / LOADER+23 /LAST ADDRESS OF MOVED LOADER CODE ZBLOCK 7776-. /EMPTY SPACE / WHEN THE CODE IS IN RAM, THESE LOCATIONS IN CP FIELD 0 ARE USED AS THE START / OF THE CP INTERRUPT HANDLER. THE MAIN MEMORY INTERRUPTED PC IS STORED IN CP / 00000 AND CONTROL IS REGAINED AT CP 07777. INVARIABLY, THE INSTRUCTION USED / THERE IS JMP I .-1. THE POINTER ADDRESS IS THEREFORE STORED HERE AT CP 07776. ROMSP, .-. /USED LATER AS CP INTERRUPT POINTER / THE ROM PROGRAM GAINS CONTROL HERE. ALSO USED LATER FOR CP INTERRUPTS. ROMST, JMP ROMGO /CONTINUE THERE / START OF PAGE ZERO WHILE RUNNING IN FIELD 7. THESE LOCATIONS ARE NOT LOADED / BY THE ROM'S LOADING PROGRAM BUT ARE USED BY THE MOVED CODE AS TEMPORARIES. *0 /START AT THE BEGINNING NOPUNCH /DON'T GENERATE BINARY RIMADR, /APT RIM-LOADER TEMPORARY INTADR, /CP-INTERRUPTS PC STORED HERE / THE FOLLOWING ARE DEFINITIONS FOR MAIN MEMORY INTERRUPTS IN FIELD 0. INTADR, .-. /MAIN-MEMORY INTERRUPTS PC STORED HERE INT1, JMP I INT2 /WHAT'S PUT HERE IN MAIN MEMORY FIELD 0 INT2, INTHND /POINTER TO MAIN MEMORY INTERRUPT HANDLER TIMEOUT,.-. /TIME-OUT COUNTER FOR LOOPBACK TEST CLKTICK,.-. /CLOCK TICK COUNTER FOR LOOPBACK TEST CSTATUS,.-. /COUNT PATTERN PROGRESS STATUS PATTERN,.-. /COUNT PATTERN TEMPORARY TSTATUS,.-. /LOOPBACK CP TEST STATUS *10 /GET TO AUTO-INDEX AREA XR0, .-. /AUTO-INDEX REGISTER 0 XR1, .-. /AUTO-INDEX REGISTER 1 XR2, .-. /AUTO-INDEX REGISTER 2 XR3, .-. /AUTO-INDEX REGISTER 3 XR4, .-. /AUTO-INDEX REGISTER 4 XR5, .-. /AUTO-INDEX REGISTER 5 XR6, .-. /AUTO-INDEX REGISTER 6 XR7, .-. /AUTO-INDEX REGISTER 7 *20 /GET PAST AUTO-INDEX AREA CTMP1, .-. /OUTPUT COUNTING TEMPORARY FOR LOOPBACK TEST CTMP2, .-. /INPUT COUNTING TEMPORARY FOR LOOPBACK TEST CNTLO, .-. /LOW-ORDER COUNTER FOR LOOPBACK TESTING CNTHI, .-. /HIGH-ORDER COUNTER FOR LOOPBACK TESTING TEMP1, .-. /TEMPORARY TEMP2, .-. /TEMPORARY TEMP3, .-. /TEMPORARY ZBLOCK 1 /EMPTY SPACE / THESE SIX ARE PRINTED AS A GROUP. TM0, .-. /TEMPORARY COMTM1, .-. /COMMUNICATIONS PORT TESTING TEMPORARY MTM1, .-. /TEMPORARY MTM2, .-. /TEMPORARY SP1SAVE,.-. /FIRST STACK POINTER SAVED HERE SP2SAVE,.-. /SECOND STACK POINTER SAVED HERE MTM5, .-. /TEMPORARY MTM6, .-. /TEMPORARY MTM7, .-. /TEMPORARY TINC, .-. /TEMPORARY T0, .-. /TEMPORARY T1, .-. /TEMPORARY T2, .-. /TESTING TEMPORARY T3, .-. /TEMPORARY T4, .-. /TEMPORARY T5, .-. /TEMPORARY T6, .-. /TEMPORARY T7, .-. /TEMPORARY T8, .-. /TEMPORARY RXCMD, .-. /LATEST RX50 COMMAND ESTATUS,.-. /CUMULATIVE ERROR STATUS LCHAR, .-. /LATEST COMMAND CHARACTER IN SETUP ROUTINE ROW, .-. /ROW POSITION FOR CHARACTER ROUTINES COLUMN, .-. /COLUMN POSITION FOR CHARACTER ROUTINES CCNT, .-. /DELIMITER CHARACTER SEARCH COUNT PSTATUS,.-. /STATUS AT POWER-ON ENPUNCH /RESTORE BINARY / START OF ROM-BASED CODE. *0 /START AT THE BEGINNING ROMADR= . /WHERE IT IS LOADED WHILE IN ROM RELOC 100 /FOOL THE ASSEMBLER CODEXC= . /WHERE IT RUNS IN FIELD 7 3732 /THIS LOCATION IS PROBABLY A VERSION NUMBER PCHRPRT,CHRPRT /POINTER TO SCREEN CHARACTER OUTPUT ROUTINE PPPTABL,PPTABLE /POINTER TO PROGRAMMING TABLE POINTER PROWLOA,ROWLOAD /POINTER TO ROWTABLE AND REGISTER LOAD ROUTINE Z7, 7 /CONSTANT 0007 Z10, 10 /CONSTANT 0010 Z12, 12 /CONSTANT 0012 Z17, 17 /CONSTANT 0017 Z20, 20 /CONSTANT 0020 Z102, 102 /CONSTANT 0102 Z200, 200 /CONSTANT 0200 Z237, 237 /CONSTANT 0237 Z0301, 0301 /CONSTANT 0301 Z377, 377 /CONSTANT 0377 Z400, 400 /CONSTANT 0400 Z2525, 2525 /CONSTANT 2525 Z3777, 3777 /CONSTANT 3777 JMPIM1, ROMSP&177+JMPIC /JMP I .-1 CONSTANT FOR RESTART ADDRESS ZCDF, CDF 00 /CONSTANT 6201 PWRIBUF,WRIBUFFER /POINTER TO WRITE BUFFER PAPTROU,APTROUTINE /POINTER TO APT ROUTINE 6777 /CONSTANT 6777 (UNUSED?) Z7766, 7766 /CONSTANT 7766 Z7760, 7760 /CONSTANT 7760 Z7741, 7741 /CONSTANT 7741 Z7400, 7400 /CONSTANT 7400 DTIMOUT,-DTIME /DISK WAIT TIMEOUT FACTOR Z7775, 7775 /CONSTANT 7775 CPIADDR,/ROMSP /POINTER ADDRESS FOR CP-INTERRUPTS Z7776, 7776 /CONSTANT 7776 PROMST, ROMST /ROM (RE)START ADDRESS FOR INTERRUPTS, ETC. LBLADR, LBLOAD-1 /LOOPBACK TEST CODE ADDRESS (-1) LBMCNT, LBTEST-LBTEND /LENGTH OF LOOPBACK TEST CODE TO BE MOVED CPLADR, CPLOAD-1 /CP-INTERRUPT CODE ADDRESS (-1) CPMCNT, CPLOAD-CPEND2 /LENGTH OF CP-INTERRUPT CODE TO BE MOVED PCOMLOA,COMLOAD /=> COMMUNICATIONS CHIP REGISTER LOAD ROUTINE PCOMREA,COMREAD /=> COMMUNICATIONS CHIP REGISTER READ ROUTINE PCLR23, CLR23 /POINTER TO FIELD 2, 3 CLEAR ROUTINE PRXCOMD,RXCOMD /POINTER TO RXCOMD ROUTINE PSSTRIN,SSTRING /POINTER TO SSTRING ROUTINE / THE FOLLOWING LOCATION IS UNREFERENCED; PERHAPS THERE IS A CONVENTION ABOUT / WHERE TO RESTART THE ROM PROGRAM? PRGDONE /POINTER TO PRGDONE ROUTINE (UNUSED?) PMEMCOM,MEMCOMP /POINTER TO MEMORY COMPARE ROUTINE PKBDIN, KBDIN /POINTER TO KEYBOARD INPUT ROUTINE PCALLSU,CALLSUB /POINTER TO TEST (SUBROUTINE) LOCATION Z205, 205 /CONSTANT 0205 ZBLOCK 21 /EMPTY SPACE / ******** SUBR /POINTER TO SUBR SUB176, .-. /ENTRY HERE JMP I .-2/[SUBR] /GO THERE PAGE / THIS IS WHERE THE CODE STARTS AFTER THE LOADER HAS MOVED IT FROM 00000 TO / 70100. AT THIS POINT THE ROM IS TOTALLY DISABLED. IF AUTOMATIC PRODUCT / TESTING IS IN PROGRESS, IT IS POSSIBLE THAT A PREVIOUSLY LOADED MAIN MEMORY / TEST PROGRAM HAS EXITED VIA A PANEL REQUEST INSTRUCTION. THIS ACTION CAUSES A / TOTAL RESTART TO THIS LOCATION. CODESTA=. /THE CODE STARTS HERE CODESTA,CLA CLL /CLEAN UP PRS /GET (POWER-ON) STATUS NOW DCA PSTATUS /SAVE FOR LATER PG0 /RESET THE HLTFLG FLIP-FLOP / THE PIE CHIPS HAVE TO BE PROGRAMMED BEFORE THEY CAN BE USED. UP UNTIL NOW ALL / IOTS HAVE BEEN INTERNAL; AN UNIMPLEMENTED EXTERNAL IOT (6777) WILL BE USED TO / LOAD IN THE DEVICE-SPECIFIC INFORMATION. TAD I PPPTABLE/[PPTABLE] /GET PROGRAMMING TABLE POINTER DCA XR0 /STASH THE POINTER PRGLUP, TAD I XR0 /GET THE LATEST SNA /SKIP IF NOT AT END JMP PRGDONE /CONTINUE THERE IF DONE 6777 /UN-IMPLEMENTED EXTERNAL IOT TO SETUP CHIPS CLA /CLEAN UP JMP PRGLUP /KEEP GOING / COMES HERE WHEN I/O PORT INITIALIZING IS DONE. PRGDONE,TAD Z237/[237] /GET PORT ENABLE VALUE MLC /ENABLE ALL OUTPUT LINES JMS I PROWLOAD/[ROWLOAD] /CALL ROWTABLE AND REGISTER LOAD ROUTINE JMS I PCLR23/[CLR23] /CLEAR FIELDS 2, 3 (AND BITS IN 13705, 13707) CDF 70 /BACK TO OUR FIELD NL7776 /-2 DCA XR0 /SETUP COUNTER VAGAIN, DCA XR1 /CLEAR TIME-OUT COUNTER VWATLP, VSF /VIDEO RETRACE FLAG UP? SKP /SKIP IF NOT JMP VPAST /JUMP IF SO ISZ XR1 /WAITING TOO LONG? JMP VWATLP /NO, KEEP GOING JMP PRGDONE /YES, GO DO IT ALL OVER AGAIN VPAST, TAD L72/(72) /GET VALUE FOR REGISTER 3A LSCREG /LOAD THE REGISTER VREAD /GET THE STATUS THERE, CLEAR INTERNAL FLAGS CLA /CLEAN UP ISZ XR0 /DONE IT ENOUGH TIMES? JMP VAGAIN /NO, GO DO IT AGAIN / FOR SOME PURPOSE, WE NEED TO STORE 0100 INTO CP20301. NL0100 CLL /GET VALUE CDF 20 /GOTO BUFFER FIELD DCA I Z0301/[0301] /STORE IN BUFFER CDF 70 /BACK TO OUR FIELD / IF THE PRINTER PORT HAS THE APTEN LINE GROUNDED, WE GO IMMEDIATELY INTO THE / AUTOMATIC PRODUCT TEST DOWNLOAD MODE. THIS COULD BE A SECONDARY CALL TO THE / DOWNLOAD ROUTINE IF A PREVIOUSLY LOADED ROUTINE EXITED VIA A PANEL REQUEST / INSTEAD OF HLT. APTSKP /AUTOMATIC PRODUCT TEST REQUESTED? JMP MEMTEST /NO, JUST KEEP GOING JMS I .+1; DOWNLOAD /YES, GO DOWNLOAD SOME STUFF. L72, 72 /CONSTANT 0072 / MEMORY TESTING. ALTERNATING ONES AND ZEROES ARE STORED INTO ALL FIELDS IN / MAIN MEMORY AND FIELDS 2-6 IN CP MEMORY. CHECK IF THE PATTERN WORKED AND THEN / REVERSE ALL PARAMETERS EACH PASS FOR SEVERAL ITERATIONS. MEMTEST,CPD /INDIRECT TO MAIN MEMORY FROM NOW ON CDF 70 /RESET TO OUR FIELD FIRST (WHY?) DCA T2 /CLEAR FIELD COUNTER / EXECUTE CDF TO LATEST TEST FIELD. MLODLP, TAD T2 /GET LATEST FIELD AND Z7/[7] /JUST FIELD BITS R3L /MOVE UP TAD ZCDF/[CDF] /MAKE IT A CDF INSTRUCTION DCA .+1 /STORE IN-LINE HLT+.-. /WILL BE CDF TEST FIELD INSTRUCTION DCA T1 /CLEAR ADDRESS POINTER / STORE TEST PATTERN IN LATEST TEST FIELD. FILLIT, TAD Z2525 /GET ALTERNATING TEST PATTERN DCA I T1 /STASH INTO TEST MEMORY ISZ T1 /BUMP TO NEXT JMP FILLIT /GO BACK FOR MORE / BUMP TO NEXT FIELD AND CHECK WHICH MEMORY BANK WE ARE TESTING. ISZ T2 /BUMP TO NEXT FIELD TAD T2 /GET LATEST FIELD AND Z10/[10] /JUST GROUP BIT SNA CLA /SKIP IF FIRST GROUP DONE JMP MLODLP /GO BACK AGAIN / CP MEMORY IS BEING TESTED; CHECK IF WE JUST LOADED FIELD 6. TAD T2 /GET LATEST FIELD IAC /LOOK AT NEXT TENTATIVE FIELD AND Z20/[20] /CHECK IF AT LAST MEMBER (WHICH WOULD BE US!) SZA CLA /SKIP IF NOT THERE YET JMP MEMLOADED /JUMP IF AT END / CHECK IF WE ARE JUST FINISHED LOADING MAIN MEMORY. TAD T2 /GET LATEST FIELD AND Z7/[7] /JUST FIELD BITS SZA CLA /SKIP IF GROUP DONE JMP MLODLP /GO BACK AGAIN / SWITCH INDIRECTS BACK TO CP MEMORY. AVOID TESTS IN FIELDS 0 AND 1. SPD /WILL BE CP INDIRECTS FROM NOW ON ISZ T2 /BUMP LATEST FIELD ISZ T2 /DO IT TWICE JMP MLODLP /KEEP GOING / COMES HERE WHEN ALL TESTABLE FIELDS ARE FILLED WITH THE TEST PATTERN. MEMLOAD,DCA T1 /CLEAR ADDRESS POINTER DCA T2 /CLEAR FIELD COUNTER TAD Z2525/[2525] /GET TEST VALUE CMA /INVERT FOR CHECKING LATER DCA T0 /STASH IT CPD /MAIN MEMORY INDIRECTS FROM NOW ON NL0001 /SETUP FOR SINGLE DCA TINC /FIELD INCREMENT NL7775 /SETUP FOR THREE DCA XR1 /COMPLETE TEST PASSES MTSTLP, JMS I PMEMCOMP/[MEMCOMP] /CHECK LATEST FIELD FOR PROPER TEST VALUE JMP MEMTEST /MEMORY FAILED TO MATCH, GO BACK FOR MORE TAD TINC /GET INCREMENT TAD T2 /UPDATE FIELD DCA T2 /STORE BACK TAD TINC /GET INCREMENTAL FACTOR SPA CLA /SKIP IF STILL ADDING JMP CDWNTST /JUMP IF NOT / FOUND OUT IF WE ARE FINISHED (JUST TESTED CP FIELD 6) WHILE COUNTING FORWARD. TAD T2 /GET CURRENT FIELD IAC /TENTATIVELY ADD ONE AND Z20/[20] /CHECK IF AT LAST FIELD SNA CLA /SKIP IF SO JMP CPMTST /JUMP IF NOT / BACKUP TO FIELD 6 TO START NEXT TEST PASS. NL7777 /BACKUP TAD T2 /ADD ON LATEST FIELD BACKEND,DCA T2 /STORE BACK JMP PASSEND /CONTINUE THERE / COUNTING FIELDS DOWN; CHECK IF WE JUST FINISHED A PASS. CDWNTST,TAD T2 /GET CURRENT FIELD SPA CLA /SKIP IF STILL VALID JMP BACKEND /JUMP IF NOT / CHECK IF WE ARE ABOUT TO START TESTING CP MEMORY. CPMTST, TAD T2 /GET CURRENT FIELD AND Z10/[10] /CHECK IF INTO CP GROUP SNA CLA /SKIP IF SO JMP MTSTLP /KEEP GOING TAD TINC /GET INCREMENTAL FACTOR SPA CLA /SKIP IF STILL POSITIVE JMP NEGTST /JUMP IF NOT / CHECK IF FIRST TIME IN CP MEMORY; SWITCH OVER TO CP INDIRECTS AND BYPASS / TESTING OF FIELD 0 AND FIELD 1. TAD T2 /GET LATEST FIELD AND Z7/[7] /JUST FIELD BITS SNA CLA /SKIP IF NOT AT ZERO NL002A /ELSE START HERE TAD T2 /ADD ON CURRENT FIELD DCA T2 /STORE BACK SPD /PANEL INDIRECTS FROM NOW ON JMP MTSTLP /CONTINUE THERE / IF COUNTING FIELDS DOWN, WE MUST AVOID FIELD 0 AND FIELD 1; IF CP FIELD 2 WAS / JUST FINISHED, THEN SWITCH OVER TO MAIN FIELD 7. NEGTST, NL7777 /-1 TAD T2 /COMPARE TO LATEST FIELD AND Z7/[7] /JUST FIELD BITS SZA CLA /SKIP IF WE ARE AT FIELD 1 JMP MTSTLP /JUST KEEP GOING CPD /MAIN MEMORY INDIRECTS FROM NOW ON TAD Z7/[7] /SETUP FOR FIELD 7 DCA T2 /STASH IN FIELD COUNTER JMP MTSTLP /CONTINUE THERE / COMES HERE AT THE END OF A TEST PASS OVER ALL TESTED FIELDS. PASSEND,TAD TINC /GET INCREMENT FACTOR CIA /INVERT IT DCA TINC /STORE BACK TAD T0 /GET TEST PATTERN COMPARE VALUE CMA /INVERT THE BITS DCA T0 /STORE BACK TAD TINC /GET INCREMENT AGAIN SPA CLA /SKIP IF POSITIVE NL7777 /ELSE SET -1 DCA T1 /STORE EITHER WAY ISZ XR1 /DONE ENOUGH PASSES? JMP I PMTSTLP/(MTSTLP) /NO, KEEP GOING JMS I PCLR23/[CLR23] /CLEAR FIELDS 2, 3 (AND BITS IN 13705, 13707) CDF 70 /BACK TO OUR FIELD APTSKP /AUTOMATIC PRODUCT TESTING? SKP /SKIP IF NOT JMS I PAPTROUTINE/[APTROUTINE]/CALL ROUTINE IF SO / MOVE CP 72600-72746 TO MAIN 00200-00346. THIS IS THE MAIN MEMORY ROUTINE AND / INTERRUPT HANDLER FOR THE PRINTER LOOPBACK TEST. TAD LBLADR/[LBLOAD-1] /SETUP THE DCA XR0 /SOURCE POINTER TAD LBMCNT/[LBTEST-LBTEND] /SETUP THE DCA XR1 /MOVE COUNTER TAD LBADR/(LBTEST-1) /SETUP THE DCA XR2 /DESTINATION POINTER LBMVLP, TAD I XR0 /GET A WORD CDF 00 /GOING TO FIELD 0 CPD /GOING TO MAIN MEMORY DCA I XR2 /PUT A WORD SPD /INDIRECTS BACK TO CP MEMORY AGAIN CDF 70 /BACK TO OUR FIELD ISZ XR1 /DONE YET? JMP LBMVLP /NO, GO BACK / MOVE CP 73000-75600 TO CP 04000-06600. THIS IS THE CP-INTERRUPT HANDLER FOR / THE PRINTER LOOPBACK TEST. / PROGRAMMING NOTE: THE LENGTH OF EXECUTABLE CODE REQUIRED TO BE RELOCATED IS / APPARENTLY MUCH SMALLER THAN THE ACTUAL AMOUNT OF CODE MOVED. THE LENGTH / SHOULD BE CPEND-CPINT INSTEAD OF CPEND2-CPLOAD. THIS LENGTH MAY INTERFERE / WITH AUTOMATIC PRODUCT TESTING OR CAUSE SOME OTHER BUG. IT IS NOT KNOWN AT / THIS TIME IF THE ORIGINAL PROGRAMMER'S INTENTION WAS TO OVERLAY ANY OTHER CODE / BEYOND THE INTERRUPT HANDLER, BUT THIS SOURCE CODE FOLLOWS THE ROM CONTENTS, / BUGS AND ALL :-). TAD CPLADR/[CPLOAD-1] /SETUP THE DCA XR0 /SOURCE POINTER TAD CPMCNT/[CPLOAD-CPEND2] /SETUP THE DCA XR1 /MOVE COUNTER NL3777/TAD (CPINT-1) /SETUP THE DCA XR2 /DESTINATION POINTER CPMVLP, TAD I XR0 /GET A WORD CDF 00 /GOING TO FIELD 0 DCA I XR2 /PUT A WORD CDF 70 /BACK TO OUR FIELD ISZ XR1 /DONE YET? JMP CPMVLP /NO, KEEP GOING / NOW WE HAVE TO MOVE JMP I .-1 TO CP 07777 AND 4000 TO CP 07776 TO COMPLETE THE / INTERRUPT HANDLER. NL4000/TAD (CPINT) /GET INTERRUPT HANDLING ADDRESS CDF 00 /GOING TO FIELD 0 DCA I CPIADDRESS/[ROMSP] /STORE IN POINTER LOCATION TAD JMPIM1/[ROMSP&177+JMPIC]/GET JMP I .-1 INSTRUCTION DCA I PROMST/[ROMST] /STORE IN RESTART ADDRESS CIF CDF 00 /GOING TO FIELD 0 CPD /INDIRECTS TO MAIN MEMORY PEX /LEAVING CP MEMORY JMP I Z200/[200] /GO START IT UP LBADR, LBTEST-1 /LOOPBACK TEST ADDRESS (-1) PMTSTLP,MTSTLP /POINTER TO LOOP BRANCH / COMES HERE WHEN THE PRINTER LOOPBACK TEST IS DONE TO TEST THE KEYBOARD IN / LOOPBACK MODE. LBDONE, DCA ESTATUS /SAVE (POSSIBLE ERROR) RESULTS TAD L16/(16) /GET 9600 BAUD VALUE PRSB /SET BAUD RATE CLA /CLEAN UP DCA CTMP1 /CLEAR OUTPUT TEST VALUE DCA CTMP2 /CLEAR INPUT TEST VALUE DCA CNTLO /CLEAR LOW-ORDER COUNTER TAD M52/(-52) /SETUP THE DCA CNTHI /HIGH-ORDER COUNTER APTSKP /AUTOMATIC PRODUCT TESTING? TAD Z20/[20] /NO, GET LOOPBACK MODE VALUE VIDCON /LOAD NEW MODE EITHER WAY KBIRB /READ KEYBOARD DATA TO SET UART CLA /THROW IT AWAY KBOPC /OUTPUT TO UART NOW LUPLUP, KBISF /KEYBOARD INPUT FLAG UP? SKP /SKIP IF NOT JMP LUPIN /JUMP IF SO KBOSF /KEYBOARD OUTPUT FLAG UP? SKP /SKIP IF NOT JMP LUPOUT /JUMP IF SO ISZ CNTLO /DONE WAITING? JMP LUPLUP /NO, KEEP GOING ISZ CNTHI /ENOUGH TIMES? JMP LUPLUP /NO, KEEP GOING JMP LUPTIMOUT /YES, CONTINUE THERE LUPIN, KBISF /SKIP ON, CLEARING THE INPUT FLAG L16, 16 /9600 BAUD RATE VALUE; HERE IN CASE IT SKIPS KBIRB /GET THE INPUT VALUE AND Z377/[377] /JUST 8-BIT CHARACTER CIA /INVERT FOR TEST TAD CTMP2 /COMPARE TO TEST VALUE SZA CLA /SKIP IF IT MATCHES VIDCON /CLEAR LOOPBACK IF NOT TAD CTMP2 /GET INPUT PATTERN VALUE JMS I PCOUNTUP/(COUNTUP) /BUMP TO NEXT VALUE JMP LUPDONE /ALL VALUES USED DCA CTMP2 /SAVE UPDATED VALUE JMP LUPLUP /KEEP GOING LUPOUT, KBOSF /SKIP ON, THUS CLEARING OUTPUT FLAG NOP /JUST IN CASE IT SKIPS TAD CTMP1 /GET COUNT PATTERN VALUE JMS I PCOUNTUP/(COUNTUP) /BUMP TO NEXT VALUE JMP LUPLUP /ALL VALUES USED; KEEP GOING FOR INPUT'S SAKE DCA CTMP1 /SAVE UPDATED VALUE TAD CTMP1 /GET IT BACK KBOLS /OUTPUT IT CLA /CLEAN UP JMP LUPLUP /KEEP GOING M52, -52 /CONSTANT 7726 PCOUNTU,COUNTUP-LBTEST+LBLOAD /POINTER TO COUNTUP ROUTINE L375, 375 /CONSTANT 0375 PTSTBUF,TSTBUFFER-1 /POINTER TO TEST BUFFER PKBTEND,KBTEND /POINTER TO END OF KEYBOARD TEST / COMES HERE WHEN THE LOOPBACK TEST TIMES OUT. LUPTIMO,NL0010 CLL /INDICATE TIME-OUT ENDED THE TEST / COMES HERE WHEN THE COUNT PATTERN IS FINISHED TO (POSSIBLY) TEST THE KEYBOARD. LUPDONE,TAD ESTATUS /GET TEST ERROR STATUS DCA ESTATUS /STORE (POSSIBLY) UPDATED VALUE VIDCON /CLEAR VIDEO CONTROL APTSKP /AUTOMATIC PRODUCT TESTING? SKP /SKIP IF NOT JMP I PKBTEND/(KBTEND) /JUMP IF SO TO BYPASS TEST DCA XR2 /CLEAR RECEIVED CHARACTER COUNT KBIRB /READ BUFFER NOW TO RESET UART CLA /CLEAN UP TAD L375/[375] /GET "JUMP TO POWER UP" VALUE KBOLS /OUTPUT TO KEYBOARD KBOSF /WAIT FOR IT JMP .-1 /'TIL DONE KBOSF /SKIP ON, THUS CLEARING THE FLAG 40/NOP /HERE IN CASE IT SKIPS (UNREFERENCED?) CLA /CLEAN UP TAD Z7766/[-12] /SETUP THE DCA CNTHI /HIGH-ORDER COUNT DCA CNTLO /CLEAR LOW-ORDER COUNT TAD PTSTBUFF/(TSTBUFFER-1) /SETUP THE DCA XR1 /BUFFER POINTER KEYLUP, KBISF /FLAG UP? SKP /SKIP IF NOT JMP GOTKEY /JUMP IF SO ISZ CNTLO /WAITING TOO LONG? JMP KEYLUP /NO, KEEP TRYING ISZ CNTHI /TOO MANY TIMES? JMP KEYLUP /NO, KEEP TRYING / NO (FURTHER) KEYBOARD INPUT. JMP KBTIMOUT /CONTINUE THERE / COMES HERE WHEN A KEYBOARD CHARACTER IS RECEIVED. GOTKEY, KBISF /SKIP ON, THUS CLEARING THE FLAG NOP /IN CASE IT SKIPS KBIRB /GET THE CHARACTER AND Z377/[377] /JUST 8 BITS DCA I XR1 /STORE INTO THE BUFFER ISZ XR2 /BUMP CHARACTER COUNT JMP KEYLUP /KEEP GOING / COMES HERE WHEN KEYBOARD INPUT TIMES OUT. KBTIMOU,TAD L7774/(-4) /GET EXPECTED COUNT TAD XR2 /COMPARE TO ACTUAL SNA /SKIP IF OTHER THAN EXPECTED TAD I PTSTBEND/(TSTBEND) /ELSE LOOK AT LAST CHARACTER RECEIVED SZA CLA /SKIP IF LAST CHARACTER WAS A TAD Z20/[20] /ELSE ADD ON KEYBOARD ERROR VALUE TAD ESTATUS /GET CUMULATIVE STATUS DCA ESTATUS /STORE BACK KBTEND, JMP I .+1/(COMTEST) /CONTINUE THERE COMTEST /THROUGH HERE PTSTBEN,TSTBEND-1 /POINTER TO END OF TEST KEYBOARD BUFFER L7774, 7774 /CONSTANT 7774 L342, 342 /CONSTANT 0342 L320, 320 /CONSTANT 0320 A7740, 7740 /CONSTANT 7740 PAPTSTR,APTSTRT /STARTING ADDRESS FOR DOWNLOAD / DIRECT DOWN-LOAD ROUTINE. CALLED VIA JMS I .+1;DOWNLOAD IF APTEN IS SET. THE / FORMAT IS STANDARD PAPER-TAPE RIM FORMAT WITHOUT A LEADER. LOADING IS TO MAIN / MEMORY FIELD 7. THE ROUTINE IS ALSO CALLABLE AFTER A PREVIOUSLY LOADED / PROGRAM EXITS VIA A PANEL REQUEST INSTEAD OF A HLT INSTRUCTION. THIS CAUSES A / TOTAL RESTART OF ALL CODE INITIALLY MOVED FROM THE ROM TO CP FIELD 7. IN THIS / SITUATION, CODE LOADED INTO MAIN MEMORY 76000-77777 WILL BE MOVED TO CP / 76000-7777 TO BECOME THE NEXT CP-INTERRUPT HANDLER, ETC. EXIT VIA HLT / INSTRUCTION RETURNS TO A DESIGNATED ENTRY POINT TO LOAD MORE CODE. DOWNLOA,.-. /DOWN-LOAD ROUTINE ISZ DOWNLOAD /BUMP PAST CALL POINTER CDF 70 /ENSURE OUR FIELD TAD Z400/[400] /SET POWER-ON MASK AND PSTATUS /GET POWER-ON BIT SNA CLA /SKIP IF SET JMP DWNAGN /JUMP IF NOT DCA CMSW /INDICATE MOVABLE CODE NOT LOADED YET / THE CODE IS REJOINED HERE WHEN DOWN-LOADED CODE EXITS WITH A HLT INSTRUCTION. DWNENTR,CDF 70 /GOTO MAIN MEMORY LOADING FIELD TAD PBAUD /GET BAUD RATE PRSB /SETUP 9600 BAUD RATE CLA /CLEAN UP PRISKP /SKIP ON, THUS CLEARING INPUT FLAG PBAUD, 16 /RATE VALUE FOR 9600 BAUD; ALSO SKIP PROTECT TAD L342/(342) /GET CHARACTER CODE PROLS /OUTPUT IT PRIRB /READ KEYBOARD BUFFER NOW FOR CHARACTERS LATER CPD /MAIN MEMORY INDIRECTS FROM NOW ON RIMLUP, PRISKP /FLAG UP JMP RIMLUP /NO, WAIT FOR IT PRISKP /YES, MAKE SURE IT CLEARS NOP /IN CASE IT SKIPS AGAIN PRIRB /READ IN THE CHARACTER CLL RTL;RTL /MOVE UP SPA /SKIP IF NOT AT TRAILER JMP RIMEND /JUMP IF DONE RTL /MOVE UP TO HIGH-ORDER PRISKP /WAIT FOR JMP .-1 /NEXT CHARACTER PRISKP /MAKE SURE IT CLEARS NOP /IN CASE IT SKIPS AGAIN PRIRS /OR IN LATEST CHARACTER SNL /SKIP IF ORIGIN SETTING DCA I RIMADR /STORE THE DATA DCA RIMADR /STORE AS NEW ORIGIN JMP RIMLUP /KEEP GOING / COMES HERE AT THE END OF THE RIM LOADING. RIMEND, CLA /CLEAN UP TAD L320/(320) /GET THIS VALUE DCA I A7740/(7740) /SOMEONE NEEDS THIS THERE SPD /CP MEMORY INDIRECTS DCA XR0 /CLEAR INDEX (WHY?) CDF 00 /GOING TO FIELD 0 TAD PCPIHND/(CPIHND) /GET INTERRUPT HANDLER ADDRESS DCA I CPIADDR/[ROMSP] /STORE IN INTERRUPT POINTER TAD JMPIPM/(ROMSP&177+JMPIC)/GET JMP I .-1 DCA I PROMST/[ROMST] /STORE IN RESTART ADDRESS NL7777 /BACKUP TAD PCPIHND/(CPIHND) /NOW HAVE AUTO-INCREMENT LOADING ADDRESS DCA XR0 /STASH THE POINTER TAD XR0 /GET IT AGAIN DCA XR1 /STASH FOR MOVING ALSO CDF 70 /GOTO OUR FIELD RCPLUP, TAD I XR0 /GET A WORD SNA /END OF LIST? JMP RIMST /JUMP IF SO CDF 00 /GOTO FIELD 0 DCA I XR1 /PUT A WORD CDF 70 /BACK TO OUR FIELD JMP RCPLUP /KEEP GOING RIMST, CIF CDF 70 /GOING TO FIELD 7 PEX /LEAVING PANEL MEMORY JMP I PAPTSTRT/(APTSTRT) /GO THERE / COMES HERE IF A PREVIOUSLY LOADED ROUTINE EXITED VIA A PANEL REQUEST WHICH / CAUSES A TOTAL RESTART OF THE FORMERLY ROM-BASED CODE MOVED TO FIELD 7. CODE / LOADED INTO MAIN MEMORY 76000-77777 SHOULD BE MOVED TO CP 76000-77777. DWNAGN, TAD CMSW /GET LOAD SWITCH SZA CLA /SKIP IF NOT LOADED YET JMP I DOWNLOAD /RETURN TO CALLER NL7777 /INDICATE CODE MOVED DCA CMSW /FOR NEXT TIME TAD PAPTSTRT/(APTSTRT) /GET STARTING ADDRESS DCA RIMADR /STASH THE POINTER MCLUP, CPD /MAIN MEMORY INDIRECTS TAD I RIMADR /GET A WORD SPD /CP MEMORY INDIRECTS DCA I RIMADR /PUT A WORD ISZ RIMADR /BUMP TO NEXT JMP MCLUP /KEEP GOING JMP I DOWNLOAD /RETURN TO CALLER CMSW, .-. /CODE MOVED SWITCH JMPIPM, ROMSP&177+JMPIC /JMP I .-1 CONSTANT FOR RESTART ADDRESS PCPIHND,CPIHND /CP-INTERRUPT HANDLING ADDRESS / VALIDATION PATTERN FOR TRACK ZERO, SECTOR 4 DATA. T0S4DAT,-1 -"H!200 -"L!200 -"T!200 -"F!200 -"L!200 -"G!200 -2 0 /THIS ENDS THE LIST / DATA PATTERN USED TO TEST RX50 SILO BUFFER. TPATTRN,000 252 125 063 017 377 ZBLOCK 1 /EMPTY SPACE DINDEX, .-. /TEST DATA INDEX DCNT, .-. /TEST DATA COUNTER DPTR, .-. /TEST DATA POINTER M5, -5 /CONSTANT 7773 M1000, -1000 /CONSTANT 7000 PTPATTR,TPATTRN /POINTER TO SILO TEST DATA PRDTWAI,RDTWAIT /POINTER TO RDTWAIT ROUTINE / COMES HERE AFTER DEALING WITH THE COMMUNICATIONS PORT. COMDONE,JMS I PRDTWAIT/(RDTWAIT) /TIME OUT RD51 (IF PRESENT) LCD /SEND A FILL BUFFER COMMAND CAF /CLEAN UP; SELF-TEST SHOULD RAISE THE FLAG NL7777 /SETUP AN DCA XR0 /INDEX REGISTER (EXTRANEOUS?) TAD DTIMOUT/[-DTIME] /SETUP THE DCA T6 /TIME-OUT COUNTER DCA T7 /CLEAR INNER TIME-OUT COUNTER DONWAIT,SDN /DONE FLAG UP? JMP NOTDONE /NO, GO THERE TO WAIT SER /YES, ANY ERRORS? JMP DONEOK /NO, CONTINUE THERE JMP RXERROR /GO THERE BECAUSE OF ERRORS NOTDONE,ISZ T7 /WAITED ENOUGH? JMP DONWAIT /NO, KEEP GOING ISZ T6 /WAITING TOO LONG? JMP DONWAIT /NO, KEEP GOING JMP RXERROR /GO THERE BECAUSE IT TIMED OUT DONEOK, APTSKP /AUTOMATIC PRODUCT TESTING? SKP /SKIP IF NOT JMS I PAPTROUTINE/[APTROUTINE]/CALL ROUTINE IF SO CLA CLL /CLEAN UP DCA DINDEX /CLEAR DATA INDEX DCA DCNT /CLEAR DATA COUNTER NL0100 CLL /GET FILL BUFFER COMMAND (8-BIT) VALUE LCD /LOAD THE COMMAND JMS RXWAIT /CALL WAIT ROUTINE JMP CMNDOK /TRANSFER FLAG UP JMP RXERROR /DONE FLAG UP, ERROR JMP RXERROR /ERROR OR TIME-OUT CMNDOK, XDR /FINISH THE COMMAND FILLUP, JMS RXWAIT /CALL WAIT ROUTINE JMP TRNSUP /TRANSFER FLAG UP JMP DONEUP /DONE FLAG CAME UP, SO FINISH THERE JMP RXERROR /ERROR OR TIME-OUT TRNSUP, TAD DINDEX /GET DATA INDEX TAD PTPATTRN/(TPATTRN) /POINT TO PROPER ELEMENT IN LIST DCA DPTR /STASH THE POINTER TAD I DPTR /GET THE DATA VALUE XDR /SEND TO SILO CLA /CLEAN UP ISZ DCNT /BUMP DATA COUNTER ISZ DINDEX /BUMP DATA INDEX TAD DINDEX /GET DATA INDEX TAD M5/(-5) /COMPARE TO LARGEST VALUE SMA SZA CLA /SKIP IF NOT PAST DCA DINDEX /ELSE RESET DATA INDEX JMP FILLUP /KEEP GOING / DONE FLAG IS UP; CHECK IF PROPER BYTE COUNT. DONEUP, TAD DCNT /GET DATA COUNTER TAD M1000/(-1000) /COMPARE TO EXPECTED VALUE SZA CLA /SKIP IF IT MATCHES JMP RXERROR /ELSE COMPLAIN CLA CLL /CLEAN UP DCA DINDEX /CLEAR DATA INDEX DCA DCNT /CLEAR DATA COUNTER TAD Z102/[102] /GET EMPTY BUFFER COMMAND (8-BIT) VALUE LCD /LOAD THE COMMAND JMS RXWAIT /CALL WAIT ROUTINE JMP CMDOK /TRANSFER FLAG CAME UP JMP RXERROR /DONE FLAG CAME UP, COMPLAIN JMP RXERROR /ERROR OR TIME-OUT CMDOK, CLA /CLEAN UP XDR /FINISH THE COMMAND EMPTLUP,JMS RXWAIT /CALL WAIT ROUTINE SKP /TRANSFER FLAG CAME UP JMP DONUP /DONE FLAG CAME UP / OOPS! FORGOT THE "JMP RXERROR" IF IT GETS AN ERROR OR TIMES OUT. TAD DINDEX /GET DATA INDEX TAD PTPATTRN/(TPATTRN) /POINT TO PROPER ELEMENT IN LIST DCA DPTR /STASH THE POINTER TAD I DPTR /GET THE DATA DCA DPTR /SAVE IT XDR /GET THE BYTE CIA /INVERT FOR TESTING TAD DPTR /COMPARE TO TEST VALUE SZA CLA /SKIP IF IT MATCHES JMP RXERROR /ELSE COMPLAIN ISZ DCNT /BUMP DATA COUNTER ISZ DINDEX /BUMP DATA INDEX TAD DINDEX /GET DATA INDEX TAD M5/(-5) /COMPARE TO LARGEST VALUE SMA SZA CLA /SKIP IF NOT TOO FAR DCA DINDEX /ELSE RESET DATA INDEX JMP EMPTLUP /KEEP GOING / DONE FLAG IS UP; CHECK IF PROPER BYTE COUNT. DONUP, TAD DCNT /GET DATA COUNTER TAD M1000/(-1000) /COMPARE TO EXPECTED VALUE SZA CLA /SKIP IF IT MATCHES JMP RXERROR /ELSE COMPLAIN JMP I .+1/(RXOK) /CONTINUE THERE RXOK /THROUGH HERE / RX50 WAIT ROUTINE. TAKES IMMEDIATE RETURN IF TRANSFER FLAG RAISES. TAKES / SKIP RETURN IF DONE FLAG RAISES. TAKES DOUBLE-SKIP RETURN IF AN ERROR OCCURS / OR THE HARDWARE TIMES OUT. RXWAIT, .-. TAD DTIMOUT/[-DTIME] /SETUP THE DCA T6 /TIME-OUT COUNTER DCA T7 /CLEAR INNER TIME-OUT COUNTER RXWATLP,STR /TRANSFER FLAG UP? SKP /SKIP IF NOT JMP I RXWAIT /YES, TAKE IMMEDIATE RETURN SDN /DONE FLAG UP? JMP RXWATING /NO, KEEP TRYING SER /YES, WERE THERE ERRORS? JMP RXSKIP /NO, TAKE SKIP RETURN JMP RXSKP2 /YES, TAKE DOUBLE SKIP RETURN RXWATIN,ISZ T7 /WAITING TOO LONG? JMP RXWATLP /NO, KEEP TRYING ISZ T6 /WAITED TOO LONG? JMP RXWATLP /NO, KEEP TRYING RXSKP2, ISZ RXWAIT /YES, TAKE DOUBLE-SKIP RETURN RXSKIP, ISZ RXWAIT /SET SKIP RETURN FOR DONE FLAG UP CONDITION JMP I RXWAIT /RETURN AS NECESSARY M100, -100 /CONSTANT 7700 TIMOUT, .-. /GENERAL TIME-OUT ROUTINE DCA T6 /CLEAR INNER COUNTER TAD M100/(-100) /SETUP THE DCA T7 /OUTER COUNTER TIMLUP, ISZ T6 /WAITING LONG ENOUGH? JMP TIMLUP /NO, KEEP GOING ISZ T7 /WAITED TOO LONG? JMP TIMLUP /NO, KEEP GOING JMP I TIMOUT /YES, RETURN TO CALLER L40, 40 /CONSTANT 0040 RXERROR,TAD L40/(40) /GET RX50 ERROR VALUE TAD ESTATUS /UPDATE CUMULATIVE ERROR STATUS DCA ESTATUS /STORE BACK RXOK, NL0010 CLL /SET CRT VALUE VIDCON /LOAD ECHRMOD CLA /CLEAN UP JMS I PENDUP/(ENDUP) /FINISH UP SCREEN DISPLAY (POSSIBLY ERRORS) JMS I PRDSETUP/(RDSETUP) /GET RD STARTUP CODE READ IN (IF PRESENT) JMS I PRXRDY/(RXRDY) /WAIT UNTIL DRIVE ZERO IS READY JMP .-1 /WAIT FOR IT TO BE READY INDEFINITELY JMS I PCLR23/[CLR23] /CLEAR FIELDS 2, 3 (AND BITS IN 13705, 13707) RTRK1, NL7777 /SETUP THE DCA XR0 /STORAGE POINTER CDF 00 /STORING IN FIELD 0 TAD Z102/[102] /GET EMPTY SILO (8-BIT) COMMAND DCA RXCMD /STASH IT / CLA /CALL WITH AC CLEAR (1-1) JMS FREAD /CALL FLOPPY READ ROUTINE -1-1 /ONE SECTOR 1 /ON TRACK 1 JMP RTRK1 /ERROR, TRY AGAIN JMS I PVALID8/(VALID8) /VALIDATE THE PREFERENCE SETTINGS JMP FLPBAD /FLOPPY IS BAD, GO COMPLAIN SLSHAGN,JMS RXLOAD /LOAD IN VARIOUS SLUSHWARE ITEMS JMP SLSHBAD /COULDN'T DO IT JMS I PCLR23/[CLR23] /CLEAR FIELDS 2, 3 (AND BITS IN 13705, 13707) CLA /CLEAN UP CIF CDF 00 /GOING TO FIELD 0 JMP I Z200/[200] /GO START IT UP PVALID8,VALID8 /POINTER TO VALIDATION ROUTINE PFBLINK,FBLINK /POINTER TO FBLINK ROUTINE PRXRDY, RXRDY /POINTER TO RX50 READY CHECK ROUTINE PRDSETU,RDSETUP /POINTER TO RD51 SETUP ROUTINE / COMES HERE TO DISPLAY A BLINKING BIG FLOPPY PATTERN IF THE CURRENT DISKETTE / HAS AN INVALID BOOT BLOCK IN TRACK 1, SECTOR 1. FLPBAD, JMS I PFBLINK/(FBLINK) /GO DISPLAY THE PATTERN ONCE JMP RTRK1 /TRY AGAIN / COMES HERE TO DISPLAY THE BIG FLOPPY PATTERN IF THE SLUSHWARE STUFF CAN'T BE / COMPLETELY READ IN. SLSHBAD,JMS I PFBLINK/(FBLINK) /GO DISPLAY THE PATTERN ONCE JMP SLSHAGN /TRY AGAIN PRXWAIT,RXWAIT /POINTER TO RX50 WAIT ROUTINE PENDUP, ENDUP /POINTER TO ENDUP ROUTINE RXLOAD, .-. /MULTIPLE RX50 LOADING ROUTINE NL7777 /SETUP THE DCA XR0 /STORAGE POINTER TAD Z102/[102] /SETUP THE DCA RXCMD /EMPTY BUFFER COMMAND (8-BIT) JMS I PT0S3RD/(T0S3RD) /READ AND VALIDATE TRACK 0, SECTOR 3 JMP I RXLOAD /COULDN'T DO IT, TAKE FAILURE RETURN JMS I PDOCG/(DOCG) /READ AND LOAD CHARACTER GENERATOR RAM DATA NL002A /SETUP 12-BIT EMPTY SILO COMMAND VALUE DCA RXCMD /STASH THE COMMAND NL7777 /SETUP THE DCA XR0 /DATA POINTER CDF 00 /SETUP THE DATA FIELD / CLA /CALL WITH AC CLEAR (1-1) JMS FREAD /CALL FLOPPY READ ROUTINE -12-1 /READ 10 SECTORS (1-10) 116 /TRACK 78 JMP I RXLOAD /COULDN'T DO IT, TAKE FAILURE RETURN CDF 00 /SETUP THE DATA FIELD / CLA /CALL WITH AC CLEAR (1-1) JMS FREAD /CALL FLOPPY READ ROUTINE -6-1 /READ 6 SECTORS (1-6) 117 /TRACK 79 JMP I RXLOAD /COULDN'T DO IT, TAKE FAILURE RETURN CDF 10 /SETUP THE DATA FIELD NL0006 /SETUP FOR SECTOR 7 FIRST JMS FREAD /CALL FLOPPY READ ROUTINE -12-1 /READ 4 SECTORS (7-10) 117 /TRACK 79 JMP I RXLOAD /COULDN'T DO IT, TAKE FAILURE RETURN CDF 00 /BACK TO PRIMARY CODE FIELD DCA XR0 /CLEAR THE POINTER JMS I PSLCHECK/(SLCHECK) /GO VALIDATE THE DATA JMP I RXLOAD /BAD DATA, TAKE FAILURE RETURN ISZ RXLOAD /GOOD DATA, BUMP RETURN ADDRESS JMP I RXLOAD /TAKE SKIP RETURN TO CALLER PSLCHEC,SLCHECK /POINTER TO SLUSHWARE VALIDATION ROUTINE PT0S3RD,T0S3RD /POINTER TO TRACK 0, SECTOR 3 READ ROUTINE PDOCG, DOCG /POINTER TO DOCG ROUTINE / RX50 READ ROUTINE. CALL WITH AC CONTAINING RELATIVE OFFSET ON THE TRACK OF / FIRST SECTOR TO TRANSFER. THIS IS ONE LESS THAN THE ACTUAL SECTOR NUMBER. / THE FIRST IN-LINE ARGUMENT IS THE LIMIT ON THE SECTOR COUNT, I.E., THE TWO'S / COMPLEMENT OF THE SECTOR VALUE ONE HIGHER THAN DESIRED AS THE LAST SECTOR / TRANSFERRED. THE DATA IS TRANSFERRED INTO THE SAME FIELD AS THE CURRENT DATA / FIELD. XR0 SHOULD BE SET TO THE DATA STORAGE ADDRESS -1. RXCMD SHOULD BE SET / TO A SILO EMPTY COMMAND, EITHER 8-BIT OR 12-BIT AS REQUIRED. THE COMMAND WILL / BE ISSUED CORRECTLY EITHER WAY. CONTROL IS RETURNED TO JUST PAST THE SECOND / ARGUMENT IF THERE IS AN ERROR. AN EXTRA SKIP RETURN IS PERFORMED IF THE READ / WAS OK. FREAD, .-. /FLOPPY READ ROUTINE DCA TINC /SAVE PASSED VALUE (SECTOR OFFSET ON TRACK) RDF /GET CALLING FIELD TAD ZCDF/[CDF] /FORM CDF CALLING FIELD DCA TRNCDF /STORE IN-LINE CDF 70 /BACK TO OUR FIELD TAD I FREAD /GET FIRST ARGUMENT (COUNT LIMIT) DCA T0 /STASH IT ISZ FREAD /BUMP TO NEXT TAD I FREAD /GET SECOND ARGUMENT (TRACK) DCA T1 /STASH IT ISZ FREAD /BUMP PAST ARGUMENT FNXTSCT,CDF 70 /BACK TO OUR FIELD ISZ TINC /BUMP SECTOR OFFSET TO LATEST SECTOR TAD TINC /GET THE LATEST OFFSET TAD T0 /COMPARE TO COUNT LIMIT SPA CLA /SKIP IF FINISHED JMP FNEXT /ELSE KEEP GOING ISZ FREAD /BUMP RETURN ADDRESS JMP I FREAD /TAKE SUCCESSFUL RETURN FNEXT, NL0006 /GET READ FUNCTION VALUE JMS I PRXCOMD/[RXCOMD] /CALL READ COMMAND ROUTINE SKP /SKIP IF COMMAND FINISHED JMP I FREAD /ELSE TAKE FAILURE RETURN SER /ANY ERRORS? JMP FRDOK /JUMP IF NOT FERR, JMS I PSSTRING/[SSTRING] /STORE PATTERN FOR BIG FLOPPY BIGFLPY /SCREEN DATA POINTER JMP I FREAD /TAKE FAILURE RETURN FRDOK, TAD RXCMD /GET SILO EMPTY COMMAND LCD /LOAD THE COMMAND NL0100 CLL /SET THE 8-BIT MASK AND RXCMD /ISOLATE THE BIT SNA CLA /SKIP IF SET JMP TRNCDF /JUMP IF NOT JMS I PRXWAIT/(RXWAIT) /CALL FLAG WAIT ROUTINE JMP COMFINISH /TRANSFER FLAG UP AS EXPECTED JMP FERR /DONE FLAG CAME UP, ERROR JMP FERR /TIME-OUT, ERROR COMFINI,XDR /FINISH THE COMMAND TRNCDF, HLT+.-. /WILL BE CDF XX INSTRUCTION TO BUFFER FIELD CLA /CLEAN UP FRDLUP, STR /TRANSFER FLAG UP? JMP TRYDONE /NO, TRY DONE FLAG XDR /YES, GET THE LATEST DCA I XR0 /STORE IT TRYDONE,SDN /DONE FLAG UP? JMP FRDLUP /NO, TRY TRANSFER SER /YES, ANY ERRORS? JMP FNXTSCT /NO, GO DO NEXT SECTOR JMP FERR /YES, GO COMPLAIN ZBLOCK 4 /EMPTY SPACE PAGE / AUTO-INDEXED POINTER TO PIE CHIP PROGRAMMING TABLE (TABLE FOLLOWS). PPTABLE,PTABLE-1 /POINTER TO PROGRAMMING TABLE. / PROGRAMMING NOTE: BY PLACING THIS POINTER HERE, AN EXTRANEOUS PAGE ZERO / REFERENCE TO THE POINTER IS REQUIRED, INSTEAD OF MERELY A POINTER TO THE TABLE / ON PAGE ZERO ITSELF. / PIE CHIP PROGRAMMING TABLE. PTABLE= . /PROGRAMMING TABLE HERE / FIRST CHIP. KEY^10+1004 /DEVICE 03 TTY^10+1004 /DEVICE 04 CLKCON^10+3000 /DEVICE 13 PRICON^10+3002 /DEVICE 32 PROCON^10+3007 /DEVICE 33 / SECOND CHIP. PORTIN^10+1002 /DEVICE 30 PORTOUT^10+1003 /DEVICE 31 PORTCON^10+3004 /DEVICE 36 RXCON^10+0004 /DEVICE 75 APUCON^10+1004 /DEVICE 14 / THIRD CHIP (CP INTERRUPTS ONLY). TTYCON^10+1000 /DEVICE 07 VIDINT^10+3000 /DEVICE 06 KBOCON^10+7003 /DEVICE 05 KBICON^10+7002 /DEVICE 11 VIDDEV^10+4004 /DEVICE 12 0 /THIS ENDS THE LIST / MEMORY COMPARE ROUTINE. / THIS ROUTINE CHECKS IF THE CURRENT TEST FIELD MATCHES THE TEST PATTERN IN / EVERY WORD. ALL MATCHING WORDS ARE INVERTED FOR THE NEXT TEST. THE IMMEDIATE / RETURN IS TAKEN ON A MATCH FAILURE; SKIP RETURN IS TAKEN IF ALL WORDS MATCH. MEMCOMP,.-. /MEMORY COMPARE ROUTINE TAD T2 /GET LATEST FIELD AND Z7/[7] /JUST FIELD BITS R3L /MOVE UP TAD ZCDF/[CDF] /FORM CDF INSTRUCTION DCA .+1 /STORE IN-LINE HLT+.-. /WILL BE CDF XX INSTRUCTION MCHKLP, TAD I T1 /GET A WORD TAD T0 /COMPARE TO TEST VALUE IAC /SHOULD BE ZERO SZA CLA /SKIP IF IT MATCHES JMP I MEMCOMPARE /TAKE IMMEDIATE RETURN IF IT FAILS TAD T0 /GET INVERTED TEST VALUE DCA I T1 /STORE BACK TAD T1 /GET ADDRESS TAD TINC /BUMP UP DCA T1 /STORE BACK ISZ XR0 /DONE ALL IN THIS FIELD JMP MCHKLP /NO, GO BACK FOR MORE ISZ MEMCOMPARE /YES, BUMP RETURN ADDRESS JMP I MEMCOMPARE /TAKE SKIP RETURN TO CALLER PROWTAB,ROWTABLE-1 /POINTER TO HIGH-ORDER ROW TABLE PREGLIS,REGLIST-1 /POINTER TO REGISTER AND CONTENTS LIST PROWADR,ROWADR-1 /POINTER TO ROWTABLE ADDRESS ROWLOAD,.-. /ROUTINE TO LOAD ROWTABLE AND VIDEO REGISTERS CLA CLL /CLEAN UP VIDCON /CLEAR SCREEN CONTROL REGISTER CDF 70 /ENSURE OUR FIELD TAD PROWADR/(ROWADR-1) /GET ROWTABLE TABLE POINTER DCA XR0 /STASH THE POINTER TAD PROWTABLE/(ROWTABLE-1) /GET HIGH-ORDER ROW ADDRESS TABLE VALUE DCA XR1 /STASH THE POINTER ROWLUP, TAD I XR1 /GET A LIST ELEMENT SPA /SKIP IF NOT AT END OF LIST JMP FHERE /JUMP IF AT END OF LIST MQL /STASH IT FOR NOW CDF 10 /GOTO TABLE FIELD TAD Z205/[205] /GET LOW-ORDER BITS VALUE DCA I XR0 /STASH IN TABLE CLA MQA /GET HIGH-ORDER AND ATTRIBUTES DCA I XR0 /STASH IN TABLE CDF 70 /BACK TO OUR FIELD JMP ROWLUP /KEEP GOING FHERE, CLA CLL /CLEAN UP TAD PREGLIST/(REGLIST-1) /POINT TO DCA XR0 /REGISTER LIST REGLUP, CDF 70 /BACK TO OUR FIELD TAD I XR0 /GET A LIST ITEM SPA /SKIP IF NOT END OF LIST JMP REGDONE /JUMP IF DONE LSCREG /LOAD REGISTER SELECT CLA /CLEAN UP TAD I XR0 /GET THE VALUE VLOAD /LOAD THE REGISTER WITH DESIRED VALUE CLA CLL /CLEAN UP JMP REGLUP /KEEP GOING REGDONE,CLA CLL /CLEAN UP JMP I ROWLOAD /RETURN / ROUTINE TO CLEAR CP FIELD 2 AND 3; ALSO CLEARS HIGH-ORDER HALF OF CP 13705 / AND 13707 TO MAKE THOSE LINES HAVE NORMAL ATTRIBUTES. CLR23, .-. /CLEAR FIELD 2, FIELD 3 ROUTINE CLA /CLEAN UP DCA T2 /CLEAR EVEN/ODD FIELD FLAG ZERNXT, NL7777 /SETUP FOR STORING DCA XR0 /INTO LOCATION 0000 OF THE LATEST FIELD JMS CDFSETUP /SETUP PROPER FIELD TAD Z7760/[-20] /SETUP THE DCA T3 /BUFFER COUNT BUFLUP, TAD Z7400/[-400] /SETUP FOR TWO PAGES WORTH DCA T4 /IN EACH BUFFER ZERLUP, DCA I XR0 /CLEAR A WORD ISZ T4 /DONE YET? JMP ZERLUP /NO, GO BACK ISZ T3 /DONE ENOUGH BUFFERS? JMP BUFLUP /NO, GO BACK TAD T2 /GET FLAG SZA CLA /SKIP IF ZERO JMP CLRFINISH /ELSE FINISH THERE NL7777 /SET THE FLAG DCA T2 /FOR NEXT FIELD JMP ZERNXT /GO DO IT AGAIN CDFSETU,.-. /CDF SETTING ROUTINE TAD T2 /GET THE FLAG SZA CLA /SKIP IF EVEN FIELD JMP SETODD /JUMP IF ODD CDF 20 /SETUP FOR FIELD 2 JMP I CDFSETUP /RETURN SETODD, CDF 30 /SETUP FOR FIELD 3 JMP I CDFSETUP /RETURN CLRFINI,JMS I PCLR2/(CLR2) /CLEAR ATTRIBUTE BITS OF 13705 AND 13707 JMP I CLR23 /RETURN PCLR2, CLR2 /POINTER TO CLR2 ROUTINE PTIMOUT,TIMOUT /POINTER TO TIME-OUT ROUTINE FBLINK, .-. /BIG FLOPPY DISPLAY ROUTINE NL0010 CLL /SET EXTENDED CHARACTER MODE VIDCON /LOAD NEW CONTROL VALUE CLA /CLEAN UP TAD BL40/(" &177) /GET SPACE CODE JMS I PSSTRING/[SSTRING] /CLEAR ALL ITEMS OF BIGFLPY /THE BIG FLOPPY PATTERN JMS I PTIMOUT/(TIMOUT) /GO WAIT FOR AWHILE JMS I PSSTRING/[SSTRING] /GO DISPLAY ALL ITEMS OF BIGFLPY /THE BIG FLOPPY PATTERN JMS I PTIMOUT/(TIMOUT) /GO WAIT FOR AWHILE JMP I FBLINK /RETURN BL40, " &177 /CONSTANT 0040 ZBLOCK 7 /EMPTY SPACE PAGE / ROUTINE TO VALIDATE THE CONTENTS OF TRACK ONE, SECTOR ONE AS A BOOTABLE / FLOPPY. THE FIRST FEW BYTES OF THIS SECTOR HAVE TO BE A VALID PREFERENCE / SETTING BLOCK IN ORDER TO ALLOW FURTHER BOOTING. NON-SKIP RETURN IS TAKEN IF / THE BYTES ARE BAD, SKIP RETURN IF THEY ARE GOOD. VALID8, .-. /TRACK ONE VALIDATION ROUTINE CDF 70 /RESET TO OUR FIELD (WHY?) NL7777 /SETUP POINTER TO 0000 DCA XR0 /STASH THE POINTER CDF 00 /GOTO THE DATA FIELD TAD I XR0 /GET THE FIRST BYTE TAD I XR0 /ADD TO THE SECOND BYTE CDF 70 /BACK TO OUR FIELD / THE SUM SHOULD BE ZERO MEANING THE TWO WORDS ARE THE TWO'S COMPLEMENT OF EACH / OTHER (OR ARE BOTH ZERO). SZA CLA /SKIP IF OK JMP I VALID8 /TAKE BAD RETURN IF NOT CDF 00 /GOTO THE DATA FIELD / THE NEXT BYTE IS TREATED AS A POINTER FOR LATER. TAD I XR0 /GET THE NEXT BYTE CLL RAL /*2 TAD XR0 /ADD 2 DCA XR1 /STASH THE POINTER FOR LATER / THE NEXT BYTE HAS TO BE 001. NL7777 /GET -1 TAD I XR0 /ADD ON NEXT BYTE CDF 70 /BACK TO OUR FIELD SZA CLA /SKIP IF IT MATCHES JMP I VALID8 /ELSE TAKE BAD RETURN / THE REST OF THE TESTED BYTES ARE POINTED TO THE THIRD BYTE. THE FOUR BYTES / SHOULD SUM TO 377. THE POINTER WAS INCREMENTED BY TWO INITIALLY, SO WE MAY / HAVE TO SUBTRACT TWO TO LOCATE THE PROPER FOUR BYTE SEQUENCE. VALAGN, DCA XR2 /SET TO 0000 (OR 7776) NL7777 /BACKUP TAD XR1 /ADD ON POINTER TAD XR2 /ADD 0000 OR 7776 DCA XR0 /STASH THE POINTER CDF 00 /GOTO THE DATA FIELD TAD I XR0 /\ TAD I XR0 / \GET THE NEXT TAD I XR0 / /FOUR BYTES TAD I XR0 // CDF 70 /BACK TO OUR FIELD IAC /ADD ONE AND Z377/[377] /JUST LOW-ORDER BITS SZA CLA /SKIP IF ALL TOGETHER IT'S ZERO JMP VALALT /JUMP IF NOT / HAVING LOCATED THE CORRECT FOUR BYTE SEQUENCE, CONFIRM THAT THE FIRST TWO HAVE / BIT[8] SET. NL7777 /BACKUP TAD XR1 /ADD ON POINTER TAD XR2 /ADD ON 0000 OR 7776 DCA XR0 /STASH THE POINTER CDF 00 /GOTO THE DATA FIELD NL0010 CLL /SET THE BIT MASK AND I XR0 /GET THE FIRST ONE'S BIT AND I XR0 /AND THE SECOND ONE'S BIT CDF 70 /BACK TO OUR FIELD SZA CLA /SKIP IF OFF ISZ VALID8 /BUMP TO GOOD RETURN JMP I VALID8 /RETURN EITHER WAY VALALT, TAD XR2 /GET THE OFFSET SZA CLA /SKIP IF ZERO JMP I VALID8 /RETURN IF 7776 WAS ALSO UNSUCCESSFUL NL7776 /SET -2 VALUE JMP VALAGN /TRY IT AGAIN / THIS IS THE LIST OF VALUES USED WITH LSCREG AND VLOAD IN PAIRS. REGLIST,26 /REGISTER 16 000 /DUMMY VALUE (DO A RESET) 00 /REGISTER 0 144-1 /100 CHARACTERS PER HORIZONTAL PERIOD 01 /REGISTER 1 120-1 /80 CHARACTERS PER DATA ROW 02 /REGISTER 2 016 /14 IS HORIZONTAL DELAY 03 /REGISTER 3 007 /7 IS HORIZONTAL SYNC WIDTH 04 /REGISTER 4 003 /3 IS VERTICAL SYNC WIDTH 05 /REGISTER 5 025 /21 IS VERTICAL DELAY 06 /REGISTER 6 022 /PINS 00, CURSOR SKEW 2, BLANK SKEW 2 07 /REGISTER 7 30-1 /24 VISIBLE DATA ROWS PER FRAME 10 /REGISTER 8 051 /SCAN LINES/FRAME 1, SCAN LINES/DATA ROW 9 11 /REGISTER 9 011 /9 SCAN LINES PER FRAME 12 /REGISTER A 160 /DMA BURST DELAY 7, DMA BURST COUNT 0 13 /REGISTER B 010 /OPERATION MODE 4 **** 0014 /REGISTER C ROWADR&377 /LOW-ORDER 8-BITS OF 13660 0015 /REGISTER D ROWADR%400+0220 /CONTIGUOUS ROW TABLE AT 13660 16 /REGISTER E 000 /LOW-ORDER AUXILIARY ADDRESS REGISTER 17 /REGISTER F 000 /HIGH-ORDER AUXILIARY ADDRESS REGISTER 20 /REGISTER 10 077 /SEQUENTIAL BREAK REGISTER DISABLE VALUE 21 /REGISTER 11 000 /PAGE BLANK, SMOOTH SCROLL CAN START AT 000 22 /REGISTER 12 030 /DATA ROW END PAST LINE 23 27 /REGISTER 17 000 /NO SMOOTH SCROLL OFFSET 30 /REGISTER 18 000 /CURSOR APPEARS VERTICAL AT 000 31 /REGISTER 19 000 /CURSOR APPEARS HORIZONTALLY AT 000 32 /REGISTER 1A 100 /ENABLE VERTICAL RETRACE INTERRUPTS 25 /REGISTER 15 000 /ISSUE START COMMAND 4000 /THIS ENDS THE LIST / THIS TABLE IS USED TO LOAD THE HIGH-ORDER BYTES OF THE CONTIGUOUS ROW ADDRESS / TABLE. THE FORMAT IS TWO ATTRIBUTE BITS AND SIX ADDRESS BITS. THE LOW-ORDER / ADDRESS BYTE IS ALWAYS 205. THE ATTRIBUTE BITS ARE: 00=NORMAL DATA ROW, / 01=SINGLE HEIGHT, DOUBLE WIDTH; 10=TOP OF DOUBLE HEIGHT, DOUBLE WIDTH; / 11=BOTTOM OF DOUBLE HEIGHT, DOUBLE WIDTH. ROWTABL,0141 /LINE 00 DATA STARTS AT 20605 (DOUBLE WIDTH) 0042 /LINE 01 DATA STARTS AT 21205 0043 /LINE 02 DATA STARTS AT 21605 0044 /LINE 03 DATA STARTS AT 22205 0045 /LINE 04 DATA STARTS AT 22605 0046 /LINE 05 DATA STARTS AT 23205 0047 /LINE 06 DATA STARTS AT 23605 0050 /LINE 07 DATA STARTS AT 24205 0051 /LINE 08 DATA STARTS AT 24605 0052 /LINE 09 DATA STARTS AT 25205 0053 /LINE 10 DATA STARTS AT 25605 0054 /LINE 11 DATA STARTS AT 26205 0055 /LINE 12 DATA STARTS AT 26605 0056 /LINE 13 DATA STARTS AT 27205 0057 /LINE 14 DATA STARTS AT 27605 0072 /LINE 15 DATA STARTS AT 35205 0061 /LINE 16 DATA STARTS AT 30605 0062 /LINE 17 DATA STARTS AT 31205 0063 /LINE 18 DATA STARTS AT 31605 0064 /LINE 19 DATA STARTS AT 32205 0065 /LINE 20 DATA STARTS AT 32605 0066 /LINE 21 DATA STARTS AT 33205 0067 /LINE 22 DATA STARTS AT 33605 0070 /LINE 23 DATA STARTS AT 34205 7777 /THIS ENDS THE LIST PAGE / STORE DISPLAY STRING ROUTINE. CALL WITH CLEAR AC TO DISPLAY VALUES IN / ARGUMENT LIST OR WITH 0040 IN AC TO BLANK THE FIELD. IN-LINE ARGUMENT IS A / POINTER TO THE ARGUMENT LIST. LIST FORMAT IS 0000 IF ITEMS ARE FOR FIELD 2, / OR 4000 IF ITEMS ARE FOR FIELD 3. RELATIVE STORAGE ADDRESS FOR SUBSEQUENT / ITEMS FOLLOWS THE 0000 OR 4000. ALL OTHER ITEMS ARE SEQUENTIAL VALUES TO / STORE INTO THE BUFFER STARTING AT THE GIVEN ADDRESS. ALL ADDRESSES ARE / RELATIVE TO THE ABSOLUTE VALUE 0205, NOT THE ACTUAL ROW ADDRESS WHICH IS / ALWAYS SOME NUMBER OF WHOLE PAGES DIFFERENT. ADDRESSES NEAR THE END OF A / FIELD WILL NOT BE CORRECTED TO THE NEXT FIELD. THE ARGUMENT LIST ENDS WITH / 7777. CONTROL RETURNS PAST THE IN-LINE POINTER ARGUMENT. SSTRING,.-. /STORE STRING FOR DISPLAY ROUTINE CDF 70 /ENSURE OUR FIELD DCA SPACSW /SAVE PASSED VALUE NL7777 /BACKUP FOR AUTO-INDEX TAD I SSTRING /GET ARGUMENT ADDRESS ISZ SSTRING /BUMP PAST ARGUMENT DCA XR7 /STASH THE POINTER SSLUP, TAD I XR7 /GET A WORD MQL /STASH IT FOR NOW CLA MQA /GET IT BACK IAC /ADD ONE FOR TEST SNA CLA /SKIP IF NOT AT END OF LIST (7777) JMP I SSTRING /RETURN IF AT END CLA MQA /GET THE VALUE AGAIN AND Z3777/[3777] /IGNORE HIGH-ORDER BIT FOR NOW SNA CLA /SKIP IF SOMETHING SET JMP SSADR /JUMP IF NOT TAD SPACSW /GET PASSED ARGUMENT SNA /SKIP IF IT WAS SET (A SPACE CHARACTER) CLA MQA /USE PASSED VALUE CDFINST,HLT+.-. /WILL BE CDF XX INSTRUCTION DCA I T5 /STORE IN BUFFER ISZ T5 /BUMP TO NEXT NOP /JUST IN CASE IT SKIPS CDF 70 /BACK TO OUR FIELD JMP SSLUP /KEEP GOING SSADR, TAD I XR7 /GET NEXT WORD AFTER FLAG WORD DCA T5 /STASH AS ADDRESS CLA MQA /GET THE WORD SPA CLA /SKIP IF IT FLAG WORD IS ZERO TAD Z10/[10] /MAKE IT CDF 30 TAD CDF20/(CDF 20) /GET CDF 20 DCA CDFINST /STORE CDF 20 OR CDF 30 IN-LINE TAD T5 /GET ADDRESS WORD TAD Z205/[205] /ADD OFFSET DCA T5 /STORE BACK JMP SSLUP /KEEP GOING CDF20, CDF 20 /CONSTANT 6221 SPACSW, .-. /PASSED SPACE PARAMETER / DATA PATTERN THAT LOOKS LIKE A BIG FLOPPY (USED FOR ERROR DISPLAY). BIGFLPY,0000 /FIELD 2 1445 /ADDRESS 0015 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0014 0000 /FIELD 2 2045 /ADDRESS 0031 0000 /FIELD 2 2070 /ADDRESS 0015 0022 0022 0022 0022 0022 0014 0031 0000 /FIELD 2 2445 /ADDRESS 0031 0000 /FIELD 2 2470 /ADDRESS 0031 0000 /FIELD 2 2476 /ADDRESS 0031 0031 0000 /FIELD 2 3045 /ADDRESS 0031 0000 /FIELD 2 3070 /ADDRESS 0031 0000 /FIELD 2 3076 /ADDRESS 0031 0031 0000 /FIELD 2 3445 /ADDRESS 0031 0000 /FIELD 2 3462 /ADDRESS 4025 0000 /FIELD 2 3470 /ADDRESS 0016 0022 0022 0022 0022 0022 0013 0031 0000 /FIELD 2 4045 /ADDRESS 0031 0000 /FIELD 2 4060 /ADDRESS 4026 4031 0000 /FIELD 2 4063 /ADDRESS 4031 4026 0000 /FIELD 2 4072 /ADDRESS 0015 0022 0022 0022 0014 0031 0000 /FIELD 2 4445 /ADDRESS 0031 0050 " +200 " +200 " +200 " +200 " +200 0051 0000 /FIELD 2 4460 /ADDRESS 4027 0000 /FIELD 2 4464 /ADDRESS 4027 0000 /FIELD 2 4472 /ADDRESS 0031 0000 /FIELD 2 4476 /ADDRESS 0031 0031 0000 /FIELD 2 5045 /ADDRESS 0031 0000 /FIELD 2 5061 /ADDRESS 4030 4027 4030 0000 /FIELD 2 5072 /ADDRESS 0031 0000 /FIELD 2 5076 /ADDRESS 0031 0031 0000 /FIELD 2 5445 /ADDRESS 0031 0000 /FIELD 2 5460 /ADDRESS 0007 0000 /FIELD 2 5472 /ADDRESS 0031 0000 /FIELD 2 5476 /ADDRESS 0031 0031 0000 /FIELD 2 6045 /ADDRESS 0031 0000 /FIELD 2 6072 /ADDRESS 0031 0000 /FIELD 2 6076 /ADDRESS 0031 0031 0000 /FIELD 2 6445 /ADDRESS 0031 0000 /FIELD 2 6472 /ADDRESS 0031 0000 /FIELD 2 6476 /ADDRESS 0031 0031 0000 /FIELD 2 7045 /ADDRESS 0031 0000 /FIELD 2 7070 /ADDRESS 0015 0014 0016 0022 0022 0022 0013 0031 0000 /FIELD 2 7445 /ADDRESS 0016 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0022 0013 0016 0022 0022 0022 0022 0022 0013 7777 /END OF LIST / ERROR NUMBER DISPLAY LIST. EDISPLI,0000 /FIELD 2 5422 /ADDRESS .-. /HIGH-ORDER ERROR DIGIT .-. /LOW-ORDER ERROR DIGIT 0000 /FIELD 2 6022 /ADDRESS J00, 0040+.-. /HIGH-ORDER ERROR DIGIT J01, 0040+.-. /LOW-ORDER ERROR DIGIT 7777 /END OF LIST / NON-ERROR (DECMATE II LOGO) DISPLAY LIST. DMLOGO, 0000 /FIELD 2 5415 /ADDRESS " +200 "D+200 "E+200 "C+200 "M+240 "A+240 "T+240 "E+240 " +200 "I+200 "I+200 " +200 0000 /FIELD 2 6015 /ADDRESS " +200 "D+200 "E+200 "C+200 "M+240 "A+240 "T+240 "E+240 " +200 "I+200 "I+200 " +200 7777 /END OF LIST L23, 23 /CONSTANT 0023 L247, 247 /CONSTANT 0247 L202, 202 /CONSTANT 0202 L460, "0+200 /CONSTANT 0460 ENDUP, .-. /FINISH UP ROUTINE CLA CLL /CLEAN UP JMS I PSET2/(SET2) /SET ATTRIBUTE BITS IN 13705, 13707 TAD ESTATUS /GET ERROR STATUS SNA CLA /SKIP IF ANY PROBLEMS JMP NOERRORS /JUMP IF NONE DCA XR0 /CLEAR QUOTIENT TAD ESTATUS /GET ERROR STATUS APTSKP /AUTOMATIC PRODUCT TEST? SKP /SKIP IF NOT JMP I PAPT2/(APTRO2) /ELSE GO THERE SUBLUP, TAD Z7766/[7766] /SUBTRACT 10 SPA /GONE TOO FAR? JMP ADDFIX /YES, GO THERE TO FIX UP ISZ XR0 /NO, BUMP QUOTIENT JMP SUBLUP /KEEP GOING ADDFIX, TAD Z12/[12] /RESTORE VALUE TAD L460/("0+200) /MAKE IT ASCII WITH ATTRIBUTES SET DCA I LOW1/(EDISPLIST+3) /STORE IN BUFFER TAD I LOW1/(EDISPLIST+3) /GET IT BACK DCA I LOW2/(EDISPLIST+7) /STORE THERE ALSO TAD XR0 /GET QUOTIENT TAD L460/("0+200) /MAKE IT ASCII WITH ATTRIBUTES SET DCA I HIGH1/(EDISPLIST+2) /STORE IN BUFFER TAD I HIGH1/(EDISPLIST+2) /GET IT BACK DCA I HIGH2/(EDISPLIST+6) /STORE THERE ALSO TAD L23/(23) /GET KEYBOARD CODE TO LIGHT LEDS KBOLS /SEND IT TO KEYBOARD DCA XR2 /CLEAR WAIT COUNTER ISZ XR2 /WAITING LONG ENOUGH? JMP .-1 /NO, KEEP GOING TAD L202/(202) /GET KEYBOARD CODE FOR LED PATTERN KBOLS /SEND IT TO KEYBOARD CLA /CLEAN UP JMS I PSSTRING/[SSTRING] /CALL STRING STORE FOR DISPLAY ROUTINE EDISPLIST /ERROR DIGITS DISPLAY LIST POINTER KBISF /KEYBOARD FLAG UP? JMP .-1 /NO, WAIT FOR IT KBIRB /YES, READ IN THE CHARACTER CLA /THROW IT AWAY JMP I ENDUP /RETURN / COMES HERE IF NO ERRORS FOUND EARLIER. NOERROR,APTSKP /AUTOMATIC PRODUCT TESTING? JMP NOTAPT /JUMP IF NOT JMS I PAPTROUTINE/[APTROUTINE]/CALL ROUTINE IF SO JMP I .+1/(PRGDONE) /GO THERE PRGDONE /THROUGH HERE NOTAPT, TAD L247/(247) /GET KEYBOARD CODE FOR THE BEEPER KBOLS /SEND IT CLA /CLEAN UP JMS I PSSTRING/[SSTRING] /DISPLAY THE DMLOGO /DECMATE II LOGO JMP I ENDUP /RETURN PSET2, SET2 /POINTER TO 2-WORD ATTRIBUTE BITS SET ROUTINE LOW1, EDISPLIST+3 /POINTER TO LOW-ORDER DIGIT STORAGE (1) LOW2, EDISPLIST+7 /POINTER TO LOW-ORDER DIGIT STORAGE (2) HIGH1, EDISPLIST+2 /POINTER TO HIGH-ORDER DIGIT STORAGE (1) HIGH2, EDISPLIST+6 /POINTER TO HIGH-ORDER DIGIT STORAGE (2) PAPT2, APTRO2 /POINTER TO APTROUTINE ERROR HANDLING ENTRY / CP-INTERRUPT HANDLER FOR DOWN-LOADED CODE. THE DOWNLOADED CODE EXITS VIA A / HLT INSTRUCTION OR PANEL REQUEST. HLT ENDS THE EXECUTION AND RETURNS CONTROL / TO OUR CODE; PANEL REQUEST CAUSES A TOTAL RESTART OF ALL MOVED ROM CODE. CPIHND, DCA XR7 /SAVE AC GCF /GET CURRENT FIELDS, ETC. STATUS DCA XR6 /STASH IT PRS /GET PANEL STATUS DCA XR0 /STASH IT SPD /CP INDIRECTS FROM NOW ON TAD XR0 /GET STATUS BACK SMA /SKIP IF BOOTSTRAP (CPREQ) SET JMP HALTEST /JUMP IF NOT CLA /CLEAN UP VSF /SKIP ON, CLEAR VIDEO INTERRUPT FLAG NOP /IN CASE IT SKIPS TTYSF /SKIP ON, CLEAR TTY: TRAP FLAG NOP /IN CASE IT SKIPS KBISF /SKIP ON, CLEAR KEYBOARD INPUT FLAG NOP /IN CASE IT SKIPS KBOSF /SKIP ON, CLEAR KEYBOARD OUTPUT FLAG NOP /IN CASE IT SKIPS TAD XR6 /GET FIELDS BACK RTF /RESTORE THEM TAD XR7 /RESTORE AC PEX /LEAVING PANEL MEMORY JMP I INTADR /RETURN TO INTERRUPTED MAIN MEMORY PROGRAM HALTEST,CIF CDF 70 /STAYING IN OUR FIELD AND L200/(200) /JUST HLTFLG BIT SNA CLA /SKIP IF SET JMP I L200/(CODESTART) /JUMP IF NOT (PANEL REQUEST) PG0 /RESET RUN FLIP-FLOP JMP I .+1/(DWNENTRY) /GO THERE DWNENTRY /THROUGH HERE L200, 200/CODESTART /CONSTANT 0200 0000 /THIS ENDS THE LIST OF INSTRUCTIONS TO MOVE ZBLOCK 2 /EMPTY SPACE PAGE / INTERRUPT-DRIVEN LOOPBACK TEST ROUTINE. MOVED TO MAIN MEMORY FIELD 0. LBLOAD= . /WHERE WE ARE NOW RELOC 0200 /WHERE THIS EXECUTES IN MAIN MEMORY FIELD 0 LBTEST, CAF /CLEAN UP PRIRB /READ PRINTER INPUT NOW HLT /STOP NOW HLTPC, NL0004 /THIS SHOULD BE SKIPPED BECAUSE OF CP ROUTINES VFL /SET VIDEO INTERRUPT FLAG VIDPC, NL0004 /THIS SHOULD BE SKIPPED BECAUSE OF CP ROUTINES KRS /DO A TRAPPED KEYBOARD INSTRUCTION TTYPC, NL0004 /THIS SHOULD BE SKIPPED BECAUSE OF CP ROUTINES KBOFL /SET KEYBOARD OUTPUT FLAG KBOIPC, NL0004 /THIS SHOULD BE SKIPPED BECAUSE OF CP ROUTINES KBIFL /SET KEYBOARD INPUT FLAG KBIPC, NL0004 /THIS SHOULD BE SKIPPED BECAUSE OF CP ROUTINES DCA TSTATUS /SAVE AC TEST STATUS TAD LB20/(20) /GET LOOPBACK ENABLE VALUE VIDCON /MAKE THE INTERFACES LOOP BACK CLA /CLEAN UP NL0001 /SET INTERRUPT ENABLE BIT CLIE /ENABLE CLOCK INTERRUPTS DCA CSTATUS /SET INITIAL COUNT STATUS TAD L17/(17) /GET BAUD RATE VALUE FOR 19200 BAUD PRSB /SET BAUD RATE CLA CLL /CLEAN UP DCA CTMP1 /CLEAR INITIAL OUTPUT CHARACTER TAD JMPI2/(JMP I INT2) /GET INTERRUPT INSTRUCTION DCA INT1 /STORE IN INTERRUPT STARTUP TAD PINTHND/(INTHND) /GET INTERRUPT ADDRESS DCA INT2 /STORE IN INTERRUPT POINTER DCA TIMEOUT /CLEAR TIME-OUT COUNTER DCA CLKTICK /CLEAR CLOCK-TICK COUNTER TAD CTMP1 /GET OUTPUT CHARACTER PROPC /OUTPUT TO PRINTER PORT DCA CTMP2 /SAVE AS INITIAL INPUT TEST VALUE ALSO ION /TURN ON INTERRUPTS ISZ TIMEOUT /DONE WAITING YET? JMP .-1 /NO, KEEP WAITING JMP TIMCHK /WE'RE DONE, FINISH IT THERE PINTHND,INTHND /POINTER TO INTERRUPT HANDLER JMPI2, JMP I INT2 /INTERRUPT STARTUP INSTRUCTION L377, 377 /CONSTANT 0377 LB20, 20 /LOOPBACK ENABLE VALUE / INTERRUPTS COME HERE. INTHND, CLSK /CLOCK FLAG UP? SKP /SKIP IF NOT JMP DOCLK /JUMP IF SO PROSKP /PRINTER OUTPUT FLAG UP? SKP /SKIP IF NOT JMP PROINT /JUMP IF SO PRISKP /PRINTER INPUT FLAG UP? JMP INTXIT /JUMP IF NOT PRISKP /SKIP ON, CLEARING THE FLAG NOP /HERE IN CASE IT SKIPS PRIRB /GET THE CHARACTER CIA /INVERT FOR TESTING TAD CTMP2 /COMPARE TO TEST VALUE AND L377/(377) /JUST DATA BITS SZA CLA /SKIP IF IT MATCHES PRIIE /PREVENT FURTHER PRINTER INPUT INTERRUPTS TAD CTMP2 /GET LATEST COUNT PATTERN VALUE JMS COUNTUP /GET NEXT IN THE PATTERN JMP COUNTDONE /AT END OF COUNT PATTERN DCA CTMP2 /STORE UPDATED VALUE DCA TIMEOUT /RESET TIME-OUT COUNTER INTXIT, ION /RE-ENABLE INTERRUPTS JMP I INTADR /BACK TO INTERRUPTED CODE DOCLK, CLSK /MAKE SURE CLOCK FLAG CLEARS NOP /IN CASE IT SKIPS ISZ CLKTICK /COUNT THIS TICK L17, 17 /19200 BAUD RATE VALUE; HERE IN CASE IT SKIPS JMP INTXIT /CONTINUE THERE PROINT, PROSKP /SKIP ON, CLEARING PRINTER OUTPUT FLAG NOP /JUST IN CASE IT SKIPS TAD CTMP1 /GET COUNT PATTERN VALUE JMS COUNTUP /GET NEXT IN THE PATTERN SKP /AT END OF COUNT PATTERN JMP NEXTOUT /JUMP IF NOT AT END PROIE /PREVENT FURTHER PRINTER OUTPUT INTERRUPTS JMP INTXIT /CONTINUE THERE NEXTOUT,DCA CTMP1 /SAVE NEW VALUE TAD CTMP1 /GET IT BACK PROLS /OUTPUT IT JMP INTXIT /CONTINUE THERE / COMES HERE WHEN ALL CHARACTER VALUES USED. COUNTDO,DCA CSTATUS /CLEAR COUNT STATUS / COMES HERE WHEN NULL JOB TIMES OUT. TIMCHK, NL7776 /SETUP VALUE TAD CLKTICK /COMPARE TO CLOCK TICK COUNT SPA CLA /SKIP IF >=2 NL002A /SET STATUS BIT IF NOT TAD CSTATUS /GET COUNT STATUS EITHER WAY DCA CSTATUS /STORE BACK CAF /CLEAR ALL FLAGS NOW TAD CSTATUS /GET COUNT STATUS TAD TSTATUS /GET CP TEST STATUS PRQ3 /DO A PANEL REQUEST TO EXIT JMP . /WILL HANG HERE IF IT FAILS! COUNTUP,.-. /PATTERN COUNT ROUTINE DCA PATTERN /SAVE PASSED VALUE TAD PATTERN /GET IT BACK IAC /ADD ONE AND L377/(377) /JUST GOOD BITS SNA /SKIP IF NOT AT END JMP I COUNTUP /TAKE IMMEDIATE RETURN IF AT END DCA PATTERN /SAVE UPDATED VALUE ISZ COUNTUP /BUMP RETURN ADDRESS TAD PATTERN /GET NEW PATTERN VALUE JMP I COUNTUP /TAKE SKIP RETURN TO CALLER LBTEND= . /END OF CODE TO BE MOVED RELOC LBTEND-LBTEST+LBLOAD /RE-ESTABLISH ORIGIN / SUBROUTINE TO SET HIGH-ORDER BITS IN CP 13705 AND 13707. BIT[4] IS SET IN / 13705; BITS[4-5] ARE SET IN 13707. THIS MAKES THE LINES INTO DOUBLE-HEIGHT, / DOUBLE WIDTH UPPER AND LOWER HALVES RESPECTIVELY. THIS ROUTINE DEPENDS ON THE / PREVIOUS CONTENTS OF THE BITS BEING ZERO. SET2, .-. /SET HIGH BITS IN 2 WORDS ROUTINE CDF 10 /GOTO BUFFER FIELD TAD I L3705/(3705) /GET CURRENT CONTENTS OF 13705 TAD Z200/[200] /ADD ON A HIGH-ORDER BIT DCA I L3705/(3705) /STORE BACK TAD I L3707/(3707) /GET CURRENT CONTENTS OF 13707 TAD L300/(300) /ADD ON HIGH-ORDER BITS DCA I L3707/(3707) /STORE BACK CDF 70 /BACK TO OUR FIELD JMP I SET2 /RETURN L3705, 3705 /CONSTANT 3705 L3707, 3707 /CONSTANT 3707 L300, 300 /CONSTANT 0300 L77, 77 /CONSTANT 0077 / SUBROUTINE TO CLEAR THE ATTRIBUTE BITS OF CP 13705 AND 13707. THIS MAKES THE / CORRESPONDING LINES NORMAL WIDTH AND HEIGHT. CLR2, .-. /CLEAR BITS IN TWO WORDS ROUTINE. CDF 10 /GOTO BUFFER FIELD TAD I L3705/(3705) /GET CURRENT CONTENTS OF 13705 AND L77/(77) /JUST KEEP LOW-ORDER HALF DCA I L3705/(3705) /STORE BACK TAD I L3707/(3707) /GET CURRENT CONTENTS OF 13707 AND L77/(77) /JUST KEEP LOW-ORDER HALF DCA I L3707/(3707) /STORE BACK CDF 70 /BACK TO OUR FIELD JMP I CLR2 /RETURN ZBLOCK 1 /EMPTY SPACE PAGE / CP-INTERRUPT HANDLER FOR MAIN MEMORY LOOPBACK TEST. CPLOAD= . /CP-INTERRUPT HANDLER LOADS HERE RELOC 4000 /WHERE THIS EXECUTES IN FIELD 0 CPINT= . /CP-INTERRUPT HANDLER CODE EXECUTES HERE CPINT, DCA XR7 /SAVE AC PRS /GET STATUS DCA XR0 /SAVE IT SPD /WANT OUR OWN INDIRECTS CIF CDF 00 /SET OUR OWN FIELD TAD XR0 /GET STATUS RAL /MOVE UP SZL /SKIP IF BOOTSTRAP NOT SET JMP TESTCP /JUMP IF IT IS SPA /SKIP IF PANEL REQUEST NOT SET JMP PRQEXIT /JUMP IF IT IS SET R3L /MOVE UP SPA CLA /SKIP IF HALT TRAP NOT SET JMP TESTHLT /JUMP IF IT IS SET CDF CIF 70 /BACK TO OUR FIELD JMP I PLBDONE/(LBDONE) /RETURN TO CALLER PLBDONE,LBDONE /POINTER TO CALLER OF TEST / AT THIS POINT, THE SO-CALLED "BOOTSTRAP" CONDITION IS SET, WHICH MEANS THAT / ONE OF THE CPREQ'S FROM THE THIRD PIE CHIP HAS OCCURRED. TESTCP, CLA /CLEAN UP VSF /VIDEO INTERRUPT? JMP TSTTRAP /NO, TRY OTHERS CLA /CLEAN UP VIE /PREVENT FURTHER VIDEO INTERRUPTS TAD PVIDPC/(VIDPC) /GET EXPECTED INTERRUPTED ADDRESS CIA /INVERT FOR COMPARISON TAD INTADR /COMPARE TO ACTUAL INTERRUPT PC SNA CLA /SKIP IF OTHER THAN EXPECTED JMP BUMPIT /JUMP IF OK / INTERRUPT PC WRONG. JMP JUSTEXIT /CONTINUE THERE TSTTRAP,TTYSF /DEVICE 03, 04 TRAP FLAG SET? JMP TSTKYIN /JUMP IF NOT TTYIE /PREVENT FURTHER TTY: TRAP INTERRUPTS TAD PTTYPC/(TTYPC) /GET EXPECTED INTERRUPTED ADDRESS CIA /INVERT FOR COMPARISON TAD INTADR /COMPARE TO ACTUAL INTERRUPT PC SNA CLA /SKIP IF OTHER THAN EXPECTED JMP BUMPIT /JUMP IF OK / INTERRUPT PC WRONG. JMP JUSTEXIT /CONTINUE THERE TSTKYIN,KBISF /KEYBOARD INPUT FLAG SET? JMP TSTKYOUT /NO, TRY OUTPUT KBIIE /PREVENT FURTHER KEYBOARD INPUT INTERRUPTS TAD PKBIPC/(KBIPC) /GET EXPECTED INTERRUPTED ADDRESS CIA /INVERT FOR COMPARISON TAD INTADR /COMPARE TO ACTUAL INTERRUPT PC SNA CLA /SKIP IF OTHER THAN EXPECTED JMP BUMPIT /JUMP IF OK / INTERRUPT PC WRONG. JMP JUSTEXIT /CONTINUE THERE TSTKYOU,KBOSF /KEYBOARD OUTPUT FLAG SET? JMP JUSTEXIT /NO, FORGET IT KBOIE /PREVENT FURTHER KEYBOARD OUTPUT INTERRUPTS TAD PKBOIPC/(KBOIPC) /GET EXPECTED INTERRUPTED ADDRESS CIA /INVERT FOR COMPARISON TAD INTADR /COMPARE TO ACTUAL INTERRUPT PC SNA CLA /SKIP IF OTHER THAN EXPECTED / COMES HERE TO BUMP THE PC PAST THE NL0004 INSTRUCTIONS IF THE PROPER INTERRUPT / ADDRESS WAS PRESENT AT THE POINT OF INTERRUPT. BUMPIT, ISZ INTADR /BUMP INTERRUPTED ADDRESS / SKIPS PREVIOUS TO EXIT NORMALLY; THIS COULD POSSIBLY BE CONSIDERED AN ERROR. JUSTEXI,PEX /EXITING FROM PANEL MEMORY JMP I INTADR /BACK TO INTERRUPTED MAIN MEMORY PROGRAM / COMES HERE IF THE HALT FLAG WAS SET TESTHLT,CLA /CLEAN UP PG0 /RESET THE HALT FLAG TAD PHLTPC/(HLTPC) /GET EXPECTED INTERRUPTED ADDRESS CIA /INVERT FOR COMPARISON TAD INTADR /COMPARE TO ACTUAL INTERRUPT PC SNA CLA /SKIP IF OTHER THAN EXPECTED JMP BUMPIT /JUMP IF OK / INTERRUPT PC WRONG. JMP JUSTEXIT /CONTINUE THERE / COMES HERE IF MAIN MEMORY PROGRAM EXITED VIA PANEL REQUEST. PRQEXIT,CLA /CLEAN UP TAD XR7 /RESTORE EXITING AC CIF CDF 70 /BACK TO OUR FIELD JMP I PLBDONE/(LBDONE) /RETURN TO CALLER PVIDPC, VIDPC /EXPECTED PC FOR VIDEO INTERRUPT PTTYPC, TTYPC /EXPECTED PC FOR TTY: TRAP INTERRUPT PKBIPC, KBIPC /EXPECTED PC FOR KEYBOARD INPUT INTERRUPT PKBOIPC,KBOIPC /EXPECTED PC FOR KEYBOARD OUTPUT INTERRUPT PHLTPC, HLTPC /EXPECTED PC FOR HALT INTERRUPT CPEND= . /END OF CP-INTERRUPT HANDLER CODE THAT OUGHT /TO BE MOVED RELOC CPEND-CPINT+CPLOAD /RE-ESTABLISH ORIGIN / THIS ROUTINE READS IN TRACK 0, SECTOR 3 INTO CP 15350-16347. THE FIRST EIGHT / BYTES ARE VALIDATED AGAINST A KNOWN PATTERN. ALL ELEMENTS READ IN AS 377 ARE / REPLACED WITH 4000 IN THE RUNNING COPY. T0S3RD, .-. /TRACK 0, SECTOR 3 READ ROUTINE TAD PT0S3BUFF/(T0S3BUFFER-1)/SETUP THE DCA XR0 /DATA STORAGE POINTER CDF 10 /SET THE DATA FIELD FOR THE TRANSFER NL002A /SET SECTOR OFFSET (3-1) JMS I PFREAD/(FREAD) /CALL FLOPPY READ ROUTINE -3-1 /SECTOR THREE IS THE LAST ONE 0 /TRACK 0000 JMP I T0S3RD /ERROR, TAKE NON-SKIP RETURN TAD PT0S3DATA/(T0S3DATA-1) /SETUP THE VALIDATION LIST VALUE DCA XR0 /STASH THE POINTER TAD PT0S3BUFF/(T0S3BUFFER-1)/POINT TO THE DCA XR1 /READ-IN DATA LISTLUP,TAD I XR0 /GET A TEST VALUE SNA /END OF LIST? JMP LISTOK /JUMP IF SO CDF 10 /GOTO DATA FIELD TAD I XR1 /COMPARE TO READ-IN VALUE CDF 70 /BACK TO OUR FIELD SZA CLA /SKIP IF IT MATCHES JMP I T0S3RD /TAKE FAILURE RETURN IF NOT JMP LISTLUP /KEEP GOING LISTOK, JMS I PRUBCHK/(RUBCHK) /REPLACE ALL 377 CODES WITH 4000 ISZ T0S3RD /BUMP TO SUCCESSFUL RETURN JMP I T0S3RD /TAKE SKIP-RETURN TO CALLER PFREAD, FREAD /POINTER TO FLOPPY READ ROUTINE PT0S3DA,T0S3DATA-1 /POINTER TO TEST DATA FOR TRACK 0, SECTOR 3 PT0S3BU,T0S3BUFFER-1 /POINTER TO TRACK 0, SECTOR 3 LOADING ADDRESS PRUBCHK,RUBCHK /POINTER TO RUBCHK ROUTINE / COMES BACK HERE AFTER LOADING THE CHARACTER GENERATOR RAM TO EXIT. CGDONE, JMP I DOCG /RETURN TO ORIGINAL CALLER PT0S7DA,T0S7DATA-1 /POINTER TO TEST DATA FOR TRACK 0, SECTOR 7 PUSEDAT,USEDATA /POINTER TO USE DATA ROUTINE PNODATA,NODATA /POINTER TO NO DATA ROUTINE / THE CHARACTER GENERATOR RAM LOAD ROUTINE IS ENTERRED HERE. DOCG, .-. /CHARACTER GENERATOR RAM LOAD ROUTINE NL7777 /SETUP THE DCA XR0 /STORE POINTER CDF 00 /GOTO DATA FIELD NL0006 /SET OFFSET FOR SECTOR 7 (7-10) JMS I PFREAD/(FREAD) /CALL FLOPPY READ ROUTINE -12-1 /WANT SECTORS 7-10 0 /ON TRACK 0 JMP I PNODATA/(NODATA) /ERROR, TRY TO KEEP GOING / THE DATA READ IN OK, SO VALIDATE IT. TAD PT0S7DATA/(T0S7DATA-1) /SETUP THE DCA XR0 /TEST DATA POINTER NL7777 /SETUP THE DCA XR1 /DATA POINTER TSTDLUP,TAD I XR0 /GET A TEST WORD SNA /SKIP IF NOT AT END OF LIST JMP I PUSEDATA/(USEDATA) /END OF LIST, GO USE GOOD DATA CDF 00 /GOTO DATA FIELD TAD I XR1 /COMPARE DATA TO TEST WORD CDF 70 /BACK TO OUR FIELD SNA CLA /SKIP IF NO MATCH JMP TSTDLUP /KEEP GOING IF IT MATCHES / THE DATA ISN'T VALID, SO IGNORE IT AS IF IT HAD BEEN AN I/O ERROR. JMP I PNODATA/(NODATA) /CONTINUE THERE PAGE / COMES HERE TO CLEAR THE DATA WHICH WAS EITHER INVALID OR COULDN'T GET READ IN. / BETTER TO CLEAR THE TABLE THAN LEAVE IT AT RANDOM. NODATA, DCA CGPTR /CLEAR THE DATA POINTER CLRLUP, CDF 00 /GOTO DATA FIELD DCA I CGPTR /CLEAR A WORD ISZ CGPTR /DONE ALL YET? JMP CLRLUP /NO, GO BACK / COMES HERE TO LOAD THE CHARACTER GENERATOR RAM FROM (HOPEFULLY) THE READ-IN / DATA (OR JUST ZEROES IF IT WASN'T READABLE). USEDATA,CDF 70 /GOTO OUR FIELD / WE HAVE TO CLEAR THE FIRST ROW OF DATA BECAUSE IT ISN'T A PART OF THE USEFUL / DATA (VERIFICATION HEADER AND OTHER JUNK). NL7777 /SETUP THE DCA XR0 /DATA POINTER TAD Z7760/[-20] /SETUP THE DCA XR1 /ROW COUNTER CDF 00 /GOTO THE DATA FIELD CLRIT, DCA I XR0 /CLEAR A WORD ISZ XR1 /DONE ENOUGH? JMP CLRIT /NO, GO BACK TAD L110/(110) /DISABLE SCREEN AND ENABLE CG RAM VIDCON /LOAD VIDEO CONTROL NL7777 /SETUP THE DCA XR0 /DATA POINTER DCA CGPTR /CLEAR CG RAM ADDRESS POINTER CGLDLP, TAD PCGINDX/(CGINDX-1) /SETUP THE DCA XR2 /INDEX POINTER TAD Z7760/[-20] /SETUP THE DCA XR1 /LINE COUNT NXTLINE,CDF 70 /BACK TO OUR (ODD) FIELD TAD I XR2 /GET AN INDEX TAD CGPTR /ADD ON CURRENT CHARACTER BASE CGLOAD /LOAD CHARACTER GENERATOR ADDRESS CLA /CLEAN UP CDF 00 /GOTO (EVEN) FIELD 0 TAD I XR0 /GET LATEST CELL DATA LINE CGLOAD /LOAD CHARACTER GENERATOR VALUE CLA /CLEAN UP ISZ XR1 /DONE ALL LINES YET? JMP NXTLINE /NO, GO BACK TAD Z20/[20] /SETUP CHARACTER UPDATE TAD CGPTR /ADD TO CHARACTER ADDRESS DCA CGPTR /STORE BACK TAD CGPTR /GET THE POINTER SMA CLA /SKIP IF DONE ALL 2048 LINES JMP CGLDLP /JUMP IF NOT DONE YET NL0010 CLL /SETUP RAM ENABLE AND SCREEN ENABLE VIDCON /LOAD NEW CONTROL VALUE CLA /CLEAN UP JMP I .+1/(CGDONE) /GO THERE CGDONE /THROUGH HERE L110, 110 /CONSTANT 0110 PCGINDX,CGINDX-1 /POINTER TO CG INDEX TABLE / TABLE OF CG CELL LINE INDICES; (THE FOUR BITS ARE READ BACKWARDS). CGINDX, 00 /LINE 00 10 /LINE 01 04 /LINE 02 14 /LINE 03 02 /LINE 04 12 /LINE 05 06 /LINE 06 16 /LINE 07 01 /LINE 08 11 /LINE 09 05 /LINE 10 15 /LINE 11 03 /LINE 12 13 /LINE 13 07 /LINE 14 17 /LINE 15 CGPTR, 0000 /CHARACTER GENERATOR DATA POINTER / NOTE: ALL ROUTINES AND DATA BEYOND THIS POINT MARKED WITH ******** ARE NOT / ACCESSED BY THE NORMAL USAGE OF THE ROM EXCEPT POSSIBLY INDIRECTLY THROUGH A / DOWN-LOADED AUTOMATIC PRODUCT TEST ROUTINE. ALL OF THE CODE IS SUBORDINATE TO / THE SUBROUTINE ENTERRED VIA JMS 0176, WHICH IS ITSELF NOT CALLED BY ANY / EXISTING ROM ROUTINES. / ******** GETPARM,.-. /ROUTINE TO GET SELECTED PARAMETERS NL7777 /SETUP THE DCA XR0 /DATA POINTER CDF 00 /GOTO DATA FIELD TAD I XR0 /GET A WORD DCA COMTM1 /STASH IT NL0003 /SETUP THE DCA XR0 /DATA POINTER NL7777 /BACKUP FOR AUTO-INDEX TAD I XR0 /GET ADDRESS POINTER DCA XR1 /STASH IT TAD I XR0 /GET FIELD VALUE TAD ZCDF/[CDF] /FORM CDF INSTRUCTION DCA .+1 /STORE IN-LINE HLT+.-. /WILL BE CDF XX INSTRUCTION TAD I XR1 /GET ADDRESS DCA TM0 /STASH IT TAD I XR1 /GET FIELD DCA MTM5 /STASH IT TAD I XR1 /GET ADDRESS DCA MTM1 /STASH IT TAD I XR1 /GET FIELD DCA MTM6 /STASH IT TAD I XR1 /GET ADDRESS DCA MTM2 /STASH IT TAD I XR1 /GET FIELD DCA MTM7 /STASH IT RSP1 /GET FIRST STACK POINTER DCA SP1SAVE /SAVE IT RSP2 /GET SECOND STACK POINTER DCA SP2SAVE /SAVE IT TAD MTM5 /GET FIELD TAD ZCDF/[CDF] /FORM CDF INSTRUCTION DCA .+1 /STORE IN-LINE HLT+.-. /WILL BE CDF XX INSTRUCTION TAD I TM0 /GET VALUE CDF 70 /BACK TO OUR FIELD DCA TM0 /SAVE IT TAD MTM6 /GET FIELD TAD ZCDF/[CDF] /FORM CDF INSTRUCTION DCA .+1 /STORE IN-LINE HLT+.-. /WILL BE CDF XX INSTRUCTION TAD I MTM1 /GET VALUE CDF 70 /BACK TO OUR FIELD DCA MTM1 /SAVE IT TAD MTM7 /GET FIELD TAD ZCDF/[CDF] /FORM CDF INSTRUCTION DCA .+1 /STORE IN-LINE HLT+.-. /WILL BE CDF XX INSTRUCTION TAD I MTM2 /GET VALUE CDF 70 /BACK TO OUR FIELD DCA MTM2 /SAVE IT JMP I GETPARM /RETURN TO CALLER / ******** / COUNT FOR FIELDS PRIOR TO HIGHLIGHTED RATE FIELD. CLIST, -1 /50 BAUD -1 /75 BAUD -1 /110 BAUD -1 /134.5 BAUD -1 /150 BAUD -1 /300 BAUD -2 /600 BAUD -3 /1200 BAUD -4 /1800 BAUD -4 /2000 BAUD -4 /2400 BAUD -5 /3600 BAUD -5 /4800 BAUD -6 /7200 BAUD -6 /9600 BAUD -6 /19200 BAUD / ******** CIDF, CIF CDF 00 /CONSTANT 6203 AFREAD, FREAD /POINTER TO FLOPPY READ ROUTINE PPRMPRT,PRMPRT /POINTER TO SETUP PARAMETER PRINT ROUTINE PLOC36, LOC36 /POINTER TO 36 OR 37 LOCATOR ROUTINE PT0S1DA,T0S1DAT-1 /TRACK 0 SECTORS 1-2 VALIDATION DATA POINTER / ******** / CONTINUATION OF SUBROUTINE CALL FROM 0176. SUBR, DCA SUBAC /SAVE PASSED AC SEL /SELECT FIRST RX50 PAIR SDN /SKIP ON, CLEARING DONE FLAG P24, 24 /POINTER TO 0024; THIS CAN BE SKIPPED SER /SKIP ON, CLEARING ERROR FLAG P26, 26 /POINTER TO 0026; THIS CAN BE SKIPPED STR /SKIP ON, CLEARING TRANSFER FLAG P25, 25 /POINTER TO 0025; THIS CAN BE SKIPPED RDF /GET DATA FIELD TAD CIDF/(CIF CDF 00) /TURN INTO CIF CDF INSTRUCTION DCA SUBCDF /STORE IN-LINE DCA CCNT /CLEAR DELIMITER CHARACTER SEARCH COUNT CDF 70 /GOTO OUR FIELD TAD Z102/[102] /SETUP 8-BIT SILO EMPTY DCA RXCMD /STASH THE COMMAND JMS VERHLT /CALL HLT PANEL VERIFY, ETC. ROUTINE JMP SUBCDF /ERROR RETURN, WE EXIT / NOW VERIFY THAT SETUP DATA IS VALID. TAD PCALLSUB/[CALLSUB] /SETUP THE DCA XR0 /DATA STORAGE POINTER / CLA /WANT SECTOR 1 FIRST (1-1) JMS I AFREAD/(FREAD) /CALL FLOPPY READ ROUTINE -2-1 /TWO SECTORS (1-2) 0 /TRACK 00 JMP SUBCDF /COULDN'T DO IT TAD PCALLSUB/[CALLSUB] /SETUP THE DCA XR0 /READ-IN DATA POINTER TAD PT0S1DAT/(T0S1DAT-1) /SETUP THE DCA XR1 /VALIDATION DATA POINTER SETVLUP,TAD I XR1 /GET A TEST WORD SNA /END OF LIST JMP SETOK /YES, WE'RE DONE TAD I XR0 /COMPARE TO READ-IN DATA SZA CLA /SKIP IF IT MATCHES JMP SUBCDF /JUMP IF IT'S DIFFERENT JMP SETVLUP /KEEP GOING SETOK, JMS I PROWLOAD/[ROWLOAD] /CALL ROWTABLE AND REGISTER LOAD ROUTINE JMS I PVIDCLR/(VIDCLR) /CLEAR VIDEO DATA CDF 00 /GOTO DATA FIELD TAD I P24/(0024) /GET 00024 DCA TEMP1 /SAVE IT TAD I P25/(0025) /GET 00025 DCA TEMP2 /SAVE IT TAD I P26/(0026) /GET 00026 DCA TEMP3 /SAVE IT NEXTPRM,CDF 70 /BACK TO OUR FIELD JMS I PLOC36/(LOC36) /LOCATE A (36 OR 37) DELIMITER JMS I PPRMPRT/(PRMPRT) /PRINT CURRENT PARAMETER VALUES NEXTCHR,JMS I PKBDIN/[KBDIN] /GET A CHARACTER METRENT,DCA SUBAC /SAVE LATEST CHARACTER TAD PCOMTABLE/(COMTABLE-1) /SETUP THE DCA XR0 /TABLE POINTER COMSRCH,TAD I XR0 /GET A WORD SNA /SKIP IF NOT AT END OF LIST JMP NEXTCHR /END OF LIST, IGNORE AND GET ANOTHER TAD SUBAC /COMPARE TO CHARACTER SNA CLA /SKIP IF NOT A MATCH JMP FINDIT /JUMP IF IT MATCHES ISZ XR0 /BUMP PAST DISPATCH ADDRESS JMP COMSRCH /TRY AGAIN FINDIT, TAD I XR0 /GET DISPATCH ADDRESS DCA DISPADR /STASH IT TAD SUBAC /GET THE CHARACTER ITSELF AS AN ARGUMENT JMS I DISPADR /DISPATCH TO ROUTINE JMP NEXTCHR /NO-CHANGE RETURN, GO THERE JMP NEXTPRM /POSSIBLE-CHANGE RETURN, GO THERE SUBCDF, HLT+.-. /DOUBLE-SKIP RETURN; WILL BE CIF CDF RETURN JMP I SUB176 /RETURN TO CALLER SUBAC, .-. /AC DATA SAVED HERE DISPADR,.-. /DISPATCH ADDRESS TEMPORARY PCOMTAB,COMTABLE-1 /POINTER TO COMMAND DISPATCH TABLE PVIDCLR,VIDCLR /POINTER TO VIDEO CLEAR ROUTINE / ******** VERHLT, .-. /READ AND VERIFY HALT PANEL DATA TAD SUBAC /GET PASSED ARGUMENT SNA CLA /SKIP IF SET JMP VERPOK /JUMP IF NOT TAD PCALLSUB/[CALLSUB] /SETUP THE DCA XR0 /DATA STORAGE POINTER NL0003 /SET OFFSET FOR SECTOR 4 JMS I AFREAD/(FREAD) /CALL FLOPPY READ ROUTINE -4-1 /ONE SECTOR (4) 0 /TRACK 0 JMP VERPOK /COULDN'T DO IT; JUST IGNORE THE PROBLEM CDF 70 /BACK TO OUR FIELD TAD PT0S4DAT/(T0S4DAT-1) /SETUP THE VALIDATION LIST ADDRESS DCA XR0 /STASH THE POINTER TAD PCALLSUB/[CALLSUB] /SETUP THE POINTER TO DCA XR1 /THE READ-IN HALT PANEL DATA VERLUP, TAD I XR0 /GET A TEST WORD SNA /SKIP IF NOT AT END OF LSIT JMP VERMATCH /JUMP IF IT MATCHES TAD I XR1 /COMPARE TO READ-IN WORD SZA CLA /SKIP IF IT MATCHES JMP VERPOK /IGNORE THE DATA IF NO MATCH JMP VERLUP /GO DO NEXT COMPARE VERMATC,JMS I PROWLOAD/[ROWLOAD] /CALL ROWTABLE AND REGISTER LOAD ROUTINE JMS I PVIDCLR/(VIDCLR) /CLEAR VIDEO DATA KAGN, JMS I PGETPARM/(GETPARM) /GET THE PARAMETER VALUES JMS I PPRINTP/(PRINTP) /PRINT THE PARAMETERS IN OCTAL JMS I PKBDIN/[KBDIN] /GET A KEYBOARD CHARACTER TAD M175/(-175) /COMPARE TO DO KEY SNA /SKIP IF DIFFERENT JMP I VERHLT /TAKE FAILURE RETURN TAD L45/(45) /COMPARE TO BREAK KEY SZA CLA /SKIP IF IT MATCHES JMP KAGN /JUMP IF NOT VERPOK, ISZ VERHLT /BUMP TO SUCCESSFUL RETURN JMP I VERHLT /TAKE SKIP RETURN TO CALLER M175, -175 /CONSTANT 7603 L45, 45 /CONSTANT 0045 PGETPAR,GETPARM /POINTER TO GETPARM ROUTINE PPRINTP,PRINTP /PARAMETER PRINTOUT POINTER PT0S4DA,T0S4DAT-1 /POINTER TO TRACK 0, SECTOR 4 VALIDATION LIST ZBLOCK 7 /EMPTY SPACE PAGE / ******** / HANDLER FOR SELECT KEY IN SETUP ROUTINE. SELCT, .-. /SELECT LATEST ITEM CLA /CLEAN UP TAD CCNT /GET SEARCH POSITIION LIMIT TAD M16/(-16) /COMPARE TO LIMIT SMA CLA /SKIP IF LESS THAN THIS MAXIMUM JMP TRYPRATE /JUMP IF NOT TAD CCNT /GET POSITION CLL RAR /%2 CMA /INVERT IT DCA SELSHFT /SAVE AS COUNTER STL /SET A STOP BIT JUST IN CASE SHFTLUP,RAL /MOVE UP ISZ SELSHFT /DONE ENOUGH? JMP SHFTLUP /NO, GO BACK MQL /SAVE FOR NOW CLA MQA /GET IT BACK CMA /INVERT IT AND TEMP1 /SAVE THE OTHER BITS DCA TEMP1 /STORE BACK FOR NOW TAD CCNT /GET THE POSITION COUNT CLL RAR /%2 CLA /CLEAN UP TAD TEMP1 /GET THE OTHER BITS SZL /SKIP IF BIT IS OFF MQA /ELSE OR IN SELECTED VALUE DCA TEMP1 /SAVE COMPOSITE VALUE SELXIT, ISZ SELCT /TAKE SKIP RETURN JMP I SELCT /RETURN TO COMMAND ROUTINE TRYPRAT,TAD CCNT /GET POSITION TAD M16/(-16) /ADD ON UPPER LIMIT TAD L7773/(-5) /ADD ON EXTRA LIMIT SMA SZA /SKIP IF IN THIS RANGE JMP DOCOMRATE /JUMP IF NOT TAD L5/(5) /SUBTRACT RELATIVE LIMIT TAD PBTABLE/(BTABLE) /ADD ON TABLE BASE DCA TEMP2 /STASH THE POINTER TAD I TEMP2 /GET THE PROPER BAUD RATE VALUE DCA TEMP2 /STASH IT JMP SELXIT /FINISH THERE DOCOMRA,DCA TEMP3 /SAVE RELATIVE POSITION NL7777 /-1 TAD TEMP3 /NOW HAVE PROPER RELATIVE VALUE TAD PBTABLE/(BTABLE) /ADD ON TABLE ADDRESS DCA TEMP3 /STASH THE POINTER TAD I TEMP3 /GET THE PROPER BAUD RATE VALUE DCA TEMP3 /STASH IT JMP SELXIT /CONTINUE THERE / ******** SELSHFT,.-. /SELECT ROUTINE COUNTER M16, -16 /CONSTANT 7762 L7773, -5 /CONSTANT 7773 L5, 5 /CONSTANT 0005 PBTABLE,BTABLE /POINTER TO BAUD RATE TABLE / BAUD RATE TABLE FOR SUPPORTED RATES. BTABLE, 05 /300 BAUD 06 /600 BAUD 07 /1200 BAUD 12 /2400 BAUD 14 /4800 BAUD 16 /9600 BAUD / ******** KBDIN, .-. /COMMAND INPUT ROUTINE KBISF /FLAG UP? JMP .-1 /NO, WAIT FOR IT KBIRB /YES, READ IT IN AND Z377/[377] /JUST EIGHT BITS JMP I KBDIN /RETURN ARXWAIT,RXWAIT /POINTER TO RX50 WAIT ROUTINE RXRDY, .-. /DRIVE READY CHECK ROUTINE TAD Z12/[12] /GET READ STATUS VALUE LCD /LOAD THE COMMAND JMS I ARXWAIT/(RXWAIT) /WAIT FOR IT JMP I RXRDY /TRANSFER FLAG CAME UP, FORGET IT SKP /DONE FLAG CAME UP, THERE'S HOPE JMP I RXRDY /ERROR OR TIME-OUT XDR /GET STATUS AND Z200/[200] /JUST DRIVE READY BIT SZA CLA /SKIP IF NOT READY ISZ RXRDY /ELSE TAKE SKIP RETURN JMP I RXRDY /RETURN EITHER WAY / ******** VIDCLR, .-. /VIDEO CLEAR (?) ROUTINE NL6000 /SET BOTH CONTROL BITS VIDCON /LOAD CONTROL REGISTER CLA /CLEAN UP DCA XR0 /CLEAR INNER COUNTER NL7775 /SET THE DCA XR1 /OUTER COUNTER VIDWAIT,ISZ XR0 /WAITING ENOUGH? JMP VIDWAIT /NO, KEEP GOING ISZ XR1 /WAITED TOO LONG? JMP VIDWAIT /NO, KEEP GOING VIDCON /RESET TO NORMAL VIDEO MODE JMP I VIDCLR /RETURN / SLUSHWARE TEST VALIDATION DATA. SLTDAT, -6201 -0033 -0077 0 /THIS ENDS THE LIST / ******** / COMMAND DISPATCH TABLE FOR BUILT-IN COMMANDS. COMTABL,-214; BOOTIT /REMOVE -215; SELCT /SELECT -175; DOKEY /DO -247; MOVLEFT /LEFT ARROW -250; MOVRITE /RIGHT ARROW -275; RETURN /RETURN -264; METRONOME /METRONOME 0 /THIS ENDS THE LIST / ******** / VALIDATION DATA FOR TRACK 0, SECTORS 1-2. T0S1DAT,-1 -"S!200 -"E!200 -"T!200 -"U!200 -"P!200 0 /THIS ENDS THE LIST / VALIDATION DATA FOR TRACK 0, SECTORS 7-10. T0S7DAT,-1 -"U!200 -"C!200 -"G!200 -"R!200 -"A!200 -"M!200 -2 0 /THIS ENDS THE LIST / VALIDATION DATA FOR TRACK 0, SECTOR 3. T0S3DAT,-1 -"K!200 -"B!200 -"D!200 -"B!200 -"R!200 -"D!200 -2 0 /THIS ENDS THE LIST / ******** M7, -7 /CONSTANT 7771 PRMPRT, .-. /SETUP PARAMETER OUTPUT ROUTINE CDF 70 /BACK TO OUR FIELD DCA ROW /CLEAR ROW DCA COLUMN /CLEAR COLUMN TAD TEMP1 /GET FIRST PARAMETER VALUE DCA PRMTM1 /SAVE IT TAD PCALLSUB/[CALLSUB] /SETUP THE DCA XR0 /BUFFER POINTER TAD M7/(-7) /SETUP THE DCA XR1 /BUFFER COUNT HEDLUP, TAD I XR0 /GET A CHARACTER TAD Z7776/[-2] /COMPARE TO HEADER END CODE SZA CLA /SKIP IF IT MATCHES JMP HEDLUP /ELSE KEEP GOING NXTPRM, TAD XR1 /GET CURRENT COUNT SNA CLA /SKIP IF STILL SOME LEFT JMP PRTRATE /JUMP IF NOT TAD PRMTM1 /GET FIRST PARAMETER VALUE CLL RAR /MOVE OVER DCA PRMTM1 /STORE BACK SNL /SKIP IF SET NL0001 /ELSE SET INCREMENT TAD Z7741/[-37] /NOW HAVE -36 IF CLEAR, -37 IF SET DCA PRMTM2 /SAVE IT PRMLUP, TAD I XR0 /GET A CHARACTER MQL /LOAD IT FOR PRINTING LATER CLA MQA /GET IT BACK TAD PRMTM2 /COMPARE TO DESIRED DELIMITER SNA CLA /SKIP IF OTHER JMP ATDELIM /JUMP IF IT MATCHES JMS I PCHRPRT/[CHRPRT] /PRINT THE CHARACTER JMP PRMLUP /KEEP GOING ATDELIM,ISZ XR1 /COUNT THIS ONE NOP /IN CASE IT SKIPS PRTIT, JMS I PCHRPRT/CHRPRT] /PRINT THE CHARACTER TAD I XR0 /GET THE NEXT CHARACTER MQL /LOAD IT FOR PRINTING CLA MQA /GET IT BACK TAD Z7741/[-37] /COMPARE TO DELIMITER SMA SZA CLA /SKIP IF THAT OR LESS JMP REVIT /JUMP IF NOT JMS I PCHRPRT/[CHRPRT] /PRINT THE CHARACTER JMP NXTPRM /GO DO NEXT PARAMETER REVIT, TAD Z400/[400] /ADD ON REVERSE VIDEO BIT JMP PRTIT /CONTINUE THERE PRTRATE,TAD TEMP2 /GET SECOND PARAMETER JMS NPRT /OUTPUT IT TAD TEMP3 /GET THIRD PARAMETER JMS NPRT /OUTPUT IT OUTLUP, TAD I XR0 /GET A CHARACTER MQL /LOAD FOR PRINTING CLA MQA /GET IT BACK TAD Z7775/[7775] /COMPARE TO END CHARACTER SNA CLA /SKIP IF NOT AT END JMP I PRMPRT /RETURN IF AT END JMS I PCHRPRT/[CHRPRT] /PRINT THE CHARACTER JMP OUTLUP /GO DO ANOTHER / UNREFERENCED LOCATION. PERHAPS ERRONEOUS NOTION THAT CHRPRT ROUTINE MIGHT / SKIP OR OTHER OBSOLETE CONVENTION? JMP I PRMPRT /RETURN PRMTM1, .-. /TEMPORARY PRMTM2, .-. /TEMPORARY / ******** / PRINT NUMERICAL PARAMETER ROUTINE. THE SELECTED PARAMETER IS A BAUD RATE. / THE (CLOSEST TO THE) SELECTED RATE IS HIGHLIGHTED. NPRT, .-. DCA NTMP /SAVE THE PASSED VALUE TAD NTMP /GET IT BACK AND Z17/[17] /JUST RATE BITS TAD PCLIST/(CLIST) /ADD ON TABLE BASE DCA NTMP /STASH THE POINTER TAD I NTMP /GET THE PROPER COUNT DCA NTMP /STASH IT NPLUP, TAD I XR0 /GET A CHARACTER MQL /LOAD IT FOR PRINTING CLA MQA /GET IT BACK TAD Z7741/[-37] /COMPARE TO FIELD DELIMITER SNA /SKIP IF NOT A MATCH JMP FNDDELIM /JUMP IF IT IS IAC /COMPARE TO ALTERNATE DELIMITER VALUE SNA CLA /SKIP IF NOT A MATCH THERE EITHER JMP FNDDELIM /JUMP IF IT IS A MATCH NEXTREG,JMS I PCHRPRT/[CHRPRT] /PRINT THE CHARACTER JMP NPLUP /GO DO NEXT MOREPRM,JMS I PCHRPRT/[CHRPRT] /PRINT THE CHARACTER CLA MQA /GET THE CHARACTER TAD Z7766/[7766] /COMPARE TO MASTER DELIMITER SNA CLA /SKIP IF NOT AT END JMP I NPRT /RETURN IF AT END TAD I XR0 /GET NEXT CHARACTER MQL /LOAD IT FOR PRINTING JMP MOREPRM /KEEP GOING / COMES HERE IF FIELD DELIMITER FOUND. FNDDELI,ISZ NTMP /FOUND ENOUGH REGULAR FIELDS? JMP NEXTREG /NO, KEEP GOING BOLDLP, JMS I PCHRPRT/[CHRPRT] /PRINT THE CHARACTER TAD I XR0 /GET ANOTHER CHARACTER MQL /LOAD IT FOR PRINTING CLA MQA /GET IT BACK TAD Z7741/[-37] /COMPARE TO FIELD DELIMITER SPA SNA CLA /SKIP IF HIGHER JMP MOREPRM /JUMP IF NOT TAD Z400/[400] /GET REVERSE VIDEO BIT JMP BOLDLP /GO DO NEXT NTMP, .-. /TEMPORARY PCLIST, CLIST /POINTER TO REGULAR FIELD COUNT LIST / SLUSHWARE CODE VALIDATION ROUTINE. SLCHECK,.-. /SLUSHWARE VALIDATION ROUTINE RDF /GET DATA FIELD TAD ZCDF/[CDF] /FORM CDF INSTRUCTION DCA SLUCDF /STORE IN-LINE TAD PSLTDAT/(SLTDAT-1) /SETUP THE DCA XR1 /VALIDATION POINTER CDF 70 /BACK TO OUR FIELD SLNEXT, TAD I XR1 /GET A TEST WORD SNA /SKIP IF NOT AT END OF LIST JMP SLGOOD /JUMP IF AT END SLUCDF, CDF 00+.-. /WILL BE CDF XX INSTRUCTION TAD I XR0 /COMPARE TO READ-IN DATA CDF 70 /BACK TO OUR FIELD SNA CLA /SKIP IF NOT A MATCH JMP SLNEXT /JUMP IF IT MATCHES JMP I SLCHECK /TAKE FAILURE RETURN SLGOOD, ISZ SLCHECK /BUMP TO GOOD RETURN JMP I SLCHECK /TAKE SKIP RETURN TO CALLER PSLTDAT,SLTDAT-1 /POINTER TO SLUSHWARE TEST DATA ZBLOCK 2 /EMPTY SPACE PAGE / ******** HIGHROW,ROWADR+1 /POINTER TO ROWTABLE (HIGH-ORDER) L2030, 2030 /CONSTANT 2030 L31, 31 /CONSTANT 0031 M31, -31 /CONSTANT 7747 CHRPRT, .-. /CHARACTER PRINT ROUTINE DCA ATTRVAL /SAVE PASSED ATTRIBUTE VALUE CLA MQA /GET THE CHARACTER TAD Z7766/[-"J!300] /COMPARE TO SNA /SKIP IF OTHER JMP JUSTPOS /JUMP IF IT MATCHES TAD Z7775/[-"M+"J] /COMPARE TO SNA CLA /SKIP IF NO MATCH JMP JUSTPOS /JUMP IF IT MATCHES TAD ROW /GET DESIRED ROW NUMBER CLL RAL /*2 TAD HIGHROW/(ROWADR+1) /POINT TO PROPER HIGH-ORDER ADDRESS DCA CHARADR /STASH THE POINTER CDF 10 /GOTO ROWTABLE FIELD TAD I CHARADR /GET THE HIGH-ORDER ROW ADDRESS CDF 70 /BACK TO OUR FIELD DCA CHARADR /STASH THE POINTER TAD CHARADR /GET HIGH-ORDER ROW ADDRESS CLL RAR /MOVE OVER AND L2030/(30) /JUST FIELD BITS (CLOSE ENOUGH) TAD ZCDF/[CDF] /FORM CDF INSTRUCTION DCA CHARCDF /STORE IN-LINE TAD CHARADR /GET HIGH-ORDER ROW ADDRESS AGAIN AND Z17/[17] /JUST QUARTER-FIELD BITS CLL RTL;BSW /*400 TAD COLUMN /ADD ON DESIRED COLUMN TAD Z205/[205] /ADD ON LINE BASE DCA CHARADR /STASH THE POINTER CLA MQA /GET THE CHARACTER TAD M40/(-40) /COMPARE TO SMA SZA CLA /SKIP IF OR CONTROL CHARACTER CLA MQA /ELSE GET THE CHARACTER SZA /SKIP IF NOT DISPLAYABLE TAD ATTRVAL /ELSE ADD ON PASSED ATTRIBUTES CHARCDF,HLT+.-. /WILL BE CDF 20 (OR 30) INSTRUCTION DCA I CHARADR /STORE IN LINE BUFFER CDF 70 /BACK TO OUR FIELD JUSTPOS,JMS SCRPOS /ADVANCE SCREEN POSITION JMP I CHRPRT /RETURN ATTRVAL,.-. /PASSED ATTRIBUTE BITS SAVED HERE CHARADR,.-. /ADDRESS TEMPORARY M40, -" !200 /CONSTANT 7740 / ******** SCRPOS, .-. /SCREEN POSITION ADVANCE ROUTINE CLA MQA /GET THE CHARACTER TAD Z7766/[-"J!300] /COMPARE TO SZA /SKIP IF IT MATCHES JMP SCRCHK /JUMP IF NOT ISZ ROW /BUMP TO NEXT ROW JMP I SCRPOS /RETURN SCRCHK, TAD Z7775/[-"M+"J] /COMPARE TO SZA CLA /SKIP IF IT MATCHES JMP SCREGULAR /JUMP IF NOT DCA COLUMN /CLEAR COLUMN JMP I SCRPOS /RETURN SCREGUL,ISZ COLUMN /BUMP TO NEXT COLUMN JMP I SCRPOS /RETURN / ******** / HANDLER FOR LEFT ARROW KEY IN SETUP ROUTINE. MOVLEFT,.-. /MOVE BACK ONE POSITION ROUTINE DCA LCHAR /SAVE OUR CHARACTER FOR OTHERS TAD PCALLSUB/[CALLSUB+1-1] /GET BUFFER POINTER DCA XR0 /STASH THE POINTER CDF 70 /GOTO OUR FIELD NL7777 /TRY TO BACKUP TAD CCNT /COMPARE TO CURRENT SELECT SPA /SKIP IF IT CAN BACKUP CLA /ELSE FORGET IT DCA CCNT /SAVE NEW POSITION JMS LOC36 /LOCATE NEW DELIMITER JMP I MOVLEFT /RETURN / ******** / HANDLER FOR RIGHT ARROW KEY IN SETUP ROUTINE. MOVRITE,.-. /MOVE FORWARD ONE POSITION ROUTINE DCA LCHAR /SAVE OUR CHARACTER FOR OTHERS TAD CCNT /GET CURRENT POSITION TAD M31/(-31) /COMPARE TO UPPER LIMIT SPA CLA /SKIP IF TOO FAR ISZ CCNT /ELSE BUMP TO NEXT JMS LOC36 /LOCATE NEW DELIMITER JMP I MOVRITE /RETURN / ******** / THIS ROUTINE LOCATES DELIMITER (36 OR 37) CODES IN THE BUFFER. CCNT / DETERMINES HOW MANY. LOC36, .-. /DELIMITER SEARCH ROUTINE DCA ROW /CLEAR ROW DCA COLUMN /CLEAR COLUMN TAD PCALLSUB/[CALLSUB] /SETUP THE DCA XR0 /BUFFER POINTER DCA XR1 /CLEAR CHARACTER COUNTER SRCHLUP,TAD I XR0 /GET A CHARACTER MQL /STASH IT THERE CLA MQA /GET IT BACK TAD Z7741/[-37] /COMPARE TO 37 CODE SNA /SKIP IF OTHER JMP IS37 /JUMP IF IT MATCHES IAC /COMPARE TO 36 CODE SZA CLA /SKIP IF IT MATCHES JMP NOTOURS /JUMP IF NOT IS37, TAD XR1 /GET CHARACTER COUNT CIA /INVERT FOR TEST TAD CCNT /COMPARE TO LIMIT SZA CLA /SKIP IF SEARCHED ENOUGH JMP ISOURS /JUMP IF NOT ISZ COLUMN /BUMP TO NEXT COLUMN JMS CUPDATE /PLACE CURSOR THERE JMP I LOC36 /RETURN ISOURS, ISZ XR1 /BUMP CHARACTER COUNT NOTOURS,JMS SCRPOS /ADVANCE SCREEN POSITION JMP SRCHLUP /KEEP GOING / ******** CUPDATE,.-. /CURSOR UPDATE ROUTINE TAD L2030/(2030) /GET VERTICAL CURSOR REGISTER VALUE LSCREG /LOAD REGISTER SELECT CLA /CLEAN UP TAD ROW /GET CURRENT ROW VLOAD /LOAD CURSOR VERTICAL POSITION CLA /CLEAN UP TAD L31/(31) /GET HORIZONTAL CURSOR REGISTER VALUE LSCREG /LOAD REGISTER SELECT CLA /CLEAN UP TAD COLUMN /GET CURRENT COLUMN VLOAD /LOAD CURSOR HORIZONTAL POSITION CLA /CLEAN UP JMP I CUPDATE /RETURN ZBLOCK 7 /EMPTY SPACE PAGE / ******** PCUPDAT,CUPDATE /POINTER TO CURSOR UPDATE ROUTINE / HANDLER FOR REMOVE KEY IN SETUP ROUTINE. BOOTIT, .-. /REMOVE KEY ROUTINE CLA /CLEAN UP JMS I AVIDCLR/(VIDCLR) /CLEAR VIDEO DATA CDF 70 /GOTO OUR FIELD DCA ROW /CLEAR ROW DCA COLUMN /CLEAR COLUMN JMS I PCUPDATE/(CUPDATE) /UPDATE CURSOR POSITION TAD PCALLSUB/[CALLSUB] /SETUP THE DCA XR0 /DATA POINTER NL7775 /SETUP THE DCA XR1 /DATA COUNTER LOOKLP, TAD I XR0 /GET A WORD TAD Z7776/[7776] /COMPARE TO VALIDATION FIELD DELIMITER SZA CLA /SKIP IF IT MATCHES JMP LOOKLP /ELSE KEEP GOING ISZ XR1 /FOUND ENOUGH OF THEM? JMP LOOKLP /NO, KEEP GOING PLUP, TAD I XR0 /GET A CHARACTER MQL /LOAD FOR PRINTING ROUTINE CLA MQA /GET IT BACK TAD Z7775/[-3] /COMPARE TO MESSAGE END CHARACTER SNA CLA /SKIP IF NOT THERE YET JMP PEND /JUMP IF AT END JMS I PCHRPRT/[CHRPRT] /PRINT THE CHARACTER JMP PLUP /KEEP GOING PEND, JMS I PKBDIN/[KBDIN] /GET A KEYBOARD CHARACTER TAD L7603/(-175) /COMPARE TO VALUE FOR DO KEY SNA CLA /SKIP IF IT DOESN'T MATCH JMP I PRXOK/(RXOK) /JUMP IF IT DOES DCA CCNT /CLEAR POSITION COUNT JMS I AVIDCLR/(VIDCLR) /CLEAR VIDEO DATA ISZ BOOTIT /TAKE SKIP RETURN JMP I BOOTIT /RETURN TO COMMAND ROUTINE L7603, -175 /CONSTANT 7603 PRXOK, RXOK /POINTER TO RXOK ROUTINE C23, 23 /CONSTANT 0023 AVIDCLR,VIDCLR /POINTER TO VIDEO CLEAR ROUTINE / ******** / HANDLER FOR DO KEY IN SETUP ROUTINE. DOKEY, .-. /DO KEY ROUTINE DCA LCHAR /SAVE CHARACTER VALUE FOR OTHERS TAD C23/(23) /SETUP FOR THE DCA ROW /HIGHEST ROW DCA COLUMN /CLEAR COLUMN TAD CM5/(-5) /SETUP THE DCA XR1 /ROW COUNT P1LUP, TAD M120/(-120) /SETUP THE DCA XR2 /COLUMN COUNT P2LUP, JMS I PCHRPRT/[CHRPRT] /PRINT THE CHARACTER ISZ XR2 /DONE A LINE YET? JMP P2LUP /NO, KEEP GOING DCA COLUMN /YES, CLEAR COLUMN ISZ ROW /BUMP TO NEXT ROW ISZ XR1 /DONE ENOUGH ROW? JMP P1LUP /NO, KEEP GOING TAD PCALLSUB/[CALLSUB+1-1] /SETUP THE DCA XR0 /DATA POINTER FNDIT, TAD Z7775/[-3] /GET DELIMITER VALUE TAD I XR0 /COMPARE TO LATEST SZA CLA /SKIP IF IT MATCHES JMP FNDIT /ELSE KEEP GOING ISZ XR0 /BUMP PAST DELIMITER TAD C23/(23) /SETUP FOR DCA ROW /HIGHEST ROW DCA COLUMN /CLEAR COLUMN PNEXT, TAD I XR0 /GET A CHARACTER MQL /LOAD FOR PRINTING CLA MQA /GET IT BACK TAD Z7775/[-3] /COMPARE TO DELIMITER SNA CLA /SKIP IF NOT THERE YET JMP ATEND /JUMP IF AT END OF BLURB JMS I PCHRPRT/[CHRPRT] /PRINT THE CHARACTER JMP PNEXT /KEEP GOING ATEND, JMS I PKBDIN/[KBDIN] /GET A KEYBOARD CHARACTER CIA /INVERT IT TAD LCHAR /COMPARE TO OUR VALUE (DO KEY) SNA CLA /SKIP IF OTHER JMP DOIT /JUMP IF IT MATCHES BMPRET, JMS I AVIDCLR/(VIDCLR) /CLEAR VIDEO DATA NOCRET, ISZ DOKEY /BUMP RETURN ADDRESS JMP I DOKEY /TAKE SKIP RETURN ON USER ABORT DOIT, TAD PWRIBUFF/[WRIBUFFER+1-1]/SETUP THE DCA XR0 /DATA POINTER NL002A /SETUP 12-BIT EMPTY SILO COMMAND VALUE DCA RXCMD /STASH THE COMMAND CDF 30 /GOTO DATA FIELD / CLA /SET AC T0 1-1 FOR FIRST SECTOR JMS I LFREAD/(FREAD) /CALL FLOPPY READ ROUTINE -1-1 /WANT ONE SECTOR L116, 116 /TRACK 78 JMP NOCRET /COULDN'T DO IT, FORGET IT TAD PWRIBUFF/[WRIBUFFER+1-1]/GET BUFFER POINTER IAC /MOVE TO NEXT POSITION DCA XR0 /STASH THE POINTER CDF 30 /GOTO BUFFER FIELD JMS I ASLCHECK/(SLCHECK) /ENSURE SLUSHWARE IS VALID JMP SLUBAD /FORGET IT, BAD SLUSHWARE DCA XR0 /SETUP POINTER TO 0001 JMS I PPARMOVE/(PARMOVE) /MOVE IN THE NEW PARAMETERS / CLA /SET 12-BIT FILL VALUE LCD /LOAD THE COMMAND FOR FILLING LODLUP, JMS I LRXWAIT/(RXWAIT) /CALL RX50 WAIT ROUTINE JMP LDTRANS /TRANSFER FLAG CAME UP JMP LDDONE /DONE FLAG CAME UP JMP I PFERR/(FERR) /ERROR, GO COMPLAIN THERE LDTRANS,CDF 30 /GOTO BUFFER FIELD TAD I XR0 /GET A WORD XDR /FILL IT JMP LODLUP /KEEP GOING LDDONE, TAD L116/(116) /SETUP TRACK 78 DCA T1 /STASH IT NL0001 CLL /SETUP THE DCA TINC /SECTOR NUMBER NL0004 /SET WRITE FUNCTION CDF 70 /BACK TO OUR FIELD JMS I PRXCOMD/[RXCOMD] /GO DO THE WRITE COMMAND SKP /SKIP IF IT WAS OK JMP BMPRET /JUMP IF NOT SER /ANY ERRORS? SKP /SKIP IF NOT JMP BMPRET /JUMP IF SO SLUBAD, ISZ DOKEY /TAKE THE ISZ DOKEY /DOUBLE-SKIP JMP I DOKEY /RETURN ASLCHEC,SLCHECK /POINTER TO SLUSHWARE VALIDATION ROUTINE LFREAD, FREAD /POINTER TO FREAD ROUTINE CM5, -5 /CONSTANT 7773 M120, -120 /CONSTANT 7660 PPARMOV,PARMOVE /POINTER TO PARAMETER MOVE ROUTINE LRXWAIT,RXWAIT /POINTER TO RX50 WAIT ROUTINE PFERR, FERR /POINTER TO ERROR ROUTINE PAGE / ******** / HANDLER FOR METRONOME CHARACTER IN SETUP ROUTINE. METRONO,.-. /METRONOME KEY ROUTINE CLA /CLEAN UP TAD LCHAR /GET PREVIOUS CHARACTER JMP I .+1/(METRENTRY) /GO THERE METRENTRY /THROUGH HERE LVIDCLR,VIDCLR /POINTER TO VIDEO CLEAR ROUTINE / ******** / HANDLER FOR RETURN CHARACTER IN SETUP ROUTINE. RETURN, .-. /RETURN KEY ROUTINE JMS I LVIDCLR/(VIDCLR) /CLEAR VIDEO OUT JMS PARMOVE /SETUP THE PARAMETERS ISZ RETURN /TAKE THE ISZ RETURN /DOUBLE-SKIP JMP I RETURN /RETURN / ******** A14, 24 /POINTER TO 0024 A15, 25 /POINTER TO 0025 A16, 26 /POINTER TO 0026 PARMOVE,.-. /PARAMETER MOVE ROUTINE CDF 00 /SETUP DATA FIELD TAD TEMP2 /GET SECOND PARAMETER DCA I A15/(0025) /STORE IT TAD TEMP1 /GET FIRST PARAMETER DCA I A14/(0024) /STORE IT TAD TEMP3 /GET THIRD PARAMETER DCA I A16/(0026) /STORE IT CDF 70 /BACK TO OUR FIELD DCA XR0 /SETUP SOURCE POINTER TAD PWRIBUFF/[WRIBUFFER+1-1]/SETUP THE DCA XR1 /DESTINATION POINTER ISZ XR1 /BUMP PAST HEADER TAD M377/(-377) /SETUP THE DCA MVCNT /MOVE COUNTER MVLUP, CDF 00 /GOTO DATA FIELD TAD I XR0 /GET A WORD CDF 30 /GOTO BUFFER FIELD DCA I XR1 /PUT A WORD ISZ MVCNT /DONE ENOUGH? JMP MVLUP /NO, GO BACK TAD PWRIBUFF/[WRIBUFFER+1-1]/SETUP THE DCA XR0 /DISK DATA POINTER JMP I PARMOVE /RETURN MVCNT, .-. /MOVE COUNTER M377, -377 /CONSTANT 7401 BAUD17, 17 /CONSTANT 0017 / COMES HERE AFTER TESTING THE KEYBOARD (OR JUST AFTER THE TEST WAS BYPASSED IF / APTEN IS IN EFFECT) TO SETUP THE COMMUNICATIONS CHIP. COMTEST,TAD BAUD17/(17) /GET BAUD RATE VALUE FOR 19200 BAUD MSB /SETUP COMMUNICATIONS CHIP RATE CLA /CLEAN UP MPRESET /RESET THE COMMUNICATIONS CHIP APTSKP /AUTOMATIC PRODUCT TESTING? SKP /SKIP IF NOT JMP TESTCOM /JUMP IF SO COMEXIT,TAD Z7/[7] /GET 1200 BAUD RATE VALUE MSB /SETUP COMM CHIP FOR 1200 BAUD CLA /CLEAN UP JMS I PREGINIT/(REGINIT) /INITIALIZE THE REGISTERS JMP I .+1/(COMDONE) /GO BACK TO MAIN-LINE CODE COMDONE /THROUGH HERE PREGINI,REGINIT /POINTER TO REGISTER INITIALIZATION ROUTINE TESTCOM,JMS I PREGINIT/(REGINIT) /INITIALIZE THE REGISTERS DCA TM0 /CLEAR OUTPUT TEST VALUE DCA COMTM1 /CLEAR INPUT TEST VALUE DCA T6 /CLEAR LOW-ORDER TIME-OUT COUNTER TAD Z7741/[-37] /SETUP THE DCA T7 /HIGH-ORDER TIME-OUT COUNTER CDF 00 /SET EVEN FIELD TO ACCESS "A" SIDE OLS /OUTPUT A NULL CHARACTER CDF 70 /BACK TO OUR FIELD ISZ TM0 /BUMP OUTPUT VALUE COMWAIT,ISF /COMMUNICATIONS PORT FLAG UP? SKP /SKIP IF NOT JMP COMCHK /JUMP IF SO ISZ T6 /WAITING TOO LONG? JMP COMWAIT /NO, KEEP TRYING ISZ T7 /WAITING TOO MANY TIMES? JMP COMWAIT /NO, KEEP TRYING COMBAD, TAD L100/(100) /GET COMMUNICATIONS PORT ERROR BIT TAD ESTATUS /UPDATE CUMULATIVE ERROR STATUS DCA ESTATUS /STORE BACK JMP COMEXIT /STOP TESTING COMCHK, JMS I PCOMREAD/[COMREAD] /READ CONTENTS OF B^10+2 /REGISTER 2B AND Z17/[17] /JUST LOW-ORDER BITS AFFECTING "A" HALF TAD M6/(-6) /RECEIVE CHARACTER AVAILABLE? SZA /SKIP IF AS EXPECTED JMP CCHKMORE /JUMP IF NOT CDF 00 /NEED EVEN FIELD TO ACCESS "A" SIDE IRB /GET THE CHARACTER CDF 70 /BACK TO OUR FIELD AND Z377/[377] /JUST DATA BITS CIA /INVERT FOR COMPARISON TAD COMTM1 /COMPARE TO EXPECTED VALUE SNA CLA /SKIP IF DIFFERENT JMP CREADOK /JUMP IF IT MATCHES JMS I PCOMLOAD/[COMLOAD] /CALL REGISTER LOAD ROUTINE A^10+0 /REGISTER 0A 030 /CHANNEL RESET JMP COMBAD /FORGET IT CREADOK,ISZ COMTM1 /BUMP INPUT TEST VALUE TAD COMTM1 /GET THE VALUE AND Z400/[400] /JUST TOO-FAR BIT SZA CLA /SKIP IF STILL GOING JMP COMEXIT /JUMP IF FINISHED CINTCLR,JMS I PCOMLOAD/[COMLOAD] /CALL REGISTER LOAD ROUTINE A^10+0 /0A 070 /END OF INTERRUPT JMP COMWAIT /GO BACK FOR MORE CCHKMOR,TAD L2/(-4+6) /TRANSMITTER BUFFER EMPTY? SZA CLA /SKIP IF IT MATCHES JMP COMBAD /JUMP IF NOT TAD TM0 /GET OUTPUT TEST VALUE AND Z400/[400] /JUST TOO-FAR BIT SNA CLA /SKIP IF NOW TOO FAR JMP OUTMORE /JUMP IF NOT JMS I PCOMLOAD/[COMLOAD] /CALL REGISTER LOAD ROUTINE A^10+0 /0A 050 /CLEAR TRANSMITTER INTERRUPT JMP CINTCLR /CONTINUE THERE OUTMORE,TAD TM0 /GET OUTPUT VALUE CDF 00 /SET EVEN FIELD TO ACCESS "A" HALF OLS /OUTPUT THE CHARACTER CDF 70 /BACK TO OUR FIELD CLA /CLEAN UP ISZ TM0 /BUMP TEST VALUE JMP CINTCLR /CONTINUE THERE L100, 100 /CONSTANT 0100 M6, -6 /CONSTANT 7772 L2, -4+6 /CONSTANT 0002 ZBLOCK 3 /EMPTY SPACE PAGE / RD TEST AND SETUP ROUTINE. CHECKS IF RD51 HARDWRE IS PRESENT. IF PRESENT, / WILL WAIT MAY SECONDS UNTIL THE SELF-TEST FINISHES AND RAISES THE DONE FLAG OR / IT TIMES OUT. THEN THE STARTUP SECTOR IS READ IN AND EXECUTED AS A / SUBROUTINE LOADED IN A DESIGNATED PLACE. RDSETUP,.-. /RD TEST AND SETUP ROUTINE NL7777 /SET TEST PATTERN RDTEST /DO TEST IOT THAT SHOULD CLEAR THE AC SZA CLA /SKIP IF RD51 HARDWARE ACTUALLY PRESENT JMP I RDSETUP /ELSE JUST RETURN TAD M12/(-12) /GET OUTER TIME-OUT CONSTANT DCA T8 /STASH THE OUTER COUNTER RDWLP1, TAD M30/(-30) /GET MIDDLE TIME-OUT CONSTANT DCA T7 /STASH THE MIDDLE COUNTER RDWLP2, RDSD /DONE FLAG SET FROM SELF-TEST? SKP /SKIP IF NOT JMP RDFIN /JUMP IF SO ISZ T6 /WAIT AWHILE? JMP RDWLP2 /KEEP WAITING ISZ T7 /WAITED ENOUGH? JMP RDWLP2 /KEEP GOING ISZ T8 /WAITED TOO LONG? JMP RDWLP1 /NO, KEEP GOING JMP I RDSETUP /YES, JUST RETURN RDFIN, RDSE /ANY ERRORS? SKP /SKIP IF NOT JMP I RDSETUP /JUST RETURN TAD PCALLSUB/[CALLSUB+1-1] /SETUP THE DCA XR0 /STORAGE POINTER TAD L32/(32) /GET READ STARTUP SECTOR COMMAND RDSC /SEND THE COMMAND DTRLUP, JMS RDWAIT /WAIT FOR FLAGS JMP I RDSETUP /ERROR OR TIME-OUT, FORGET IT SKP /TRANSFER REQUEST UP JMP SSDONE /JUMP THERE IF DONE RDTD /TRANSFER DATA DCA I XR0 /STORE THE WORD IN THE SUBROUTINE BODY JMP DTRLUP /KEEP GOING SSDONE, TAD PCALLSUB/[CALLSUB+1-1] /SETUP THE POINTER DCA XR0 /TO THE READ-IN DATA TAD PTSTDATA/(TSTDATA-1) /SETUP THE TEST DATA POINTER DCA XR1 /STASH THE POINTER TSTLUP, TAD I XR1 /GET AN INVERTED TEST VALUE SNA /SKIP IF NOT AT END OF LIST JMS I PCALLSUB/[CALLSUB] /CALL THE READ-IN CODE TAD I XR0 /COMPARE TO READ-IN VALUE SZA CLA /SKIP IF IT MATCHES JMP I RDSETUP /RETURN IF NOT JMP TSTLUP /KEEP TESTING M30, -30 /MIDDLE TIME-OUT CONSTANT L32, 32 /CONSTANT 0032 M12, -12 /OUTER TIME-OUT CONSTANT 6 /AN UNUSED CONSTANT 0006 PTSTDAT,TSTDATA-1 /POINTER TO TEST DATA TABLE (-1) / TEST CONTENTS OF CALLABLE SUBROUTINE. ALL VALUES ARE INVERTED. THE ACTUAL / READ-IN CODE IS EXECUTABLE AS AND INSTRUCTIONS. TSTDATA,-1 -"R!200 -"D!200 -"5!200 -"1!200 -2 0 /THIS ENDS THE LIST / RD51 WAIT ROUTINE. TAKES IMMEDIATE RETURN ON ERROR OR TIME-OUT; TAKES SKIP / RETURN ON TRANSFER REQUEST FLAG; TAKES DOUBLE-SKIP RETURN ON DONE FLAG. RDWAIT, .-. /RD51 WAIT ROUTINE TAD DTIMOUT/[-DTIME] /SETUP THE DCA T7 /TIME-OUT COUNTER DCA T6 /CLEAR INNER TIME-OUT COUNTER RDWATLP,RDSR /DATA REQUEST FLAG UP? SKP /SKIP IF NOT JMP RDTRAN /JUMP IF SO RDSD /DONE FLAG UP? SKP /SKIP IF NOT JMP RDDONE /JUMP IF SO ISZ T6 /WAITED ENOUGH? JMP RDWATLP /NO, KEEP GOING ISZ T7 /WAITING TOO LONG? JMP RDWATLP /NO, KEEP GOING JMP I RDWAIT /YES, TAKE IMMEDIATE RETURN RDDONE, RDSE /ANY ERRORS? SKP /SKIP IF NOT JMP I RDWAIT /TAKE IMMEDIATE RETURN IF SO ISZ RDWAIT /TAKE DOUBLE-SKIP RETURN ON DONE FLAG RAISE RDTRAN, ISZ RDWAIT /TAKE SKIP RETURN ON TRANSFER FLAG RAISE JMP I RDWAIT /RETURN EITHER WAY / MPSCC REGISTER READ ROUTINE. CALLED WITH IN-LINE ARGUMENT OF EVEN/ODD FIELD / IN BITS[6-8] AND SPECIFIED REGISTER IN BITS[9-11]. THE CONTENTS OF THE / SPECIFIED REGISTER ARE RETURNED IN THE AC. COMREAD,.-. /MPSCC CHIP REGISTER READ ROUTINE TAD I COMREAD /GET THE IN-LINE ARGUMENT ISZ COMREAD /BUMP PAST IT DCA CTMP1 /SAVE IT TAD CTMP1 /GET IT BACK AND L70/(70) /JUST FIELD BITS TAD ZCDF/[CDF] /FORM CDF INSTRUCTION DCA .+1 /STORE IN-LINE HLT+.-. /WILL BE CDF XX INSTRUCTION TAD CTMP1 /GET ARGUMENT AGAIN AND Z7/[7] /JUST REGISTER BITS TAD L4000/(4000) /ADD ON READ ACCESS BIT MPSCC /SETUP TO READ THE SPECIFIED REGISTER CLA /CLEAN UP MPSCC /READ THE REGISTER CDF 70 /BACK TO OUR FIELD JMP I COMREAD /RETURN L4000, 4000 /CONSTANT 4000 / MPSCC REGISTER LOAD ROUTINE. CALLED WITH IN-LINE ARGUMENTS OF EVEN/ODD FIELD / IN BITS[6-8] AND SPECIFIED REGISTER IN BITS[9-11] OF THE FIRST ARGUMENT, / FOLLOWED BY VALUE TO LOAD INTO THE SPECIFIED REGISTER IN THE SECOND ARGUMENT. COMLOAD,.-. /COMMUNICATIONS CHIP REGISTER LOAD ROUTINE CLA /CLEAN UP TAD I COMLOAD /GET THE FIRST ARGUMENT ISZ COMLOAD /BUMP PAST IT DCA CTMP1 /STASH IT TAD I COMLOAD /GET THE SECOND ARGUMENT ISZ COMLOAD /BUMP PAST IT DCA CTMP2 /STASH IT TAD CTMP1 /GET THE FIRST ARGUMENT AND L70/(70) /JUST FIELD BITS TAD ZCDF/[CDF] /FORM CDF INSTRUCTION DCA .+1 /STORE IN-LINE HLT+.-. /WILL BE CDF XX INSTRUCTION TAD CTMP1 /GET THE FIRST ARGUMENT AGAIN AND Z7/[7] /JUST REGISTER BITS SZA /DON'T NEED TO POINT IF ACCESSING REGISTER 0 MPSCC /POINT TO DESIRED REGISTER NEXT TIME CLA /CLEAN UP TAD CTMP2 /GET THE NEW REGISTER CONTENTS MPSCC /LOAD THE NEW VALUE CLA /CLEAN UP CDF 70 /BACK TO OUR FIELD JMP I COMLOAD /RETURN TO CALLER L70, 70 /CONSTANT 0070 ZBLOCK 11 /EMPTY SPACE PAGE / RX50 READ COMMAND ROUTINE. THE COMMAND (TYPICALLY 0006 FOR A READ) IS PASSED / IN THE AC. THE SECTOR IS IN TINC, AND THE TRACK IN T1. TAKE IMMEDIATE RETURN / IF THE COMMAND SUCCEEDS; TAKE SKIP RETURN IF IT TIMES OUT. RXCOMD, .-. /RX50 READ COMMAND ROUTINE LCD /LOAD PASSED COMMAND TAD TINC /GET THE SECTOR STR /TRANSFER FLAG UP? JMP .-1 /NO, WAIT FOR IT XDR /YES, SEND THE SECTOR CLA /CLEAN UP TAD T1 /GET THE TRACK STR /TRANSFER FLAG UP? JMP .-1 /NO, WAIT FOR IT XDR /YES, SEND THE TRACK CLA /CLEAN UP TAD DTIMOUT/[-DTIME] /SETUP THE DCA T6 /TIME-OUT COUNTER DCA T7 /CLEAR INNER TIME-OUT COUNTER DNWAIT, SDN /DONE FLAG UP? SKP /SKIP IF NOT JMP I RXCOMD /TAKE SUCCESSFUL RETURN IF SO ISZ T7 /WAITING LONG ENOUGH? JMP DNWAIT /NO, KEEP WAITING ISZ T6 /WAITING TOO LONG? JMP DNWAIT /NO, KEEP WAITING ISZ RXCOMD /BUMP TO FAILURE RETURN JMP I RXCOMD /TAKE SKIP RETURN TO CALLER REGINIT,.-. /REGISTER INITIALIZE ROUTINE JMS I PCOMLOAD/[COMLOAD] /LOAD REGISTER A^10+0 /0A 030 /CHANNEL RESET JMS I PCOMLOAD/[COMLOAD] /LOAD REGISTER B^10+0 /0B 030 /CHANNEL RESET JMS I PCOMLOAD/[COMLOAD] /LOAD REGISTER A^10+2 /2A 020 /LOW-ORDER BITS ARE AFFECTED, NO DMA JMS I PCOMLOAD/[COMLOAD] /LOAD REGISTER B^10+2 /2B 000 /INTERRUPT VECTOR IS ALL ZEROES JMS I PCOMLOAD/[COMLOAD] /LOAD REGISTER A^10+4 /4A 104 /16X CLOCK RATE, 1 STOP BIT ASYNCHRONOUS JMS I PCOMLOAD/[COMLOAD] /LOAD REGISTER A^10+1 /1A 022 /RECEIVE AND TRANSMIT INTERRUPT ENABLE JMS I PCOMLOAD/[COMLOAD] /LOAD REGISTER B^10+1 /1B 004 /CONDITION AFFECTS VECTOR, NO B INTERRUPTS JMS I PCOMLOAD/[COMLOAD] /LOAD REGISTER A^10+3 /3A 301 /8 BITS, ENABLE RECEIVER JMS I PCOMLOAD/[COMLOAD] /LOAD REGISTER A^10+5 /5A 150 /8 BITS, ENABLE TRANSMITTER JMP I REGINIT /RETURN / ******** PRINTP, .-. /SIX PARAMETERS PRINT ROUTINE CDF 70 /RESET TO OUR FIELD DCA ROW /CLEAR COLUMN DCA COLUMN /CLEAR COLUMN TAD PCALLSUB/[CALLSUB] /SETUP THE DCA XR0 /DATA POINTER TAD L7772/(-6) /SETUP THE DCA XR1 /PARAMETER COUNT TAD PTM0/(TM0-1) /SETUP THE DCA PADR /PARAMETER ADDRESS HDLOOP, TAD I XR0 /GET A WORD TAD Z7776/[7776] /COMPARE TO MESSAGE END SZA CLA /SKIP IF IT MATCHES JMP HDLOOP /ELSE GO BACK PRLOOP, TAD I XR0 /GET A CHARACTER MQL /LOAD IT FOR PRINTING CLA MQA /GET IT BACK TAD Z7741/[-37] /COMPARE TO DELIMITER SNA /SKIP IF OTHER JMP ATDEL /JUMP IF A MATCH IAC /COMPARE TO ALTERNATE DELIMITER VALUE SNA /SKIP IF OTHER JMP ATDEL /JUMP IF A MATCH TAD L4/(4) /COMPARE TO END OF DATA VALUE SNA CLA /SKIP IF OTHER JMP I PRINTP /RETURN IF IT MATCHES JMS I PCHRPRT/[CHRPRT] /PRINT THE CHARACTER JMP PRLOOP /KEEP GOING ATDEL, JMS I PCHRPRT/[CHRPRT] /PRINT THE CHARACTER TAD XR1 /GET PARAMETER COUNT SNA CLA /SKIP IF NOT DONE JMP PRLOOP /JUST PRINT THE FIELD ISZ XR1 /COUNT THIS ONE NOP /IN CASE IT SKIPS ISZ PADR /BUMP TO NEXT ADDRESS TAD M4/(-4) /SETUP THE DCA XR2 /DIGIT COUNTER TAD I PADR /GET THE VALUE DCA DIGTMP /STASH IT DIGLUP, TAD DIGTMP /GET VALUE BACK R3L /MOVE UP DCA DIGTMP /STORE IT BACK TAD DIGTMP /GET IT AGAIN AND Z7/[7] /JUST LATEST DIGIT TAD L60/("0&177) /MAKE IT ASCII MQL /STASH IT JMS I PCHRPRT/[CHRPRT] /PRINT THE CHARACTER ISZ XR2 /DONE ALL DIGITS YET? JMP DIGLUP /NO, KEEP GOING JMP PRLOOP /KEEP GOING / ********* L4, 4 /CONSTANT 0004 M4, -4 /CONSTANT 7774 L7772, -6 /CONSTANT 7772 L60, "0&177 /ASCII NUMERIC CONSTANT 0060 PADR, .-. /PARAMETER ADDRESS TEMPORARY DIGTMP, .-. /OUTPUT VALUE STORED HERE PTM0, TM0-1 /POINTER TO DATA BLOCK / RD51 TEST AND WAIT ROUTINE. IF RD51 IS PRESENT, THEN WAIT AWHILE. RDTWAIT,.-. /RD51 TEST AND WAIT ROUTINE NL7777 /SET TEST PATTERN RDTEST /AC WILL CLEAR IF RD51 IS PRESENT SZA CLA /SKIP IF RD51 INSTALLED JMP I RDTWAIT /RETURN IF NOT TAD M2260/(-2260) /SETUP THE DCA T6 /OUTER LOOP COUNTER DCA T7 /CLEAR THE INNER LOOP COUNTER WAITLUP,ISZ T7 /WAIT FOR AWHILE JMP WAITLUP /KEEP WAITING ISZ T6 /WAITED ENOUGH JMP WAITLUP /NO, KEEP GOING JMP I RDTWAIT /YES, RETURN TO CALLER M2260, -2260 /CONSTANT 5520 ZBLOCK 4 /EMPTY SPACE PAGE / THIS ROUTINE CHECKS FOR BYTES LOADED AS 0377 TO BE REPLACED WITH 4000. THE / AFFECTED DATA CONSISTS OF THE FRESHLY READ-IN (IN BYTE MODE) CONTENTS OF TRACK / 1, SECTOR 3 PAST THE VALIDATED HEADER BYTES, LOCATIONS 15360-15777 ONLY. RUBCHK, .-. /377 CODE REPLACE ROUTINE TAD RUBPTR/(T0S3BUFFER+10) /SETUP THE LIST POINTER PAST THE HEADER DCA VPTR /STASH THE POINTER VLUP, CDF 10 /GOTO DATA FIELD TAD I VPTR /GET A WORD IAC /ADD ONE AND Z377/[377] /LOW-ORDER BITS ONLY SZA CLA /SKIP IF THEY WERE ALL SET JMP VAROUND /ELSE RETAIN THIS WORD NL4000 /GET REPLACEMENT VALUE DCA I VPTR /STORE OVER LIST ELEMENT VAROUND,CDF 70 /BACK TO OUR FIELD ISZ VPTR /BUMP TO NEXT NL2000 /GET ADDRESS MASK AND VPTR /JUST QUADRANT BIT SNA CLA /SKIP IF JUST FINISHED JMP VLUP /JUMP IF NOT JMP I RUBCHK /RETURN TO CALLER RUBPTR, T0S3BUFFER+10 /POINTER TO DATA PAST THE HEADER VPTR, .-. /DATA POINTER / WHILE THERE IS NO MORE ACTUAL CODE, THE FOLLOWING LINES ARE PRESENT TO / CALCULATE THE MOVE LENGTH FOR THE CP-INTERRUPT HANDLER USED DURING THE / LOOPBACK TEST IN MAIN MEMORY. THIS CALCULATION IS PROBABLY INCORRECT AND / MOVES TOO MUCH CODE. THE ONLY POSSIBLE PROBLEM IS INTERACTION WITH APT / DOWNLOADED PROGRAM CONVENTIONS. ZBLOCK .&7600+200-. /EMPTY SPACE IN THE REST OF THE PAGE / THIS IS WHERE THE STARTUP SECTOR CODE IS READ IN AS A CALLED SUBROUTINE. CALLSUB,.-. /TEST SUBROUTINE LOCATION CPEND2= . /MOVED CP INTERRUPT HANDLER CODE ENDS HERE? TSTBUFF,ZBLOCK 4 /KEYBOARD TEST BUFFER TSTBEND=. /END OF KEYBOARD TEST BUFFER RELOC 6000 /EMPTY SPACE APTSTRT=. /APT ROUTINE STARTS HERE RELOC 6400 /EMPTY SPACE WRIBUFF=. /WRITE BUFFER FOR SETUP RELOC 6500 /EMPTY SPACE APTROUT=. /APT ROUTINE LOADS HERE RELOC .+20 /EMPTY SPACE APTRO2= . /SECONDARY APT ADDRESS HERE RELOC /UN-FOOL THE ASSEMBLER ZBLOCK ROMGO-. /EMPTY SPACE $ /THAT'S ALL FOLK!