//monprom.asm 2005-01-01 /********************************************************* /* Customized prom version of Scelbi 8008 Monitor Routines /********************************************************* /* Equates for non-printable characters - with parity forced EQU CTLD 204 EQU BS 210 EQU LF 212 EQU FF 214 EQU CR 215 EQU SP 240 /* Equates for Page Zero Usage EQU BRKJMP 070 /JUMP INSTRUCTION FOR BRKPT EQU OCTDGT 150 /3 BYTES FOR OCTAL ROUTINE EQU CMDJMP 155 /JUMP INS FOR CMD ROUTINES EQU TMP1 164 /TEMP STORAGE EQU TMP2 165 /TEMP STORAGE EQU OCTLAD 166 /LOW ADDRESS - ADR PORTION EQU OCTLPG 167 /LOW ADDRESS - PAGE PORTION EQU OCTHAD 170 /HIGH ADDRESS - ADR PORTION EQU OCTHPG 171 /HIGH ADDRESS - PAGE PORTION EQU TRFLAD 172 /TEMP STORAGE EQU TRFLPG 173 /TEMP STORAGE EQU TRFHAD 174 /TEMP STORAGE EQU TRFHPG 175 /TEMP STORAGE EQU TRTLAD 176 /TEMP STORAGE EQU TRTLPG 177 /TEMP STORAGE EQU VREGA 200 /VIRTUAL CPU REG "A" EQU VREGB 201 /VIRTUAL CPU REG "B" EQU VREGC 202 /VIRTUAL CPU REG "C" EQU VREGD 203 /VIRTUAL CPU REG "D" EQU VREGE 204 /VIRTUAL CPU REG "E" EQU VREGH 205 /VIRTUAL CPU REG "H" EQU VREGL 206 /VIRTUAL CPU REG "L" EQU VREGF 207 /FLAG STATUS BYTE EQU INPBFR 340 /INPUT BUFFER / INPUT BUFFER USES THE REST OF PAGE ZERO / /COMMAND INPUT ROUTINE / ORG 70 000 /START OF 2K PROM ENTRY 70 000 /FORCE LOADER FORMAT INCMD, LHI PROMPT/400 /SET PNTR TO HEADING MSG LLI PROMPT CAL MSG /PRINT C/R, L/F, > CAL CDIN /INPUT LINE FROM KYBD LLI INPBFR /INPUT BUFFER LAM /FETCH COMMAND CHAR NDI 337 /MAKE CMD UC LDI 012 /SET CMND NMBR CNTR LHI CMDLUT/400 LLI CMDLUT /SET CMND TABLE PNTR CKCMD, CPM /IS CMND CHAR FOUND IN TBL? JTZ FOUND /YES, PROCESS COMMAND INL /NO,ADVANCE CMND TBL PNTR INL INL DCD /IS LAST CMND CHECKED? JFZ CKCMD /NO, CHECK NEXT ERR, CAL HDLN /YES, PRINT C/R, L/F LAI 311 /ILLEGAL ENTRY CODE CAL PRINT /PRINT ERROR MSG JMP INCMD /INP NEXT COMMAND / FOUND, INL /ADD CMND TBL PNTR LDM /FETCH CMND LO ADDR INL LCM /FETCH CMND PG ADDR LLI CMDJMP /SET PNTR TO JMP INSTR. LHI CMDJMP/400 LMI 104 /LOAD JMP OP CODE INL LMD /LOAD LO ADDR OF CMND INL LMC /LOAD PG ADDR OF CMND LLE JMP CMDJMP /JUMP TO CMND ROUTINE / CDIN, LLI INPBFR /SET PNTR TO START OF INP BFR LHI INPBFR/400 SPI, LMI SP /FILL INP BFR WITH SPACES INL /INCR INP BFR PNTR JFZ SPI /DONE? NO, STORE MORE SPACES LLI INPBFR /SET INP BFR PNTR IN2, CAL RCV /INP CHAR FM INP DEVICE CPI CTLD /CHAR = CNT'L D? JTZ INCMD /YES, RET TO COMMAND MODE CPI CR /CHAR = CAR RET? RTZ /YES, RET TO CALLING PGM CPI FF /CHAR = CNT'L? RTZ /YES, RET TO CALLING PGM CPI BS /CHAR = RUBOUT? JTZ BDCR /YES, DELETE CHAR FM INP BFR INL /IS INP BFR FULL? DCL JTZ IN2 /YES, DON'T STORE CHARACER LMA /NO, STORE CHARACTER INL /INCR INP BFR PNTR IN3, CAL PRINT /ECHO INPUT TO DISPLAY JMP IN2 /CONTINUE INPUT / BDCR, LAI INPBFR /SET ACC TO INP BFR S.A. CPL /ANY CHARACTERS YET? JTZ IN2 /NO, CONTINUE INPUT DCL /YES, BACK UP INP BFR PNTR LMI SP /STORE SPACE OVER LAST CHAR LAI BS /RESTORE BACKSPACE CHAR JMP IN3 /ECHO BACKSPACE & CONTINUE INPUT / HDLN, LLI CRLF /SET PNTR TO C/R, L/F MSG LHI CRLF/400 /FALL THRU TO PRINT MSG / MSG, LAM /FETCH CHAR TO PRINT NDA /END OF MSG CHAR? RTZ /YES, RET TO CALLING PGM CAL PRINT /NO, PRINT CHAR CAL INMEM /INCR MSG PNTR JMP MSG /CONTINUE PRINT OUT / INMEM, INL /INCR LO ADDR RFZ /IF NON ZERO, RET INH /ELSE, INCR PG ADDR RET /RET TO CALLING PGM / OCTNM, LEL /SAVE INP BFR PNTR CAL OCTPR /CONVERT 1ST OCATAL PAIR LLI OCTLAD /SET PNTR TO LO ADDR STRAGE LMB /SAVE LO HALF OF LO ADDR INL LMC /SAVE PG HALF OF LO ADR LLE /RESTORE INP BFR PNTR LAM /FETCH NXT CHAR CPI 254 /CHAR = COMMA? JFZ SGL /NO, ONLY ONE ENTRY INL /YES, INCR INP BFR PNTR LEL /SAVE INP BFR PNTR CAL OCTPR /CONVERT 2ND OCTAL PAIR SGL, LLI OCTHAD /SET PNTR TO HI ADDR STORAGE LMB /SAVE LO HALF OF HI ADDR INL LMC /SAVE PG HALF OF HI ADDR LAC LLI OCTLPG /IS HI ADDR < LO ADDR? CPM JTC ERR /YES, PRINT ERROR RFZ /IF PG HALF NOT =, RET INL /ELSE, CHECK LO HALF LAM LLI OCTLAD /IS HI ADDR < LO ADDR? CPM JTC ERR /YES, PRINT ERROR MSG RET /NO, RET TO CALLING PGM / OCTPR, CAL DCDNM /DECODE 1ST OCTAL NUMBER LCB /SAVE OCTAL NUMBER INE /INCR INP BFR PNTR / FALL THRU TO DECODE 2ND NMBR / DCDNM, LLI OCTDGT /SET PNTR TO DIGIT STRAGE TBL LMH /CLEAR TBL BY STORING 000. INL LMH INL LMH LLE LOOP, CAL FNUM /CHECK FOR VALID NUMBER JTS CKLNH /IF NOT, CHECK CHAR CNT = 0 LAM /FETCH CHAR LDL /SAVE INP BFR PNTR NDI 007 /MASK OFF 260 LLI OCTDGT /STORE OCTAL NUMBER IN LBM /TABLE IN PG 00 LMA /AND SHIFT OTHER NUMBERS INL /UP THRU THE TABLE LAM LMB INL LMA LLD /RESTORE AND INCR INP BFR PNTR INL JMP LOOP /FETCH NEXT NUMBER / CKLNH, LAL CPE /IS CHAR CNT = 0? JTZ ERR /YES, PRINT ERROR MSG LEL /NO, SAVE INP BFR PNTR CAL OCT /FETCH FINAL OCTAL NUMBE JFS ERR /IF INVALID, PRINT ERR MSG RET /ELSE RET TO CALLING PGM / FNUM, LAM /IS CHAR A VALID NUMBER? CPI 260 RTS /NO, RET WITH S FLAG SET SUI 270 /CHECK UPPER LIMIT BY ADI 200 /SETTING S FLAG TO PROPER RET /STATE AND RETURN / INCR, ADI 001 /INCR CONTENTS OF MEM LOC LMA /RESTORE MEM CONTENTS RFC /IF NO CARRY, RET INL /ELSE, FETCH NXT LOC LAM ADI 001 /INCR MEM CONTENTS LMA /RESTORE MEM CONTENTS RET /RETURN TO CALLING PGM / OCT, LLI OCTDGT+2 /SET PNTR TO 3RD DIGIT LAM CPI 004 /IS 3RD DIGIT > 3? RFS /YES, RET WITH S FLAG RESET NDI 003 /CLEAR CARRY RRC /POSITION DIGIT RRC LBA /SAVE IN REG B DCL /DECR PNTR LAM /FETCH NEXT DIGIT RLC /POSITION DIGIT RLC RLC ADB /ADD TO REG B DCL /DECR PNTR ADM LBA /SAVE FINAL NUMBER LAI 200 /SET S FLAG TO INDICATE NDA /THAT THE NUMBER IS VALID RET /RET TO CALLING PGM / SWITCH, LCH /SWITCH THE PNTR IN LHD /REG'S H AND L WITH LDC /THE PNTR IN REG'S D AND E LCL LLE LEC RET /RET TO CALLING PGM / OCTOUT, LLA /SAVE OCTAL NUMBER TO PRINT RLC /POSITION HUNDRED'S DIGIT RLC NDI 003 /MASK OFF OTHER BITS ORI 260 /FORM OCTAL NUMBER CAL PRINT /PRINT DIGIT LAL /FETCH OCTAL NUMBER RRC /POSITION TENS'S DIGIT RRC RRC NDI 007 /MASK OFF OTHER DIGITS ORI 260 /FOR ASCII CODE CAL PRINT /PRINT DIGIT LAL /FETCH OCTAL NUMBER NDI 007 /MASK OFF OTHER DIGITS ORI 260 /FORM ASCII CODE JMP PRINT /PRINT DIGIT AND RET / COLON, LAI 272 /SET ASCII CODE FOR : JMP PRINT /PRINT COLON AND RET PRT166, LLI OCTLPG /SET PNTR TO PG ADDR LHI OCTLPG/400 /OF LO ADDR STORED LAM /FETCH PG ADDR NDI 077 CAL OCTOUT /PRINT PG ADDR CAL SPAC /PRINT A SPACE LLI OCTLAD /SET PNTR TO LO ADDR LAM /FETCH LO ADDR CAL OCTOUT /PRINT LO ADDR / /FALL THRU TO PRINT SPACE / SPAC, LAI 240 /SET ASCII CODE FOR SPACE JMP PRINT /PRINT SPACE AND RET / SETUP, LHI OCTLAD/400 LLI OCTLAD /SET PNTR TO LOW ADDR LCM /FETCH LO ADDR INL LHM /FETCH PG ADDR LLC /SET PNTR TO MEM LOC RET /RET TO CALLING PGM / CKEND, LHI OCTHPG/400 LLI OCTHPG /SET PNTR TO HI ADDR LAM /FETCH 2ND HALF LLI OCTLPG /SET PNTR TO END HALF LO ADDR CPM /2ND HALFS EQUAL? JFZ CONT /NO, CONTINUE ROCESS INL LAM /FETCH 1ST HALF HI ADDR LLI OCTLAD /SET PNTR TO 1ST HALF HI ADDR CPM /1ST HALFS EQUAL? JTZ INCMD /YES, RET TO CMND MODE CONT, LLI OCTLAD /NO, SET PNTRO TO LO ADDR LAM JMP INCR /INCR LO ADDR AND RET / MODIFY, LLI INPBFR+2 /SET INP BFR PNTR CAL OCTNM /FETCH ADDR TO MODIFY CAL SPAC /PRINT SPACE MOD1, CAL MEMPRT /PRINT CONTENTS OF MEM LOC CAL COLON /PRINT COLON CAL INSPCL /INP MODIFICATION LAI INPBFR /WAS MOD ENTERED? CPL JTZ NXLOC /NO, SET UP NXT LOC LEA /YES, SAVE INP PNTR CAL DCDNM /CONVERT TO OCTAL NUMBER LAB /SAVE OCTAL NUMBER LLI OCTLAD /SET PNTR TO MEM ADDR STRAGE LEM /FETCH MEMPNTR INL LDM CAL SWITCH /SET PNTR TO MEM LOC LMA /LOAD MEM WITH NEW VALUE NXLOC, LHI OCTLAD/400 /SET PNTR TO PG 00 LLI OCTLAD /SET PNTR TO MEMADDR STRANGE LAM /FETCH LO HALF CAL INCR /INCR MEM ADDR CAL MCONT /PRINT NXT ADDR TO MODIFY JMP MOD1 / MCONT, CAL HDLN /PRINT C/R, L/F JMP PRT166 /PRINT ADDR TO MODIFY AND RET / INSPCL, LLI INPBFR /SET PNTR TO S.A. OF INP BFR LHI INPBFR/400 LPIN, CAL RCV /INP CHAR LMA /STORE CHAR IN INP BFR CPI 240 /CHAR = SPACE? RTZ /YES, RET TO CALLING PGM CPI 212 /NO, CHAR = NL? JTZ INCMD /YES, RET TO COMMAND MODE INL /NO, INCR INP BFR PNTR JTZ ERR /INP BFR FULL? YES, ERROR JMP LPIN /NO, INP NXT CHAR / MEMPRT, CAL SETUP /SET PNTR TO MEM LOC LAM /FETCH CURRENT MEM CONTENTS JMP OCTOUT /PRINT CONTENTS AND RET / MDUMP, LLI INPBFR+2 /SET PNTR TO INP BFR CAL OCTNM /FETCH MEM DUMP LIMITS CAL HDLN /PRINT C/R, L/F MDMP1, CAL MCONT /PRINT ADDR OF 1ST LOC CAL SPAC /PRINT SPACE MDMP2, LLI TMP1 /SET PNTR TO TEMP STRAGE LMI 020 /SAVE LOC PER LINE CNTR OUTAGN, CAL MEMPRT /PRINT MEMORY CONTENTS CAL CKEND /CHECK FOR LAST LOC PRTD CAL SPAC /PRINT SPACE LLI TMP1 /SET PNTR TO L/L CNTR LBM /FETCH CNTR DCB /DECR CNTR LMB /SAVE CNTR, CNTR = 0? JTZ MDMP1 /YES, START NEW LINE JMP OUTAGN /NO, PRINT MORE CONTENTS / WRITE, LLI INPBFR+2 /SET PNTR TO INP BFR CAL OCTNM /FETCH START AND END ADDR LLI OCTLAD /SET REG'S H AND L WITH LCM /THE START ADDR AND INL /REG'S D AND E WITH LBM /THE END ADDR OF THE INL /BLOCK OF MEM TO BE LEM /WRITTEN TO THE BULK INL /STORAGE DEVICE LDM LHB LLC CAL PUNCH /GO TO USER BULK WRITE RTN JMP INCMD /RET TO COMMAND MODE / RDBULK, CAL READ /GO TO USER BULK READ RTN JMP INCMD /RETURN TO COMMAND MODE / BREAK, CAL ANLYZ /SET UP ADDRESS OF BP LLE LHD JTZ B1 /DETERMINE IF B1 OR B2 CPI 262 JFZ ERR /ERROR IF NEITHER / B2, CAL SETBK /SET UP BP RST COMMAND LMI BRK2 /**** STORE BP2 FND LA INL LMI BRK2/400 /**** STORE BP2 FND PG JMP FINBK /TO REST OF BP SET UP RTN / B1, CAL SETBK /SET UP BP RST COMMAND LMI BRK1 /**** STORE BP1 FND LA INL LMI BRK1/400 /**** STORE BP1 FND PG FINBK, INL LME /STORE BP ORIG LOW ADDR INL LMD /STORE BO ORIG PG ADDR INL LMA /STORE ORIG BP INSTRUCTION JMP INCMD / ANLYZ, LLI INPBFR+3 /SET PNTR TO BUFF SA CAL OCTNM /FETCH ADDR INTO TEMP STORAGE LLI INPBFR+1 /RESTORE BUFF SA LAM /GET BP 1 OR 2 COMMAND LLI OCTLAD /GET BP LOW ADDR LEM /INTO "E" INL LDM /AND BP PAGE LLI CMDJMP /PNTR TO JUMP COMMAND LMI 104 /SET UP JMP COMMAND INL LME INL /SET UP JUMP ADDRESS LMD CPI 261 /DETERMINE IF CMND 1 OR 2 RET / SETBK, LAM /SAVE ORIG CONTENTS OF BP LMI BRKJMP+5 /INSERT BP RESTART INSTR LEL /CHANGE POINTERS LDH LHI 000 /SET PAGE 00 LLI BRKJMP /SET PNTR TO RST 1 LOC LMI 104 /STORE JUMP INSTRUCTION INL RET / BRK1, LHI 000 /SET PAGE 00 LLI VREGA /CPU REGISTER STORAGE LOCS LMA /SAVE ACCUMULATOR LLI VREGB LMB /AND CPU REGS B & C LLI VREGC BRKCOM, LMC /WITHOUT DISTURBING FLAGS FLAGAT, LAH /SET UP TEMP REGS LBA LCA JFC NOC /TEST FOR CARRY FLAG LAI 001 /SET 1 IN "A" IF CARRY TRUE NOC, JFZ NOZ /TEST FOR ZERO FLAG LBI 010 /SET 1 IN "B" IF ZERO TRUE NOZ, JFP NOP /TEST FOR PARITY FLAG LCI 100 /SET 1 IN "C" IF PARITY "T" NOP, JFS NOS /TEST FOR SIGN FLAG ADI 200 /SET MSB IF SIGN TRUE NOS, ADB ADC /FORM FLAG STATUS BYTE LLI VREGF LMA /STORE FLAG STATUS LLI BRKJMP+3 /PNTR TO ORIG BP LOW ADDDR LEM /GET ORIG LOC OF BP INL LDM /AND ORIG PG OF BP INL LAM /AND ORIG PG OF BP LLE /SET UP ORIGINAL LHD /BREAK POINT POINTERS LMA /RESTORE ORIG BKPNT INSTR JMP INCMD /BACK TO MONITOR / BRK2, LBH /SAVE ORIG VALUE OF H & L LCL LHI VREGD/400 /SET PNTR TO PAGE 00 LLI VREGD /CPU REGISTER STORAGE LOCS LMD /SAVE REGS D AND E LLI VREGE /AS WELL AS ORIG H AND L LME LLI VREGH /WITHOUT DISTURBING FLAGS LMB LLI VREGL JMP BRKCOM /TO REST OF BREAKPT RTN /* GO TO ROUTINE GOTO, CAL ANLYZ /SET UP ADDR OF GOTO JTZ GO1 /TO SET UP CPU REGS A,B,C CPI 262 JFZ ERR /ERROR IF NOT G1 OR G2 / GO2, LLI VREGD /SET UP CPU REGS D,E,H & L LDM INL LEM GOCOM, INL LBM INL LCM LLC LHB JMP CMDJMP / GO1, LLI VREGA /SET UP CPU REGS A,B,C LAM JMP GOCOM / XREG, LLI INPBFR+1 /SET INP BFR PNTR LAM /FETCH REG LETTER NDI 337 /FORCE UC RGAGN, CPI 301 /IS REG VALID? JTC ERR /NO, PRINT ERROR CPI 306 /YES, IS REG A THRU E? JFC FHL /NO, TRY H, L OR F SUI 101 /SET UP REG TBL PNTR XCOM, LLI TMP1 /SAVE TBL PNTR IN TEMP STRAGE LMA LLA /SET PNTR TO REG TBL LOC CAL SPAC /PRINT SPACE LAM /FETCH CURRENT REG VALUE CAL OCTOUT /PRINT CURRENT REG VALUE CAL COLON /PRINT COLON CAL INSPCL /INP MODIFICATION LEI INPBFR /SET INP BFR PNTR LAL CPE /WAS MOD ENTERED? JTZ INCMD /NO, RET TO COMMAND MODE CAL DCDNM /YES, DECODE OCTAL NUMBER LLI TMP1 /SET PNTR TO TEMP STRAGE LLM /FETCH REG TBL PNTR LMB /STORE NEW REG VALUE JMP INCMD /RET TO COMMAND MODE / FHL, CPI 310 /IS REG = H? JFZ LORF /NO, TRY L OR F LAI VREGH /YES, SET REG TBL PNTR JMP XCOM /INP MOD TO REG VALUE / LORF, CPI 314 /IS REG = L? JFZ F /NO, ATRY F LAI VREGL /YES, SET REG TBL PNTR JMP XCOM /INP MOD TO REG VALUE / F, CPI 306 /IS REG = F, FOR FLAGS? JFZ ERR /NO, PRINT ERROR CAL SPAC /PRINT SPACE LLI VREGF /SET REG TBL PNTR LAM /FETCH FLAG WORD CAL OCTOUT /PRINT FLAG WORD JMP INCMD /RET TO COMMAND MODE / FILL, CAL ADRDTA /INP ADDR AND DATA FM BFR FL1, CAL SETUP /SET UP MEM PNTR LMB /FILL MEM LOC WITH DATA CAL CKEND /DONE? YES, RET TO CMND MODE JMP FL1 /NO, CONTINUE WITH FILL / SEARCH, CAL ADRDTA /INP ADDR AND DATA FM BFR LLI TMP2 /SET PNTR TO SAVE DATA LMB /SAVE SEARCH DATA IN MEM SH1, LLI TMP2 /SET PNTR TO SRCH DATA LAM /FETCH SEARCH DATA CAL SETUP /FETCH CONTENTS OF MEM CPM /DATA EQUAL SRCH DATA? CTZ MCONT /YES, PRINT ADDR CAL CKEND /DONE? YES, RET TO CMND MODE JMP SH1 /NO, CONTINUE SEARCH / ADRDTA, LLI INPBFR+2 /SET PNTR TO ADDR INP CAL OCTNM /INPUT START AND END ADDR INE /INCR TO DATA POSITION JMP DCDNM /FETCH DATA FM INP BFR / TRNSFR, LLI INPBFR+2 /SET PNTR TO ADDR INP CAL OCTNM /FETCH 'FROM' ADDR LLI OCTLAD /SET PNTR TO ADDR INP LBE /SAVE INP BFR PNT LEI TRFLAD /SAVE 'FROM' IN TEMP STRGE LDH SVSA, CAL SWAP /MOVE ADDR TO TEMP STRGE LAI TRFLAD /IS XFR COMPLETE? CPL JFZ SVSA /NO, CONTINUE MOVE INB /SKIP OVER COMMA LLB /RESTORE INP BFR PNTR CAL OCTNM /INP 'TO' ADDR LLI TRTLAD /SET PNTR TO SAVE 'TO' ADDR LMB /SAVE LO ADDR INL LMC /SAVE PG ADDR LLI TRFLAD /SET PNTR TO TEMP STRGE LEI OCTLAD /SET TO MOVE 'FROM' BACK LDH TF1, CAL SWAP /XFR 'FROM' LAI TRTLAD CPL /XFR COMPLETE? JFZ TF1 /NO, CONTINUE LEM /FETCH 'TO' PNTR INL LDM TF2, CAL SETUP /SET 'FROM' PNTR CAL SWAP /SWAP MEM CONTENTS CAL CKEND /DONE? YES, RET TO CMND MODE JMP TF2 /NO, CONTINUE XFR / SWAP, LAM /FETCH BYTE TO XFR CAL INMEM /INCR 'FROM' PNTR CAL SWITCH /CHANGE PNTRS LMA /STORE BYTE IN NEW LOC CAL INMEM /INCR 'TO' PNTR JMP SWITCH /CHANGE PNTRS AND RET / /MONITOR MESSAGE TABLE / PROMPT, DB 215 /CAR. RET. DB 212 /LINE FEED DB 276 /> DB 000 CRLF, DB 215 /CAR. RET. DB 212 /LINE FEED DB 000 / / /COMMAND LOOK UP TABLE / CMDLUT, DB 'M'+200 /MODIFY DW MODIFY DB 'D'+200 /DUMP DW MDUMP DB 'W'+200 /BULK WRITE DW WRITE DB 'R'+200 /BULK READ DW RDBULK DB 'B'+200 /BREAKPOINT DW BREAK DB 'G'+200 /GO TO DW GOTO DB 'X'+200 /EXAMINE REGISTERS DW XREG DB 'F'+200 /FILL MEM DW FILL DB 'S'+200 /SEARCH DW SEARCH DB 'T'+200 /TRANSFER DW TRNSFR / RCV, INP 0 /GET INPUT STATUS NDI 001 /KBD READY? JTZ RCV /NO INP 1 /READ KBD ORI 200 /SET PARITY BIT LBA /SAVE INPUT CHAR LAI 376 /PORT 11 RESET MASK OUT 10 /ACK KBD LAB /RESTORE INPUT RET / / / READS FILE FROM INP2 / EXPECTS 6 BYTE HEADER: / 0 ENTRY ADDRESS (ADDR:PG) / 2 LOAD ADDRESS (ADDR:PG) / 4 FILE LENGTH (LOW:HIGH) / USES RST 0 TO LAUNCH PROGRAM READ, LHI 0 /PAGE 0 LLH /RST 0 ADDRESS LAI 104 /JMP OP CODE LMA /STORE JMP CODE INL /POINT TO RST ADDRESS CAL GET /GET ENTRY ADDRESS LMA /STORE ADDRESS INL /POINT TO RST PAGE CAL GET /GET PAGE LMA /STORE PAGE CAL GET /GET LOAD ADDRESS LLA /POINT TO ADDRESS CAL GET /GET LOAD PAGE LHA /POINT TO PAGE CAL GET /GET LOW LENGTH LCA /PUT IN COUNTER CAL GET /GET HIGH LENGTH LDA /PUT IN COUNTER NEXT, CAL GET /GET FILE BYTE LMA /STORE BYTE INL /INCREMENT MEMORY POINTER JFZ SAME /STILL ON SAME PAGE INH /INCREMENT PAGE POINTER SAME, DCC /DECREMENT LOW COUNT JFZ NEXT /NOT DONE YET DCD /DECREMENT HIGH COUNT JFS NEXT /STILL LOTS TO DO RST 0 /CALL LOADED PROGRAM JMP INCMD /RESTART MONITOR IF PROGRAM RETURNS GET, INP 0 /GET INPUT STATUS NDI 002 /LOADER READY? JTZ GET /NO INP 2 /READ LOADER LBA /SAVE INPUT CHAR LAI 375 /PORT 2 RESET MASK OUT 10 /ACK LOADER LAB /RESTORE INPUT RET / PRINT, NDI 177 /CLEAR PARITY BIT OUT 11 /WRITE TO DISPLAY RET /* BULK STORAGE OUTPUT /* HL -> START /* DE -> END PUNCH, LAM /GET BYTE TO WRITE OUT 12 /WRITE TO PUNCH DEVICE LAH CPD /LAST PAGE? JFZ PUNCH1 /NOT YET LAL CPE /LAST BYTE? RTZ /YES, RETURN TO WRITE COMMAND PUNCH1, CAL INMEM /NEXT MEMORY LOCATION JMP PUNCH /KEEP IT MOVING