.Z80 ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; ; D E F I N I T I O N S : ; ========================== ; ; ASCII's for Controls ; CLR EQU 1 ESC EQU 2 BRK EQU 3 ;weitere ASCII's CCPL EQU 4 TAB EQU 5 INVS EQU 6 BEEP EQU 7 CUL EQU 8 CUR EQU 9 CUD EQU 0AH CUU EQU 0BH CLS EQU 0CH CR EQU 0DH KKBD EQU 0EH HCOPY EQU 0FH HOME EQU 10H PAGE EQU 11H SCROLL EQU 12H STOP EQU 13H KBEEP EQU 14H SHLK EQU 16H CEOLN EQU 18H CCR EQU 19H INS EQU 1AH PESC EQU 1BH NL EQU 1EH DEL EQU 1FH KBE EQU 0FFH ;Keyboardbuffer ; empty ; SMALL EQU 0FA00H CAPITAL EQU 0F800H VBLEN EQU 0E0H BLZK EQU 12 HEAD EQU 7F7FH ;Prolog ; ; Workspace-RAM ; .PHASE 1C4H STACK: DEFS 16 SSTCK: DEFS 16 RAM: DEFS 0 PIOINT: DEFS 4 CTCINT: DEFS 8 MIX: DEFS 16 .DEPHASE ; ; I/O-Address ; P1AD EQU 88H P1BD EQU 89H P1AC EQU 8AH P1BC EQU 8BH CTC0 EQU 8CH CTC1 EQU 8DH CTC2 EQU 8EH CTC3 EQU 8FH ;Korrespond. ;Arbeitszellen: PORT1 EQU 84H ;(IX+1),MPT1 PORT2 EQU 86H ;(IX+4),MPT2 ;Serielle S1AD EQU 08H ;V24-Schnitt- S1AC EQU 0AH ;stelle CTC4 EQU 0CH ; ; IRM-Work-RAM ; .PHASE 0B700H IOPUF: DEFS 80H ARGC: DEFS 1 ARGN: DEFS 1 ARG1: DEFS 2 ARG2: DEFS 2 ARG3: DEFS 2 ARG4: DEFS 2 ARG5: DEFS 2 ARG6: DEFS 10 ; NUMNX: DEFS 1 NUMYX: DEFS 2 HCADR: DEFS 2 WINNR: DEFS 1 WINAN: DEFS 2 WINLG: DEFS 2 CRSR: DEFS 2 STBT: DEFS 1 ;0: Pixel ;1: Farbe ;3: Steuerzeich. ;4: ESC-Sequenz ;5: HD-Print COLOR: DEFS 1 WEND: DEFS 2 CCTL: DEFS 8 SYSP: DEFS 2 STAB: DEFS 2 CTAB: DEFS 2 NCAOS: DEFS 5 OUTAB: DEFS 2 INTAB: DEFS 2 UOUT1: DEFS 3 UIN1: DEFS 3 UOUT2: DEFS 3 UIN2: DEFS 3 BUFLEN: DEFS 2 BUFADR: DEFS 2 NOMC: DEFS 2 RWEND: DEFS 2 FCONT: DEFS 2 HOR: DEFS 2 VERT: DEFS 1 FARB: DEFS 1 MIXIT: DEFS 1 COUNT: DEFS 1 POUT: DEFS 3 PIN: DEFS 3 ETAB: DEFS 2 MPT1: DEFS 1 MPT2: DEFS 1 KENNG: DEFS 2 WARM: DEFS 2 DEFS 0B800H-$ MODBUF: DEFS 100H FTASTE: DEFS 100H-100 MWIND: DEFS 100 RTAB: DEFS 20H KBDBUF: DEFS VBLEN .DEPHASE ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; .PHASE 0E000H ; JP ST3 ;WARMSTART JP ERW1 ;BASIC Anschl. JP ERW2 JP ERW3 DEFW TOTAB2 JP IO ; ; Bestimmen der Cursorpos. CUADR: LD DE,(CRSR) ; ; Bestimmen der Pixel- und Coloradr. ; aus der rel. Cursorpos. ; DE: rel. Cursor ; DE: Color ; HL: Pixel ; CY: au~erhalb ; VR: F,HL ; CADR: LD HL,(WINAN) ADD HL,DE NADR: SLA H SLA H SLA H ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Bestimmen der Pixel- und Coloradr. ; aus der Zeile/Spalte ; H: Zeile ; L: Spalte ; VR: F,DE,HL ; PADR: PUSH AF LD A,L LD L,H CP 40 JR NC,PADR3 OR 80H LD H,A POP AF AND A RET ; PADR3: POP AF ;au~erhalb SCF RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Pr}fen ob Cursor im Window ; DE: rel. Cursor ; CY: au~erhalb ; VR: AF ; TCIF: LD A,(WINLG) DEC A SUB E RET C LD A,(WINLG+1) DEC A SUB D RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Bestimmen der Video-RAM Adr. ; DE: rel. Cursor ; HL: Video-RAM Adr. ; CY: au~erhalb ; VR: F,HL ; VADR: PUSH AF CALL TCIF JR C,PADR3 PUSH DE LD HL,(WINAN) ADD HL,DE EX DE,HL LD A,D ADD A,A ADD A,A ADD A,A LD L,A LD H,0 ADD HL,HL ADD HL,HL LD D,59H ADD HL,DE LD E,A ADD HL,DE POP DE POP AF AND A RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Vorder- und Hintergrundfarbe ; vertauschen ; A: alte Farbe ; A: neue Farbe ; VR: A,C ; COMPL: PUSH AF AND 0C0H LD C,A POP AF PUSH AF AND 7 RLCA RLCA RLCA OR C LD C,A POP AF RRCA RRCA RRCA AND 7 OR C RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Ausdrucken eines Zeichens in A auf ; der rel. Pos. DE ; A: ASCII ; DE: rel. Cursor ; VR: / ; DISP: PUSH HL PUSH DE PUSH BC PUSH AF LD HL,(WINAN) ADD HL,DE EX DE,HL ; LD HL,CCTL+2 ADD A,A JR NC,DISP2 LD L,LOW(CCTL+6) DISP2: ADD A,A JP PO,DISP3 SUB 80H DEC L DEC L DISP3: LD C,M INC L LD B,M LD L,A LD H,0 ADD HL,HL ADD HL,BC ;Anfang Zeichen ; LD A,E CP 40 JR NC,DISPE OR 80H LD B,D LD D,A LD A,B ADD A,A ADD A,A ADD A,A LD E,A ; LD A,(STBT) BIT 5,A ;HD-Modus JR NZ,HDDISP RRCA JR C,DISP5 PUSH DE LDI LDI LDI LDI LDI LDI LDI LDI POP DE DISP5: RRCA JR C,DISPE LD A,(MPT1) LD H,A OR 2 OUT (PORT1),A LD A,(COLOR) LD (DE),A INC E LD (DE),A INC E LD (DE),A INC E LD (DE),A INC E LD (DE),A INC E LD (DE),A INC E LD (DE),A INC E LD (DE),A LD A,H DISPD: OUT (PORT1),A DISPE: POP AF POP BC POP DE POP HL RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Pixeln im 4-Farbenmodus ; HDDISP: LD A,(COLOR) ;(brvvvhhh) RRCA PUSH HL PUSH DE CALL HDPIX POP DE POP HL LD A,(MPT1) OR 2 OUT (PORT1),A LD A,(COLOR) RRCA RRCA CALL HDPIX LD A,(MPT1) JR DISPD ; HDPIX: BIT 2,A JR NZ,SFG;Vordergrund setzen JR NC,RBG;L|schen LD B,8 ;Invers SFG1: LD A,M INC HL CPL LD (DE),A INC E DJNZ SFG1 RET ; SFG: JR C,SBG;F}llen LD BC,8 ;Normal LDIR RET RBG: ; SBG: SBC A,A LD B,4 RBG1: LD (DE),A INC E LD (DE),A INC E DJNZ RBG1 RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Rollen einer Bildebene ; ; VR: A,D,H ; LROLL: LD A,(WINLG) LR1: PUSH HL PUSH DE PUSH BC LR2: LDI LDI LDI LDI LDI LDI LDI LDI JP PE,LR2 POP BC POP DE POP HL INC H INC D DEC A JR NZ,LR1 RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Ausdrucken eines Zeichen auf dem ; CRT mit Cursorsteuerung ; A: ASCII ; DE: neuer Cursor ; VR: AF,BC,DE,HL ; CRT1: LD DE,(CRSR) LD HL,STBT BIT 4,M JR NZ,CRTESC ;ESCAPE-Sequ. CP ' ' JR NC,PZEI LD HL,STBT BIT 3,M JR NZ,PZEI LD HL,(CTAB) ;Anfang Tabelle STRT: ADD A,A LD C,A ;Startadr. LD B,0 ADD HL,BC LD A,M INC HL LD H,M LD L,A CHL: JP (HL) ; CRTESC: RES 4,M CP ' ' JR C,PZEI SUB '0' RET C CP 10 JR C,SETNW ;0..9:WINDOWs SUB 'A'-'0' AND 0DFH CP 'Z'-'A'+1 RET NC LD HL,(ETAB) ;A..Z:Sequenz JR STRT ; SETNW: CALL SETW LD DE,(CRSR) RET ; ATAB: LD A,E AND 0F8H ADD A,8 LD E,A JR ACUR+1 ; PZEI: CALL VADR RET C PZEI1: LD M,A CALL DISP ACUR: INC E ;Cursor right LD A,(WINLG) DEC A CP E RET NC ACR: LD E,0 ;Cursor CR ACUD: INC D ;Cursor down LD A,(WINLG+1) CP D RET NZ LD HL,(WEND) JP (HL) ; AHCOPY: LD HL,(HCADR) ;Hardcopy JP (HL) ; ACUL: LD A,E ;Cursor left AND A JR Z,CU1 DEC E RET CU1: LD A,D AND A RET Z DEC D ACEOLN: LD A,(WINLG) ;Cursor eoln DEC A LD E,A RET ; ACUU: LD A,D ;Cursor down AND A RET Z DEC D RET ; APAGE: LD HL,AHOME ;Page einsch. PA1: LD (WEND),HL RET ASCROLL: LD HL,SCR ;Scroll einsch. JR PA1 ; ACLR: CALL ACUL ;Clear ADEL: PUSH DE ;Delete DEL1: CALL VADR LD A,M AND A JR Z,DEL3 PUSH DE PUSH HL CALL ACUR CALL VADR LD A,M POP HL POP DE AND A JR Z,DEL2 CALL PZEI1 JR DEL1 ; AINS: PUSH DE ;Insert LD A,' ' INS1: CALL VADR LD B,M CALL PZEI1 LD A,B AND A JR NZ,INS1 DEL2: CALL VADR LD M,A LD A,' ' CALL DISP DEL3: POP DE RET ; ; ACLS: LD A,(WINLG+1) ;Cls ACLS3: LD D,0 CLS1: PUSH AF CALL AESC POP AF INC D DEC A JR NZ,CLS1 AHOME: LD D,0 ;Home,Pagemodus ACCR: LD E,0 ;CCR RET ; CLLNHD: LD A,0 JR Z,CLLN DEC A ; CLLN: LD B,C ;Clear a line LD D,L ;VR: B,D,HL CLLN1: LD M,A INC L LD M,A INC L LD M,A INC L LD M,A INC L LD M,A INC L LD M,A INC L LD M,A INC L LD M,A LD L,D INC H DJNZ CLLN1 RET ; SCR: LD A,(WINLG) ;Scroll-Routine LD C,A LD A,(WINLG+1) SCR9: DEC A LD B,0 JR Z,ONESC ;nur eine Zeile PUSH DE PUSH AF LD D,B LD E,B CALL VADR EX DE,HL SCR1: LD HL,40 ADD HL,DE PUSH HL PUSH BC LDIR POP BC POP DE DEC A JR NZ,SCR1 ;VRAM gescrollt POP AF ADD A,A ADD A,A ADD A,A LD C,A LD D,B LD E,B CALL CADR EX DE,HL LD L,8 ADD HL,DE LD A,(STBT) RRCA PUSH AF CALL NC,LROLL POP AF RRCA JR C,SCR2 LD A,(MPT1) OR 2 OUT (PORT1),A CALL LROLL LD A,(MPT1) OUT (PORT1),A SCR2: POP DE ONESC: DEC D ;letzte Zeile ;l|schen -> ; AESC: LD E,0 ;Escape CALL VADR RET C ;? LD A,(WINLG) AESC9: LD B,A LD C,A XOR A ESC1: LD M,A INC HL DJNZ ESC1 ;VADR gel|scht CALL CADR RET C ;? PUSH DE LD A,(STBT) BIT 5,A JR NZ,HDESC RRCA LD E,A JR C,ESC2 XOR A PUSH HL CALL CLLN POP HL ESC2: RRC E JR C,ESC3 LD A,(MPT1) LD E,A OR 2 OUT (PORT1),A LD A,(COLOR) CALL CLLN ESC4: LD A,E OUT (PORT1),A ESC3: POP DE RET ; HDESC: LD A,(COLOR) BIT 3,A CALL CLLNHD LD A,(MPT1) LD E,A OR 2 OUT (PORT1),A LD A,(COLOR) BIT 4,A CALL CLLNHD JR ESC4 ; ABEEP: LD BC,0A0FH ;langer Beeps ABEEP1: LD HL,30H ;f}r Error PUSH DE LD E,0 CALL TONB POP DE RET ; AINVS: LD HL,COLOR LD A,M CALL COMPL LDHLA: LD M,A RET ; LDAHL: LD A,M RET ; AKBEEP: LD A,(IX+8) XOR 20H LD (IX+8),A RET: RET ; AKKBD: RES 6,(IX+8) BIT 4,(IX+8) RET NZ LD HL,(BUFADR) LD M,0 RET ; APESC: LD HL,STBT SET 4,M RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Startadressen: ; ACTAB: DEFW RET DEFW ACLR DEFW AESC DEFW RET ;BRK DEFW ACCPL ;Complement !!! DEFW ATAB ;Tabulator !!! DEFW AINVS ;Invers !!! DEFW ABEEP DEFW ACUL DEFW ACUR DEFW ACUD DEFW ACUU DEFW ACLS DEFW ACCR DEFW AKKBD DEFW AHCOPY DEFW AHOME DEFW APAGE DEFW ASCROLL DEFW RET DEFW AKBEEP DEFW RET DEFW RET DEFW RET DEFW ACEOLN DEFW ACCR DEFW AINS DEFW APESC DEFW RET DEFW RET DEFW ACR ;Newline !!! DEFW ADEL ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; CRT-Routine ; A: ASCII ; VR: / ; CRT: PUSH HL PUSH DE PUSH BC PUSH AF CALL CRT1 LD (CRSR),DE POP AF POP BC POP DE POP HL RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Keyboard-Interrupt-Routine ; Zeitkonstanten: ; TCTZK EQU 144 TGE0 EQU 102 TGE1 EQU 66 ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Z E I T I N T E R R U P T ; ; Taste losgelassen ; ITAKT: EI ;CTC - Interrupt PUSH AF LD A,23H OUT (CTC3),A SET 3,(IX+8) LD (IX+13),0 JR ITEND ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; T A S T A T U R I N T E R R U P T ; ; Taste gedr}ckt ; ITAST: EI ;PIO-Interrupt PUSH AF IN A,(CTC3) PUSH AF LD A,0A7H OUT (CTC3),A LD A,TCTZK OUT (CTC3),A POP AF ; BIT 3,(IX+8);neue Bet{tigung RES 3,(IX+8) JR NZ,ITEND ; CP TGE0 JR NC,ITA ;Null erkannt ADD A,-TGE1 JR C ,ITA ;Eins erkannt PUSH HL ;Taste fertig PUSH DE LD A,(IX+12) RRA XOR 1 LD L,(IX+14) LD H,(IX+15) LD D,0 LD E,A ADD HL,DE LD A,M ;A = Tastencode BIT 7,(IX+8);Shiftlock ? JR NZ,IT2 CP 40H JR C,IT2 CP 80H JR NC,IT2 XOR 20H IT2: CP (IX+13) ;gleicher Code ? JR NZ,IT11 BIT 7,(IX+10) JR Z,IT12 ;Autorepeat on INC (IX+10) IT3: POP DE POP HL JR ITEND ;Taste okey ;_______________________________________ ; ITA: RR (IX+12) ;Bit einschieben ITEND: POP AF RETI ;_______________________________________ ; IT11: LD (IX+13),A LD L,(IX+11) LD (IX+10),L ;Autorepeat ;Counter CP SHLK JR Z,IT20 IT12: SET 0,(IX+8) BIT 4,(IX+8) JR NZ,IT3 LD D,A IN A,(P1AD) LD E,A OR 4 DI OUT (P1AD),A LD HL,(BUFADR) LD A,D INC A JR Z,IT14 PUSH BC LD BC,(BUFLEN) XOR A CPIR POP BC JR NZ,IT15 ;voll ! [?[ LD M,A ;bei vollem Puff DEC HL ;kein Autorepeat IT13: LD M,D IT15: LD A,E OUT (P1AD),A EI JR IT3 ; IT14: RES 6,(IX+8) JR IT13 ; IT20: LD A,(IX+8);Shiftlock XOR 80H LD (IX+8),A LD A,SHLK JR IT12 ; ; ; Umcodierungstabelle f}r Tastatur ; KTAB: DEFB 'W','w' DEFB 'A','a' DEFB '2','"' DEFB CUL,CCR DEFB HOME,CLS DEFB '-','=' DEFB 0F2H,0F8H DEFB 'Y','y' DEFB 'E','e' DEFB 'S','s' DEFB '3','#' DEFB '^',']' DEFB CLR,HCOPY DEFB ':','*' DEFB 0F3H,0F9H DEFB 'X','x' DEFB 'T','t' DEFB 'F','f' DEFB '5','%' DEFB 'P','p' DEFB DEL,ESC DEFB '0','@' DEFB 0F5H,0FBH DEFB 'V','v' DEFB 'U','u' DEFB 'H','h' DEFB '7',27H ; Apostroph DEFB 'O','o' DEFB INS,KBEEP DEFB '9',')' DEFB BRK,CCPL DEFB 'N','n' DEFB 'I','i' DEFB 'J','j' DEFB '8','(' DEFB ' ','[' DEFB 'K','k' DEFB ',','<' DEFB KBE,STOP DEFB 'M','m' DEFB 'Z','z' DEFB 'G','g' DEFB '6','&' DEFB 0,0 ;Fehlercode DEFB 'L','l' DEFB '.','>' DEFB 0F6H,0FCH DEFB 'B','b' DEFB 'R','r' DEFB 'D','d' DEFB '4','$' DEFB '_','\' DEFB '+',';' DEFB '/','?' DEFB 0F4H,0FCH DEFB 'C','c' DEFB 'Q','q' DEFB SHLK,SHLK DEFB '1','!' DEFB CUD,SCROLL DEFB CUU,PAGE DEFB CUR,CEOLN DEFB 0F1H,0F7H DEFB CR,CR KTABE: ; ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Interrupttabelle: ; ITAB: DEFW IKEP ;PIO A KASS.EING DEFW ITAST ;PIO B TAST.EING DEFW EIRETI ;CTC 0 DEFW IKACT ;CTC 1 KASS.OUT DEFW TONLG ;CTC 2 TONLAENGE DEFW ITAKT ;CTC 3 TAST. ; DEFB 0 ;Zeitkonstante DEFB 98H ;PORT1 DEFB 0 ;gel. Block DEFB 0 ;zu lad. Block DEFB 60H ;PORT2 DEFW IOPUF ;Kas.puffer DEFB 0 ;LOAD/VERIFY DEFB 88H ;Tastatur DEFB LOW(HEAD) ;Prolog DEFB 0 ;Autorepeatz{hle DEFB -6 ;Autorepeatzeit DEFB 0 ;Nr. der Taste DEFB 0 ;ASCII DEFW KTAB ;KTAB ITABE: ; ; ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Keyboard-Routinen ; A: Code ; CY: gedr}ckt ; VR: AF ; KBDS: BIT 4,(IX+8) JR NZ,KBDS1 PUSH HL LD HL,(BUFADR) LD A,M POP HL AND A RET Z SCF RET ; KBDS1: XOR A BIT 0,(IX+8) RET Z LD A,(IX+13) INKY: SCF RET ; ; Keyboard-Routinen ; A: Code ; CY: gedr}ckt ; VR: AF ; KBD: CALL KBDS BIT 4,(IX+7) JR NZ,INKY RET NC BIT 4,(IX+8) JR NZ,KBD2 PUSH AF PUSH HL LD HL,(BUFADR) KBD1: INC HL LD A,M DEC HL LD M,A INC HL AND A JR NZ,KBD1 POP HL POP AF RET ; KBD2: RES 0,(IX+8) RET ; BRKT: CALL KBDS ;ohne Tastenqu. CP BRK SCF RET Z AND A RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; MODULCONTROL ; DEFW HEAD DEFM 'SWITCH' DEFB 1 ; ;ARGN=1: Lesen Modulschacht ;ARGN=2: Ausgabe des Steuerworts ; LD D,E CALL MODUL LD A,L ;Anzeige Schacht CALL AHSP LD A,H ; "" Typ CALL AHSP LD A,E ; "" Steuerw. AHCR: CALL AHEX JP CRLF ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Modul schalten ; L: Schacht ; D: Steuerwort ; A: read/write ; H: Type ; L: Schacht ; D: Steuerwort ; MODUL: LD H,HIGH(MODBUF) ;[?[ LD C,80H LD B,L CP 2 JR NC,MODUL1 LD D,M ;Lesen MODUL0: IN H,(C) RET ; MODUL1: LD M,D LD A,L CP 6 JR C,MODUL2 OUT (C),D ;echtes Modul JR MODUL0 ; MODUL2: AND A JR Z,MRAM0 DEC A JR Z,MIRM DEC A JR Z,MROMCB DEC A JR Z,MROMCC DEC A JR Z,MRAM4 ; RAM-Floppy IN A,(P1BD) AND 9FH BIT 0,D JR Z,$+4 OR 20H BIT 1,D JR Z,$+4 OR 40H OUT (P1BD),A ;Mode ; LD A,D AND 30H RLCA RLCA LD H,A LD A,(MPT1) AND 3DH MODUL5: OR H MODUL6: LD (MPT1),A OUT (PORT1),A MODUL9: LD H,0FFH RET ; MRAM0: IN A,(P1AD) AND 0F5H BIT 0,D JR Z,$+4 OR 2 BIT 1,D JR Z,$+4 OR 8 MODUL8: OUT (P1AD),A JR MODUL9 ; MRAM4: IN A,(P1AD) AND 0CFH BIT 0,D JR Z,$+4 OR 10H BIT 1,D JR Z,$+4 OR 20H JR MODUL8 ; MROMCB: IN A,(P1BD) AND 7FH BIT 0,D JR Z,$+4 OR 80H MODUL7: OUT (P1BD),A JR MODUL9 ; MROMEC: IN A,(P1BD) AND 0FEH BIT 0,D JR Z,$+4 OR 1 ;INC JR MODUL7 ; MROMCC: LD A,(MPT1) AND 0DFH BIT 0,D JR Z,$+4 OR 20H JR MODUL6 ; MIRM: IN A,(P1AD) AND 0FBH BIT 0,D JR Z,$+4 OR 4 OUT (P1AD),A LD A,D AND 0C0H RLCA RLCA RLCA LD H,A LD A,(MPT1) AND 0F9H JR MODUL5 ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Jump in ein Modul auf Adresse 0F012h ; mit Abschaltung des internen Systems ; DEFW HEAD DEFM 'JUMP' DEFB 1 ;Autojump LD A,L ;bei RESET [?[ JUMP: LD B,A ;A: Schacht LD C,80H IN A,(C) INC A ;Test, ob Modul ;vorhanden JP Z,ERRM LD A,0FDH ;auf C mit RO LD H,0B8H LD L,B LD M,A DI OUT (C),A IN A,(P1AD) AND 7EH ;Abschalten des ;internen ROM JP NCAOS ;Sprung }ber IRM ; ;********************************************************** ; * Tape-Input/Output * ; ; ; KASSETTENFORMAT ANALOG ZU ROBOTRON ; KOMPLETTE SCHWINGUNGEN !!! ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Zeitkonstanten f}r Schreiben: ; ZKKAT EQU 94 ;Trennzeichen ZKKA0 EQU 23 ; "0" ZKKA1 EQU 47 ; "1" ; ; Init vor I/O ; INIT: DI IN A,(P1AD) OR 40H OUT (P1AD),A EI LD HL,(WEND) LD (RWEND),HL CALL NNOM LD (NOMC),HL LD (IX+5),LOW(IOPUF) LD (IX+6),HIGH(IOPUF) CALL APAGE JR TON9 ;event. CTC-Stop ; CSRLX: LD (IX+2),0FEH CALL SRLX ; ; Init nach I/O ; RINIT: LD HL,(NOMC) LD (OUTAB),HL LD HL,(RWEND) LD (WEND),HL IN A,(P1AD) AND 9FH OUT (P1AD),A CALL CRLF TON9: BIT 3,(IX+1) JR Z,TON10 IN A,(P1BD) ;Init nach Ton- SET 7,A ;ausgabe OUT (P1BD),A ;Blink on TON10: RES 1,(IX+8) DI LD A,47H OUT (CTC2),A LD A,BLZK ;Blinkfrequenz OUT (CTC2),A EI LD A,3 OUT (CTC0),A OUT (CTC1),A RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ;P R O G R A M M E Z U R A U S G A B E ; ISRLX: CALL INIT LD (IX+2),0;Block 1 LD BC,1000H;langer Vorton ;_______________________________________ ; SRLX: JP POUT ; SRLX1: INC (IX+2) ;erh|hen Block DI LD A,87H OUT (CTC1),A ;INIT CTC LD A,ZKKA1 ;Vorton 1 OUT (CTC1),A EI PUSH DE LD D,A LD E,A KARA1: CALL AUS ;Vorton ausgeben CPI JP PE,KARA1 ; CALL AUST ;Trennzeichen LD A,(IX+2) CALL KAUBT ;Blocknr. ausg. LD L,(IX+5) LD H,(IX+6);Blockanfang LD B,80H ;Counter+Pr}fsm. ; KARA2: LD A,M CALL KAUBT ;128 Datenbytes ;ausgeben LD A,C ADD A,M LD C,A ;Bilden Pr}fsum. INC HL DJNZ KARA2 ; CALL KAUBT ;Ausgabe Pr}fsum LD A,D CALL DYNST ;Endimpuls POP DE LD A,3 OUT (CTC1),A ;CTC-Stop RET ; ; Schreiben eines Bytes ; KAUBT: PUSH BC ;A=Byte LD C,A LD B,8 KAUB1: RRC C LD E,ZKKA0 CALL NC,AUS ;CY=0 LD E,ZKKA1 CALL C ,AUS ;CY=1 DJNZ KAUB1 POP BC ; AUST: LD E,ZKKAT ;Trennzeichen AUS: CALL DYNST DYNST: LD (IX),D ;Zeitkonst.->IX DY1: LD A,(IX) AND A JR NZ,DY1 ;Warten bis Zeit LD D,E ;konstante vom RET ;Interruptprogr. ;r}ckgesetzt ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Zeitkonstanten f}r Lesen: ; IKEZK EQU 164 IKEGN EQU 94 IKEG1 EQU 188 ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ;P R O G R A M M Z U M E I N L E S E N ; ISRLI: CALL INIT ; SRLIN: JP PIN ; SRLIN1: LD A,83H OUT (P1AC),A;Int Freig. PIO PUSH HL PUSH DE MA1: LD B,22 MA2: CALL LSTOP ;Lesen einer ;Vollschwingung JR C,MA1 ;kein Einsbit ? CP IKEG1 ;Einsbit ? JR C,MA1 DJNZ MA2 ;Z{hlen Einsbit MA5: LD B,2 MA3: XOR A LD C,A LD (IX),A CALL LS1 ;Lesen einer ;Halbschwingung CP IKEGN ;Nullbit ? JR NC,MA5 DJNZ MA3 ;Warten auf ein ;Komplettes Nullbit CALL IBYTE ;Lesen ein Byte JR C,LED ; Fehler LD (IX+2),A; Blocknr. LD BC,8000H; 128 Byte+Pr}fs LD L,(IX+5) LD H,(IX+6) MA4: PUSH BC CALL IBYTE ;Lesen 128 Da- POP BC ;tenbytes JR C,LED ; Fehler ? LD M,A ADD A,C LD C,A ;Pr}fsumme INC HL DJNZ MA4 CALL IBYTE ; -""- lesen JR C,LED ; Fehler ? SUB C ; Vgl. Pr}fsumme ADD A,0FFH ;Pr}fsumme false ;=> CY=1 LED: POP DE ;Register holen POP HL LD A,3 ;PIO-Stop-INT OUT (P1AC),A RET ; ; Interruptroutine zum Schreiben ; IKACT: PUSH AF LD A,87H OUT (CTC1),A LD A,(IX) ;Start CTC OUT (CTC1),A LD (IX),0 JR REI ;RETI ; ; Interruptroutine lesen ; IKEP: PUSH AF ;PIO INT. IN A,(CTC2);CTC lesen in LD (IX),A ;-> IX LD A,7 OUT (CTC2),A;CTC Neustart LD A,IKEZK REI1: OUT (CTC2),A REI: POP AF EIRETI: EI RETI ; LSTOP: LD (IX),0 LS0: LD A,(IX) OR A JR Z,LS0 ;Warten bis CTC- ;stand eingeles. LD C,A ; C=1.Halbschw. LD (IX),0 LS1: LD A,(IX) OR A JR Z,LS1 ; Warten auf 2. ; Halbschw. ADD A,C ; Summe bilden RET ; ; Eingabe eines Bytes ; IBYTE: LD DE,800H IB1: CALL LSTOP ;Bit Eingabe JR C,IB2 ;Nullbit ? CP IKEG1 ; Einsbit RET C ;Trennzeichen IB2: CCF RR E ;einschieben DEC D JR NZ,IB1 CALL LSTOP LD A,E ;Byte in A RET ;_______________________________________ ; ; Interruptroutine f}r Tondauer ; TONLG: PUSH AF CALL TON9 ;Blink CTC-Init JR REI ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Tonausgabeprogramm ; HL: Tonh|he 1.Kanal ; DE: " 2. " ; BC: L{nge/Lautst{rke ; VR: AF,BC,DE,HL ; TON: CALL ARGS TON0: BIT 1,(IX+8) JR NZ,TON0 TONB: LD A,C CPL AND 1EH LD C,A IN A,(P1BD) AND 0E0H OR C INC A LD C,A ;Lautst{rke LD A,B AND A JR Z,TON1 ;Dauerton RES 7,C SET 1,(IX+8);Tonl{nge aktiv LD A,0C7H OUT (CTC2),A LD A,B ;Tonl{nge setzen OUT (CTC2),A TON1: LD A,C ;Lautst{rke OUT (P1BD),A ; LD C,CTC0 CALL TON2 ;1.Kanal INC C EX DE,HL ;2.Kanal ; TON2: LD A,L ;Kanal AND A LD L,3 JR Z,TON4 ;off LD L,A LD A,7 BIT 0,H JR Z,TON3 ;VT 16 OR 20H ;VT 256 TON3: OUT (C),A ;Steuerwort TON4: OUT (C),L ;ZK RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; ; ************************* ; * * ; * B A S I C * ; * * ; ************************* ; ; ; Konstanten : ; BASIC EQU 0C000H REBASIC EQU 0C002H IO EQU 0C800H ;[?[ ERW1 EQU 0C800H ;[?[ ERW2 EQU 0C800H ;[?[ ERW3 EQU 0C800H ;[?[ TOTAB1 EQU 0C121H TOTAB2 EQU 0E571H ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Routinen zum Aufruf von BASIC/REBASIC ; BASIC-ROM wird eingeschaltet, IRM ; ausgeschaltet. Es wird die BASIC- ; Tastatur eingeschaltet. ; DEFW HEAD DEFM 'BASIC' DEFB 1 CALL SETFT LD DE,BASIC JR SWON ; DEFW HEAD DEFM 'REBASIC' DEFB 1 REBSC: CALL SETFT LD DE,REBASIC ; SWON: LD HL,KBDB LD BC,0FB80H SWT: PUSH DE LD (INTAB),HL IN A,(P1AD) AND B OR C OUT (P1AD),A RET ; ; Verlassen von BASIC ; BYE: LD SP,(SYSP) LD DE,PARSE LD HL,BLINK LD BC,7F02H LD (KENNG),HL JR SWT ; ; Belegen der Funktionstasten f1 und f2 ; SETFT: LD HL,FTASTE+1 LD BC,9CH-2 CPIR JP PO,FTB CPIR FTB: LD DE,FTASTE+3;FT1+2 suchen LD C,9CH-4 LDIR LD L,9CH-3 LD C,9CH-3 LDDR ;verschieben LD M,A INC HL LD M,0F1H INC HL LD M,A INC HL LD M,0F2H ;belegen INC HL LD M,A LD HL,REBSC LD (WARM),HL LD HL,'KF' LD (KENNG),HL RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; ; ************************* ; * * ; * B O A R D * ; * * ; ************************* ; ; ;*********** Tastatur ********** ; KBDB: CALL BLINK CP 0F1H JR Z,FT1 CP 0F2H RET NZ ; FT2: CALL BLINK ;f2-Routine SUB 30H LD B,A LD A,(CRSR+1) SUB B JR C,FT2 LD D,A LD A,(CRSR) LD E,A CALL VADR LD DE,IOPUF LD BC,7FH LDIR EX DE,HL JR FT5 ; LRC: SUB 0F2H-1CH RET ; FT1: CALL BLINK ;f1-Routine CP 0F1H JR Z,FT1 JR NC,LRC CP ' ' RET C ;Steuerzeichen ? ; PUSH AF LD HL,BTAB LD D,0 LD E,A ADD HL,DE ;Tabellenwert LD A,M ;berechnet LD DE,TOTAB1 CP 55H JR C,FTX SUB 55H LD DE,TOTAB2 FTX: INC A ;DE=TOTAB LD B,A FT3: LD A,(DE) INC DE AND A JP P,FT3 DJNZ FT3 ;Token gefunden RES 7,A LD HL,IOPUF FT4: LD M,A INC HL LD A,(DE) INC DE AND A ;}bertragen JP P,FT4 LD M,' ' ;" " INC HL POP AF CP 60H JR C,FT5 ;wenn Fkt.-> "(" LD M,'(' INC HL FT5: LD M,0 LD HL,IOPUF LD (FCONT),HL SET 6,(IX+8) JP KBDB ; ;********* Tastaturbelegung ***** ; BTAB: DEFB 222-80H ;SPC DEFB 142-80H ;! DEFB 144-80H ;" DEFB 236-80H ;# DEFB 213-80H ;$ DEFB 155-80H ;% DEFB 147-80H ;& DEFB 154-80H ;' DEFB 165-80H ;( DEFB 168-80H ;) DEFB 157-80H ;* DEFB 208-80H ;+ DEFB 150-80H ;, DEFB 218-80H ;- DEFB 161-80H ;. DEFB 158-80H ;/ DEFB 243-80H ;0 DEFB 242-80H ;1 DEFB 228-80H ;2 DEFB 229-80H ;3 DEFB 226-80H ;4 DEFB 223-80H ;5 DEFB 224-80H ;6 DEFB 145-80H ;7 DEFB 177-80H ;8 DEFB 178-80H ;9 DEFB 219-80H ;: DEFB 143-80H ;; DEFB 238-80H ;< DEFB 134-80H ;= DEFB 239-80H ;> DEFB 230-80H ;? DEFB 234-80H ;@ DEFB 151-80H ;A DEFB 220-80H ;B DEFB 153-80H ;C DEFB 131-80H ;D DEFB 211-80H ;E DEFB 129-80H ;F DEFB 136-80H ;G DEFB 140-80H ;H DEFB 132-80H ;I DEFB 212-80H ;J DEFB 235-80H ;K DEFB 160-80H ;L DEFB 138-80H ;M DEFB 130-80H ;N DEFB 233-80H ;O DEFB 149-80H ;P DEFB 139-80H ;Q DEFB 141-80H ;R DEFB 171-80H ;S DEFB 169-80H ;T DEFB 217-80H ;U DEFB 232-80H ;V DEFB 221-80H ;W DEFB 162-80H ;X DEFB 163-80H ;Y DEFB 240-80H ;Z DEFB 209-80H ;[ DEFB 210-80H ;\ DEFB 170-80H ;] DEFB 227-80H ;^ DEFB 152-80H ;_ DEFB 180-80H ;` DEFB 184-80H ;a DEFB 203-80H ;b DEFB 204-80H ;c DEFB 198-80H ;d DEFB 192-80H ;e DEFB 186-80H ;f DEFB 196-80H ;g DEFB 216-80H ;h DEFB 183-80H ;i DEFB 214-80H ;j DEFB 200-80H ;k DEFB 205-80H ;l DEFB 207-80H ;m DEFB 170-80H ;n DEFB 193-80H ;o DEFB 197-80H ;p DEFB 189-80H ;q DEFB 206-80H ;r DEFB 194-80H ;s DEFB 195-80H ;t DEFB 185-80H ;u DEFB 202-80H ;v DEFB 182-80H ;w DEFB 201-80H ;x DEFB 215-80H ;y DEFB 190-80H ;z DEFB 180-80H ;{ DEFB 180-80H ;| DEFB 180-80H ;} DEFB 180-80H ;~ DEFB 180-80H ; ; ; ;*Turbo-Scroll ??? ;*Zeiger f}r Belegung definieren ??? ;xDruckertreiber ??? ; JUMP n -> Autojump bei RESET ;xInsertmodus/Editor ;*BASIC Restart setzen ;*BEEP bei BASIC mit WAIT ;*CLOAD ohne Name alles lesen ;*PSET au~erhalb kein ERROR ; kein Autorepeat bei nichtleerem Puffer ;*65 Farben bei PSET/LINE/CIRCLE ; Switch n,x genauso wie M}hlhausen ; LOAD/SAVE Zeiger einbauen wie 2.5 ; INLOOP/Prologauswertung ; Turbotape ; INS/DEL anders ; ;* interessiert nur BASIC ;x seperat ;_______________________________________ ; ; P O R T B E L E G U N G : ; ; Portbeleg.: \ Port 1:(IX+1),MPT1 ; \ ;80 Module \ 0 Bildanzeige ;81 \ 1 Zugr. Farb/Pixel ;82 \ 2 Zugr. Bild1/2 ;83 \ 3 Farbe/HD-Color ;84 Port1 \ 4 System-LED ;85 \ 5 CAOS-ROM C000 ;86 Port2 \ 6 RAF 0 ;87 \ 7 RAF 1 ;88 PIOAD \ ;89 PIOBD \ Port 2:(IX+4),MPT2 ;8A PIOAC \ ;8B PIOBC \ 0 RAF 2 ;8C CTC0 \ 1 RAF 3 ;8D CTC1 \ 2 / ;8E CTC2 \ 3 / ;8F CTC3 \ 4 / ; \ 5 ROF 0 ;_______________\ 6 ROF 1 ; \ 7 / ; \ ; PIO B : \ PIO A : ; \ ; 0 tr}ck/blink \ 0 CAOS-ROM E000 ; 1 \ \ 1 RAM 0 ; 2 \ Laut- \ 2 IRM ; 3 \ st{rke \ 3 WER 0 ; 4 \ \ 4 RAM 4 ; 5 RAM 8 \ 5 WER 4 ; 6 WER 8 \ 6 Motor ; 7 / \ 7 ROM-Floppy/BASIC ;_______________\_______________________ ; ; SWITCH 0 RAM 0 0,1,3 ; 1 IRM ; 2 ROM ; 3 RAM-Disk ; 4 RAM 4 0,1,3 ;_______________________________________ ; ; ESCapefolgen ; ; 0...9 Windowumschaltung ; Pixeln des Steuerzeichens ; A Anzeige Bild 1 ; B Bild 2 ; C Normal ; D 4-Farben ; E Schreib Bild 1 ; F Bild 2 ; G Normal ; H 4-Farben ; I beides Bild 1 ; J Bild 2 ; K Normal ; L 4-Farben ; M Tastaturpuffer ein/aus ; N Auswertung ESC durch KBD ein/aus ; O Tastaturpuffer sichtbar ein/aus ; P Pixel schreiben ein/aus ; Q Farbe schreiben ein/aus ; R ; S Rollen Bildschirm r}ckw{rts ; T Aktuelle Zeile l|schen ; U Aktuelle Zeile einf}gen ; V V-Synchronisation ; W BS bis akt. Pos. l|schen ; X BS ab akt. Pos. l|schen ; Y ; Z ;_______________________________________ ; ; ; Auf 4k-EPROM: ; ------------- ; ESCape's Druckertreiber ; KEYLIST WINDOW ; KEY LOAD ; COLOR ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; ************************* ; * * ; * Auswertung von ESC- * ; * folgen * ; * * ; ************************* ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Startadressen: ; AETAB: DEFW DIP1 ;A DEFW DIP2 ;B DEFW DIPN ;C DEFW DIP4 ;D DEFW WRI1 ;E DEFW WRI2 ;F DEFW WRIN ;G DEFW WRI4 ;H DEFW BOTH1 ;I DEFW BOTH2 ;J DEFW BOTHN ;K DEFW BOTH4 ;L DEFW BUFFON ;M DEFW SETESC ;N DEFW KBDANZ ;O DEFW WRPIX ;P DEFW WRCOL ;Q DEFW RET ;R DEFW BACK ;S DEFW DELLN ;T DEFW INSLN ;U DEFW VSYNC ;V DEFW DELBEF ;W DEFW DELAFT ;X DEFW RET ;Y DEFW RET ;Z ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; VSYNC: SET 1,(IX+8) PUSH AF DI LD A,0C7H OUT (CTC2),A LD A,1 OUT (CTC2),A EI POP AF VSYNC1: BIT 1,(IX+8) JR NZ,VSYNC1 KBDANZ: RET ; BUFFON: LD B,10H JR ESCMN ; SETESC: LD B,4 ESCMN: LD A,(IX+8) XOR B LD (IX+8),A RET ; WRPIX: LD B,1 JR WRPC ; WRCOL: LD B,2 WRPC: LD HL,STBT LD A,M XOR B LD M,A RET ; DELBEF: PUSH DE LD A,D AND A CALL NZ,ACLS3 POP DE PUSH DE LD A,E LD E,0 CALL VADR CALL NZ,AESC9 POP DE RET ; DELAFT: PUSH DE LD A,(WINLG) SUB E CALL VADR CALL NZ,AESC9 POP DE PUSH DE INC D LD A,(WINLG+1) SUB D CALL NZ,ACLS3 POP DE RET ; INSLN: LD A,(WINLG) LD C,A INC D LD A,D JP SCR9 ; DELLN: PUSH DE LD HL,WINAN+1 LD A,M LD M,D PUSH AF LD HL,WINLG+1 LD A,M PUSH AF SUB D LD M,A LD D,A CALL SCR POP AF LD (WINLG+1),A POP AF LD (WINAN+1),A POP DE RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; BOTH1: CALL WRI1 DIP1: LD B,0FEH DIPA: AND A JR DISW ; BOTH2: CALL WRI2 DIP2: LD B,1 DIPO: SCF DISW: LD A,(MPT1) JR C,DIST AND B JR DINX DIST: OR B DINX: CALL VSYNC WRT: OUT (PORT1),A LD (MPT1),A LD (IX+1),A RET ; BOTH4: CALL WRI4 DIP4: LD B,0F7H JR DIPA ; BOTHN: CALL WRIN DIPN: LD B,8 JR DIPO ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; WRI1: LD A,(MPT1) AND 0FBH JR WRT ; WRI2: LD A,(MPT1) OR 4 JR WRT ; WRIN: LD BC,0 JR WRN4 ; WRI4: LD BC,2004H WRN4: LD HL,STBT LD A,M RES 5,A OR B LD M,A LD HL,FARB LD A,M RES 2,A OR C LD M,A RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; r}ckw{rts Rollen des Fensters ; BACK: LD A,(WINLG) ;Scroll-Routine LD C,A LD A,(WINLG+1) DEC A LD B,0 PUSH DE JR Z,ONBSC ;nur eine Zeile PUSH AF LD D,A LD E,B CALL VADR EX DE,HL BACK1: LD HL,-40 ADD HL,DE PUSH HL PUSH BC LDIR POP BC POP DE DEC A JR NZ,BACK1 ;VRAM gescrollt ; POP AF ADD A,A ADD A,A ADD A,A LD C,A LD E,B LD D,A DEC D CALL CADR EX DE,HL LD HL,8 ADD HL,DE EX DE,HL LD A,(STBT) RRCA PUSH AF CALL NC,BROLL POP AF RRCA JR C,ONBSC LD A,(MPT1) OR 2 OUT (PORT1),A CALL BROLL LD A,(MPT1) OUT (PORT1),A ONBSC: LD D,0 ;erste Zeile CALL AESC ;l|schen POP DE RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Rollen einer Bildebene r}ckw{rts ; BROLL: LD A,(WINLG) BR1: PUSH HL PUSH DE PUSH BC BR2: LDD LDD LDD LDD LDD LDD LDD LDD JP PE,BR2 POP BC POP DE POP HL INC H INC D DEC A JR NZ,BR1 RET ; defs 0F000H-$ ; ; Sprungverteiler ; RESET: JP START ;Einschalten SYS: JP SYS1 ;mit DEFB SYSC: JP SYS2 ;mit ARGC SYSE: JP SYS3 ;mit E SYSI: JP SYS4 ;IRM on/off RCALL: JP RCA ;relat. CALL CWARM: JP ST3 ;f}r JUMP SYSSE: JP SYS5 ;mit E,IRM+Stack BWSON: JP IRMN ;IRM on BWSOF: JP IRMF ;IRM off SYSSC: PUSH BC ;direct mit ARGC,IRM+Stack CALL IRMN CALL SYS2 JR SYST ;------------------------ SYS5: PUSH BC CALL IRMN CALL SYS3 SYST: CALL IRMF POP BC RET ;------------------------ SYS4: CALL IRMON CALL SYS3 ;Aufruf }ber E IRMOFF: PUSH AF IN A,(P1AD) AND 0FFH-4 OUT (P1AD),A ;BWS aus POP AF RET ;------------------------ SYS1: PUSH HL DI POP HL POP HL ;TOS=TOS+1 INC HL PUSH HL DEC SP DEC SP ;Korr. Stack EI DEC HL ;HL-> Nr. POINTS: PUSH DE LD E,M ; SYSNR: LD HL,(STAB);E=Nr., HL,DE LD D,0 ; im Stack PUSH AF ADD HL,DE ADD HL,DE ;HL->Startadr. POP AF LD E,M INC HL LD D,M EX DE,HL ;HL=Startadr. POP DE PRS2: EX (SP),HL RET ;------------------------ PUSH: PUSH HL PUSH DE JR SYSNR ; SYS2: PUSH HL PUSH DE PUSH BC PUSH HL LD HL,RPOP EX (SP),HL PUSH HL LD HL,ARGC JR POINTS ;------------------------ SYS3: PUSH HL ;Retten HL,DE,BC PUSH DE PUSH BC CALL PUSH RPOP: POP BC POP DE POP HL RET ;------------------------ IRMN: POP BC PUSH IY LD IY,0 ADD IY,SP LD SP,(SYSP) PUSH BC IRMON: PUSH AF IN A,(P1AD) INTT1 EQU $+1 OR 4 OUT (P1AD),A POP AF RET ; IRMF: POP BC CALL IRMOFF LD SP,IY POP IY PUSH BC RET ; ; rel. CALL's ; RCA: EX (SP),HL ;CALL LD E,M ;Offset holen INC HL LD D,M INC HL EX DE,HL ADD HL,DE ;neue Adresse EX (SP),HL PUSH DE RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; TEST: OUT (PORT1),A LD B,A POP DE LD HL,8000H TS1: LD A,M CPL LD M,A CP M LD M,0 JR NZ,HARDW INC L JR NZ,TS1 INC H BIT 6,H JR Z,TS1 PUSH DE LD A,B RET ; HARDW: CALL ALLINIT CALL PRS DEFM 'RAM-' DEFB 0 CALL ERRM JP PARSE ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; START: LD SP,STACK ; ; Speichertest !!! ; LD A,3FH OUT (P1AD),A ;IRM Test LD A,98H COLD1: CALL TEST INC A CP 9CH JR NZ,COLD1 LD A,3BH ;RAM Test OUT (P1AD),A LD A,18H COLD2: CALL TEST ADD A,40H JR NC,COLD2 ; CALL ALLINIT ;Init + Windows LD A,10 COLD3: DEC A LD (WINNR),A CALL WINS AND A JR NZ,COLD3 ; LD BC,80H ;Module off COLD4: OUT (C),A DJNZ COLD4 ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ST3: LD SP,STACK CALL ALLINIT ;alles Initial. LD BC,880H IN A,(C) DEC A JR NZ,MRET1;Test auf Pr}f- LD A,0FH ;modul OUT (P1AD),A LD A,43H OUT (C),A JP 4000H ; MRET1: LD HL,(KENNG) LD DE,'KF';Autowarmstart SBC HL,DE JR NZ,MRET LD HL,(WARM) JP (HL) ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Men} Display ; DEFW HEAD DEFM 'MENU' DEFB 1 POP HL ;Stack in Ordng. MRET: CALL PRS ;Kopfzeile aus- DEFB CLS,CUD ;geben DEFM '* HC-CAOS 4.04*' DEFB 0 ; ; Men}-Aufbau ; MENLO: LD HL,0C000H LD C,L LD B,L MN2: CALL CRLF MN3: CALL PRS DEFB ESC ;Zeile l|schen DEFM '%' DEFB 0 CALL BRKT JR C,PARS1 ;Ende Men} bei ;BRK LD A,(IX+9) MN1: CPIR JP PO,PARS1 CPI JR NZ,MN1 MENU4: LD A,M CP 2 JR C,MN2 CP '0' JR C,MN3 CP 60H JR NC,MN3 CALL ROUT ;Ausgabe Zeichen INC HL DEC BC JR MENU4 ;------------------------ ; ; Main Monitor Loop ; PERRP: POP HL ;Inloop [?[ PERR: CALL ERRM PARSE: CALL PRS DEFM '%' DEFB 0 PARS1: CALL INLN INC DE LD A,(DE) CP ' ' ;nur Leerzeichen JR Z,PARSE AND A ;nichts JR Z,PARSE CALL ZSUCH0 JR NC,PERR PUSH HL ;HL-> Epilog CALL RLIN JR C,PERRP ; ; Call command Routine ; PEND: LD HL,PARSE EX (SP),HL LD A,M INC HL PUSH HL AND A ;Epilog=0 ? CALL ARGS RET NZ JP IRMOFF ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Stringsuchprogramm ; ZSUCH0: LD HL,0C000H LD B,L LD C,L ZSUCH: LD A,(IX+9) ZSUC2: CPIR SCF CCF RET PO CPI JR NZ,ZSUC2 PUSH AF PUSH DE ZSUC3: LD A,(DE) CP 21H JR C,ZSUC4 ;ZK im VRAM zu INC DE ;Ende CPI JR Z,ZSUC3 ZSUP: POP DE POP AF ;doch nicht JR ZSUC2 ; ZSUC4: LD A,M CP 2 JR C,ZSUR CP ' ' JR C,ZSUP INC HL JR ZSUC4 ; ZSUR: POP AF POP AF SCF RET ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Zeitschleife 1 ; WAIT0: DEC A RET Z PUSH AF POP AF JR WAIT0 ; ; Zeitschleife 2 T=A*6.05 ms ; WAIT: LD B,A XOR A WAIT1: CALL WAIT0 DJNZ WAIT1 RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Ausdrucken der Blocknr. mit ; folgendem Text ; PBLNR: LD A,(IX+2) AHPS: CALL AHEX ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Ausgabe einer Zeichenkette ; PRS: EX (SP),HL PRS1: LD A,M INC HL AND A JP Z,PRS2 CALL ROUT JR PRS1 ; ZKOUT: LD A,M INC HL AND A RET Z CALL ROUT JR ZKOUT ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Startadresse ausrechnen ; (HL): Nummer ; DE: Startadresse ; VR: F,DE,HL ; CALC: LD E,M LD HL,(STAB) OUTT1 EQU $+1 LD D,0 ADD HL,DE ADD HL,DE LD E,M INC HL LD D,M RET ;_______________________________________ ; ; Ein/Ausgabe auf Kanal 0/4 ; NORM: CALL NNIM ;UP-Eingabe auf ;Kanal 4 ;_______________________________________ ; ; Setzen eines neuen Output Kanals ; NNOM: LD HL,OUTT1 NOM: PUSH DE CALL CALC LD HL,(OUTAB) LD (OUTAB),DE POP DE RET ;_______________________________________ ; ; Setzen eines neuen Input Kanals ; NNIM: LD HL,INTT1 NIM: PUSH DE CALL CALC LD HL,(INTAB) LD (INTAB),DE POP DE RET ; ; Eingabe eines Zeichens }ber def.Kanal ; ICHR: PUSH HL LD HL,(INTAB) JR ATE ; ; Ausgabe eines Zeichens }ber def.Kanal ; ROUT: PUSH HL LD HL,(OUTAB) ; ; Start eines UP ; ATE: PUSH DE PUSH BC CALL CHL ;CALL (HL) REGPOP: POP BC POP DE POP HL RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Eingabe eines Zeichens mit Cursor- ; einblendung ; BLINK1: PUSH HL PUSH DE PUSH BC BIT 6,(IX+8);F-Taste? JR NZ,BL2 ; BL0: LD DE,(CRSR) CALL VADR XOR A CP M ;ASCII=0 im VRAM JR Z,BL14 LD E,A ;E=0 BL10: CALL CUCPL ;Cursor setzen INC E ;z{hlen LD B,15 BL11: CALL KBD JR C,BL12 ;Taste gedr. DEC BC LD A,B OR C JR NZ,BL11 ;1/4 sec. warten JR BL10 ;noch mal neg. ; BL14: CALL CUADR ;f}r blanks SET 1,L SET 2,L ;Adr. Pixel LD A,M ;holen LD B,A XOR 7FH LD M,A ;setzen BL15: CALL KBD JR NC,BL15 ;warten LD M,B ;CRSR weg JR BL13 ; BL12: BIT 0,E ;unger. Male CALL NZ,CUCPL;negiert ? ; BL13: LD D,A ;Tastaturbeeps BIT 5,(IX+8) LD BC,307H CALL NZ,ABEEP1 LD A,D ; BOFF: CP 0F1H ;F-Taste? JR C,REGPOP SET 6,(IX+8) AND 0FH ;A=Nr.der Ftaste LD B,A LD HL,FTASTE BL4: LD A,M AND A INC HL JR NZ,BL4 DJNZ BL4 JR BL3 ; BL2: LD HL,(FCONT) BL3: LD A,M INC HL LD (FCONT),HL AND A JR NZ,REGPOP RES 6,(IX+8) JR BL0 ; ; Eingabe eines Zeichens mit ESCape- ; auswertung ; BLINK: CALL BLINK1 CP PESC RET NZ BIT 2,(IX+8) RET NZ CALL CRT CALL BLINK1 CALL CRT JR BLINK ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Aufbau von (IX+8): ; ;0: Taste aktiv 4: Tastaturpuffer off ;1: Ton aktiv* 5: Beeps ;2: Escapeausw. 6: Stapeljob ;3: Taste gedr. 7: Shift-Lock ; ;* VSync-Hilfsbit ; ; Aufbau von (IX+7) ; ;0: Verify/Load 4: Zur}ckkommen bei "" ;1: Autost.off 5: (Tastaturp.sichtb.)* ;2: Centr/V24 6: / ;3: Blockanz. 7: / ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Arbeitsspeicher Initialisierung ; INITT: DEFW DRET ;Hcopy DEFB 0 DEFW 0 DEFW 2028H ;Window DEFW 0 DEFB 0 DEFB 7 ;Farbe DEFW SCR DEFW CAPITAL DEFW SMALL DEFW CAPITAL DEFW SMALL ; DEFW STACK DEFW STABA DEFW ACTAB ;CTAB ; OUT (P1AD),A JP 0F012H ; ; I/O Tables ; DEFW CRT DEFW BLINK ; ; USER Jumps ; JP DRET JP DRET JP DRET JP DRET ; DEFW VBLEN-1 ;Pufferl{nge DEFW KBDBUF ;Pufferadr. INITX: ; JP SRLX1 JP SRLIN1 DEFW AETAB DEFB 98H,60H INITY: ; DEFB 3 ;RAM 0 DEFB 1 ;IRM DEFB 0C1H ;BASIC/ROM-Fl. DEFB 3 ;RAM-Floppy DEFB 3 ;RAM 4 INITZ: ; ; ; ; ZEILENEINGABE ; INLN: CALL ICHR CALL ROUT CP CR JR NZ,INLN CALL CRLF LD DE,(CRSR) CP D ;Zeile 0 ? JR NZ,INL1 LD A,(WINLG+1) LD D,A ;letzte Zeile INL1: DEC D PUSH HL CALL VADR EX DE,HL POP HL DRET: RET ; ; AUSGABE HL ALS 4 HEX-ZEICHEN UND SPACE ; HLHX: LD A,H CALL AHEX ;AUSGABE A ALS 2 LD A,L ;HEX-ZEICHEN AHSP: CALL AHEX SPAC: LD A,' ' ;AUSGABE SPACE CRLF1: JP ROUT ; ; FEHLER AUSGABE ; ERRM: CALL PRS DEFM 'Error' DEFB BEEP,KKBD DEFB 0 ; ; AUSGABE NEWLINE ; CRLF: CALL PRS DEFB CR,CUD DEFB 0 RET ; ; Cursor at home ; SHOME: LD A,HOME JR CRLF1 ; ; AUSGABE A ALS 2 HEX-ZEICHEN ; AHEX: PUSH AF RRA RRA RRA RRA CALL TETRAD POP AF ; ; AUSGABE BIT 0-3 ALS EIN HEX-ZEICHEN ; TETRAD: AND 0FH ADD A,90H DAA ADC A,40H DAA JR CRLF1 ; ; AUSGABE HL UND DE ALS HEXZAHLEN ; HLDE: CALL HLDE1 HLDE1: CALL HLHX EX DE,HL RET ; ; ERFASSEN EINER HEX-ZAHL IN EINER ZEILE ; DE=ADRESSE IM RAM (VRAM) ; NUMN=ANZAHL DER HEX-ZEICHEN (0-4) ; NUMV=WERT DER ZAHL ; NN0: INC DE NUM: LD A,(DE) CP ' ' JR Z,NN0 ; NUMV,NUMN=0 XOR A LD HL,NUMYX+1 LD M,A DEC HL LD M,A DEC HL LD M,A ; ERFASSEN DER ASCII-ZEICHEN NN1: LD A,(DE) OR A RET Z CP ' ' RET Z ; UMWANDLUNG DER ASCII-ZEICHEN SUB '0' RET C CP 10 JR C,NN2 SUB 7 AND 0FFH-20H CP 10 RET C CP 16 CCF RET C ; NN2: INC DE INC M INC HL RLD INC HL RLD DEC HL DEC HL JR Z,NN1 DEC DE SCF RET ; ; ERFASSEN VON MAXIMAL 10 ARGUMENTEN ; DE ZEIGT AUF ANFANG DER ARGUMENTE IN ; DER ZEILE ; RLIN: LD BC,ARGN XOR A LD (BC),A RL2: CALL NUM RET C LD A,M OR A RET Z INC HL INC BC LD A,M LD (BC),A ;EINTRAGEN INC HL INC BC LD A,M LD (BC),A LD L,LOW(ARGN) INC M LD A,M ADD A,255-10 JR NC,RL2 RET ; ; Monitor Initialisierung ; ALLINIT: LD DE,HCADR LD HL,INITT LD BC,INITX-INITT LDIR ;Umladen LD E,LOW(POUT) LD C,INITY-INITX LDIR LD DE,MODBUF LD C,INITZ-INITY LDIR SIXR: LD A,1 ; ;SET INTERRUPT-TABLE ; SIXD: LD HL,ITAB LD (MIXIT),A LD E,LOW(MIX) LD D,A PUSH DE LD E,LOW(RAM) LD BC,1CH LDIR ;Umladen der In- ;terrupttabelle POP IX ;+IX Arbeitsz. ; ;Set IX JNITT: PUSH AF PUSH DE PUSH HL DI IM 2 ;INTERRUPTMODE 2 LD A,(MIXIT) LD I,A LD D,8 LD HL,JTATA CALL INITCS POP HL POP DE POP AF RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Universelles Initialisierungsprogramm ; ; HL: Init-Tabellen-anfang ; HL: " -ende ; VR: HL ; INITC: PUSH BC LD C,M ;1.B. E/A-Adr. INC HL LD B,M ;2.B. Tab.L{nge INC HL OTIR ; ... Bytes POP BC RET ; ; Initialisierung mehrerer E/A-Kan{le ; INITCS: DI INIT1: CALL INITC DEC D JR NZ,INIT1 EI RET ; ; Tabelle zur E/A-Initialisierung ; PIO und CTC ; JTATA: DEFB P1AC,3 ;* Kassetten-INT DEFB LOW(PIOINT) ;INT-VEKTOR DEFB 0FH ;BYTE EINGABE DEFB 3 ;DI f}r Kassette ; DEFB P1AD,1 ;* DEFB 3FH ;MOTOR+ROM C off ; DEFB P1BC,3 ;* Tastatur-INT DEFB LOW(PIOINT+2) DEFB 0FH ;BYTE-AUSGABE DEFB 83H ;INT AKTIV ; DEFB P1BD,1 ;* DEFB 0FFH ;Lautst{rke 0 ; DEFB CTC2,2 ;* Blink ein DEFB 47H ;Z{hler mit 50Hz DEFB BLZK ;Zeitkonst. ; DEFB CTC0,1 ;* DEFB LOW(CTCINT) ;Interruptvektor ; DEFB PORT1,1 ;* Latch I DEFB 98H ;System-LED on ; DEFB PORT2,1 ;* Latch II DEFB 60H ;ROM-Bank ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; SAVE KOMMANDO ; DEFW HEAD DEFM 'SAVE' DEFB 1 CP 2 JP C,ERRM CALL PRS DEFM 'NAME :' DEFB 0 CALL INLN LD HL,6 ADD HL,DE SAVE: LD DE,IOPUF LD BC,11 LDIR ;UMLADEN NAME XOR A LD (DE),A ;COPY PROT. LD HL,ARGN LD E,16 LD C,21 LDIR ;EINTRAG ARGU- ;MENTE CALL ISRLX ;1. Block LD HL,(ARG1) ;----------------------- WR1: LD (IX+5),L LD (IX+6),H CALL PBLNR DEFB CUL,CUL DEFB 0 LD BC,160 ;Vortonl{nge CALL BRKT ;BREAK ? JP C,RINT ; LD DE,80H ;Blockl{nge ADD HL,DE LD DE,(ARG2) SBC HL,DE ;ENDE (ARG2) ER- JP NC,CSRLX;REICHT ? CALL SRLX JR WR1 ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Laden der Argumente ; ARGS: LD BC,(ARG3) LD DE,(ARG2) LD HL,(ARG1) LD A,(ARGN) RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Lesen eines Blockes mit Ausschrift ; ; (IX+3) zu lesender Block ; VR: AF,BC (Block<>1) ( >## ) ; VR: AF,BC,HL (Block=1) ( Name ) ; CY: BRK ; ; RDPRO: LD (IX+3),0 RDBLK: INC (IX+3) RD0: CALL BRKT RET C CALL SRLIN BIT 3,(IX+7);keine Blockanz. RET NZ JR NC,RD1 LD A,4 LD (CRSR),A CALL PBLNR ;Pr}fsumme false DEFM ' ?' DEFB CR DEFB 0 JR RD0 ; RD1: LD A,(IX+2);gelesener Bl. LD B,(IX+3);zu lesender "" DEC B JR Z,RDB1 ;Block 1 soll INC B ;gelesen werden CP B JR Z,RD2 INC A ;FF ?? JR Z,RD2 RD3: LD A,4 LD (CRSR),A CALL PBLNR ;falscher Block DEFM '* ' DEFB CR DEFB 0 JR RD0 ; RD2: CALL PBLNR DEFM '>' ;richtig DEFB CR DEFB 0 RET ; RDB1: DEC A JR NZ,RD3 ;gelesener Block ; <>1 CALL CRLF LD HL,IOPUF LD B,11 RD4: LD A,M INC HL AND A CALL NZ,PCTRL;kein Ausf}hren CALL Z,SPAC ;von CTRL ;Dummy = SPAC DJNZ RD4 JP SPAC ;Name ; ;________________________ ; ERRM2: CALL PRS DEFM '???' DEFB 0 RINT: JP RINIT ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Lesen von Band ; DEFW HEAD DEFM 'VERIFY' DEFB 1 VERIF: RES 0,(IX+7) JR READ1 ; DEFW HEAD DEFM 'LOAD' DEFB 1 READ: SET 0,(IX+7) READ1: CALL INIT ;________________________ ; CALL RDPRO ;1.Block lesen RINT2: JR C,RINT ; BIT 0,(IX+7) JR Z,VER LD L,10H LD A,M SUB 2 CP 9 JR NC,ERRM2 ;ARGN <> 2...10 LD BC,(IOPUF+21); Start LD DE,(IOPUF+19); Endadr. LD HL,(IOPUF+17); Anf.adr. LD A,(ARGN); Ladeoffset ? AND A ;Argumente uml. JR Z,R5 ; PUSH BC LD BC,(ARG1);Offset ADD HL,BC ;Umrechnen Anf. EX DE,HL ADD HL,BC ;Umrechnen Ende EX DE,HL LD A,(IOPUF+10H) LD (ARGN),A BIT 2,A ;ARGN=4...7 JR NZ,RR5 ;Ja? Startoffset EX (SP),HL ADD HL,BC ;neue Startadr. EX (SP),HL RR5: POP BC ;[?[ Argumente ; umspeichern R5: LD (ARG2),BC;Startadr. CALL HLDE ;Ausgabe Adresse EX DE,HL VER: CALL CRLF ;Ausgabe CRLF RF: CALL RDBLK JR C,RINT2 BIT 0,(IX+7) JR Z,NVER ; PUSH HL SBC HL,DE LD BC,80H SBC HL,BC ;cy=0 JR NC,RDX ;voller Block ADD HL,BC JR Z,RDY ;nichts mehr LD C,L RDX: LD HL,IOPUF LDIR ;Umspeichern RDY: POP HL ; NVER: INC (IX+2) ;gelesener Bl. JR NZ,RF ;=FF ? CSRLI: CALL RINIT ;Endblock LD A,(ARGN) AND 3 DEC A RET NZ ;Verify oder ;Autostart off LD A,(ARGN) CP 3 ;kein " RET C LD HL,(ARG2) JP (HL) ;********************************************************** ; ; Color Kommando ; L: Vordergrundfarbe/Blinken ; E: Hintergrund ; A: <2 nur Vordergrund ; DEFW HEAD DEFM 'COLOR' DEFB 1 MCOLOR: PUSH AF LD A,1FH AND L RLA RLA RLA LD L,A POP AF CP 2 ;Hintergrund ? LD A,E JR NC,COL1 LD A,(COLOR) COL1: AND 7 OR L LD (COLOR),A RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Subroutine Table ; STABA: DEFW CRT DEFW SRLX DEFW UOUT1 DEFW UOUT2 DEFW BLINK DEFW SRLIN DEFW UIN1 DEFW UIN2 DEFW ISRLX DEFW CSRLX DEFW ISRLI DEFW CSRLI DEFW KBDS DEFW ST3 DEFW KBD DEFW MCOLOR ; DEFW READ DEFW VERIF DEFW PARSE DEFW NORM DEFW WAIT DEFW ARGS DEFW ICHR DEFW INLN DEFW NUM DEFW ERRM DEFW HLHX DEFW HLDE DEFW AHEX DEFW ZSUC2 DEFW NOM DEFW NIM ; DEFW NNOM DEFW NNIM DEFW RLIN DEFW PRS DEFW ROUT DEFW CUCPL DEFW MODUL DEFW JUMP DEFW LDHLA DEFW LDAHL DEFW BRKT DEFW SPAC DEFW CRLF DEFW SHOME DEFW MOD0 DEFW PRES ; DEFW PSET DEFW SIXD DEFW VADR DEFW TCIF DEFW PADR DEFW TON DEFW SAVE DEFW MBIN ;[?[ DEFW MBOT ;[?[ DEFW KEY DEFW KEYL DEFW DISPL DEFW WINDS DEFW SETW DEFW LIN DEFW CIRC ; DEFW SQR DEFW MULT DEFW CSTBT DEFW INITC DEFW INITCS DEFW ZKOUT DEFW MENLO DEFW POINT ;weitere UP's DEFW DISP ;[?[ DEFW RDBLK ;INLOOP,VERSION ;PSET ;Block les.+schr ;}ber HL ind. ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Unterprogramm f}r MODIFY/DISPLAY ; Ausdrucken einer Zeile ; ; HL: Anfang ; C: L{nge ; VR: AF,B,HL ; HL: Ende ; DLINE: CALL HLHX ;Adr. PUSH HL LD B,C DL1: LD A,M ;HEX-Dump INC HL CALL AHSP DJNZ DL1 POP HL LD B,C LD A,CUR CALL ROUT DL2: LD A,M ;ASCII's INC HL CALL PCTRL DJNZ DL2 RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Ausdrucken ohne Ausf}hrung von ; Steuerzeichen ; PCTRL: PUSH HL LD HL,STBT SET 3,M ;setzen CALL ROUT RES 3,M ;r}cksetzen POP HL RET ; ; Steuerbit complementieren ; CSTBT: PUSH AF LD A,(STBT) XOR 8 LD (STBT),A POP AF RET ; ; Wurzel ziehen ; A=SQR(HL) ; SQR: LD DE,-1 LD A,D SQR1: INC A ADD HL,DE DEC E DEC DE JR C,SQR1 RET ; ; Multiplizieren ; ; D*C=BA ; MULT: LD B,0 LD E,9 MUL1: RR D LD A,D DEC E RET Z LD A,B JR NC,MUL2 ADD A,C MUL2: RRA LD B,A JR MUL1 ;---------------------------------------------------------- ; Display ; ; HL: Anfang ; E: Zeilen (bei ARGN>1), sonst 1 ; C: Bytes/Zeile(-""->2), sonst 8 ; DEFW HEAD DEFM 'DISPLAY' DEFB 1 DISPL: CP 3 JR NC,DIS1 LD C,8 CP 2 JR NC,DIS1 LD E,1 DIS1: LD D,E DIS2: CALL DLINE CALL CRLF CALL BRKT RET C DEC D JR NZ,DIS2 CALL ICHR CP BRK RET Z CP STOP JR NZ,DIS1 JR MOD1 ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Modify Kommando ; DEFW HEAD DEFM 'MODIFY' DEFB 1 MOD0: LD C,E CP 2 JR NC,MOD1 LD C,1 MOD1: CALL DLINE ;Anzeige Adr., ;Bytes, ASCII's LD A,5 LD (CRSR),A;Crsr auf Anf. CALL INLN ;Zeileneingabe PUSH HL CALL NUM ;Erfassen der LD A,M ;Speicheradr. POP HL JR C,MODR ;Fehler ? AND A ;Adr.erfa~t ? JR Z,MOD1 LD HL,(NUMYX);Adr. lesen ; ; Erfassen der Eingaben ; MOD2: PUSH HL CALL NUM LD A,M AND A INC HL LD A,M POP HL JR Z,MOD4 ;Zahl erfa~t ? ; ; Eingabe in den Speicher ; MOD3: LD M,A INC HL MOD4: LD A,(DE) INC DE ;IF "." return CP '.' RET Z ;IF "," Erfassen eines ASCII-Zeichens CP ',' JR NZ,MOD5 LD A,(DE) ;Erh|hen Zei- INC DE ;lenposition JR MOD3 ;IF ":" Adresse um 1 erniedrigen MOD5: CP ':' JR NZ,MOD6 DEC HL JR MOD4 ;IF "/" neue Adresse erfolgt MOD6: CP '/' JR NZ,MOD7 CALL NUM JR C,MODR LD HL,(NUMYX) JR MOD1 ;IF "'" String bis 00h oder ' lesen MOD7: CP 27H JR NZ,MOD9 MOD8: LD A,(DE) INC DE AND A JR Z,MOD1 CP 27H JR Z,MOD4 LD M,A INC HL JR MOD8 ; MOD9: AND A JR Z,MOD1 CP ' ' JR Z,MOD2 MODR: CALL ERRM JR MOD1 ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Windowverwaltung ; DEFW HEAD DEFM 'WINDOW' DEFB 1 AND A JR Z,SETW ;Window Nr.0 DEC A JR Z,SET0 ; -""- L DEC A LD A,C JR NZ,WINDS;Eintragen in C XOR A ; -""- 0 ; ; Window eintragen ; ; HL: Anfang ; DE: L{nge ; A: Nummer ; VR: F,BC ; BC: 0h ; WINDS: PUSH DE PUSH HL CALL WINS ;retten POP HL POP DE LD (WINNR),A LD A,L ;Argumente pr}fn ADD A,E ;CY=1 ERROR RET C ADD A,-40-1 RET C LD A,H ADD A,D RET C ADD A,-32-1 RET C LD (WINAN),HL LD (WINLG),DE LD (CRSR),BC RET ; SET0: LD A,L ; ; Window setzen ; ; A: Nummer ; VR: AF,BC,DE,HL ; BC: 0h ; SETW: CALL WINS SET1: LD (WINNR),A CALL WINADR RET C EX DE,HL ;Adr. in HL LD DE,WINAN JR WINS1 ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Window-adr. berechnen ; A: Nr. ; VR: AF,DE ; CY: Fehler ; DE: Adresse ; WINADR: ADD A,-10 RET C ADD A,A LD E,A ADD A,A ADD A,A ADD A,E LD E,A LD D,0B9H AND A RET ; ; akt. WINDOW retten ; ; VR: F,BC,DE,HL ; BC=0 ; WINS: PUSH AF LD A,(WINNR) CALL WINADR JP C,PADR3 ;POP AF, RET POP AF LD HL,WINAN WINS1: LD BC,10 LDIR RET ; ; Ausdrucken einer F-Taste ; ; HL: Anfang ; VR: AF,HL ; HL: Ende ; PKEY1: INC HL PKEY: LD A,M AND A RET Z CALL PCTRL JR PKEY1 ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Unterprogramm zum Belegen der F-Tasten ; ; A: Nummer ; VR: AF,BC,DE,HL ; DEFW HEAD DEFM 'KEY' DEFB 1 LD A,L KEY: AND A RET Z CP 12+1 RET NC ;Nummer kontr. LD B,A LD HL,FTASTE KEY1: LD A,M INC HL AND A JR NZ,KEY1 DJNZ KEY1 ;suchen CALL PKEY ;ausdr. KEY11: PUSH AF KEY2: DEC HL KEY3: POP AF KEY4: CALL BLINK1 ;Taste CP STOP JP Z,CRLF ;STOP=Ende PUSH AF ;ASCII retten LD B,0 DEC A ;=1 ? JR NZ,NKEY LD A,M ;ja AND A JR Z,KEY3 ;Taste leer -> LD D,H LD E,L PUSH HL INC HL LD A,LOW(MWIND) SUB L ;[?[ JR Z LD C,A LDIR ;verschieben POP HL POP AF CALL ROUT ;ausdrucken JR KEY11 ; NKEY: LD A,(MWIND-2) AND A JR NZ,KEY3 ;voll -> PUSH HL LD A,LOW(MWIND-1) SUB L ;[?[ JR Z LD C,A LD HL,MWIND-2 LD DE,MWIND-1 LDDR ;verschieben POP HL POP AF INC HL LD M,A ;eintragen CALL PCTRL ;ausdr. JR KEY4 ; ; Unterprogramm zum Ausdr. der F-Tasten ; ; VR: AF,BC,HL ; DEFW HEAD DEFM 'KEYLIST' DEFB 1 KEYL: LD HL,FTASTE LD BC,0CF0H;C=Name,B=Count. KEYL1: INC C LD A,C CALL AHPS DEFM ' :' ;Name DEFB 0 CALL PKEY1 ;Taste CALL CRLF ;Zeile DJNZ KEYL1 RET ; ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; CUCPL: ; ACCPL: PUSH AF ;Complement Crsr PUSH DE PUSH HL CALL CUADR ;ADR.IM PRAM JR C,ACC2 PUSH BC LD B,8 ;8 Bytes compl. ACC1: LD A,M CPL LD M,A INC L DJNZ ACC1 POP BC ACC2: POP HL POP DE POP AF RET ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; Punktsetzprogramm ; HOR : Horizontalkomp. ; VERT: Vertikal- " ; HL: Pixeladr. ; DE: Farbadr. ; A : Maske ; CY: Fehler ; VR: AF,BC,DE,HL ; PUNKT: LD HL,(HOR) LD A,L AND 7 SRL H RR L SRL H RR L SRL H RR L ADD A,LOW(PTAB) LD C,A LD B,HIGH(PTAB) LD A,(VERT) CPL LD H,A LD A,(BC) JP PADR ; ; Punkt setzen ; PSET: PUSH HL PUSH DE PUSH BC CALL PUNKT JR C,PS1 OR M LD M,A ;Pixel ges. LD A,(FARB) AND 0F8H LD B,A LD A,(DE) AND 7 OR B ;neue Farbe LD (DE),A ;Farbe ges. PS1: POP BC POP DE POP HL RET ; ; Punkt r}cksetzen ; PRES: PUSH HL PUSH DE PUSH BC CALL PUNKT JR C,PS1 LD B,A LD C,M CPL AND C LD M,A ;Pixel r}ckges. LD A,B AND C ;Z ges. LD A,(DE) ;Farbe geholt JR PS1 ; PTAB: DEFB 80H,40H,20H,10H,8,4,2,1 ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; LINE-Programm ; ; ARG1..4: xa,xe,ya,ye ; VR: AF,BC,DE,HL,AF',BC',DE',HL' ; LIN: LD HL,(ARG2) LD DE,(ARG4) EXX LD HL,(ARG1) LD DE,(ARG3);Argumente holn LX1: XOR A SBC HL,DE JP PE,LX2 ;xa-xe>=0 ? ADD HL,DE EX DE,HL ;Anfang und Ende EXX ;vertauschen EX DE,HL EXX JR LX1 ; LX2: EXX PUSH DE ;ya->stack !!! LX3: SBC HL,DE JP PE,LX4 ;ye-ya>=0 ? ADD HL,DE EX DE,HL ;ye, ya vertausc OR 1 ;BIT 0,A=1 JR LX3 ;=>up ; LX4: PUSH HL ;dy ->stack EXX POP BC ;stack ->BC PUSH HL SBC HL,BC ;dx-dy POP HL PUSH BC JR NC,LX5 EX (SP),HL OR 2 ;BIT 1,A=1 ;=> flach LX5: PUSH HL ;HL=gro~es d LD B,H LD C,L EXX POP BC POP DE LD H,B LD L,C SRL H RR L EXX POP HL EX DE,HL LOP1: CALL POINT EXX AND A SBC HL,DE JR NC,LX6 ADD HL,BC LX6: EXX BIT 1,A JR NZ,LX7 INC HL JR NC,LEND AND A LX7: BIT 0,A INC DE JR Z,LX8 DEC DE DEC DE LX8: JR NC,LEND INC HL LEND: EX AF,AF LD A,B OR C RET Z DEC BC EX AF,AF JR LOP1 ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; CIRCLE-Programm ; ; ARG1,ARG2: x,y ; L(ARG3) : r ; VR : AF,BC,DE,HL,BC',DE',HL' ; CIRC: LD A,(ARG3) LD C,A LD L,C XOR A LD B,8 RR L CR1: JR NC,CR2 ADD A,C CR2: RRA RR L DJNZ CR1 LD H,A LD D,H LD E,L LD A,C SLA C RL B DEC BC PUSH BC LD BC,1 EXX LD C,A LD B,0 ; CLOOP: CALL QUA CALL QUA EXX AND A SBC HL,BC INC BC INC BC SBC HL,DE ADD HL,DE EXX JR NC,INN EXX EX (SP),HL EX DE,HL AND A SBC HL,DE DEC DE DEC DE EX DE,HL EX (SP),HL EXX DEC C INN: INC B LD A,C CP B JR NC,CLOOP POP AF RET ; QUA: LD A,B LD B,C LD C,A XOR A LD D,A LD HL,(ARG2) PUSH HL LD E,C ADD HL,DE CALL UPP XOR A LD D,A POP HL LD E,C SBC HL,DE ; UPP: PUSH HL LD HL,(ARG1) LD E,B AND A SBC HL,DE POP DE CALL POINT PUSH DE LD D,A LD E,B ADD HL,DE ADD HL,DE POP DE ; ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; universelles Punkt(re)set-Programm ; ; HL: x ; DE: y ; (FARB) Bit 3..7: Farbe ; Bit 2 : 4-Farben-Modus ; Bit 1=1 : PRESET ; Bit 0=1 : PXOR ; VR: / ; POINT: PUSH HL ;[?[ mit extra PUSH DE ;Sprungverteiler PUSH BC PUSH AF LD A,L AND 7 ADD A,LOW(PTAB) LD C,A LD B,HIGH(PTAB) LD A,L SRL H RRA SRL H RRA SRL H RRA CP 40 JR NC,POEND OR 80H LD H,A LD A,0FFH ADD A,D JR C,POEND XOR E LD L,A LD A,(FARB) LD D,A LD A,(BC) BIT 2,D JR NZ,PSHD BIT 1,D JR NZ,PORES BIT 0,D JR NZ,POXOR OR M PU1: LD M,A LD A,(MPT1) LD E,A OR 2 OUT (PORT1),A LD A,M AND 0F8H OR D PSHD2: LD M,A LD A,E OUT (PORT1),A POEND: POP AF POP BC POP DE POP HL RET ; POXOR: XOR M RES 0,D JR PU1 ; PORES: CPL AND M LD M,A JR POEND ; PSHD: LD B,A OR M BIT 3,D JR NZ,PSHD1 XOR B PSHD1: LD M,A LD A,(MPT1) LD E,A OR 2 OUT (PORT1),A LD A,B OR M BIT 4,D JR NZ,PSHD2 XOR B JR PSHD2 ; ;*__*__*__*__*__*__*__*__*__*__*__*__*__ ; ; ; B Y T E - I N P U T / O U T P U T - ; R O U T I N E N ; ; MBOT: PUSH HL PUSH BC PUSH AF LD HL,COUNT LD C,M LD B,HIGH(IOPUF) LD (BC),A INC C LD M,C BIT 7,C JR Z,BT1 LD M,0 LD BC,144 CALL SRLX CALL NNOM CALL PBLNR DEFB CUL,CUL DEFB 0 LD (OUTAB),HL BT1: POP AF POP BC POP HL RET ; MBIN: PUSH BC LD A,(COUNT) BIT 7,A JR Z,BN1 ; PUSH HL CALL NNOM PUSH HL CALL RDBLK POP HL LD (OUTAB),HL POP HL JR C,BN2 XOR A ; BN1: LD B,HIGH(IOPUF) LD C,A INC A LD (COUNT),A LD A,(BC) CP A BN2: POP BC ;CY=0,Z=1 RET .DEPHASE ; END