' This is absolute loader. ' It reads a tape and store it to the memory, then send the control to the readen programm ' 8-bit tape: xx xx xx ... xx xx FF 00 ' BOOTABLE tape: xx xx xx ... xx xx FF FF 00 ' 4-bit tape: xx xx xx ... xx xx FF FF FF 00 RO1 OBA 402_M1 'STOP READER HLT NXT: 'NEXT BLOCK OBA 602_M1 'START READER IBA 002_M1 'READ A BYTE - FOR CLEAR READY FLAG LDA7 READ8 ' STORE 8-BIT READING ADDRES AS DEFAULT READING. STA0 READADDR 'CRC=0, NO_CRC!=0 STV0 NO_CRC 'write something from readaddr LDA7 0_H2 STA0 CRC ' SKEEPING BLANK HEAD: 'DO LEADER: 'CALL READ LDB7 BLANK_RET STB0 RETADDR JMP2 READADDR BLANK_RET: 'WHILE A!=FF (IT IS A LEADER) h0: INA ALA 8_D1 NAZ LEADER ' FF FF — 4-bit, FF 00 - 8-BIT else - error 'CALL READ LDB7 FF2_RET STB0 RETADDR JMP2 READADDR FF2_RET: JAZ READ_DATA ' 8-BIT VARIANT INA ALA 8_D1 NAZ ERR ' NOT 8-BIT (IT'S ABOVE), NOT 4-BIT (FF+1=0) - ERROR ' FF FF FF - 4-BIT, else - error 'CALL READ LDB7 FF3_RET STB0 RETADDR JMP2 READADDR FF3_RET: INA ALA 8_D1 NAZ ERR ' ERROR ' FF FF FF 00 - 4-BIT, else - error 'CALL READ LDB7 FF30_RET STB0 RETADDR JMP2 READADDR FF30_RET: NAZ ERR ' ERROR LDB7 READ4 ' STORE 4-BIT READING ADDRES . STB0 READADDR READ_DATA: LDA7 0_H2 STV0 NO_CRC 'READING BLOCK LENGHT 'CALL READ LDB7 LNG_RET STB0 RETADDR JMP2 READADDR LNG_RET: 'LNH: HLT 'OCA INA STV0 LNG 'LNG=NEG(A)+1 SO LNG=-A STA0 LNG 'LNG=A 'READING BASE ADDRES TO X-REG 'CALL READ LDB7 BASE_RET STB0 RETADDR JMP2 READADDR BASE_RET: 'BAH: HLT STV0 PRG_ADDR2 'CALL READ LDB7 BASE2_RET STB0 RETADDR JMP2 READADDR BASE2_RET: 'BA2H: HLT STV0 PRG_ADDR1 LDX0 PRG_ADDR2 'IF (LENGHT == 0) GOTO BASE ADDR LDA0 LNG NAZ NOT_GOTO OBA 402_M1 'STOP READER JMP4 NOT_GOTO: 'ELSE READ THE BLOCK TO THE ADDRESSED AREA 'FOR (; LNG!=0; LNG++) 'DWM0 LNG2 NXT_CMD: 'CALL READ LDB7 BLOCK_RET STB0 RETADDR JMP2 READADDR BLOCK_RET: STV4 ' STORE THE READEN BYTE INX 'DH: HLT 'NEXT LNG; 'LDV0 LNG 'INA 'STV0 LNG 'ALA 8_D1 'NAZ NXT_CMD DWM0 LNG LDA0 LNG NAZ NXT_CMD 'IF (WRITTEN_CRC != CALCULATED_CRC) {STOP_READER; BEEP; HLT;} ' WRITTEN CRC -> AL 'CALL READ; NO CRC CHANGING LDB7 CRC_TST STB0 RETADDR LDA7 1_H2 STV0 NO_CRC JMP2 READADDR CRC_TST: STA0 TMP2 'A=CRC+(CRC>>8), ONLY LOW BYTE LDA0 CRC LRA 8_D1 ADA0 CRC ALA 8_D1 LRA 8_D1 SBA0 TMP2 'CRCERR: HLT JAZ CRC_CORRECT 'CALCULATED CRC (B) == READEN CRC (A) ERR: OBA 402_M1 'STOP READER LDA7 7_H2 OBA 0_H1 'RING EH: HLT CRC_CORRECT: JMP0 NXT 'READING THE NEXT BLOCK '--------------------------------------------------------------------------------- READ4: 'OBA 602_M1 'START READER 'IBA 002_M1 'READ A BYTE - FOR CLEAR READY FLAG WAIT4: IBA 102_M1 'READ READER STATUS ANA7 2_H2 ' TEST A WITH "READY TO SEND" MASK JAZ WAIT4 ' IF READER IS NOT READY YET - WAIT IBA 002_M1 ' READ THE DATA 'SAVE 4 BITS AS HIGHT TETRADE ALA 12_D1 ARA 8_D1 STV0 TMP1 WAIT42: IBA 102_M1 'READ READER STATUS ANA7 2_H2 ' TEST A WITH "READY TO SEND" MASK JAZ WAIT42 ' IF READER IS NOT READY YET - WAIT IBA 002_M1 ' READ THE DATA 'SAVE 4 BITS AS LOW TETRADE ALA 12_D1 ARA 12_D1 'AND ADD HIGHT TETRADE ADV0 TMP1 'OBA 0_H1 'AND SEND TO TTY 'OBA 402_M1 'STOP READER 'CRC CHANGING STV0 TMP1 'SAVE A LDV0 NO_CRC NAZ NO_CRC4 'NO NEED TO CHANGE CRC 'CRC+=A WITH OVERFLOW ADDED TO 0 BIT LDV0 CRC ADV0 TMP1 'ADD NEW BYTE NOV NOOVER4 INA NOOVER4: STV0 CRC NO_CRC4: LDV0 TMP1 'LOAD A 'LDB7 "00" 'ORB 'OBB 0_H1 'SEND DIGIT TO TTY JMP2 RETADDR 'RETURN '--------------------------------------------------------------------------------- READ8: 'OBA 602_M1 'START READER 'IBA 002_M1 'READ A BYTE - FOR CLEAR READY FLAG WAIT: IBA 102_M1 'READ READER STATUS ANA7 2_H2 ' TEST A WITH "READY TO SEND" MASK JAZ WAIT ' IF READER IS NOT READY YET - WAIT IBA 002_M1 ' READ THE DATA 'OBA 402_M1 'STOP READER 'CRC CHANGING STA0 TMP2 'SAVE A LDV0 NO_CRC NAZ NO_CRC8 'NO NEED TO CHANGE CRC 'CRC+=A WITH. CRC - 2 BYTES, A - 1 BYTE, N<256 SO NO OVERFLOWS LDA0 TMP2 ADA0 CRC STA0 CRC NO_CRC8: LDA0 TMP2 'LOAD A 'LDB7 0_h2 'ORB 'OBB 0_H1 'SEND DIGIT TO TTY 'OBA 402_M1 'STOP READER 'HLT 'OBB 602_M1 'START READER 'IBB 002_M1 'READ A BYTE - FOR CLEAR READY FLAG JMP2 RETADDR 'RETURN '--------------------------------------------------------------------------------- '--------------------------------------------------------------------------------- READADDR: READ8 RETADDR: 0_H1 RETADDR_L: 0_H1 'RETURN ADDRESS FOR "READ" (2-BYTE) PRG_ADDR2: 0_H1 PRG_ADDR1: 0_H1 LNG: 0_H2 'LENGHT OF THE BLOCK NO_CRC: 1_H1 ' WHEN NOT 0, CRC OMMITED - FOR READING CRC BYTE CRC: 0_H2 'CONTROL SUMM. HAVE TO BE AFTER NO_CRC!!!!! TMP2: 0_H1 TMP1: 0_H1 '--------------------------------------------------------------------------------- ^ ^ WARNING: Begin = 0; Starting from zerro memory word.