Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
z9001:software:os:kassetteninterface [2019/06/14 13:18] – [Kassettenformate] volkerpz9001:software:os:kassetteninterface [2020/10/09 09:43] (aktuell) – [Auszug aus OS] volkerp
Zeile 118: Zeile 118:
   * [[z9001:software:turbo|verschiedene TURBO-Lader]]   * [[z9001:software:turbo|verschiedene TURBO-Lader]]
   * ...   * ...
 +
 +====== Implementierung ======
 +
 +Das Betriebssystem stellt keine Funktion zum Speichern eines kompletten Speicherbereichs bereit. Diese muss als Programm nachgeladen werden (OS-SAVE, ZM30). Es gibt nur die drei Systemrufe (via CALL 5) zum Öffnen für Kassette schreiben, Schreiben eines BLocks, Schließen.
 +
 +Auszug aus dem Betriebssystem [[z9001:software:os:os12|]]. Die einzelnen Puzzlestücke aus dem OS sind hier zusammengefasst und erweitert kommentiert. 
 +
 +<code>
 +       1/       0 :                      page 0
 +       2/       0 :                     
 +       3/       0 :                     ; Z9001 Kassetteninterface, Auszug aus os.asm
 +       4/       0 :                     
 +       5/       0 :                      ;PN MONITOR 16.08.85
 +       6/       0 :                     ;
 +       7/       0 :                     ;MONITOR FUER SERIENGERAET 1985
 +       8/       0 :                     ;V 01.02.
 +       9/       0 :                     ;
 +      10/       0 :                     ; TITL ' R0BOTRON  Z  9001  -  MONITOR '
 +      11/       0 :                     ;
 +      12/       0 :                      cpu z80
 +      13/    F000 :                      ORG 0F000H
 +      14/    F000 :                     ;
 +      15/    F000 :                     ;*******************************************************************
 +      16/    F000 :                     ;                                                                *
 +      17/    F000 :                     ;* MONITOR - D E F I N I T I O N E N                          *
 +      18/    F000 :                     ;                                                                *
 +      19/    F000 :                     ;*******************************************************************
 +      20/    F000 :                     ;
 +      21/    F000 : =0DH                BCSV: EQU 0DH ;REGISTER FUER BC
 +      22/    F000 : =0FH                ASV: EQU 0FH ;REGISTER FUER A
 +      23/    F000 : =1BH                DMA: EQU 1BH ;ZEIGER AUF KASSETTENPUFFER
 +      24/    F000 : =36H                EOR: EQU 36H ;ZEIGER AUF LOG. RAM - ENDE
 +      25/    F000 : =5CH                FCB: EQU 5CH ;FILE-CONTROL-BLOCK
 +      26/    F000 :                     ;FCB: BER 36 ;Dateikontrollblock
 +      27/    F000 :                     ; FNAME: EQU FCB ;Dateiname 8 Zeichen
 +      28/    F000 :                     ; FTYP: EQU FCB+8 ;Dateityp 3 Zeichen
 +      29/    F000 :                     ; PSUM: EQU FCB+13 ;Prüfsumme eines Datenblockes
 +      30/    F000 :                     ; ARB: EQU FCB+14 ;Hilfszelle für Kassettentreiber
 +      31/    F000 :                     ; BLNR: EQU FCB+15 ;Blocknummer
 +      32/    F000 :                     ; LBLNR: EQU FCB+16 ;gesuchte Blocknummer bei Lesen
 +      33/    F000 :                     ; AADR EQU FCB+17 ;Dateianfangsadresse
 +      34/    F000 :                     ; EADR EQU FCB+19 ;Dateiendeadresse
 +      35/    F000 :                     ; SADR EQU FCB+21 ;Startadresse, wenn Datei ein Maschinencodeprogramm ist
 +      36/    F000 :                     ; SBY: EQU FCB+23 ;Schutzbyte ;0 nicht geschützt
 +      37/    F000 :                     ;     ;1 System nach Laden der Datei vor WRITE geschützt
 +      38/    F000 : =69H                PSUM: EQU 69H ;PRUEFSUMME
 +      39/    F000 : =6AH                ARB: EQU 6AH ;ARBEITSZELLE
 +      40/    F000 : =6BH                BLNR: EQU 6BH ;BLOCKNUMMER
 +      41/    F000 : =6CH                LBLNR: EQU 6CH ;ZU LESENDE BLOCKNUMMER
 +      42/    F000 : =6DH                AADR: EQU 6DH ;ANFANGSADRESSE
 +      43/    F000 : =6FH                EADR: EQU 6FH ;ENDADRESSE
 +      44/    F000 : =71H                START: EQU 71H ;STARTADRESSE
 +      45/    F000 :                     ;
 +      46/    F000 : =80H                STDMA: EQU 80H ;STANDARDPUFFER FUER KASSETTE
 +      47/    F000 : =0EFC0H             MAPPI: EQU 0F000H-64 ;SYSTEMBYTE
 +      48/    F000 :                     ;
 +      49/    F000 :                     ; System-PIO ist PIO1
 +      50/    F000 : =88H                DPIO1A: equ 88H ;Daten Kanal A Video
 +      51/    F000 : =8AH                SPIO1A: equ 8aH ;Steuerung Kanal A
 +      52/    F000 : =80H                CTC0: EQU 80H
 +      53/    F000 : =82H                CTC2: EQU 82H
 +      54/    F000 :                     
 +      55/    F000 :                     ; Systemaufrufe
 +      56/    F000 : =0F2FEH             OCRLF equ 0F2FEh ; Ausgabe CR+LF
 +      57/    F000 : =0F310H             OSPAC equ 0F310h ; Ausgabe Leerzeichen
 +      58/    F000 :                     
 +      59/    F000 : =0F5A3H             REA equ 0F5A3h ; AUSGABE FEHLERCODE A
 +      60/    F000 : =0F593H             REQU equ 0F593h ; Ausgabe String 'start tape' , warten auf ENTER
 +      61/    F000 :                      ; setzt HL = (DMA)
 +      62/    F000 :                     
 +      63/    F000 : =0F23BH             CHRAM equ 0F23Bh ;LOGISCHER SPEICHERTEST
 +      64/    F000 : =0FAE3H             INITA equ 0FAE3h ;TASTATUR INITIALISIERN
 +      65/    F000 :                     
 +      66/    F000 :                     
 +      67/    F000 :                     
 +      68/    F000 :                     ;noramchk equ 1 ; kein Schutz (MAPPI), kein Test auf RAM
 +      69/    F000 :                     
 +      70/    F000 :                     
 +      71/    F000 :                     ;
 +      72/    F000 :                     ;*******************************************************************
 +      73/    F000 :                     ;* C L O A D     KOMMANDO                                   *
 +      74/    F000 :                     ;*******************************************************************
 +      75/    F000 :                     ;
 +      76/    F000 :                     ; Funktion:    Laden eines Programms
 +      77/    F000 :                     ;
 +      78/    F000 :                     LOAD: ;prep fcb ;FCB muss korrekt gefüllt sein
 +      79/    F000 :                      ;...
 +      80/    F000 : CD 24 F0            LOAD4: CALL OPENR
 +      81/    F003 : 30 09                JR NC, LOAD5 ;KEIN FEHLER
 +      82/    F005 : B7                  OR A
 +      83/    F006 : 37                  SCF
 +      84/    F007 : C8                  RET Z ;STOP GEGEBEN
 +      85/    F008 : CD A3 F5            CALL REA ;AUSG. FEHLERMELD. WARTEN REAKT.
 +      86/    F00B : D8                  RET C ;STOP GEGEBEN
 +      87/    F00C : 18 F2                JR LOAD4 ;WIEDERHOLUNG
 +      88/    F00E : 2A 6D 00            LOAD5: LD HL,(AADR) ;DATEIANFANGSADRESSE
 +      89/    F011 : 22 1B 00            LD (DMA),HL ;NACH ADR. KASSETTENPUFFER
 +      90/    F014 : CD 60 F0            LOA55: CALL READ ;LESEN BLOCK
 +      91/    F017 : 30 05                JR NC, LOAD6 ;KEIN FEHLER
 +      92/    F019 : CD A3 F5            CALL REA ;AUSG. FEHLERMELD. WARTEN REAKT.
 +      93/    F01C : D8                  RET C ;STOP GEGEBEN
 +      94/    F01D : AF                  XOR A
 +      95/    F01E : B7                  LOAD6: OR A
 +      96/    F01F : 28 F3                JR Z, LOA55 ;WEITER BIS DATEIENDE LESEN
 +      97/    F021 : C3 FE F2            JP OCRLF
 +      98/    F024 :                     ;
 +      99/    F024 :                     
 +     100/    F024 :                     ;
 +     101/    F024 :                     ;*******************************************************************
 +     102/    F024 :                     ;* BDOS CALL5-Routinen                                             *
 +     103/    F024 :                     ;*******************************************************************
 +     104/    F024 :                     ;
 +     105/    F024 :                     ;OPEN FUER KASSETTE LESEN
 +     106/    F024 :                     ;
 +     107/    F024 : CD 93 F5            OPENR: CALL REQU ;AUSGABE STARTMELDUNG
 +     108/    F027 :                      ; HL := (DMA)
 +     109/    F027 : 3C                  INC A
 +     110/    F028 : D8                  RET C ;STOP GEGEBEN
 +     111/    F029 : E5                  PUSH HL
 +     112/    F02A : AF                  XOR A ;BLOCKNUMMER 0 LESEN
 +     113/    F02B : 32 6C 00            LD (LBLNR),A
 +     114/    F02E : CD 60 F0            CALL READ ;BLOCKLESEN
 +     115/    F031 : E1                  POP HL
 +     116/    F032 : 22 1B 00            LD (DMA),HL ;PUFFERADR. ZURUECKSETZEN
 +     117/    F035 : D8                  RET C ;LESEFEHLER
 +     118/    F036 : E5                  PUSH HL
 +     119/    F037 : 11 11 00            LD DE,17 ;OFFS. AADR (= AADR-FCB)
 +     120/    F03A : 19                  ADD HL,DE
 +     121/    F03B : 11 6D 00            LD DE,AADR
 +     122/    F03E : 01 08 00            LD BC,8
 +     123/    F041 : ED B0                LDIR ;DATEIPARAMETER UEBERNEHMEN
 +     124/    F043 : D1                  POP DE
 +     125/    F044 : 21 5C 00            LD HL,FCB
 +     126/    F047 : 06 0B                LD B,11
 +     127/    F049 : CD 24 F1            CALL CHEC ;NAMENSVERGLEICH
 +     128/    F04C : 3E 0D                LD A,13
 +     129/    F04E : 37                  SCF
 +     130/    F04F : C0                  RET NZ ;FALSCHE DATEI GELESEN
 +     131/    F050 : =>UNDEFINED          ifndef noramchk
 +     132/    F050 : 3A 73 00            LD A,(FCB+23) ;SCHUTZBYTE
 +     133/    F053 : B7                  OR A
 +     134/    F054 : C8                  RET Z ;KEIN SCHUTZ
 +     135/    F055 : 32 C0 EF            LD (MAPPI),A ;SYSTEMSCHUTZ EIN
 +     136/    F058 : =>FALSE              else
 +     137/    F058 :                      XOR A ;A=0, Cy=0
 +     138/    F058 : [131]                endif
 +     139/    F058 : C9                  RET
 +     140/    F059 :                     ;
 +     141/    F059 :                     ;CLOSE FUER KASSETTE LESEN
 +     142/    F059 :                     ;
 +     143/    F059 : 21 6D 00            CLOSR: LD HL,AADR ;ADRESSE DER DATEIPARAMETER
 +     144/    F05C : 22 0D 00            CLR1: LD (BCSV),HL ;UEBERGEBEN
 +     145/    F05F : C9                  RET
 +     146/    F060 :                     ;
 +     147/    F060 :                     ;BLOCKLESEN SEQUENTIELL
 +     148/    F060 :                     ;
 +     149/    F060 : CD 71 F0            READ: CALL RRAND ;BLOCK LESEN
 +     150/    F063 : D8                  RET C ;LESEFEHLER
 +     151/    F064 : 22 1B 00            LD (DMA),HL ;PUFFERADR. UM 128 ERHOEHEN
 +     152/    F067 : 21 6C 00            LD HL,LBLNR
 +     153/    F06A : 34                  INC (HL) ;ZU LESENDE BLOCKNUMMER ERHOEHEN
 +     154/    F06B : F5                  PUSH AF
 +     155/    F06C : CD 10 F3            CALL OSPAC ;AUSGABE LEERZEICHEN
 +     156/    F06F : F1                  POP AF
 +     157/    F070 : C9                  RET
 +     158/    F071 :                     ;
 +     159/    F071 :                     ;BLOCKLESEN
 +     160/    F071 :                     ;
 +     161/    F071 : =>UNDEFINED         RRAND: ifndef noramchk
 +     162/    F071 : 2A 36 00            LD HL,(EOR) ;LOGISCHES RAM - ENDE
 +     163/    F074 : 11 7F 00            LD DE,7FH
 +     164/    F077 : ED 52                SBC HL,DE
 +     165/    F079 : ED 5B 1B 00          LD DE,(DMA) ;PUFFERADRESSE
 +     166/    F07D : CD 1E F1            CALL COMPW ;ADRESSVERGLEICH
 +     167/    F080 : 3E 0A                LD A,10
 +     168/    F082 : D8                  RET C ;BLOCK UEBERSCHREIBT RAM - ENDE
 +     169/    F083 : EB                  EX DE,HL
 +     170/    F084 : CD 3B F2            CALL CHRAM ;LOGISCHER SPEICHERTEST
 +     171/    F087 : 3E 09                LD A,9
 +     172/    F089 : 30 1D                JR NC, ERAND ;BEREICH GESCHUETZT/ROM
 +     173/    F08B : [161]                endif
 +     174/    F08B : F5                  RR1: PUSH AF
 +     175/    F08C : F1                  RR2: POP AF
 +     176/    F08D : CD D9 F1            CALL MAREK ;EINGABE BLOCK
 +     177/    F090 : CD E3 FA            CALL INITA ;TASTATUR INITIALISIEREN
 +     178/    F093 : F5                  PUSH AF
 +     179/    F094 : E5                  PUSH HL
 +     180/    F095 : 21 6C 00            LD HL,LBLNR ;ZU LESENDE BLOCKNUMMER
 +     181/    F098 : 3A 6B 00            LD A,(BLNR) ;GELESENE BLOCKNUMMER
 +     182/    F09B : BE                  CP A, (HL)
 +     183/    F09C : E1                  POP HL
 +     184/    F09D : 38 ED                JR C, RR2 ;BLOCKNUMMER NOCH NICHT ERREICHT
 +     185/    F09F : 28 09                JR Z, RROK ;GEFUNDEN
 +     186/    F0A1 : FE FF                CP A, 0FFH
 +     187/    F0A3 : 28 05                JR Z, RROK ;ENDEBLOCK GELESEN
 +     188/    F0A5 : F1                  POP AF
 +     189/    F0A6 : 3E 0B                LD A,11 ;BLOCKNUMMER ZU GROSS
 +     190/    F0A8 : 37                  ERAND: SCF
 +     191/    F0A9 : C9                  RET
 +     192/    F0AA : F1                  RROK: POP AF
 +     193/    F0AB : 3E 0C                LD A,12
 +     194/    F0AD : D8                  RET C ;LESEFEHLER
 +     195/    F0AE : 3A 6B 00            LD A,(BLNR) ;RUECKGABE EOF - KENNZEICHEN
 +     196/    F0B1 : 3C                  INC A
 +     197/    F0B2 : 3E 00                LD A,0
 +     198/    F0B4 : 20 01                JR NZ, RROK1
 +     199/    F0B6 : 3C                  INC A
 +     200/    F0B7 : 32 0F 00            RROK1: LD (ASV),A ;1 WENN ENDEBLOCK, SONST 0
 +     201/    F0BA : C9                  RET
 +     202/    F0BB :                     ;
 +     203/    F0BB :                     ;OPEN FUER KASSETTE SCHREIBEN
 +     204/    F0BB :                     ;
 +     205/    F0BB : CD 93 F5            OPENW: CALL REQU ;AUSGABE STARTMELDUNG
 +     206/    F0BE :                      ;HL := (DMA)
 +     207/    F0BE : 3C                  INC A
 +     208/    F0BF : D8                  RET C ;STOP GEGEBEN
 +     209/    F0C0 : E5                  PUSH HL
 +     210/    F0C1 : 21 5C 00            LD HL,FCB
 +     211/    F0C4 : 22 1B 00            LD (DMA),HL ;SCHREIBEN DES FCB
 +     212/    F0C7 : 3E 00                LD A,0
 +     213/    F0C9 : 32 73 00            LD (FCB+23),A ;KEIN SCHUTZ
 +     214/    F0CC : 01 70 17            LD BC,1770H ;LANGER VORTON
 +     215/    F0CF : AF                  XOR A
 +     216/    F0D0 : 32 6B 00            LD (BLNR),A ;BLOCKNUMMER 0
 +     217/    F0D3 : 3E 02                LD A,2
 +     218/    F0D5 : 32 6C 00            LD (LBLNR),A
 +     219/    F0D8 : CD E8 F0            CALL WRIT1 ;SCHREIBEN BLOCK
 +     220/    F0DB : E1                  POP HL
 +     221/    F0DC : 22 1B 00            LD (DMA),HL ;PUFFERADR. AUF AUSGANGSWERT
 +     222/    F0DF : C9                  RET
 +     223/    F0E0 :                     ;
 +     224/    F0E0 :                     ;CLOSE FUER KASSETTE SCHREIBEN
 +     225/    F0E0 :                     ;
 +     226/    F0E0 : 3E FF               CLOSW: LD A,0FFH
 +     227/    F0E2 : 32 6B 00            LD (BLNR),A ;BLOCKNUMMER FFH
 +     228/    F0E5 :                     ;
 +     229/    F0E5 :                     ;BLOCKSCHREIBEN SEQUENTIELL
 +     230/    F0E5 :                     ;
 +     231/    F0E5 : 01 A0 00            WRITE: LD BC,0A0H ;KURZER VORTON
 +     232/    F0E8 : ED 5B 1B 00         WRIT1: LD DE,(DMA) ;PUFFERADRESSE
 +     233/    F0EC : =>UNDEFINED          ifndef noramchk
 +     234/    F0EC : 3A C0 EF            LD A,(MAPPI)
 +     235/    F0EF : B7                  OR A
 +     236/    F0F0 : 28 04                JR Z, WRIT2 ;KEIN SCHUTZ VOR SCHREIBEN
 +     237/    F0F2 : 3E 09               WERR: LD A,9 ;SCHREIBSCHUTZ
 +     238/    F0F4 : 37                  WERR1: SCF ;FEHLERAUSGANG
 +     239/    F0F5 : C9                  RET
 +     240/    F0F6 : 2A 36 00            WRIT2: LD HL,(EOR) ;LOGISCHES RAM - ENDE
 +     241/    F0F9 : D5                  PUSH DE
 +     242/    F0FA : 11 7F 00            LD DE,7FH
 +     243/    F0FD : ED 52                SBC HL,DE
 +     244/    F0FF : D1                  POP DE
 +     245/    F100 : CD 1E F1            CALL COMPW ;ADRESSVERGLEICH
 +     246/    F103 : 3E 0A                LD A,10
 +     247/    F105 : 38 ED                JR C, WERR1 ;BLOCK LIEGT HINTER RAM - ENDE
 +     248/    F107 : EB                  EX DE,HL
 +     249/    F108 : CD 3B F2            CALL CHRAM ;LOGISCHER SPEICHERTEST
 +     250/    F10B : 30 E5                JR NC, WERR ;BEREICH IST GESCHUETZT/ROM
 +     251/    F10D : [233]                endif
 +     252/    F10D : CD 5B F1            CALL KARAM ;AUSGABE BLOCK
 +     253/    F110 : 22 1B 00            LD (DMA),HL ;PUFFERADR. UM 128 ERHOEHEN
 +     254/    F113 : 21 6B 00            LD HL,BLNR
 +     255/    F116 : 7E                  LD A,(HL)
 +     256/    F117 : 32 0F 00            LD (ASV),A ;BLOCKNUMMER ZURUECKGEBEN
 +     257/    F11A : 34                  INC (HL) ;BLOCKNUMMER ERHOEHEN
 +     258/    F11B : C3 E3 FA            JP INITA ;TASTATUR INITIALISIERN
 +     259/    F11E :                     
 +     260/    F11E :                     ;Hilfsroutinen
 +     261/    F11E :                     
 +     262/    F11E :                     ;ADRESSVERGLEICH HL, DE
 +     263/    F11E : E5                  COMPW: PUSH HL
 +     264/    F11F : B7                  OR A
 +     265/    F120 : ED 52                SBC HL,DE
 +     266/    F122 : E1                  POP HL
 +     267/    F123 : C9                  RET
 +     268/    F124 :                     ;
 +     269/    F124 :                     ;ZEICHENKETTENVERGLEICH
 +     270/    F124 :                     ; in: HL Adresse String 1
 +     271/    F124 :                     ; DE Adresse String 2
 +     272/    F124 :                     ; B Anzahl zu vergleichender Zeichen
 +     273/    F124 :                     ; ret: Z=1 -> String 1 = String 2
 +     274/    F124 :                     ; DE unverändert
 +     275/    F124 :                     ; HL Wort vor String 2
 +     276/    F124 :                     ;
 +     277/    F124 : E5                  CHEC: PUSH HL ;ADR. 1. ZEICHENKETTE
 +     278/    F125 : D5                  PUSH DE ;ADR. 2. ZEICHENKETTE
 +     279/    F126 : EB                  EX DE,HL
 +     280/    F127 : 1A                  CHC0: LD A,(DE)
 +     281/    F128 : FE 20                CP A, 20H
 +     282/    F12A : 28 04                JR Z, CH0
 +     283/    F12C : FE 40                CP A, 40H
 +     284/    F12E : 38 02                JR C, CHC01
 +     285/    F130 : E6 DF               CH0: AND A, 0DFH ;NUR GROSSBUCHSTABEN
 +     286/    F132 : BE                  CHC01: CP A, (HL)
 +     287/    F133 : 13                  INC DE
 +     288/    F134 : 23                  INC HL
 +     289/    F135 : 20 0C                JR NZ, CHC1
 +     290/    F137 : 10 EE                DJNZ CHC0 ;(B)=ANZAHL ZEICHEN
 +     291/    F139 : D1                  POP DE
 +     292/    F13A : D1                  POP DE ;ADR. 1. ZEICHENKETTE
 +     293/    F13B : 6B                  LD L,E
 +     294/    F13C : 62                  LD H,D
 +     295/    F13D : 2B                  DEC HL
 +     296/    F13E : 7E                  LD A,(HL)
 +     297/    F13F : 2B                  DEC HL
 +     298/    F140 : 6E                  LD L,(HL)
 +     299/    F141 : 67                  LD H,A ;(HL)=WORT VOR 1. ZEICHENKETTE
 +     300/    F142 : C9                  RET
 +     301/    F143 : D1                  CHC1: POP DE
 +     302/    F144 : E1                  POP HL
 +     303/    F145 : C9                  RET
 +     304/    F146 :                     ;
 +     305/    F146 :                     
 +     306/    F146 :                     ;
 +     307/    F146 :                     ;
 +     308/    F146 :                     ;*******************************************************************
 +     309/    F146 :                     ;                                                                *
 +     310/    F146 :                     ;* O P E R A T I N G  -  S Y S T E M                          *
 +     311/    F146 :                     ;                                                                *
 +     312/    F146 :                     ;*******************************************************************
 +     313/    F146 :                     
 +     314/    F146 :                     ; HARDWARE
 +     315/    F146 :                     
 +     316/    F146 :                     ;*******************************************************************
 +     317/    F146 :                     ; Bei der Ausgabe jedes Bits wird der Kanal 0 des CTC initialisiert. Der Ausgang
 +     318/    F146 :                     ; dieses Kanals steuert den Takteingang eines D-Flip-Flops, welches aus dem CTC-
 +     319/    F146 :                     ; Signal einen Rechteckimpuls formt. Die Flanken dieses Impulses werden durch eine
 +     320/    F146 :                     ; RC-Kombination abgeschliffen. Der nachfolgende Spannungsteiler verringert den
 +     321/    F146 :                     ; Pegel des Ausgabesignals. Dieses Signal wird dann über die Diodenbuchse X5 dem
 +     322/    F146 :                     ; Kassettengerät zugeführt.
 +     323/    F146 :                     ; 
 +     324/    F146 :                     ; Beim Lesen vom Kassettengerät wird das Signal über ein Filter zu einem
 +     325/    F146 :                     ; Operationsverstärker geführt, der das Signal in einen Rechteckimpuls umformt.
 +     326/    F146 :                     ; Eine Verzögerungskette liefert bei jedem Flankenwechsel einen kurzen Impuls,
 +     327/    F146 :                     ; welches über den Eingang ASTB der PIO1 einen Interrupt erzeugt. Softwaremäßig
 +     328/    F146 :                     ; wird jetzt die Zeitdauer zwischen den PIO-Interrupts gemessen und der ermittelte
 +     329/    F146 :                     ; Wert den entsprechenden Zuständen logisch "0", "1" oder Vorton zugeordnet.
 +     330/    F146 :                     ;*******************************************************************
 +     331/    F146 :                     ;
 +     332/    F146 :                     ;INITIALISIERUNG DES COMPUTERS
 +     333/    F146 :                     ;
 +     334/    F146 :                     INIT: ; ...CALL IOST ;INITIALISIEREN STANDARD-E/A
 +     335/    F146 :                     
 +     336/    F146 :                      ;INTERRUPTADRESSEN
 +     337/    F146 : 21 C3 F1            ld hl,IKACT ;KASSETTE SCHREIBEN 
 +     338/    F149 : 22 00 02            ld (200h), hl ;CTC0 200h
 +     339/    F14C : 21 3A F2            ld hl,IKEP ;KASSETTE LESEN
 +     340/    F14F : 22 0A 02            ld (20Ah), hl ;SPIOA 20Ah
 +     341/    F152 :                     
 +     342/    F152 : C9                  ret
 +     343/    F153 :                     
 +     344/    F153 :                     WARM:
 +     345/    F153 :                      ;...CALL INICT ;INITIALISIERUNG CTC
 +     346/    F153 :                     
 +     347/    F153 : 3E 03                LD A,3 ;Steuerwort CTC: Reset
 +     348/    F155 : D3 80                OUT CTC0, A
 +     349/    F157 : AF                  XOR A
 +     350/    F158 : D3 80                OUT CTC0, A ;INTERRUPT-VEKTOR = 00h
 +     351/    F15A :                     
 +     352/    F15A : C9                  RET
 +     353/    F15B :                     
 +     354/    F15B :                     ;
 +     355/    F15B :                     ;*******************************************************************
 +     356/    F15B :                     ;* KASSETTEN - E/A                                            *
 +     357/    F15B :                     ;*******************************************************************
 +     358/    F15B :                     ;
 +     359/    F15B :                     ;SCHREIBEN EINES BLOCKES
 +     360/    F15B :                     ;
 +     361/    F15B : F3                  KARAM: DI
 +     362/    F15C : AF                  XOR A
 +     363/    F15D : 32 69 00            LD (PSUM),A
 +     364/    F160 :                      ;CALL INIC1 ;Uhr aus
 +     365/    F160 :                      ;OUT SPIOB, A ;TASTATUR AUS (A ist 3)
 +     366/    F160 : CD 8D F1            CALL INIVT ;VORTON INIT.
 +     367/    F163 : CD B1 F1            KARA1: CALL AUS1 ;VORTON AUSGEBEN
 +     368/    F166 : ED A1                CPI
 +     369/    F168 : EA 63 F1            JP PE,KARA1 ;BC MAL
 +     370/    F16B : CD A9 F1            CALL AUST ;TRENNZEICHEN
 +     371/    F16E : 3A 6B 00            LD A,(BLNR)
 +     372/    F171 : CD 98 F1            CALL KAUBT ;BLOCKNUMMER AUSGEBEN
 +     373/    F174 : 2A 1B 00            LD HL,(DMA) ;BLOCKADRESSE
 +     374/    F177 : 06 80                LD B,80H ;ANZAHL BYTES
 +     375/    F179 : 7E                  KARA2: LD A,(HL)
 +     376/    F17A : CD 98 F1            CALL KAUBT ;AUSGABE DATENBYTE
 +     377/    F17D : 3A 69 00            LD A,(PSUM)
 +     378/    F180 : 86                  ADD A, (HL) ;NEUE PRUEFSUMME
 +     379/    F181 : 32 69 00            LD (PSUM),A
 +     380/    F184 : 23                  INC HL
 +     381/    F185 : 10 F2                DJNZ KARA2
 +     382/    F187 : CD 98 F1            CALL KAUBT ;PRUEFSUMME AUSGEBEN
 +     383/    F18A : 7A                  LD A,D
 +     384/    F18B : 18 2B                JR DYNST ;LETZTE HALBPERIODE AUSGEBEN
 +     385/    F18D :                     ;
 +     386/    F18D :                     ;VORTON INITIALISIEREN
 +     387/    F18D : 3E 85               INIVT: LD A,85H ;Steuerwort CTC: (EI, Zeitkonstante folgt)
 +     388/    F18F : D3 80                OUT CTC0, A ;CTC0
 +     389/    F191 : 3E 40                LD A,40H ;VORTON 1
 +     390/    F193 : D3 80                OUT CTC0, A ;CTC0 Zeitkonstante: 2,4576 Mhz / 16 / 40h = 2400 Hz
 +     391/    F195 : FB                  EI
 +     392/    F196 : 57                  LD D,A ;LAENGE HALBPERIODE
 +     393/    F197 : C9                  RET
 +     394/    F198 :                     ;
 +     395/    F198 :                     ;SCHREIBEN EINES BYTES
 +     396/    F198 :                     ;in: A Byte
 +     397/    F198 :                     ; D Länge Halbperiode vorheriges Bit
 +     398/    F198 :                     ;ret: D Länge Halbperiode vorheriges Bit
 +     399/    F198 :                     ;
 +     400/    F198 : C5                  KAUBT: PUSH BC
 +     401/    F199 : 4F                  LD C,A
 +     402/    F19A : 06 08                LD B,8
 +     403/    F19C : CB 09               KAUB1: RRC C
 +     404/    F19E : F5                  PUSH AF
 +     405/    F19F : DC B1 F1            CALL C, AUS1 ;1 BIT
 +     406/    F1A2 : F1                  POP AF
 +     407/    F1A3 : D4 AD F1            CALL NC, AUS0 ;0 BIT
 +     408/    F1A6 : 10 F4                DJNZ KAUB1
 +     409/    F1A8 : C1                  POP BC
 +     410/    F1A9 :                     ;
 +     411/    F1A9 : 1E 80               AUST: LD E,80H ;TRENNZEICHEN Zeitkonstante: 2,4576 Mhz / 16 / 80h = 600 Hz
 +     412/    F1AB : 18 06                JR AUS
 +     413/    F1AD : 1E 20               AUS0: LD E,20H ;0 BIT Zeitkonstante: 2,4576 Mhz / 16 / 20h = 1200 Hz
 +     414/    F1AF : 18 02                JR AUS
 +     415/    F1B1 : 1E 40               AUS1: LD E,40H ;1 BIT Zeitkonstante: 2,4576 Mhz / 16 / 40h = 2400 Hz
 +     416/    F1B3 : 7A                  AUS: LD A,D
 +     417/    F1B4 : CD B8 F1            CALL DYNST ;LETZTE HALBPERIODE NOCH AUSGEB.
 +     418/    F1B7 : 7A                  LD A,D ;1. HALBPERIODE NEUES BIT
 +     419/    F1B8 : 32 6A 00            DYNST: LD (ARB),A
 +     420/    F1BB : 3A 6A 00            DY1: LD A,(ARB)
 +     421/    F1BE : B7                  OR A
 +     422/    F1BF : 20 FA                JR NZ, DY1 ;WARTEN BIS FLANKE AUSGEGEBEN
 +     423/    F1C1 : 53                  LD D,E ;LAENGE NEUE HALBPERIODE
 +     424/    F1C2 : C9                  RET
 +     425/    F1C3 :                     ;
 +     426/    F1C3 :                     ;INTERRRUPTROUTINE ZUM SCHREIBEN
 +     427/    F1C3 :                     ;ret: (ARB)=0
 +     428/    F1C3 :                     ;
 +     429/    F1C3 : F5                  IKACT: PUSH AF
 +     430/    F1C4 : 3E 03                LD A,3 ;Steuerwort CTC (Reset)
 +     431/    F1C6 : D3 80                OUT CTC0, A ;CTC0
 +     432/    F1C8 : 3E 85                LD A,85H ;Steuerwort CTC (EI, Zeitkonstante folgt)
 +     433/    F1CA : D3 80                OUT CTC0, A ;CTC0
 +     434/    F1CC : 3A 6A 00            LD A,(ARB) ;Zeitkonstante holen
 +     435/    F1CF : D3 80                OUT CTC0, A ;ZAEHLERWERT ENTSPR. ZEICHEN
 +     436/    F1D1 : AF                  XOR A
 +     437/    F1D2 : 32 6A 00            LD (ARB),A ;Arbeitszelle auf 0 setzen als Fertigmarkierung
 +     438/    F1D5 : F1                  POP AF
 +     439/    F1D6 : FB                  EI
 +     440/    F1D7 : ED 4D                RETI
 +     441/    F1D9 :                     ;
 +     442/    F1D9 :                     ;LESEN EINES BLOCKES
 +     443/    F1D9 :                     ; ret:    BLNR Blocknummer
 +     444/    F1D9 :                     ;    PSUM Prüfsumme
 +     445/    F1D9 :                     ;    CY 0 kein Fehler, 1 Fehler
 +     446/    F1D9 :                     ;
 +     447/    F1D9 :                     MAREK:
 +     448/    F1D9 : F3                  DI
 +     449/    F1DA :                      ;CALL INIC1 ;Uhr aus
 +     450/    F1DA : 3E 03                LD A,3
 +     451/    F1DC :                     MAREK0: ;OUT SPIOB, A ;TASTATUR AUS
 +     452/    F1DC : D3 8A                OUT SPIO1A, A
 +     453/    F1DE : 3E 05                LD A,5
 +     454/    F1E0 : D3 80                OUT CTC0, A ;CTC 0 ZUM ZEIT MESSEN
 +     455/    F1E2 : 3E B0                LD A,0B0H ;STARTWERT
 +     456/    F1E4 : D3 80                OUT CTC0, A
 +     457/    F1E6 : 3E 0F                LD A,0FH
 +     458/    F1E8 : D3 8A                OUT SPIO1A, A
 +     459/    F1EA : 3E 0A                LD A,0AH ;Interruptvektor 20A -> IKEP
 +     460/    F1EC : D3 8A                OUT SPIO1A, A
 +     461/    F1EE : 3E E7                LD A,0E7H ;SYSTEM PIO INTERRUPT ERLAUBT
 +     462/    F1F0 : D3 8A                OUT SPIO1A, A
 +     463/    F1F2 : FB                  EI
 +     464/    F1F3 : 06 16               MA1: LD B,22 ;22 VORTOENE SUCHEN
 +     465/    F1F5 : CD 4E F2            MA2: CALL LSTOP ;EIN BIT/TRENNZEICHEN LESEN
 +     466/    F1F8 : 38 F9                JR C, MA1 ;0 BIT GELESEN
 +     467/    F1FA : FE 90                CP A, 90H
 +     468/    F1FC : 38 F5                JR C, MA1 ;TRENNZEICHEN GELESEN
 +     469/    F1FE : 10 F5                DJNZ MA2
 +     470/    F200 : 06 02                LD B,2 ;1 TRENNZEICHEN
 +     471/    F202 : AF                  MA3: XOR A
 +     472/    F203 : 32 69 00            LD (PSUM),A
 +     473/    F206 : 4F                  LD C,A
 +     474/    F207 : 32 6A 00            LD (ARB),A
 +     475/    F20A : CD 5D F2            CALL LS1 ;EINE HALBPERIODE MESSEN
 +     476/    F20D : FE 52                CP A, 52H
 +     477/    F20F : 30 F1                JR NC, MA3 ;KEIN TRENNZEICHEN
 +     478/    F211 : 10 EF                DJNZ MA3
 +     479/    F213 : CD 65 F2            CALL IBYTE ;BLOCKNUMMER LESEN
 +     480/    F216 : D8                  RET C ;FEHLER
 +     481/    F217 : 32 6B 00            LD (BLNR),A
 +     482/    F21A : 06 80                LD B,80H ;ANZAHL BYTES
 +     483/    F21C : 2A 1B 00            LD HL,(DMA) ;BLOCKADRESSE
 +     484/    F21F : CD 65 F2            MA4: CALL IBYTE ;DATENBYTE LESEN
 +     485/    F222 : D8                  RET C ;FEHLER
 +     486/    F223 : 77                  LD (HL),A
 +     487/    F224 : 3A 69 00            LD A,(PSUM)
 +     488/    F227 : 86                  ADD A, (HL) ;NEUE PRUEFSUMME
 +     489/    F228 : 32 69 00            LD (PSUM),A
 +     490/    F22B : 23                  INC HL
 +     491/    F22C : 10 F1                DJNZ MA4
 +     492/    F22E : CD 65 F2            CALL IBYTE ;PRUEFSUMME LESEN
 +     493/    F231 : D8                  RET C ;FEHLER
 +     494/    F232 : 47                  LD B,A
 +     495/    F233 : 3A 69 00            LD A,(PSUM)
 +     496/    F236 : B8                  CP A, B
 +     497/    F237 : C8                  RET Z ;IN ORDNUNG
 +     498/    F238 : 37                  SCF
 +     499/    F239 : C9                  RET ;FEHLER
 +     500/    F23A :                     ;
 +     501/    F23A :                     ;INTERRUPTROUTINE ZUM LESEN
 +     502/    F23A :                     ;ret: (ARB) = Länge einer Halbperiode
 +     503/    F23A :                     ;
 +     504/    F23A : F5                  IKEP: PUSH AF
 +     505/    F23B : DB 80                IN A, CTC0
 +     506/    F23D : F5                  PUSH AF
 +     507/    F23E : 3E 07                LD A,7
 +     508/    F240 : D3 80                OUT CTC0, A
 +     509/    F242 : 3E B0                LD A,0B0H ;NEUE ZEITMESSUNG
 +     510/    F244 : D3 80                OUT CTC0, A ;Startwert
 +     511/    F246 : F1                  POP AF
 +     512/    F247 : 32 6A 00            LD (ARB),A ;gemessener Wert
 +     513/    F24A : F1                  POP AF
 +     514/    F24B : FB                  EI
 +     515/    F24C : ED 4D                RETI
 +     516/    F24E :                     ;
 +     517/    F24E :                     ;LESEN EINES BITS
 +     518/    F24E :                     ;ret: C = Länge der Periode
 +     519/    F24E :                     ;      CY = 1              0 Bit
 +     520/    F24E :                     ;         = 0 und C < 90H  Trennz.
 +     521/    F24E :                     ;         = 0 und C >= 90H 1 Bit
 +     522/    F24E :                     ;
 +     523/    F24E :                     
 +     524/    F24E :                     ;Bit Wert B0-x *2 Return
 +     525/    F24E :                     ;       KAUBT
 +     526/    F24E :                     ;-------------------------------------
 +     527/    F24E :                     ;0 20h 90h 120h Cy=1
 +     528/    F24E :                     ;1 40h 70h E0h > 90h
 +     529/    F24E :                     ;Trennz 80h 30h 60h < 90h
 +     530/    F24E :                     
 +     531/    F24E : AF                  LSTOP: XOR A
 +     532/    F24F : 32 6A 00            LD (ARB),A
 +     533/    F252 : 3A 6A 00            LS0: LD A,(ARB)
 +     534/    F255 : B7                  OR A
 +     535/    F256 : 28 FA                JR Z, LS0 ;WARTEN AUF 1. FLANKE
 +     536/    F258 : 4F                  LD C,A
 +     537/    F259 : AF                  XOR A
 +     538/    F25A : 32 6A 00            LD (ARB),A
 +     539/    F25D : 3A 6A 00            LS1: LD A,(ARB)
 +     540/    F260 : B7                  OR A
 +     541/    F261 : 28 FA                JR Z, LS1 ;WARTEN AUF 2. FLANKE
 +     542/    F263 : 81                  ADD A, C
 +     543/    F264 : C9                  RET
 +     544/    F265 :                     ;
 +     545/    F265 :                     ;LESEN EINES BYTES
 +     546/    F265 :                     ; ret:  A, E  Byte
 +     547/    F265 :                     ; CY 1 Fehler, 0 kein Fehler
 +     548/    F265 :                     ;
 +     549/    F265 : 16 08               IBYTE: LD D,8
 +     550/    F267 : AF                  XOR A
 +     551/    F268 : 5F                  LD E,A
 +     552/    F269 : CD 4E F2            IB1: CALL LSTOP ;LESEN EIN ZEICHEN
 +     553/    F26C : 3F                  CCF
 +     554/    F26D : 30 04                JR NC, IB2 ;0 BIT
 +     555/    F26F : FE 90                CP A, 90H
 +     556/    F271 : D8                  RET C ;TRENNZEICHEN
 +     557/    F272 : 37                  SCF ;1 BIT
 +     558/    F273 : CB 1B               IB2: RR E
 +     559/    F275 : 15                  DEC D
 +     560/    F276 : 20 F1                JR NZ, IB1
 +     561/    F278 : CD 4E F2            CALL LSTOP ;LESEN TRENNZEICHEN
 +     562/    F27B : 7B                  LD A,E
 +     563/    F27C : C9                  RET
 +     564/    F27D :                     ;
 +     565/    F27D :                      END
 +</code>
  
  • z9001/software/os/kassetteninterface.1560518297.txt.gz
  • Zuletzt geändert: 2019/06/14 13:18
  • von volkerp