.z80 title getsysl ; ======================================== ; * G E T S Y S T E M L O A D E R * ; ======================================== ; bearbeitet fuer D004 ; STAND ALONE: SYSL ---> RAM / GOTO SYSL ; GLOBAL SYSLD,SYSEND,SYSL,OK,NOTRDY GLOBAL CANTRD,NSYSL,UROK SYSLD EQU $ stack equ 8000h SYSL EQU 9000H .phase 0fc00h ; RETRY EQU 5 ;NUMBER OF REPEAT's OK EQU 1 ;LADEN O.K. NOTRDY EQU 2 ;DRIVE NOT READY CANTRD EQU 3 ;CAN'T READ NSYSL EQU 4 ;NO SYSL UROK EQU 0FFB3H ;QUITTUNGSADRESSE ; GETSYL: ld sp,stack CALL FDINI ;SPECIFY LD C,2 SYSNXT: LD B,RETRY SYSRTR: PUSH BC CALL FDSEEK JR NZ,SYS1 LD HL,SYSL LD BC,512 ; 2 SECTOR's CALL FDRD POP BC JR NZ,SYS2 LD HL,(SYSL) LD DE,'YS' AND A ; CY=0 SBC HL,DE JR NZ,KSYLx ; NO SYSL LD A,(SYSL+2) CP 'S' LD A,5 ;OTHER SYSTEM JR NZ,SOK LD A,OK SOK: LD (UROK),A JP SYSL+4 ; STRT: SYL ksylx: ld A,NSYSL KSYL: ld (UROK),a xor a OUT (FDCMT),a ; MOT OFF HALT ; sys1: pop bc ld a,NOTRDY jr ksyl Š; SYS2: DJNZ SYSRTR ; RETRY LD HL,UNIT1 LD (FDCMD+1),HL DEC C JR NZ,SYSNXT ld A,CANTRD JR KSYL ; ============================================ ; FLOPPY DISK INTERFACE ROUTINES USING UPD 765 ; ============================================ FDC EQU 0f0H FDCS EQU FDC; MAINSTATUS FDCD EQU FDC+1; DATA FDCDR EQU FDC+2; "DMA"-DATA-REG FDCRI EQU FDC+4; STATUS: DRQ/INT/RDY FDCMT EQU FDC+6; MOT ON FDCTC EQU FDC+8; FDC Terminal-Count PRDY EQU FDCRI BRDY EQU 5 ; ; INITIALISIERUNG: UPD 765 ; FDINI: LD B,0 fdix: DJNZ fdix ; DELAY IN a,(FDCS) CP 80H ; RQM ? JR Z,FDI1 AND 0FH CAll NZ,FDSNS ; INT-STATUS IN a,(FDCD) ; GET EMPTY JR FDIni ; TRY AGAIN ; ; ++++ SPECIFY PARAMETER ++++++ ; +++++++++++++++++++++++++++++ ; 5 1/4 ZOLL DRIVE (MINIFLOPPY) FDSPC: DefB 9FH ;SRT=7*2MS/HUT=MAX(15*32MS) DefB 10+10 ; HLT=10*4MS/DMA-MODE ; FDI1: LD HL,FDSPC ;SPECIFY-PAR. LD BC,303H ;KOM=3/3 PARAM. jr FDK2 ;WITHOUT MOT.-ON ; **** SEEK TO TRACK **** ; *********************** ; FDSEEK: LD A,21h OUT (FDCMT),a ; MOT+SE ON LD BC,0 ;TIME OUT OF RDY FDS1: IN a,(PRDY) BIT BRDY,A JR NZ,FDS2 ; RDY = LOW DEC BC LD A,B OR C JR NZ,FDS1 INC A ; Z<>0 RET ; FDS2: LD BC,207H ; HOME Š CALL FDCMD ; **** SENSE FDC-INT-STATUS ***** ; ******************************* ; FDSNS: IN a,(FDCS) AND 1FH ; BUSY ? Ret Z ;NO SEEK RUNNING FDS4: IN a,(FDCRI) BIT 6,A JR NZ,FDS4 LD BC,108H ; KOM=8 CALL FDK2 ; SNS INT-STATUS CALL FDNXT ; ST0 LD B,A ADD a,A Ret Z ; CY=1: KOM-ERR CALL FDNXT ; TRACK LD A,B AND 0F0H CP 0C0H JR Z,FDS4 ; RDY CHANGED XOR 20H ;SEEK-END OK:Z=1 RET ; ****** COMMAND TO uPD 765 ************ ; COMMAND IN C, NUMBER OF BYTES IN B ; *************************************** ; FDCMD: LD HL,UNIT ; KOM-PAR-TAB ; FDK2: IN a,(FDCS) AND 0C0H CP 80H JR NZ,FDK2 LD A,C OUT (FDCD),a ; SEND COMMAND LD C,(HL) INC HL DJNZ FDK2 ; NEXT CMD-BYTE RET ; ; ******* NEXT RESULTBYTE FROM FDC ****** ; FDNXT: IN a,(FDCS) AND 0C0H CP 0C0H ; RQM ? JR NZ,FDNXT IN a,(FDCD) RET ; ; **** READ SELECTED SECTOR **** ; FDRD: PUSH BC PUSH HL LD BC,946H ; BYTES/CMD CALL FDCMD Š POP hl ; BUFFER-ADR POP DE ; DATA LENGTH LD B,E LD C,FDCDR ; REQ-PORT CALL FDCIO ; ****** FETCH RESULTBYTES FROM FDC ******* ; CHECK FOR R/W ERRORS, IF OK ---> Z=1 ; ***************************************** ; FDCRES: LD B,7 ; 7 RESULTS LD HL,RESBYT FDCR1: CALL FDNXT LD (HL),A INC HL DJNZ FDCR1 LD A,(RESBYT) ; STATUS 0 AND 0C0H ;NORMAL TERM.Z=1 RET ; FDCIO: IN a,(FDCRI) ADD A,a ;/INT in S, ;/DRQ in CY Ret P JR C,FDCIO ; NO DRQ INI JR NZ,FDCIO DEC D JR NZ,FDCIO OUT (FDCTC),a ; TERMINAL-COUNT RET ; ; ***** INITIAL 765-PARM ***** ; UNIT1: DEFB 0,0,0,1 DEFB 3,5,25H,-1 ;5*1024 DRIVE: DefB 0,0,0,1; U/T/H/R DefB 1,16,0EH,-1; N/EOT/GPL/DTL ; ; ****** COMMAND TABLE FOR uPD 765 ****** ; **************************************** .dephase ; SYSEND EQU $ ; UNIT equ drive ;HEAD/UNIT TRACK EQU UNIT+1 ; RESBYT equ track+7 ;RESULTBYTES: ;ST0/ST1/ST2/C/H/R/N END