; ********************************************************************* ; * 4004 Testroutine - Rechner ; * ******************************************************************* ; * WR - 2017-04-03 ; * ******************************************************************* ; * Version 1.0 ; * ******************************************************************* ; * Funktion: A += B; A -= B; A = C*D ; * P0_R0R1: Datenpointer ZAHL A (Ergebnis) ; * P1_R2R3: Datenpointer ZAHL B ; * P2_R4R5: Datenpointer ZAHL C ; * P3_R6R7: Datenpointer ZAHL D ; * P4_R8R9: Schleifenzaehler / Austauschregister ; * P5_R10R11: Zaehler Subroutine / Austauschregister Subroutine ; * P6_R12R13: Datenpointer 1 Subroutine ; * P7_R14R15: Datenpointer 2 Subroutine ; ********************************************************************* ; ********************************************************************* ; ********************************************************************* ; ************** Initialisierungen ************** ; ********************************************************************* ; ********************************************************************* INIT LDM 0 ; select RAM bank 0 DCL ; Set Command Line ; Register mit Zahlen fuellen FIM P0, DATAA ; Look Up Adresse Zahl A FIM P1, $00 ; Registeradresse Zahl A JMS LDNUM FIM P0, DATAB ; Look Up Adresse Zahl B FIM P1, $10 ; Registeradresse Zahl B JMS LDNUM FIM P0, DATAC ; Look Up Adresse Zahl C FIM P1, $20 ; Registeradresse Zahl C JMS LDNUM FIM P0, DATAD ; Look Up Adresse Zahl D FIM P1, $30 ; Registeradresse Zahl D JMS LDNUM ; Sprung zum Programmstart JUN MAIN ; Kopierroutine LDNUM LDM $8 XCH R8 ; Schleifenzaehler 8 Zugriffe LDNUM1 FIN P2 ; Datum holen XCH R4 SRC P1 WRM XCH R5 INC R3 SRC P1 WRM INC R3 INC R1 ; naechstes Datum ISZ R8, LDNUM1 BBL 0 *=$030 ; Lookup Table Start auf Vielfachem von 16! DATAA .BYTE $00 ; 00 00 00 00 00 00 00 00 .BYTE $00 .BYTE $00 .BYTE $00 .BYTE $00 .BYTE $00 .BYTE $00 .BYTE $00 DATAB .BYTE $01 ; 00 00 00 89 76 54 32 10 .BYTE $23 .BYTE $45 .BYTE $67 .BYTE $89 .BYTE $00 .BYTE $00 .BYTE $00 DATAC .BYTE $01 ; 00 00 00 89 76 54 32 10 .BYTE $23 .BYTE $45 .BYTE $67 .BYTE $89 .BYTE $00 .BYTE $00 .BYTE $00 DATAD .BYTE $00 ; 00 00 00 00 00 00 00 00 .BYTE $00 .BYTE $00 .BYTE $00 .BYTE $00 .BYTE $00 .BYTE $00 .BYTE $00 ; ********************************************************************* ; ********************************************************************* ; ************** Hauptprogramm ************** ; ********************************************************************* ; ********************************************************************* MAIN FIM P6, $10 ; Register 3 = Register 1 FIM P7, $30 JMS COPY JMS MUL01 ; Register 0 = Register 1 * Register 2 FIM P6, $30 ; Register 1 = Register 3 FIM P7, $10 JMS COPY FIM P6, $30 ; Clear Register 3 JMS CLEAR LOCK JUN LOCK ; ********************************************************************* ; ********************************************************************* ; ************** Unterprogramme ************** ; ********************************************************************* ; ********************************************************************* ; ********************************************************************* ; Leftshift REG1 - Multiplikation mit 10 ; ********************************************************************* ; Aendert: Register File 1 ; Aendert: ACC ; Aendert: R10, R11, P7(R14,R15) ; ********************************************************************* LSHFT LDM $0 XCH R10 ; Schleifenzaehler 16 Digits LDM $0 XCH R11 ; Austauschregister (Anfang 0) FIM P7, $10 ; Register Pointer P7 (R14,R15) LS02 SRC P7 ; Adresspointer einstellen RDM ; ACC <- REG1[R10] XCH R11 WRM ; REG0[R10] <- R11 INC R15 ; P7 += 1 ISZ R10, LS02 BBL 0 ; ********************************************************************* ; CLEAR (P6) = 0 ; ********************************************************************* ; Aendert: Register File (P6) ; Aendert: ACC ; Aendert: R10, P6(R12,R13) ; *********************************************************************; CLEAR LDM $0 XCH R10 ; Schleifenzaehler 16 Digits CLEAR1 SRC P6 ; Adresspointer einstellen LDM $0 WRM ; REGn[R10] <- 0 INC R13 ISZ R10, CLEAR1 ; Naechste Stelle BBL 0 ; ********************************************************************* ; COPY (P6)-->(P7) ; ********************************************************************* ; Aendert: Register File (P7) ; Aendert: ACC ; Aendert: R10, Vorher P6 mit Quelle und P7 mit Ziel laden! ; *********************************************************************; COPY LDM $0 XCH R10 ; Schleifenzaehler 16 Digits COPY04 SRC P6 ; Adresspointer einstellen RDM ; ACC <- REG0[P7] SRC P7 WRM ; REG1[R8] <- ACC INC R13 INC R15 ISZ R10, COPY04 ; Naechste Stelle BBL 0 ; ********************************************************************* ; Addition REG0 = REG0 + REG1 ; ********************************************************************* ; Aendert: Register File 0 ; Aendert: ACC ; Aendert: R10, P6(R12,R13), P7(R14,R15) ; *********************************************************************; ADDAB CLC LDM $0 XCH R10 ; Schleifenzaehler 16 Digits FIM P6, $00 ; Summand 1, Summe FIM P7, $10 ; Summand 2 ADD01 SRC P6 RDM ; A lesen SRC P7 ADM ; B dazu addieren DAA SRC P6 WRM ; A schreiben INC R13 INC R15 ISZ R10, ADD01 ; Naechste Stelle BBL 0 ; ********************************************************************* ; Subtraktion REG0 = REG1 - REG2 oder REG2 - REG1 ; ********************************************************************* ; Aendert: Register File 0 ; Aendert: ACC ; Aendert: R10, P0(R0,R1), P6(R12,R13), P7(R14,R15) ; *********************************************************************; SUBBC LDM $0 XCH R10 ; Schleifenzaehler 16 Digits FIM P6, $00 ; Subtrahend 1 FIM P7, $10 ; Subtraktor 2 FIM P0, $20 ; Differenz SUBBC1 STC SUBBC2 TCS ; Transfer Carry Subtract SRC P6 SBM ; ACC = ACC - P1 CLC SRC P7 ADM ; ACC = ACC + P0 DAA ; Decimal Adjust SRC P0 WRM ; P2 = ACC INC R1 INC R13 INC R15 ISZ R10, SUBBC2 ; naechste Stelle JCN CN, SUBBC3 ; Wenn Ergebnis <0 --> Subtrahenden tauschen FIM P7, $00 ; Subtrahend 1 FIM P6, $10 ; Subtraktor 2 FIM P0, $20 ; Differenz SRC P0 ; Registeradresse einstellen LDM 1 WR3 ; Status Ergebnis negativ JUN SUBBC1 ; Subtraktion noch mal machen SUBBC3 BBL 0 ; ********************************************************************* ; Multiplikation REG0 = REG1 * REG2 ; ********************************************************************* ; Aendert: Register File 0, 1 ; Aendert: ACC ; Aendert: R10, P2(R4,R5) ; *********************************************************************; ; Multiplikation REG0 = REG1 * REG2 (A = B * C) MUL01 LDM $0 XCH R8 ; Schleifenzaehler 16 Digits MUL FIM P2, $20 ; Pointer C MUL02 SRC P2 RDM ; Digit lesen XCH R9 ; Additionszaehler MUL03 LD R9 ; Anzahl Schleifendurchlaeufe; 0: Break! JCN A0, MUL04 ; Abbruch bei 0 DAC ; ACC-=1 XCH R9 ; Zaehler zurueckschreiben JMS ADDAB ; A+=B JUN MUL03 ; naechster Schleifendurchlauf MUL04 JMS LSHFT ; B<<1 INC R5 ISZ R8, MUL02 MUL05 BBL 0 .END