;**************************************************************** ;* * ;* Aenderungen im MACHINE PACK 6128 fuer KC COMPACT * ;* * ;**************************************************************** .Z80 .PHASE 0591H RESET: DI LD BC,0F782H ;control OUT (C),C LD BC,0F400H ;Port A OUT (C),C LD BC,0F600H ;Port C OUT (C),C ld hl,T60 ;Ende der Tab. fuer CRTC 50Hz ld bc,0bc0fh ;Adresse CRTC und Tablaenge m1: out (c),c ;Anwahl CRTC Register dec hl ld a,(hl) inc b out (c),a ;CRTC Steuerwort dec b dec c jp p,m1 LD SP,0C000H LD B,0F5H ;PIOB IN A,(C) ;WENN D1 AN MASSE LIEGT, DANN VERZWEIGT RRA ;DAS BETRIEBSSYSTEM ZUM EINLESEN DER TESTSOFTWARE RRA ld hl,tabanf ld bc,0ee00h+tab1end-tabanf+1 ;steuerwortadr CIO jr nc,load ;und tablaenge CALL cioinit JR T60 LOAD: call cioinit0 LD HL,0a880H ;Lage fuer einzulesende Daten LD E,00H ;laenge der einzulesenden Daten fuer I2C push hl ;stackmanipulation zum anspr. der jp RDS ;nachgeladenen routinen durch ret ; DB 3FH,28H,2EH,8EH,26H,00H,19H,1EH DB 00H,07H,00H,00H,30H,00H,0C0H,00H ;Tab. 50Hz ; ;T60 muss auf der Adresse 05e5 stehen! ; T60: LD DE,00677H ;Kaltstart ist Fortsetzung LD HL,00000H JR 061FH ; ; MC BOOT PROGRAMM ; BOOT: LD SP,0C000H ;Stack ab C000H PUSH HL CALL 01FE9H ;SOUND RESET DI LD BC,0F8FFH ;Peripherie ruecksetzen OUT (C),C CALL 0005CH ;KL CHOKE OFF POP HL PUSH DE PUSH BC PUSH HL CALL 01B98H ;KM RESET CALL 01084H ;TXT RESET CALL 00AD0H ;SCR RESET CALL 0BA5FH ;KL U ROM ENABLE CONTD POP HL CALL 0001EH ;JP (HL) POP BC POP DE JR C,061CH ;MC START PROGRAMM EX DE,HL LD C,B LD DE,MELDAUS0 ;fuer Rueckkehr mit Fehlermeldung JR START1 ; ; MC START PROGRAMM ; START: LD DE,RET ;nur Starten START1: DI IM 1 EXX LD BC,0DF00H ;Palette Pointer Reset OUT (C),C LD BC,0F8FFH ;Perifherie reset OUT (C),C LD BC,07FC0H ;GA Seite 1 Speicherverw. OUT (C),C LD BC,0FA7EH ;Diskette? ruecksetzen ????? XOR A OUT (C),A LD HL,0B100H ;Start in pending queue, Ram loeschen LD DE,0B101H LD BC,007F9H LD (HL),A LDIR LD BC,07F89H ;U ROM & L ROM on OUT (C),C EXX XOR A EX AF,AF' LD SP,0C000H ;Stack eroeffnen! PUSH HL PUSH BC PUSH DE CALL 00044H ;restore high kernel jumps (Seite 0 ROM in RAM) CALL 008BDH ;JUMP RESTORE CALL 01B5CH ;KM INITIALISE CALL 01FE9H ;SOUND RESET CALL 00ABFH ;SCR INIIALISE CALL 01074H ;TXT INITIALISE CALL 015A8H ;GRA INITIALISE CALL 024BCH ;CAS INITIALISE CALL 007E0H ;MC RESRET PRINTER EI POP HL CALL 0001EH ;JP (HL) POP BC POP HL JP 00077H ;U ROM INITIALISIEREN LD HL,00202H CALL 01170H ;???????? ; ; eigene Routinen fuer Startbild ; ld hl,name jR 06fbh name: db 0ah,'KC compact',0dh,0ah,' Version 1.3' db 0dh,0ah,0ah,00,00 ; ;eigene Routinen zur Ansteuerung der CIO ; ;**************************************************************** ;* * ;* Initialisierung der CIO fuer KC-COMPACT * ;* * ;**************************************************************** ; ; Adressen fuer CIO ; STEUER EQU 0EE00H PORTA EQU 0EF00H PORTB EQU 0EC00H PORTC EQU 0ED00H ; ; Zuruecksetzen in Status 0 ; cioinit0: ld c,tabend-tabanf+1 CIOINIT: IN A,(C) ;Status 0 einstellen, wenn kein RESET XOR A ;Master Interrupt Control Reg. anwaehlen (kein RESET) OUT (C),A ;oder Resetbit ruecksetzen IN A,(C) ;ansonsten Status 0 einstellen LOOP: LD A,(HL) OUT (C),A INC HL DEC c JR NZ,LOOP RET ; ; Tabelle der Ausgabewerte zur Programmierung der ZIO ; es stehen abwechselnd Regisernummer un Registerinhalt ; TABANF: DB 0 ;Master Interrupt control Reg waehlen DB 1 ;Reset Bit setzen DB 22h ;No Vektor setzen, RJA setzen, Reset Bit ruecksetzen ;Einstellen der Verkettung der Zaehler, Zeitgeber und Ports als inaktiv und ;unabh. voneinander (durch Reset geschehen) ;Einstellen der Port-Mode Specification Register (20h =A, 28H =B) ; DB 20h ; DB 0 ; DB 28H ; DB 0 ;Einstellen Port Handshake Reg. (21h =A, 29H =B) wird bei Bit Ports ignoriert ; ;Port Command and Status Reg. (08H=A, 09H=B) ; DB 08h ; DB 08H ; DB 09H ; DB 08H ;Data Path Polarity Reg. (22H=A, 2AH=B, 5=C) DB 2AH DB 44H ;Bit 2 und 6 invertierend DB 5 DB 2 ;Bit 1 invertierend ;Data Direction Reg. (23H=A, 2BH=B, 06H=C) DB 23H DB 0BDh DB 2BH DB 0EEH DB 06H DB 0EEH ;Special IO Control Register (24H=A,2CH=B,7=C) DB 24H ;Bit 1 und 6 als open drain DB 42h ; DB 2CH ; DB 0 ; DB 7 ; DB 0 ;ausgabe von 0ffh auf port A DB 0DH DB 0FFH ;Pattern Definition Register (25H-27H=A,2DH-2FH=B) durch Reset gestellt ;Freigeben der Ports DB 1 DB 94H ; ;Steuerregister der Zaehler, Zeitgeber ; ;Counter/Timer Time Constant Register (16h,17H=1, 18H,19H=2, 1AH,1BH=3) DB 16H DB 2 DB 17H DB 71 ;ges. 583 DB 18H DB 1 DB 19H DB 103 ;ges. 359 DB 1AH DB 0 DB 1BH DB 26 ;Counter/Timer Mode Specification Register (1CH=1, 1DH=2, 1EH=3) DB 1CH DB 0FCH DB 1DH DB 0FCH DB 1EH DB 0FCH ;Counter/Timer Command and Status Register (0AH=1,0BH=2,0CH=3) DB 0AH DB 04H DB 0BH DB 04H DB 0CH DB 04H ; ;Freigeben durch Beschreiben des Master Configuration Register DB 1 DB 0F4H ;Triggern und damit starten von Zaehler 1 und 2 DB 0AH DB 06H DB 0BH tabend: DB 06H TAB1ANF: DB 1 ;Sperren Port A DB 0F0H DB 22h DB 80H ;Bit 7 invertierend DB 23h ;Port A als Ausgabe-Port DB 0 db 24h ;alle Ausgaenge mit pull up und pull down db 0 ;Transistop DB 1 ;Freigeben Port A DB 0F4H db 0dh ;ruecksetzen Drucker TAB1END: db 7fh ; ;routine fuer i2c bus ; ;finden der 0/1 flanke des taktes ; findfla: ld c,0ffh findfla1: out (c),c in a,(c) rla jr nc,findfla1 ;warten auf 0/1 flanke des taktes jr time ; ;MELDAUS0 muss auf Adresse 06f9 stehen! ; MELDAUS0: LD HL,LADERR MELDAUS: LD A,(HL) INC HL OR A RET Z CALL 013FEH JR MELDAUS LADERR: DB 2aH,2aH,2ah,20h,50H,52H,4fH,47H DB 52H,41H,4dH,20H,4cH,4fH,41H,44H DB 20H,46H,41H,49H,4cH,45H,44H,20h DB 2aH,2ah,2aH,0dH,0aH,00H ;FIRMA MUSS AUF 723 STEHEN! FIRMA: LD HL,AMS RET AMS: DB 041H,06DH,073H,00 ; ;routinen zum verzweigen zu pruefzwecken ;einrichten i2c-bus ; ;einlesen der daten in carry flag, erzeugen fallende flanke takt ; findflo: in a,(c) rla call nc,findfla rra rra findflo1: ld c,0fh jr time0 ret ;RET muss auf 737 stehen! ; ;einlesen von (e) bytes in ram ab 4000h und springen dorthin ; rds: ld b,0efh ;cioa ; ;finden startkennzeichen ; findst: in a,(c) rla jr nc,findst ;warten, bis takt auf 1 ist rra rra jr nc,findst ;datenleitung muss auch auf 1 sein findst1: in a,(c) rla jr nc,findst ;takt muss auf 1 sein rra rra jr c,findst1 ;warten auf 1/0-flanke daten call findflo1 rds1: ld d,8 rds2: call findfla call findflo rl (hl) dec d jr nz,rds2 ld c,0f0h ;ausgabe quittungszeichen call findfla1 call findflo inc hl dec e jò z,findfla ;mit dem ret aus findfla wird ae00h angespr. jr rds1 time0: out (c),c time: push af ld a,17 time1: dec a jr nz,time1 pop af ret dw 00 ; ; SET muss auf 0776 stehen! ; ;MC SET MODE set: CP 003H RET NC DI EXX RES 1,C RES 0,C OR C LD C,A OUT (C),C EI EXX ret: RET ;MC ????? PUSH HL LD HL,00000H JR 0790H PUSH HL LD HL,00001H PUSH DE PUSH BC EX DE,HL LD BC,07F10H CALL 007AAH INC HL LD C,000H CALL 007AAH ADD HL,DE INC C LD A,C CP 010H JR NZ,079CH POP BC POP DE POP HL RET ;Farbe ausgeben OUT (C),C LD A,(HL) AND 01FH OR 040H OUT (C),A RET ;MC WAIT FLYBACK PUSH AF PUSH BC LD B,0F5H IN A,(C) RRA JR NC,07B8H POP BC POP AF RET ;MC SCREEN OFFSET PUSH BC RRCA RRCA AND 030H LD C,A LD A,H RRA AND 003H OR C LD BC,0BC0CH OUT (C),C INC B OUT (C),A DEC B INC C OUT (C),C INC B LD A,H RRA LD A,L RRA OUT (C),A POP BC RET ;MC RESET PRINTER ;eINTRAGEN DER FOLGENDEN pROGRAMMSTUECKE IN PENDING QUEUE LD HL,007F7H LD DE,0B804H LD BC,00015H LDIR LD HL,007F1H JP 00AB4H INC BC POP AF CP L JP 00835H LD A,(BC) AND B LD E,(HL) AND C LD E,H AND D LD A,E AND E INC HL AND (HL) LD B,B XOR E LD A,H XOR H LD A,L XOR L LD A,(HL) XOR (HL) LD E,L XOR A LD E,E RST 20H ADD A,A INC A LD C,A LD B,000H LD DE,0B804H CP 02AH CALL C,0BAA1H RET PUSH BC PUSH HL LD HL,0B804H LD B,(HL) INC B DEC B JR Z,082FH INC HL CP (HL) INC HL JR NZ,0822H LD A,(HL) CP 0FFH JR Z,0832H CALL 0BDF1H POP HL POP BC RET LD BC,00032H CALL 00858H JR NC,0844H DJNZ 0838H DEC C JR NZ,0838H OR A RET PUSH BC LD B,0EFH AND 07FH OUT (C),A OR 080H DI OUT (C),A AND 07FH EI OUT (C),A POP BC SCF RET PUSH BC LD C,A LD B,0F5H IN A,(C) RLA RLA LD A,C POP BC RET DI LD B,0F4H OUT (C),A LD B,0F6H IN A,(C) OR 0C0H OUT (C),A AND 03FH OUT (C),A LD B,0F4H OUT (C),C LD B,0F6H LD C,A OR 080H OUT (C),A OUT (C),C EI RET LD BC,0F40EH OUT (C),C LD B,0F6H IN A,(C) AND 030H LD C,A OR 0C0H OUT (C),A OUT (C),C INC B LD A,092H OUT (C),A PUSH BC SET 6,C LD B,0F6H OUT (C),C LD B,0F4H IN A,(C) LD B,(HL) LD (HL),A AND B CPL LD (DE),A INC HL INC DE INC C LD A,C AND 00FH CP 00AH JR NZ,089DH POP BC LD A,082H OUT (C),A DEC B OUT (C),C RET DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH DB 0FFH,0FFH END