.TITLE MZ -- MZ HANDLER FOR XXDP+ V2 .IDENT /A.0/ ;+ ; Copyright (c) 2015 Oleg Safiullin ; ; Permission to use, copy, modify, and distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ; ; HISTORY: ; 12-APR-2015 A.0 INITIAL RELEASE ;- FIX$TM =: 0 ;DEFINE FOR MC0511 TIMER FIX ;+ ;DEVICE DESCRIPTOR BLOCK OFFSETS ;- XSV =: -12 ;SERVICE ROUTINE XDN =: -2 ;DRIVE NUMBER XER =: -1 ;ERROR STATUS XCM =: 0 ;COMMAND REGISTER ADDRESS XWC =: 2 ;WORD COUNT XBA =: 4 ;BUFFER ADDRESS XDT =: 6 ;BLOCK NUMBER XCO =: 10 ;COMMAND ;+ ;DEVICE COMMAND CODES ;- INIT$ =: 0 ;INITIALIZE DEVICE READ$ =: 1 ;READ WRITE$ =: 2 ;WRITE RES$FN =: 3 ;RESTORE FUNCTION FOR MONITOR ;+ ;DEVICE CODE BYTES ;- MULUN$ =: 100 ;DRIVER PERMITS MULTIPLE DEVICES ;+ ;MZ REGISTER AND BIT DEFINITIONS ;- MZCS =: 0 ;MZ CONTROL/STATUS REGISTER MZDA =: 2 ;MZ DATA REGISTER .ASECT ;+ ;XXDP DEVICE DRIVER PARAMETER TABLE ;- .WORD DISPAT ;DISPATCH ROUTINE .WORD "MZ ;DRIVER NAME .BYTE MULUN$ ;DEVICE CODE .BYTE 334 ;RETURNED DEVICE STATUS (DEVICE TYPE) .WORD BCODE ;BOOT CODE OFFSET .BYTE 'A ;UNIT # (REV A) .BYTE '0 ;ERROR STATUS (PATCH 0) .WORD 176674 ;COMMAND REGISTER ADDR .WORD 0 ;WORD COUNT .WORD 0 ;BUS ADDRESS .WORD 0 ;BLOCK NUMBER .WORD 0 ;COMMAND .WORD DIRBLK ;POINTS TO 1ST DIR BLOCK .WORD 0 ;FOR MONITOR COMPATIBILITY ;+ ;PARAMETERS USED TO DEFINE DISK LAYOUT ;- DIRBLK: .WORD 3 ;1ST UFD BLOCK ADDR .WORD 16. ;NUMBER OF UFD BLOCKS .WORD 19. ;1ST BIT MAP BLOCK ADDR .WORD 4 ;NUMBER OF MAP BLOCKS .WORD 1 ;MFD1 BLOCK ADDR .WORD 2 ;VERSION 2 FLAG .WORD 1600. ;MAX NUMBER OF BLOCKS ON DEVICE .WORD 55. ;# OF BLOCKS TO PREALLOCATE AT ZERO .WORD 1 ;INTERLEAVE FACTOR .WORD 0 ;BOOT BLOCK # MONBLK: .WORD 23. ;MONITOR CORE IMAGE BLOCK # .WORD 0 ;MFD REFRESHED FLAG ;+ ;ERROR MESSAGES ;- MWTERR: .ASCIZ / ? WR ERR/ MRDERR: .ASCIZ / ? RD ERR/ ILLERR: .ASCIZ / ? ILLEGAL CMND ERROR/ .EVEN ;+ ;MAIN DISPATCH ROUTINE ;- DISPAT: MOV R0,-(SP) ;SAVE REGISTERS MOV R1,-(SP) ; MOV R2,-(SP) ; MOV R3,-(SP) ; JSR R4,10$ ;DO A TABLE SEARCH ;+ ;FUNCTION TABLE ;- .WORD INIT$,INIT-. ;INITIALIZE .WORD RES$FN,RESTOR-. ;MONITOR RESTORE .WORD READ$,DRIVER-. ;READ .WORD WRITE$,DRIVER-. ;WRITE .WORD -1 ;END OF TABLE 10$: CMP (R4)+,XCO(R5) ;IS IT OUR FUNCTION? BEQ 30$ ;EQ = YES TST (R4)+ ;TO NEXT FUNCTION TST @R4 ;END OF TABLE? BPL 10$ ;PL = NO MOV PC,R0 ;NOT LEGAL COMMAND ADD #ILLERR-.,R0 ; EMT 3 ; EMT 23 ; MOVB #-1,XER(R5) ;SIGNAL 20$: MOV (SP)+,R4 ;RESTORE REGISTERS MOV (SP)+,R3 ; MOV (SP)+,R2 ; MOV (SP)+,R1 ; MOV (SP)+,R0 ; TSTB XER(R5) ;SET ERROR INDICATOR RETURN ;RETURN 30$: ADD @R4,R4 ;GET REAL ADDRESS CALL @R4 ;AND DO IT BR 20$ ;AND LEAVE ;+ ;INITIALIZE ROUTINE ;- INIT: CLRB XER(R5) ;ASSUME GOOD RESULT RETURN ;RETURN ;+ ;ROUTINE TO READ PART OF THE MONITOR CORE IMAGE ;- RESTOR: ADD MONBLK,XDT(R5) ;MAKE BLK NUMBER RELATIVE TO 0 MOV #READ$,XCO(R5) ;DO A READ FUNCTION JMP @XSV(R5) ;LET DRIVER TO DO IT AND RETURN ;+ ;READ/WRITE DRIVER FOR THE MZ ;- DRIVER: CLRB XER(R5) ;ASSUME GOOD RESULT MOV XDT(R5),R1 ;R1=BLKN MOV XDN(R5),R3 ;R3=UNIT ASL R3 ;R3=UNIT*2 CLR R0 ;R0=TRACK*2 DIV #10.,R0 ;R1=SECTOR INC R1 ; ASR R0 ;R0=TRACK RORB R3 ;ADD SIDE BIT MOV PC,R2 ;GET DESCRIPTOR ADDRESS ADD #MZPBLK+12-.,R2 ;+12 MOV XWC(R5),-(R2) ;SET WORD COUNT MOV XBA(R5),-(R2) ;SET BUFFER ADDRESS MOVB R1,-(R2) ;SET SECTOR MOVB R0,-(R2) ;SET TRACK MOVB R3,-(R2) ;SET SIDE & UNIT TSTB -(R2) ;SKIP PPU DEVICE NUMBER MOV #4000,-(R2) ;ASSUME READ FUNCTION CMP #READ$,XCO(R5) ;READ FUNCTION? BEQ 10$ ;YES ASL @R2 ;SET WRITE FUNCTION 10$: JSR R2,20$ ;R2=ADDRESS OF I/O PACKET .WORD 0,-1 ; 20$: MOV (SP)+,@R2 ;SET ADDRESS OF I/O DESCRIPTOR MOV XCM(R5),R4 ;GET CSR ADDRESS MOV #10.,R3 ;SET RETRY COUNT 30$: MOV #4,R1 ;SET PACKET LENGTH 40$: TSTB @R4 ;TRANSMITTER READY? BPL 40$ ;PL = NO MOVB (R2)+,MZDA(R4) ;SEND A BYTE SOB R1,40$ ;GO FOR NEXT 50$: TSTB @R4 ;WAIT FOR COMPLETION BPL 50$ ; TST -(R2) ;RESTORE ADDRESS OF I/O PACKET TSTB @-(R2) ;AND CHECK FOR I/O ERROR? BEQ 70$ ;EQ = NO DECB XER(R5) ;SIGNAL CMP #READ$,XCO(R5) ;READ ERROR? BEQ 60$ ;YES MOV PC,R0 ;ELSE WRITE ERROR ADD #MWTERR-.,R0 ; EMT 44 ; RETURN ;RETURN 60$: MOV PC,R0 ;WRITE ERROR ADD #MRDERR-.,R0 ; EMT 44 ; 70$: RETURN ;RETURN MZPBLK: .WORD 0,2,0,0,0 ;IO/ DESCRIPTOR BEGIN =: 1046 ;MONITOR START ADDRESS ;+ ;BOOTSTRAP CODE ;- BCODE: NOP ;START BOOT ROUTINE BR START ; .WORD 6 ;TRAP CATCHER HALT ; .WORD 12 ; HALT ; .BLKB 4 ; MZCSR: .WORD 176674 ;CSR ADDRESS START: NOP ; BR START1 ; .BLKB 12 ; .WORD 0,0 ; .BLKB 24 ; .IF DF FIX$TM .BLKB 10 .WORD .+2-BCODE RTI .ENDC START1: MOV #60000,SP ;INITIALIZE STACK POINTER .IF DF FIX$TM MTPS #0 MTPS #200 .ENDC MOV MZCSR,R1 ;GET CSR ADDRESS MOV R0,R2 ;SET UNIT FOR MONITOR JSR R0,10$ ;R0=ADDRESS OF I/O PACKET .WORD 0,-1 ; .WORD 4000,2,2401,1000,17400 ; 10$: MOV R0,R3 ;R3=ADDRESS OF I/O DESCRIPTOR CMP (R3)+,(R3)+ ; MOV R3,@R0 ;STORE INTO I/O PACKET BISB (SP)+,3(R3) ;SET UNIT 15$: MOV #10.,R5 ;SET RETRY COUNT 20$: MOV #4,R4 ;SET RETRY COUNT 30$: TSTB @R1 ;TRANSMITTER DEADY? BPL 30$ ;PL = NO MOVB (R0)+,MZDA(R1) ;SEND A BYTE SOB R4,30$ ;GO FOR NEXT 40$: TSTB @R1 ;WAIT FOR COMPLETION BPL 40$ ; TSTB @R0 ;I/O ERROR? BEQ 50$ ;EQ = NO CMP -(R0),-(R0) ;R0=I/O PACKET SOB R5,20$ ;RETRY HALT ;HALT BR 15$ ;TRY AGAIN 50$: JMP @#BEGIN ;START XXDP+ .END