DataMuseum.dkPresents historical artifacts from the history of: CR80 Hard and Floppy Disks |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CR80 Hard and Floppy Disks Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 11856 (0x2e50) Types: TextFile Names: »OPESYS.S«
└─⟦31b8a9b6a⟧ Bits:30005199 8" Zilog MCZ/1 Floppy CR80FD_0025 ( TC 500 SEC. PROTOCOL BB V2 830407 NCJ ) └─ ⟦this⟧ »OPESYS.S« └─⟦cf416a62a⟧ Bits:30005201 8" Zilog MCZ/1 Floppy CR80FD_0027 ( TC 500 SEC. PROTOCOL BACK UP! (V2) BB SEC 821119 NCJ ) └─ ⟦this⟧ »OPESYS.S« └─⟦f2a3f19b6⟧ Bits:30005203 8" Zilog MCZ/1 Floppy CR80FD_0030 ( BB LTU TEST BACK UP! BB VD1 821220 ) └─ ⟦this⟧ »OPESYS.S«
*P 42 *I CONSTANT SAVE MACRO *M OFF DI ; DISABLE INTERRUPT 04 LD DE,(SYSRAM+0E8H); GET EXECUTING PROCESS 20 LD HL,06H ; DESCRIPTION ADDRESS 10 ADD HL,DE ; CALCULATE STATUS BYTE ADDRESS 11 LD (SYSRAM+0E6H),SP; STATUS BYTE 20 LD BC,(SYSRAM+0E6H); GET STACK POINTER VALUE 20 LD (HL),C ; DESCRIPTION 07 INC HL ; 06 LD (HL),B ; 07 LD SP,INISP ;LOAD STACK POINTER WITH ADDRESS OF 10 EI ;SYSTEM STACK AND ENABLE INTERRUPT 04 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; NUMBER OF T-CYCLES USED BY SAVE: 119 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*M ON ENDM *E PRICO MACRO #COA,#P *M OFF ;THE DUTY OF PRICO IS TO CALCULATE ;THE PRIORITY OF THE PROCESS WHICH ;HAS TO BE STORED IN AN ACTIVE QUEUE, ;AND CALCULATE THE ADDRESS OF THE QUEUE ;HEAD.THE PARAMETER OF PRICO 'COA' CONTENT ;INFORMATION OF THE PROCESS DESCRIPTIONS ;ADDRESS.IF 'COA' IS OMITTED (#P<>M) THE ;ADDRESS OF THE PROCESS DESCRIPTION HAS TO ;BE PLACED IN REGISTER DE BEFORE PRICO IS ;CALLED. ; ;ENTRY POINT: ADDRESS OF PROCESS DESCRIPTION. ; ;EXIT POINT: ADDRESS OF QUEUE HEAD WHERE THE ; PROCESS HAS TO BE STORED PLACED ; IN REGISTER HL. COND '#P'.EQ.'M' LD DE,(#COA) ENDC LD HL,05 ADD HL,DE LD A,(HL) AND 07H RLA RLA RLA LD HL,SYSRAM LD BC,00H LD C,A ADD HL,BC *M ON ENDM *E GLOBAL SRELEASE ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;SRELEASE IS THE SUBPROCESS OF RELEASE ;WHICH RELEASE THE EXECUTING PROCESS ;AND HAND OVER THE CPU TO THE EXTENDED ;SCHEDULER. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< SRELEA SAVE ;MACRO CALL OF SAVE 145 / 149 PASAK LD HL,05H ;IF PROCESS PASSIVE ADD HL,DE ; 11 LD A,(HL) ; 07 RLA ; 04 JR C,ACT ;THEN DO 07 / 12 LD HL,SYSRAM+08*08H; TRANSFER PROCESS DESCRIPTOR 10 DI ; 04 CALL SUBENQ ; TO PASSIVE QUEUE 157 EI ; 04 JP EXSCHED ; CALL EXTENDED SCHEDULER 10 ; END ;ELSE DO ACT PRICO D,S ; CALCULATE PRIORITY OF PROCESS DI ; 04 CALL SUBENQ ; TRANSFER PROCESS DESCRIPTOR 157 EI ; 04 ; TO ACTIVE QUEUE JP EXSCHED ; CALL EXTENDED SCHEDULER 10 ; END *E ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; ; SUBROUTINE MODULE FOR SIGNAL AND WAIT ; ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< GLOBAL WAI,SIG ;''''''INISP USED BY SAVE''''''; WAI SAVE ;MACRO CALL OF SAVE 119 LD HL,(SYSRAM+0E4H) ;IF SEMAPHORE VALUE = 0 16 LD A,(HL) ;THEN TRANSFERS PROCESS DESCRIP 07 CP 0H ;TOR TO SEMAPHORE QUEUE 07 JP NZ,WAI1 ; 10 DI ; 04 CALL SUBENQ ; 157 EI ; 04 JP EXSCHED ;AND CALL EXTENDED SCHEDULER 10 WAI1 DEC A ;ELSE DO 04 LD (HL),A ; DECREMENT SEMAPHORE 07 JP PASAK ; VALUE AND CALL PASAK 10 ; END *E SIG DI ;DISABLE INTERRUPT 04 PUSH HL ;SAVE QUEUE HEAD ADDRESS 11 LD A,(HL) ;IF SEMAPHORE VALUE = 00H 07 CP 00H ; 07 JP NZ,SIG1 ;THEN DO 10 LD (HL),01H ; SET SEMAPHORE VALUE=01H 07 INC HL ; IF NUMBER OF ELEMENT=00 06 LD A,(HL) ; 07 DEC HL ; 06 CP 00H ; 07 JP NZ,SIG1 ; THEN RETURN 10 POP HL ; 10 RET ; END 14 SIG1 CALL SUBDEQ ;IF NO ELEMENT IN QUEUE 130 JP C,SIG2 ;THEN DO 10 POP HL ; RESTORE QUEUE HEAD 10 ; ADDRESS RET ; RETURN 14 ; END ;ELSE DO SIG2 PRICO D,S ; CALCULATE PRIORITY CALL SUBENQ ; TRANSFER ELEMENT TO 157 POP HL ; ACTIVE QUEUE 10 LD (HL),00H ; SET SEMAPHORE VALUE=00 07 RET ; END 14 ;RETURN *E GLOBAL RECI,SUBSEN,MESADD EXTERNAL SYSRAM RECI SAVE ;MACRO CALL OF SAVE 145 / 149 LD HL,(SYSRAM+0E2H); 16 LD A,(HL) ;IF SEMAPHORE VALUE <> 01 07 CP 01H ; 07 JP Z,RECI1 ;THEN DO 10 LD A,-1H ; SEMAPHORE VALUE = -01H 07 LD (HL),A ; 07 DI ; 04 CALL SUBENQ ; TRANSFER PROCESS DESCRIPTOR 157 EI ; TO SEMAPHORE QUEUE 04 JP EXSCHED ; CALL EXTENDED SCHEDULER 10 ; END ;ELSE DO RECI1 PUSH DE ; TEMPORARY SAVING OF PROCESS 11 DI ; DESCRIPTOR ADDRESS 04 CALL SUBDEQ ; GET MESSAGE BUFFER ADDRESS 130 EI ; FROM SEMAPHORE QUEUE 04 LD HL,(SYSRAM+0E2H); GET ADDRESS OF SEMAPHORE QUEUE 16 INC HL ; IF NUMBER OF ELEMENT IN SEMA- 06 LD A,00H ; PHORE QUEUE = 00H 07 CP (HL) ; 07 JR NZ,RECI2 ; THEN DO 07 / 12 DEC HL ; SEMAPHORE VALUE = 00H 06 LD (HL),00H ; END 10 ; ELSE DO RECI2 POP BC ; RESTORE PROCESS DE- 10 ; SCRIPTOR ADDRESS LD HL,03H ; TRANSFER MESSAGE BUFFER 10 ADD HL,BC ; ADDRESS TO PROCESS DE- 11 LD (HL),E ; SCRIPTOR 07 INC HL ; 06 LD (HL),D ; 07 INC HL ; SET BUFFER VALID BIT 06 SET 4,(HL) ; IN STATUS BYTE 15 LD D,B ; 04 LD E,C ; 04 PRICO D,S ; CALCULATE PRIORITY ; OF PROCESS DESCRIPTOR DI ; 04 CALL SUBENQ ; TRANSFER PROCESS DE- 157 EI ; SCRIPTOR TO ACTIVE 04 ; QUEUE JP EXSCHED ; CALL EXTENDED SCHEDULER 10 ; END ; END *E SUBSEN DI ; 04 LD A,(HL) ;IF SEMAPHORE VALUE <> 00H 07 CP 00H ; 07 JP Z,SUB1 ;THEN DO 10 CP 01H ; IF SEMAPHORE VALUE <> 01H 07 JP Z,SUB2 ; THEN DO 10 PUSH HL ; TEMPORARY SAVING OF 11 ; SEMAPHORE QUEUE HEAD ; ADDRESS PUSH DE ; TEMPORARY SAVING OF 11 ; MESSAGE BUFFER ADDRESS 04 CALL SUBDEQ ; GET ADDRESS OF PROCESS 130 ; DESCRIPTOR 04 LD HL,03H ; 10 ADD HL,DE ; 11 POP BC ; RESTORE MESSAGE BUFFER 10 LD (HL),C ; ADDRESS 07 INC HL ; TRANSFER MESSAGE BUFFER 06 LD (HL),B ; ADDRESS TO PROCESS 07 ; DESCRIPTOR POP HL ; RESTORE SEMAPHORE QUEUE 10 ; HEAD ADDRESS INC HL ; IF NUMBER OF ELEMENT 06 LD A,(HL) ; IN SEMAPHORE QUEUE = 00 07 CP 00H ; 07 JP NZ,SUB3 ; THEN DO 10 DEC HL ; SEMAPHORE = 00 06 LD (HL),A ; END 07 SUB3 LD HL,05H ; SET BUFFER AVAIBLE BIT 10 ADD HL,DE ; IN STATUS BYTE (BIT 4) 11 SET 4,(HL) ; 15 PRICO D,S ; CALCULATE PRIORITY ; TRANSFER PROCESS DE- 04 CALL SUBENQ ; SCRIPTOR TO ACTIVE 157 ; QUEUE 04 RET ; ;10 ; END ; ELSE DO ; TRANSFER MESSAGE BUFFER 04 SUB2 CALL SUBENQ ; TO SEMAPHORE QUEUE 157 RET ; ;END 10 ; END ;ELSE DO SUB1 INC (HL) ; SEMAPHORE VALUE = 01H 11 ; TRANSFER MESSAGE BUFFER TO 04 CALL SUBENQ ; SEMAPHORE QUEUE 157 RET ; END 10 *E ;************************************************************************** ;* ;* INPUT : HL CONTAINS ADDRESS OF QUEUE 1 ;* ;* DE CONTAINS ADDRESS OF QUEUE 2 ;* ;* OUTPUT: CARRYFLAG = 1 BUFFER HAS BEEN MOVED FROM QUEUE 1 TO QUEUE 2 ;* ;* CARRYFLAG = 0 NO BUFFER HAS BEEN MOVED ;* ;************************************************************************** GLOBAL SUBREC SUBREC LD A,(HL) ;GET SEMAPHORE VALUE CP 01H ;IF SEMAPHORE VALUE = 01 JP NZ,SR2 ; PUSH HL ; PUSH DE ; CALL SUBDEQ ; GET BUFFER FROM SEMAPHORE QUEUE 1 POP HL ; JP NC,SR1 ; CALL SUBENQ ; TRANSFER BUFFER TO QUEUE 2 POP HL ; DEC (HL) ; SET SEMAPHORE = 00 INC HL ; LD (HL),00H ; RESET NUMBER OF ELEMENT RET ;RETURN FROM PROCESS ;ELSE SR1 POP HL ; NO BUFFER HAS BEEN TRANSFERED SR2 AND A ; RESET CARRYFLAG RET ;RETURN FROM PROCESS *E MESADD LD DE,(SYSRAM+0E8H);GET ADDRESS OF PROCESS DESCRIPTOR 20 LD HL,05H ;CALCULATE STATUS BYTE ADDRESS 10 ADD HL,DE ; 11 BIT 4,(HL) ;IF BUFFER VALID BIT = 1 15 JP Z,NOBUF1 ;THEN DO 10 RES 4,(HL) ; RESET BUFFER VALID BIT 15 LD HL,03H ; CALCULATE ADDRESS CONTAINING 10 ADD HL,DE ; RECEIVED BUFFER ADDRESS 11 LD E,(HL) ; GET RECEIVED BUFFER ADDRESS 07 INC HL ; 06 LD D,(HL) ; 07 SCF ; SET CARRY INDICATING BUFFER 04 RET ; AVAIABLE 14 ; END ;ELSE DO NOBUF1 AND A ; RESET CARRY INDICATING BUFFER 04 RET ; NOT AVAIABLE 14 ; END *E GLOBAL EXSCHED EXSCHED EXS LD HL,SYSRAM ;GET ADDRESS OF FIRST PROCESS 10 ; ;QUEUE EXS1 DI ;DISABLE INTERRUPT 04 CALL SUBDEQ ;DO WHILE NO ELEMENT IN PROCESS 130 EI ;QUEUE 04 JR C,EXS2 ; 07 / 12 LD DE,07H ; CALCULATE ADDRESS OF NEXT 10 ADD HL,DE ; PROCESS QUEUE 11 PUSH HL ; SAVE QUEUE HEAD ADDRESS 11 LD BC,SYSRAM+08*08H ; 10 AND A ; IF ALL PROCESS QUEUES 04 SBC HL,BC ; 15 POP HL ; (RESTORE QUEUE HEAD ADDRESS 10 JP NZ,EXS1 ; INVESTIGATED THEN RESTART 10 JP EXSCHED ;END 10 EXS2 LD HL,05H ;IF PROCESS ACTIVE 10 ADD HL,DE ; 11 BIT 7,(HL) ; 12 JR Z,PASI ;THEN DO 07 / 12 LD (SYSRAM+0E8H),DE ; SAVE PROCESS DESCRIPTOR 20 INC HL ; ADDRESS 06 LD E,(HL) ; GET STACK POINTER 07 INC HL ; VALUE 06 LD D,(HL) ; 07 EX DE,HL ; 04 DI ; DISABLE INTERUPT 04 LD SP,HL ; LOAD STACK POINTER 06 EX DE,HL ; WITH NEW VALUE 04 DEC HL ; CALCULATE STATUS BYTE 06 DEC HL ; ADDRESS 06 BIT 5,(HL) ; IF INTERRUPT STATUS = 1 12 JR Z,DISA ; THEN ENABLE INTERRUPT 07 / 12 EI ; ELSE DISABLE INTERRUPT 04 DISA RET ; RETURN 14 ; END ;ELSE DO PASI LD HL,SYSRAM+08*08H ; TRANSFERS PROCESS DE- 10 DI ; 04 CALL SUBENQ ; SCRIPTIOR TO PASSIVE 157 EI ; 04 JP EXSCHED ; QUEUE,RESTART 10 ; END *E GLOBAL SUBENQ,SUBDEQ SUBDEQ INC HL ;1 DEC (HL) ;1 DECREMENT NUMBER OF ELEMENT SCF ;2 SET QUEUE NOT EMPTY FLAG (CARRY=1) JP M,DEQ1 ;3 IF NUMBER OF ELEMENT > 0 INC HL ;3 THEN DO; LD E,(HL) ;3 REMOVE ADDRESS OF FIRST ELEMENT INC HL ;3 TO REGISTER DE LD D,(HL) ;3 EX DE,HL ;3 REMOVE SECOND ELEMENT TO NEW DEC DE ;3 FIRST ELEMENT IN QUEUE LDI ;3 LDD ;3 EX DE,HL ;3 RET ;3 END; DEQ1 CCF ;4 ELSE DO; INC (HL) ;4 SET QUEUE EMPTY FLAG (CARRY=0) ;4 NUMBER OF ELEMENT=0 RET ;4 END; *E SUBENQ INC HL ;1 INCREMENT NUMBER OF ELEMENT LD A,(HL) ;1 INC (HL) ;1 AND A ;1 JR NZ,ENQ1 ;2 IF NUMBER OF ELEMENT WAS = 0 INC HL ;2 THEN DO; LD (HL),E ;3 REMOVE NEW ELEMENT ADDRESS INC HL ;3 IN QUEUE AS FIRST ELEMENT LD (HL),D ;3 AND LAST ELEMENT INC HL ;3 LD (HL),E ;3 INC HL ;3 LD (HL),D ;3 RETURN RET ;3 END; ENQ1 SCF ;4 ELSE DO; INC HL ;4 REMOVE NEW ELEMENT ADDRESS INC HL ;4 TO OLD LAST ELEMENT DESCRIPTION INC HL ;4 LD C,(HL) ;4 INC HL ;4 LD B,(HL) ;4 LD (HL),D ;4 DEC HL ;4 REMOVE NEW ELEMENT ADDRESS LD (HL),E ;4 TO NEW LAST ELEMENT IN QUEUE LD L,C ;4 LD H,B ;4 LD (HL),E ;4 INC HL ;4 LD (HL),D ;4 RETURN RET ;4 END; *E *L ON ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;SUBCREATE: SUBROUTINE MODULE FOR CREATE ;FILE: SUBCRE.SRC ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< GLOBAL SUBCREATE SUBCREATE LD (IX+06H),L ;SAVE STACT POINTER START 19 LD (IX+07H),H ;IN PROCESS DESCRIPTOR 19 LD (IX+08H),E ;SAVE PROCESS START ADDRESS 19 LD (IX+09H),D ;IN PROCESS DESCRIPTOR 19 SET 7,(IX+05H) ;SET PROCESS ACTIVE BIT IN STATUS BYTE 19 RES 5,(IX+05H) ;SET INTERRUPT STATUS : DISABLE 19 RES 4,(IX+05H) ;RESET BUFFER AVAIABLE BIT 19 CP 01H ;IF INTERRUPT PARAMETER = 01H 07 JP NZ,DISCRE ;THEN DO 10 SET 5,(IX+05H) ; SET INTERRUPT STATUS : ENABLE 19 ; END DISCRE LD (HL),E ;LOAD PROCESS STACK WITH 07 INC HL ;PROCESS START ADDRESS 06 LD (HL),D ; 07 PUSH IY ; 15 POP HL ;GET ADDRESS OF FIRST PRIORITY QUEUE 10 LD A,C ; 04 AND A RLA ; 04 RLA ; 04 RLA ;CALCULATE ADDRESS OF ACTUAL PRIORITY 04 LD BC,00H ;QUEUE 10 LD C,A ADD HL,BC ; 11 PUSH IX ;GET PROCESS DESCRIPTOR ADDRESS 15 POP DE ; 14 DI ;TRANSFER PROCESS DESCRIPTOR TO 04 CALL SUBENQ ;PRIORITY QUEUE 157 EI ; 04 RET ;RETURN 14 *E