From 98cab31fc3659e33aef260efca55bf9f1753164c Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Mon, 11 Feb 2019 11:49:19 +0100 Subject: Add source files from Michael --- system/shard-z80-ruc-64180/1.5/src/INIMOD.MAC | 637 ++++++++++++++++++++++++++ 1 file changed, 637 insertions(+) create mode 100644 system/shard-z80-ruc-64180/1.5/src/INIMOD.MAC (limited to 'system/shard-z80-ruc-64180/1.5/src/INIMOD.MAC') diff --git a/system/shard-z80-ruc-64180/1.5/src/INIMOD.MAC b/system/shard-z80-ruc-64180/1.5/src/INIMOD.MAC new file mode 100644 index 0000000..4127c88 --- /dev/null +++ b/system/shard-z80-ruc-64180/1.5/src/INIMOD.MAC @@ -0,0 +1,637 @@ + TITLE INIMOD - Hardwareinitialisierung fuer EUMEL 1.8 auf RUC 180 +; + INCLUDE HD64180.LIB +; + .LIST + CSEG +; +;**************************************************************** +; +; INIMOD: Initialisierung fuer EUMEL 1.8 -> RUC 64180 Karte +; +; Version 1.2 - 05.01.87 +; 1.2 mit logischen und physischen Kanaelen +; Version 1.3 - 08.02.87 +; 1.4 - 27.05.87 Console-Texthardcopy m. SHIFT CTRl F12 +; 1.5 - CIO-Printer Haenger beseitigt +vers equ 105 +; +; Copyright (C) 1985, 86, 87 by ruc: +; 1.7.3:Rainer Ellerbrake +; Eggeberger Str. 12 +; 4802 Halle (Westf.) +; +; 1.8.: Michael Staubermann +; Moraenenstr. 29 +; 4400 Muenster-Hiltrup +; +;**************************************************************** +; +; Globale Variable +; + GLOBAL START, ZZZZZZ, ZZZZZD +; +;................................................................ +; +; Externe Variable +; + EXTERNAL SHEND, SHSINF, SHSACC, SHIOCNT, SHOUT, SHBIN, SHBOUT + EXTERNAL INITS, SCCINIT + EXTERNAL RTCOK, TRAP, MEMDMA, SENDMSG + EXTERNAL ADLEISTE, MODECONF, URLK1, URLK2 + EXTERNAL HDOFS, HDLAST, HGBLKS, CPMOFS, CPMLAST, CPMBLKS + EXTERNAL DES6502, PRG6502, LEN65, ST6502 + EXTERNAL TIMER, CENTR, I6502, ERROR + EXTERNAL SCCKA, SCCKB, SCCAER, SCCBER, SCCATX, SCCBTX +; +;................................................................ +; +; Konstanten +; +; Eumel Systemadressen +; +VECBASE EQU 0A000H ; Basisadresse fuer JP-Vektoren +; +EU0BLKS EQU VECBASE+10H +; +ESTART EQU VECBASE+1EH ; EUMEL Systemstart +; +ELEISTE EQU VECBASE+21H +; +ELLEN EQU VECBASE+36H-ELEISTE +; +;................................................................ +; +; andere Adressen +; +WINDOW EQU 0F000H ; Anfangsadresse des 4K Windows +LIMIT EQU WINDOW-1 ; Obergrenze fuer EUMEL-Pufferbereich +;SHUG EQU 0100H ; SHard Code Anfang +SHOG EQU 1400H ; EUMEL 0 Anfang +RESVEC EQU 0F3F4H ; Pruefsumme Reset Vektor (CBR=51H) +VPOINT EQU 0F010H ; Pointer auf Hintergrund Volume +; +; Adressen +; +BASE EQU WINDOW +; +STADR EQU BASE+01H +TSK65 EQU BASE+80H ;Task fuer 6502 +; +; Zeichen +; +CR EQU 0DH ;Carriage Return +LF EQU 0AH ;Line Feed +; +; sonstige Konstanten +; +CB1 EQU 0F0H ;Anfang Common Base 1 und Bank Base (log.) +BOTLNG EQU 40H ; Laenge des Bootstrapladers in Bloecken +; +CMN1T0 EQU 51H ;Common Area 1 auf 6502 Adr. 0 +CMN1T1 EQU 52H ;Common Area 1 auf 6502 Adr. $1000 +; + INCLUDE PORTS.MAC +; +;----------------------------------------------------------------------- +; Bereich ab hier darf NACH dem Systemstart ueberschrieben werden +; +KANAL: DEFB 0 ; log. Kanal, der Systemstarturlader enthaelt + +SLEISTE: + DEFB 'SHARD ' ; Identifikationstext + DEFW 8 ; SHard-Interface-Version +MODE: DEFW 0 ; Vortest-Modus, wird ueberschrieben +ID4: DEFW 0 ; Lizenznummer des SHards, " +ID5: DEFW 0 ; Installationsnummer des SHards, " +ID6: DEFW 0 ; Reserviert f. SHard, " +ID7: DEFW 8000+vers ; Frei f. SHard: SHard-Version + DEFW 0 ; - + DEFW 0 ; - + JP SHOUT + JP SHBIN + JP SHBOUT + JP SHIOCNT + JP SHEND + JP SHSINF + JP SHSACC + DEFW 0 ; - + DEFW LIMIT ; obere Hauptspeicher-Grenze fuer EUMEL + +;---------------------------------------------------------------- +; +; System laden +; +SYSRD: + LD HL,SHOG + LD DE,10 +; +RDSLOP: + PUSH HL + PUSH DE ;Adresse + Block retten +; + LD A,(KANAL) + CALL SHBIN +; + POP DE + POP HL + LD A,C + AND A + JR NZ,RDSLOP ;Fehler -> Retry +; + INC H ;Adresse erhoehen + INC H + INC DE ;Blocknummer erhoehen + LD A,(EU0BLKS) + ADD 10 + CP E ; Alle gelesen ? + JR NC,RDSLOP ;Nein -> weiterlesen + +; System wurde geladen +; + +; SHard muss sich die benoetigten Teile der EUMEL-Linkleiste retten +; + DI + + LD HL,ELEISTE + LD DE,ADLEISTE + LD BC,ELLEN ; EUMEL-Linkleiste kopieren + LDIR +; +; EUMEL starten +; + LD HL,SLEISTE ; SHard-Linkleiste + JP ESTART ;EUMEL Lader starten +; +ZZZZZZ EQU $ +; +;**************************************************************** +; +; S T A R T +; +; SHARD Initialisierung und Systemstart +; +; 1. Treiber initialisieren +; 2. Startup Meldung ausgeben +; 3. Interruptadressen setzen, Interrupt Modus setzen +; 4. Urlader laden +; 5. Systemstart +; +; Bereich ab hier darf schon VOR dem Systemstart ueberschrieben werden +; (darf vom Urlader ueberschrieben werden) + +START: + DI + LD SP,LIMIT ;obere Speichergrenze +; +; Speicherkonfiguration setzen +; + XOR A ;Bank Area ab 0 + OUT0 (BBR),A +; + LD A,CB1 ;Common Area 1 ab log. F000, Bank Area ab 0 + OUT0 (CBAR),A +; + LD A,83H ; Refresh Zyklus 2 Takte, alle 80 States + OUT0 (RCR),A +; +; Startvektor deaktivieren +; + + LD A,0C3H ; JP-Code + LD (0),A ; JP-Code eintragen bei RESET/TRAP-Adr + LD HL,TRAP ; Falls RESET oder TRAP: Info ' shard' 'TRAP' + LD (1),HL ; Kein START, dieses Modul wird ueberschrieben + + LD A,51H ;Common Area 1 auf Apple Speicher setzen + OUT0 (CBR),A +; +; Durch Veraenderung der Pruefsumme des Reset-Vektors wird erreicht, +; dass bei Betaetigen von Reset immer ein Kaltstart ausgefuehrt wird +; + LD (RESVEC),A ;veraendert + +; +; Anfang und Ende des Harddisk Volumes (HG) eintragen +; + LD HL,(VPOINT) ;Pointer auf Tabelle + LD A,H + AND 0F0H ;4K-Bereich bestimmen + RRCA + RRCA + RRCA + RRCA + ADD A,51H ;Apple Speicher Anfangsoffset + OUT0 (CBR),A ;in MMU eintragen +; + LD A,H + OR 0F0H ;im 64180 Speicher ab F000H + LD H,A +; + LD BC,3 ;3 Byte kopieren + INC HL + LD DE,HDOFS + LDIR ;Anfang +; +; Laenge des Bootstrapladers (SHARD) hinzuaddieren +; + DEC DE + LD A,(DE) + ADD A,BOTLNG ;Laenge in 256-Byte Pages + LD (DE),A + DEC DE + LD A,(DE) + ADC A,0 + LD (DE),A + DEC DE + LD A,(DE) + ADC A,0 + LD (DE),A +; + INC HL + LD C,3 + LD DE,HDLAST + LDIR ;Ende +; + LD A,51H + OUT0 (CBR),A +; +; Hintergrund Blockanzahl bestimmen +; + LD HL,HDOFS+2 + LD DE,HDLAST+2 ;Last-First ausrechnen + CALL CALCSIZ + LD (HGBLKS),HL ;Groesse eintragen, max. 32MB +; +; CP/M-Volume Blockanzahl bestimmen +; + LD HL,CPMOFS+2 + LD DE,CPMLAST+2 + CALL CALCSIZ + LD (CPMBLKS),HL +; + CALL INICIO ; CIO, incl. Interrupts initialisieren + + CALL INIINT ; Interrupt System starten + + CALL INITS ; SCSI-Controller initialisieren +; + CALL CHKRTC ; Flag fuer gueltige RTC-Werte setzen +; +; Mode, ID laden +; + LD HL,MODECONF + LD DE,MODE + LD BC,8 ; 3 ID-Felder, 1 Mode-Feld + LDIR + + LD HL,STARTUP ; Startupmeldung ausgeben + CALL SENDMSG +; +; Block 10 lesen (enthaelt EUMEL0-Linkleiste) +; + + LD A,(URLK1) ; Kanal, auf dem der Urlader zuerst + CALL NEXTKAN ; gesucht wird + JP Z,SYSRD ; System von diesem Kanal laden + + LD A,(URLK2) ; Kanal, auf dem der Uralder dann gesucht + CALL NEXTKAN ; wird + JP Z,SYSRD ; von diesem Kanal laden + + LD HL,NOURL ;kein EUMEL Urlader + CALL SENDMSG + DI + HALT + +NEXTKAN: + LD (KANAL),A + LD DE,0 ; Default Typ + LD BC,5 ; IOCONTROL 'size' + CALL SHIOCNT ; zum initialisieren + LD A,B ; 0 Bloecke, Fehler + OR C + JR NZ,NEXTOK + INC A ; NZ setzen, da vorher 0 + RET + +NEXTOK: + LD A,(KANAL) + LD HL,VECBASE ; Hauptspeicher-Adresse + LD DE,10 ; Block 10 lesen + CALL SHBIN + + LD A,C ; Fehlerrueckmeldung + AND A ;erfolgreich ? + RET NZ + + JP CKEUMEL ;Eumel Urlader ? + +;................................................................ +; +; Berechnung der Groesse eines Volumes +; Eingang: HL = Zeiger auf letztes der 3 Byte Anfangs LUN/Adresse +; DE = Zeiger auf letztes der 3 Byte Ende+1 LUN/Adresse +; Ausgang: HL = Anzahl 512-Byte Bloecke dieses Volumes +; DE und A werden veraendert! +; +CALCSIZ: + LD A,(DE) + SUB (HL) + LD C,A +; + DEC DE + DEC HL + LD A,(DE) + SBC A,(HL) + LD H,A + LD L,C + SRL H ;256 -> 512 Byte Bloecke + RR L + RET +; +;................................................................ +; +; Ueberpruefen ob Block 10 den Text EUMEL enthaelt +; +; Exit: B=0! bei F=Zero +; +CKEUMEL: + LD HL,VECBASE + LD DE,EUMTXT + LD B,5 +; +CKLP: + LD A,(DE) + CP (HL) + INC HL + INC DE + RET NZ + DJNZ CKLP + + RET +; +;................................................................ +; +STARTUP: + DEFB STUPLEN, 9, CR, LF, LF + DEFB ' EUMEL auf HD64180 & 6502', CR, LF + DEFB ' SHard-Interfaceversion 8', CR, LF + DEFB ' Version 1.5 vom 26.06.87', CR, LF + DEFB ' (c) 1985, 86, 87 by ruc', CR, LF + DEFB ' ' +STUPLEN EQU $-STARTUP-1 +; +NOURL: + DEFB NOURLEN, CR, LF + DEFB 'EUMEL-Urlader nicht gefunden', CR, LF +NOURLEN EQU $-NOURL-1 +; +EUMTXT: + DEFB 'EUMEL' +; +;----------------------------------------------------------------- +; +; C H K R T C +; +; RTC-Werte auf Gueltigkeit ueberpruefen +; + +CHKRTC: + LD A,20H ; 2 (programmierte) eff. 3 Uhrenwaitstates + OUT (DCNTL),A + + ; Testen, ob vernuenftige Werte vorhanden + ; (BCD, Uhr laeuft, 24h-Modus, Bereiche ok) + XOR A + LD (RTCOK),A ; 'Nicht ok' vorbesetzen + + IN0 A,(RTCRA) ; Register A der Uhr + AND 7FH + CP 20H ; + JR NZ,CALEND ; falscher Wert + + IN0 A,(RTCRB) ; Register B der Uhr + CP 2 + JR NZ,CALEND ; falscher Wert + + IN0 A,(RTCYR) ; Jahr < 87 ? + CP 87H + JR C,CALEND + + IN0 A,(RTCDY) ; Tag > 31 + CP 32H ; + JR NC,CALEND + LD H,A + + IN0 A,(RTCMO) ; Monat > 12 ? + CP 13H + JR NC,CALEND + + OR H + JR Z,CALEND ; Monat oder Tag = 0 ? + + IN0 A,(RTCM) + CP 60H + JR NC,CALEND ; Minuten > 59 ? + + IN0 A,(RTCH) + CP 24H + JR NC,CALEND ; Stunden > 23 ? + + LD A,0FFH + LD (RTCOK),A + +CALEND: + XOR A + OUT0 (DCNTL),A ; 0 (prog.) I/O Waitstates, 0 Memory Waitst. + RET + +;................................................................ +; +; I N I C I O +; +INICIO: + +; CIO initialisieren + + IN0 C,(CIOCTL) ;Dummy Read + LD B,INILNG + LD HL,INITAB ;CIO Initialisierungstabelle + +INILOP: + LD C,(HL) ;Wert holen + OUT0 (CIOCTL),C ;und ausgeben + INC HL + DJNZ INILOP + RET + +;...................................................................... +; +; I N I I N T +; +; Interrupt System starten +; +INIINT: + CALL SCCINIT ;SCC initialisieren +; +; 6502-Programmstueck verschieben +; + LD A,1 ; Transferrichtung 64180 --> 6502 + LD BC,LEN65 ; Laenge des Programmstuecks + LD DE,PRG6502 ; Startadresse im log. 64180-Speicher + LD HL,DES6502 ; Destinationadresse im Basisspeicher + CALL MEMDMA ; Bytes transferieren +; + LD B,(CBR) ; CBR merken + + LD A,CMN1T0 + OUT0 (CBR),A + + LD HL,ST6502 ;Startadresse 6502-Routinen + LD (STADR),HL + LD A,4 ;6502 Teil starten + LD (TSK65),A +; + OUT0 (CBR),B ;CBR wieder zuruecksetzen +; + LD HL,VECTAB ; Interrupttabelle + LD DE,18H ; Destination + LD BC,ITABLEN ; Transferlaenge + LDIR + + XOR A ;interne Interrupts ab Vektor 0040 + LD I,A ;externe Interrupts ab 0018H + LD A,40H + OUT0 (IL),A +; + IM 2 ; Fuer INT0 Interrupt Modus 2 benutzen + LD A,3 ;Enable Interrupt 0 and 1 + OUT0 (ITC),A +; +; +; 6502 Interrupts hardwaremaessig freigeben +; + LD A,0B0H ;CIO PC2 auf Low setzen + OUT0 (CIOCD),A + LD A,0B4H ;CIO PC2 auf High setzen + OUT0 (CIOCD),A + + EI + + RET + +;........................................................................... +; +; CIO Initialisierungs Tabelle +; + +INITAB: +;* DEFB 0,1 ;Set Reset Bit (raus: kein Recalibrate mehr) + DEFB 0,0 ;Reset Reset Bit + DEFB 1,0 ;Master configuration control + +; SCSI-Interface-Leitungen + + DEFB 20H,00000010B ;Port A Mode Reg. + DEFB 22H,01000010B ;Port A Data Path Polarity Reg. + DEFB 23H,10111101B ;Port A Data Direction Reg. + DEFB 24H,0 ;Port A Special I/O Control + DEFB 25H,10101100B ;Port A Pattern Polarity + DEFB 26H,0 ;Port A Pattern Transition + DEFB 27H,10101100B ;Port A Pattern Mask + DEFB 0DH,0 ;Port A Data + DEFB 02H,18H ;Port A Interrupt Vector (** TEST **) + DEFB 08H,11100000B ;Port A Command: Clear IE + DEFB 08H,00100000B ;Port A Command: Clear IUS & IP + +; General Purpose Port (Centronics, SCSI, 6502-IRQ-Maske) + + DEFB 06H,00000001B ;Port C Data Direction Reg. + DEFB 05H,00001000B ;Port C Data Path Polarity Reg. + DEFB 07H,0 ;Port C Special I/O Control + DEFB 0FH,4 ;Port C Data Register + +; Centronics Interface + + DEFB 28H,10010000B ;Port B Mode + DEFB 29H,01000000B ;Port B Handshake: Strobed + DEFB 09H,00100000B ;Port B Command: Clear IUS & IP + DEFB 2AH,0 ;Port B Data Path Polarity + DEFB 2CH,0 ;Port B Special I/O Control + DEFB 03H,30H ;Port B Interrupt Vektor + +; Deskew Timer + +; DEFB 1EH,00000010B ;Counter 3 Mode Specification +; DEFB 0CH,00100000B ;Counter 3 Command and Status +; DEFB 1AH,0 ;Counter 3 Time Constant MSB +; DEFB 1BH,7 ;Counter 3 Time Constant LSB (2,268 us) +; DEFB 0CH,11100100B ;Counter 3 Gate Enable + +; Timer + + DEFB 1CH,10000000B ;Counter/Timer 1 Mode Spec. Reg. + DEFB 1DH,10000000B ;Counter/Timer 2 Mode Spec. Reg. + DEFB 0AH,00100000B ;Counter/Timer 1 Command: Clear IP & IUS + DEFB 0BH,00100000B ;Counter/Timer 2 Command: Clear IP & IUS + DEFB 16H,HIGH 38400 ;Time Constant 1 MSB + DEFB 17H,LOW 38400 ;Time Constant 1 LSB + DEFB 18H,0 ;Time Constant 2 MSB, mit Timer 1 zus. 50ms + DEFB 19H,4 ;Time Constant 2 LSB + DEFB 04H,18H ;Interrupt Vector Counters + +; CIO-Interrupts freigeben + + DEFB 01H,11110111B ;Master Config. Register + DEFB 00H,10000010B ;Master Interrupt Enable + + DEFB 09H,11000000B ;Port B Command: Set IE + + DEFB 0BH,11000110B ;Counter/Timer 2 Command: Set IE + DEFB 0AH,11100110B ;Counter/Timer 1 Command: Clear IE + +INILNG EQU $-INITAB + +;**************************************************************** +; +; Interrupt Vektor Tabelle, wird kopiert +; +VECTAB: + DEFW TIMER ;18 Timer Interrupt (CIO Counter 2) + DEFW ERROR ;1A + DEFW ERROR ;1C + DEFW ERROR ;1E + DEFW SCCBTX ;20 SCC Transmitter Interrupt (Kanal B) + DEFW ERROR ;22 SCC EXT/Status Interrupt (Kanal B) + DEFW SCCKB ;24 SCC Receive Char. available (Kanal B) + DEFW SCCBER ;26 SCC Special Receive Condition (Kanal B) + DEFW SCCATX ;28 SCC Transmitter Interrupt (Kanal A) + DEFW ERROR ;2A SCC EXT/Status Interrupt (Kanal A) + DEFW SCCKA ;2C SCC Receive Char. available (Kanal A) + DEFW SCCAER ;2E SCC Special Receive Condition (Kanal A) + DEFW CENTR ;30 Centronics Interface + DEFW ERROR ;32 + DEFW ERROR ;34 + DEFW ERROR ;36 + DEFW ERROR ;38 + DEFW ERROR ;3A + DEFW ERROR ;3C + DEFW ERROR ;3E + DEFW I6502 ;40 INT1 = 6502 Interrupt + DEFW ERROR ;42 INT2 = unbenutzt + DEFW ERROR ;44 Timer Channel 0 = unbenutzt + DEFW ERROR ;46 Timer Channel 1 = unbenutzt + DEFW ERROR ;48 DMA Channel 0 = unbenutzt + DEFW ERROR ;4A DMA Channel 1 = unbenutzt + DEFW ERROR ;4C CSI/O = unbenutzt + DEFW ERROR ;4E ASCI Channel 0 = unbenutzt + DEFW ERROR ;50 ASCI Channel 1 = unbenutzt + +ITABLEN EQU $-VECTAB +; +;..................................................................... + +ZZZZZD: END + \ No newline at end of file -- cgit v1.2.3