M@*scS C 3#{k[K!";$%DDiisskk DDeessccrriippttoorr3300 0000MM44бDDiisskk DDeessccrriippttoorr22``0000MM44'']]00--66]]00]]00KKTT]]00xxee]]00hh[[]]00 [[jj]]00 99]]00 ==]]00 ]]00 ]]00]]00]]00⁁]]00Ѱ]]00]]00]]00..EE]]00tt]]00HH'']]00{{]]00kk((]]00XX]]00 JJ]]002" z jZJ:* !"r$%]]00]]00]]00]]00))77]]00||dd]]00OOUU]]00__kk]]00 llZZ]]00 99 ]]00 88]]00 ]]00 ]]00]]00]]00ձ]]00怀]]00]]00]]00uu]]00**DD]]00]]00LL&&]]00\\]]00oo))]]00::zz]]00 X&†^,Ȋd2Ύj8Ԓp> ږvD|J枴P좺V$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN%VNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN+uNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN`NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN,#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNS.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNp!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN'0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNclNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN @cNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN",NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN.ANNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNP]NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN sRNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN5LNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNڇNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN/pNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNʹNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN%rNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN$eNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN*FNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN0=NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN끹U#񅿆[)Ŋa/ˎg5ђm; זsAݚyG㞱M颷S!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNθNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN!sNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN%aNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN+BNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNW/NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNt NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN&4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN!ONNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN-"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNT\NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN wSNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN1MNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNކNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN.qNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNgmNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN DbNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN#-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN/@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN2>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN$RNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN*qNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!W%]+NJc1̎i7Ӓo< ؖtAݚyG㞲NꢸT#NNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNN!ZBMC122SZ80bXROM Z80ZBMR122 Z80 ZBMR122 Z80 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN-ZBMON 122ZBMK310 Z80+pqrZBMC123XZ80stZBMM122 Z80`NNNNNNNNNNNNNNNN B(NNNNNNNNNNNNNNNNNNNNN!ZBMK308 Z80*HBIO308 HEXZBMK309 Z80 !"#$%&ZBMK309 Z80.'()G$xNNNNNNNNNNNNNNNNNbTNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN'9NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN%gNNNNNNNNNNNNNNNNNNNNNNOM # TO EXECUTE ; LD HL,7 ;STACK OFFSET ADD HL,SP LD A,(HL) ;FETCH ROM # TO EXECUTE LD (HL),THIS_ROM ;SET RETURN ROM @NNNNNNNNNNNNNNNNN+hNNNNNNNNNNNNNNNNNNNNN!JR Z,XR_INIT ; ; ELSE TREAT AS FUNCTION ; INC SP ;SCRUB OLD AF INC SP ; DEC A ;BIAS DOWN CALL FUNCH ; ; FUNCdgNNNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNZBMR124 Z80 CLOKROM DEFJZBMM122 Z80ZBMM122 Z80NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNZBMG101 DEFuZBMR124 Z80HBIO307 Z80jZBM-122 DOCyz{|}~CNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN 2NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN&4NNNNNNNNNNNNNNNNNNNNNN# POP HL ; ; EXECUTE THE ROM ; OUT (M2_RSEL),A ; ; THE PC SHOULD BE AT 0F833H AT THIS POINT ; ;++++++++++++++++++NNNNNNNNNNNNNNNNN,wNNNNNNNNNNNNNNNNNNNNNNTION DONE, CLEAN UP ; XR_DONE: PUSH AF ;SAVE RETURN VALUES PUSH HL ; LD HL,6 ;SET RETURN CODE TO 0 (NO FUNCTION) ADTNNNNNNNNNNNNNNNNNa'NNNNNNNNNNNNNNNNNNNNNNZBMM122 Z80 !"#ZBMH122 HDR$ZBMD123 Z80%&'()*2ZBMV122 Z80e+,-./01NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNZBM-122 DOCZBM-122 DOCZBMK307 Z80ZBMK307 Z80TNNNNNNNNNNNNNNNNNN$JNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE ALTERNATE ROM FUNCTION FUNCTION NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ROM EXECUTION RETURN POINT ; ENTRY- (SP)= AF ; (SP+2)= RETURQNNNNNNNNNNNNNNNNN-DNNNNNNNNNNNNNNNNNNNNNND HL,SP LD (HL),0 ; POP HL ;RESTORE RETURN VALUES POP AF JR XROMF ; ; ; NO-FUNCTION RETURN ; XR_RET: POP AF gNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNZBMF101 DEF)345ZBMD122 Z806789:;<=ZBMD122 Z80>?@ABCDEDKBTROM DEFKLNNNNNNNNNNNNNNNN ۿNNNNNNNNNNNNNNNNNNNNNNZBMK307 Z804HBIO308 Z80nZBMG100 DEFZBMD122 Z80 @NNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNrjNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN"TNNNNNNNNNNNNNNNNNNNNNN ; ENTRY- (SP+2)= FUNCTION # {0: NONE, ; 1: INITIALIZE ROM, ; 2..FF: FUNCTION -2} ; (SP+3)= ROM # TO EXECUTE 9NNNNNNNNNNNNNNNN(;NNNNNNNNNNNNNNNNNNNNNNN ADDRESS IN CALLER ; (SP+4)= FUNCTION # ; (SP+5)= RETURN ROM # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++6fNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN RET ; ; ; INIT EXECUTION ; XR_INIT: POP AF CALL ROM_INIT JR XR_DONE ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H'NNNNNNNNNNNNNNNNNˁNNNNNNNNNNNNNNNNNNNNNNZMONROM DEFMZBMV122XZ80eSTUVWXYZBMV122XZ80eZ[\CB2 DEF]{NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNZBMC122 Z80gZBMR123 Z80ZBMD123 Z80ZBMR123 Z80iNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA[NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN#gNNNNNNNNNNNNNNNNNNNNNN; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ IF ($ AND 7FFFH) > 7840H CONMSG **** ROMNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++ ; ; IF FUNCTION == 0 THEN RETURN ; PUSH HL ;SAVE DATA LD HL,6 ;OFFSET TO FUNCTION ADD HL,SP NNNNNNNNNNNNNNNNN/"NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACROS ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@tNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNZBMK309 Z80jkZBMK310 Z80^_`abcdeZBMK310 Z80fghilmnoZBMD122 Z80FGHIvwxNNNNNNNNNNNNNNNNN qNNNNNNNNNNNNNNNNNNNNNNZBMD123 Z80ZBMD123 Z80ZBMK308 Z80ZBMK308 Z80     NNNNNNNNNNNNNNNNNQeNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN$VNNNNNNNNNNNNNNNNNNNNNN XOVER OVERLAP **** ENDIF ORG 0F840H ; XROMF: ; ; SAVE POSSIBLE RETURN VALUES ; PUSH AF PUSH HL ; ; FETCH R5HNNNNNNNNNNNNNNNNN*YNNNNNNNNNNNNNNNNNNNNNN LD A,(HL) POP HL ;RESTORE DATA ; OR A,A ;TEST JR Z,XR_RET ; ; ELSE IF FUNCTION == 1 THEN INITIALIZE ; DEC A 6ANNNNNNNNNNNNNNNNN01NNNNNNNNNNNNNNNNNNNNNN@@@@ ; ; ACCESS RESIDENT ROM ; XRROM MACRO #FUN ; ; USE FUNCTION NO. #FUN ; PUSH HL LD HL,[MR_RNUM SHL 8] + #FtNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺U#񅿆Z(Ċ`.ʎf4ϒk: זr@ܚxF➰~K袶T"NNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0uNNNNNNNNNNNNNNNNNNNNNNUN + 2 EX (SP),HL CALL XROMF INC SP INC SP ENDM ; ; ACCESS DISK ROM ; XKROM MACRO #FUN ; ; USE FUNCTION NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN(SP),HL CALL XROMF INC SP INC SP ENDM NNNNNNNNNNNNNNNNN uNNNNNNNNNNNNNNNNNNNNNNMEMORY BANKS FOR MOVE ; JP BMOVE ;BANKED MEMORY BLOCK MOVE ; JP REST ;(NOT IMPLIMENTED) ;EXECUTE BANK FUNCTION ; JP LOtNNNNNNNNNNNNNNNNUdNNNNNNNNNNNNNNNNNNNNN!************************************** ; ; This Monitor program resides at the top 2k of memory & supports the ;system resou/rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on stacktNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ; 1.11- 27 DEC 87 GRH ; Add bank memoɄNNNNNNNNNNNNNNNNN%WNNNNNNNNNNNNNNNNNNNNNN NOT FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*XNNNNNNNNNNNNNNNNN+XNNNNNNNNNNNNNNNNNNNNNNUS IN A ; JP LO ;SEND CHAR IN C TO SYSTEM LIST DEVICE ; JP CIS ;RETURN SYSTEM CONSOLE INPUT STATUS IN A ; JP GETMEM F NNNNNNNNNNNNNNNNNe&NNNNNNNNNNNNNNNNNNNNNNNO. #FUN ; PUSH HL LD HL,[DK_RNUM SHL 8] + #FUN + 2 - 64 EX (SP),HL CALL XROMF INC SP INC SP ENDM ; ; :\NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNEG EQU BZ_XADR ;MEMORY BANK SELECT REGISTER PORT ADDRESS (BIG Z) SUBTTL JUMP TARGETS FOR MONITOR ENTRY ORG MONROM ;!NNNNNNNNNNNNNNNNNN KNNNNNNNNNNNNNNNNNNNNN!S ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS IN A ; JP REST ;INTERNAL BREAKPOINT ENTRY ; JP GOTOS ;INTERNAL EXECUTE REGISUGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!rces and transfer to additional ROMs residing in the same memory ; area as this ROM. ; *INCLUDE ZBMH122.HDR ;***************?NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; reset. ; 1.7 - 8 FEB 86 GRH NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!ry management routines. ; 1.12 20 JUL 88 GRH ; Add Monitor function call restart. ; 1.20 29 DEC 88 GRH ; Add banked memoNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN!INCLUDE JDDCONT.DEF ;*INCLUDE ZBMFUNS.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCLqrNNNNNNNNNNNNNNNNN,@NNNNNNNNNNNNNNNNNNNNNN;RETURN BANKED MEMORY DATA ; JP PUTMEM ;STORE BANKED MEMORY DATA ; JP BNKSEL ;SELECT MEMORY BANK ; JP XMOVE ;SELECT ;NNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNNACCESS DEBUGGER ROM ; XDROM MACRO #FUN ; ; USE FUNCTION NO. #FUN ; PUSH HL LD HL,[DEB_RNUM SHL 8] + #FUN + 2 - 16 f+dNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; COLD START VECTOR ; JP INIT ;COLD START (RESET) ; JP CI ;RETURN NEXT SYSTEM CONSOLE CHAR IN A ; FUNENT: JP MONFUIrNNNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNNNTERS PROCEDURE (GOTO) ; JP RSTER ;RESTART ERROR ENTRY ; JP PRTS ;DISPLAY BIT7 TERMINATED TEXT ON SYSTEM CONSOLE SU2NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************************************************* ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; Add Double 2NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-boot from reset function. ; 13NNNNNNNNNNNNNNNN!6NNNNNNNNNNNNNNNNNNNNNNry support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; 1.21 27 JAN 89 GRH ; Add new monitor f%rNNNNNNNNNNNNNNNNN'5NNNNNNNNNNNNNNNNNNNNN!UDE JDDCONT.DEF *INCLUDE ZBMFUNS.DEF LIST ON *INCLUDE ZBMG122.DEF ; THIS_ROM EQU MR_RNUM ; ; BANK SELECTION ; BNKRiNNNNNNNNNNNNNNNNN-sNNNNNNNNNNNNNNNNNNNNNNMEMORY BANKS FOR MOVE ; JP BMOVE ;BANKED MEMORY BLOCK MOVE ; JP REST ;(NOT IMPLIMENTED) ;EXECUTE BANK FUNCTION ; JP LOtNNNNNNNNNNNNNNNNNπNNNNNNNNNNNNNNNNNNNNNN EX (SP),HL CALL XROMF INC SP INC SP ENDM ; ; ACCESS CHAR I/O ROM ; XCROM MACRO #FUN ; ; USE FUNCTION NO. #CONNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNC ;EXECUTE MONITOR FUNCTION IN A ; JP CO ;SEND CHAR IN C TO SYSTEM CONSOLE ; JP COS ;RETURN SYSTEM CONSOLE OUTPUT STATGNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL MEMORY MANAGEMENT ROUTINES ;*****************IMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot image, in caseNNNNNNNNNNNNNNNNNEZNNNNNNNNNNNNNNNNNNNNNN.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE definitions. ; Remove initializati=6 NNNNNNNNNNNNNNNN"cNNNNNNNNNNNNNNNNNNNNNNunction routines. ; ; 1.22 11-22-90 GRH ; Move debugger code to separate ROM in order to gain space for I/O ; drivers and_NNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNNEG EQU BZ_XADR ;MEMORY BANK SELECT REGISTER PORT ADDRESS (BIG Z) SUBTTL JUMP TARGETS FOR MONITOR ENTRY ORG MONROM ;!zNNNNNNNNNNNNNNNNN.&NNNNNNNNNNNNNNNNNNNNNNS ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS IN A ; JP REST ;INTERNAL BREAKPOINT ENTRY ; JP GOTOS ;INTERNAL EXECUTE REGISUGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFUN ; PUSH HL LD HL,[CHR_RNUM SHL 8] + #FUN + 2 - 32 EX (SP),HL CALL XROMF INC SP INC SP ENDM ; ; ACCESSXNNNNNNNNNNNNNNNNN ߾NNNNNNNNNNNNNNNNNNNNNNUS IN A ; JP LO ;SEND CHAR IN C TO SYSTEM LIST DEVICE ; JP CIS ;RETURN SYSTEM CONSOLE INPUT STATUS IN A ; JP GETMEM FNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN TITLE M5b Z-80 MONITOR RESIDENT ROM LIST NOCOND ;***************************************************************************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4 - 2 JUN C^NNNNNNNNNNNNNNNNNvkNNNNNNNNNNNNNNNNNNNNN!on of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; 1.9 - 16 AUG 86 GRH ; Fix bug in PRI driver wK"rNNNNNNNNNNNNNNNNN#PNNNNNNNNNNNNNNNNNNNNNN interrupt code for SIO ports. ; Add serial I/O driver. ; Add rom xover function as include file so all modules can utilize itNNNNNNNNNNNNNNNNN):NNNNNNNNNNNNNNNNNNNNNN ; COLD START VECTOR ; JP INIT ;COLD START (RESET) ; JP CI ;RETURN NEXT SYSTEM CONSOLE CHAR IN A ; FUNENT: JP MONFUIsNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNN!TERS PROCEDURE (GOTO) ; JP RSTER ;RESTART ERROR ENTRY ; JP PRTS ;DISPLAY BIT7 TERMINATED TEXT ON SYSTEM CONSOLE SU29NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN MISC. I/O ROM ; XVROM MACRO #FUN ; ; USE FUNCTION NO. #FUN ; PUSH HL LD HL,[CLK_RNUM SHL 8] + #FUN + 2 - 80 EX NNNNNNNNNNNNNNNNN F)NNNNNNNNNNNNNNNNNNNNNN;RETURN BANKED MEMORY DATA ; JP PUTMEM ;STORE BANKED MEMORY DATA ; JP BNKSEL ;SELECT MEMORY BANK ; JP XMOVE ;SELECT ;NNNNNNNNNNNNNNNNNNNfUNNNNNNNNNNNNNNNNNNNNN!* ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983,1990 GRH Enterprises, Cupertino, CA ; ;**************************************~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing the status incorrectly. ; 1.5ixNNNNNNNNNNNNNNNNN#8NNNNNNNNNNNNNNNNNNNNNNhich caused new Oki 93 to be busy. ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be ; QdNNNNNNNNNNNNNNNNN$fNNNNNNNNNNNNNNNNNNNNNN. ; VERSN EQU 122 ;**************************************************************************** FORM FALSE EQU 0 TRUE EQU~NNNNNNNNNNNNNNNNN*iNNNNNNNNNNNNNNNNNNNNNNNC ;EXECUTE MONITOR FUNCTION IN A ; JP CO ;SEND CHAR IN C TO SYSTEM CONSOLE ; JP COS ;RETURN SYSTEM CONSOLE OUTPUT STATGrNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL MEMORY MANAGEMENT ROUTINES ;*****************IMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!Y'†_-Ȋd2͎h6ђn; זsBݚyH㞲N颸T"NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNN*********************************************************** ; ; BANK SELECT PROCEDURE ; NOTE: THIS FUNCTION IS ONLY FOR CP/M ivNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNNVE: ; ; STORE BANK #S ; LD (DBANK),BC ; ; SET BANKS CHANGED FLAG ; LD A,-1 LD (BNKCHG),A ; ; DONE ; RET VNNNNNNNNNNNNNNNNN 4NNNNNNNNNNNNNNNNNNNNNNOVE2: ; ; SAVE CURRENT BANK # ; LD A,(THIS_BNK) LD (CBANK),A ; ; CLEAR INTER-BANK MOVE FLAG FOR NEXT TIME ; XOR `&NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; ; NO INTERRUPTS WHILE MOVING ; DI ; ; TOP OF MOVE LOOP ; BMOVE4: LD A,B ;SELECT SOURCE BANK OUT (BNKREG),A [NNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNND A,E DI ;NO INTERRUPTS OUT (BNKREG),A ; ; FETCH DATA ; LD C,(HL) ; ; RESTORE BANK ; LD A,B OUT (BNKREG),ANNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNN; ; DONE ; POP BC RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++RNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!UNERR: LD A,-1 OR A,A RET ;############################################################################ ; ; MONITORpyNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN+++++ ; ; RETURN VERSION FUNCTION ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++8NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN3.0 COMPATABILITY. ALL OTHER ; ROUTINES SHOULD USE GETMEM, PUTMEM & XROM ROUTINES. ; ENTRY- A= BANK ADDRESS ; ;*************$:NNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEMORY TO MEMORY MOVE FUNCTION ; NOTE:ONNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNNNA,A LD (BNKCHG),A ; ; IF IN SAME BANK THEN USE INTRA_BANK MOVE ON IT ; PUSH HL ;SAVE PTR LD HL,(DBANK) LD A,H CPNNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNN!LD A,(HL) EX AF,AF' ; LD A,C ;SELECT DESTINATION BANK OUT (BNKREG),A EX AF,AF' LD (DE),A ; INC HL ;NEXT BYTE INNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNN ; ; RETURN DATA ; LD A,C ; ; DONE ; POP BC EI RET ;***************************************************** aNNNNNNNNNNNNNNNNN D&NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN! FUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0: NNNNNNNNNNNNNNNNN,KNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN*************************************************************** ; FBSEL: LD A,C ; BNKSEL: ; ; SELECT NEW BANK ; OUTNNNNNNNNNNNNNNNN XNNNNNNNNNNNNNNNNNNNNNN THIS FUNCTION IS NOT CP/M 3.0 COMPATABLE. HL & DE ARE REVERSED ; (Z-80 COMPATABLE) ; ENTRY- HL= SOURCE PTR ; DE= DESTINATI 9NNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNN A,L POP HL ;PTR JP NZ,NTSAME ; ; SELECT BANK OF MOVE ; DI ;NO INTERRUPTS WHILE BANK SWAPPED ; OUT (BNKREG),A ;CRNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNNC DE ; EXX ;CHECK FOR DONE DEC BC LD A,C OR A,B EXX JP NZ,BMOVE4 ; ; DONE ; JP BMOVE3 ;+++++++++++++vNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNN*********************** ; ; STORE DATA INTO BANKED MEMORY PROCEDURE ; ENTRY- HL= OFFSET PTR ; E= BANK # ; C= DATA ; EXIT)NNNNNNNNNNNNNNNN!wNNNNNNNNNNNNNNNNNNNNNN+++++++ ; FUNCH: ;ROM SWAP ENTRY MONFUNC: ;EXTERNAL ENTRY ; ; IF NOT LOCAL FUNCTIONS THEN EXIT ; CP A,MAXFUNS JR NCNNNNNNNNNNNNNNNN'ݱNNNNNNNNNNNNNNNNNNNNNN RETURN MONITOR ROM VERSION DW GETMEM ;1: RETURN BANKED MEMORY DATA DW PUTMEM ;2: STORE DATA INTO BANKED MEMORY DW MFUNENNNNNNNNNNNNNNNNNN-2zNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++ ; ; NOT INTERNAL FUNCTION, CHECK FOR DEBUGGER ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! (BNKREG),A ; ; STORE IN BANK PAGE 0 ; LD (THIS_BNK),A ; ; DONE ; RET ;**************************************\NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNON PTR ; BC= BYTE COUNT ; EXIT - HL & DE= NEXT BYTES TO MOVE PTRS ; A, BC= ? ; ;+++++++++++++++++++++++++++++++++++++++++c'NNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNN!A STILL HAS BANK (BOTH SAME, REMEMBER?) ; LDIR ; ; DONE, RESTORE BANK TO CURRENT BANK WHEN CALLED ; BMOVE3: LD A,(CBŹNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION ; ENTRY- HL= OFFSET PTQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN - A= ? ; ;**************************************************************************** ; PUTMEM: ; ; SAVE REG ; PUSH`[NNNNNNNNNNNNNNNNN""DNNNNNNNNNNNNNNNNNNNNNN,NOT_INT ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTANNNNNNNNNNNNNNNNN(͏NNNNNNNNNNNNNNNNNNNNNNRR ;3: SPARE DW XMOVE ;4: SET BLOCK MOVE BANKS DW BMOVE ;5: BANKED BLOCK MOVE DW MFUNERR ;6: SELECT NEW BUS PROCESSOR oNNNNNNNNNNNNNNNNN.g)NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++ ; NOT_INT: ; ; BIAS DOWN DEBUGGER FUNCTIONS ; SUB A,16 ; ; IF FUN# < START THEN INTERNAL FUNCTIONf NNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN************************************** ; ; SET BANKS FOR A FOLLOWING MOVE CALL (CP/M 3.0 COMPATABLE) ; ENTRY- B= SOURCE BANK NNNNNNNNNNNNNNNN :NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++ ; BMOVE: ; ; IF BANK NOT SELECTED PRIOR TO CALL THEN USE FASTER INTRA-BANK MOVE ; LrNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNNANK) ;RESELECT CURRENT BANK & RETURN OUT (BNKREG),A ; EI ;ALLOW INTERRUPTS NOW RET ; ; ; BANKS NOT THE SAME, DO DINNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNR ; E= BANK # ; EXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETMEM: oNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN BC ; ; SAVE CURRENT BANK TO RETURN TO ; LD A,(THIS_BNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERRUPTS WNNNNNNNNNNNNNNNNN#uNNNNNNNNNNNNNNNNNNNNNNBL ; ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; RESTORE ARGUMENN@NNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN! DW MFUNERR ;7: RETURN CURRENTLY SELECTED BANK IN A DW GOTOS ;8: DEBUGGER EXECUTER DW FBSEL ;9: SELECT NEW BANK ; MAXFYNNNNNNNNNNNNNNNNN/TNNNNNNNNNNNNNNNNNNNNNN RESERVED ERR ; JR C,MFUNERR ; ; ELSE IF FUN# > LAST THEN GO CHECK NEXT GROUP ; CP A,16 JR NC,NOT_DEB ; ; ELSE E,NNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNN! ; C= DESTINATION BANK ; EXIT - A= ? ; ;**************************************************************************** ; XMO9NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNND A,(BNKCHG) OR A,A JP NZ,BMOVE2 ; LDIR ; ; DONE WITH SIMPLE CASE ; RET ; ; ; ELSE USE INTER-BANK MOVE ; BMFNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNSCRETE MOVE ; NTSAME: ; ; SAVE COUNT ; PUSH BC ;SAVE COUNT EXX POP BC EXX ; ; FETCH BANKS ; LD BC,(DBANK)6 pNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; ; SAVE REGISTER ; PUSH BC ; ; SAVE CURRENT BANK FOR RETURN ; LD A,(THIS_BNK) LD B,A ; ; SELECT BANK ; LNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNHILE BANK SWAPPED OUT (BNKREG),A ; ; STORE DATA ; LD (HL),C ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; EI |NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNT & PUT EXECUTION ADDRESS ON STACK ; EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MF,NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++BNNNNNNNNNNNNNNNN0GUNNNNNNNNNNNNNNNNNNNNNNXECUTE DEBUGGER FUNCTION ; ADD A,2 ;BIAS UP PUSH HL LD H,DEB_RNUM LD L,A EX (SP),HL CALL XROMF INC SP INC SP NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁹U#񅿆[)Ŋa/ˎg5Ғn; זr@ۚwDߞ{H䢱MNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNN! RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CHAR FUNCTIONS ; ;++++++++++++++yNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNN CP A,16 JR NC,NOT_DSK ; ; ELSE EXECUTE DISK ROM ; ADD A,2 ;ADD OFFSET ; PUSH HL ;SAVE ARG LD H,DK_RNUM ;SET ROM+'DNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN------------------------- ; ; THIS IS THE COLD START INIT CODE ; ;---------------------------------------------------------->NNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNLL HAS DEFAULT BANK # ; ; INIT ALL BANKS ; LD E,A ;START WITH ALL Z80 BANKS LD HL,THIS_BNK ;POINT TO LOCATION TO STORENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN CALL XROMF POP HL ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; EXECUTE THE DEBUGGER NNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNN ; ; DO AT LAST MINUTE TO MINIMIZE REFRESH REGISTER CHANGE ; LD R,A ;SET R POP AF ;SET AF ; ; RESERVE SPACE FOR A ENNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN! CAN WORK ; PUSH AF LD A,R ;DO REFRESH REGISTER AS SOON AS POSSIBLE LD (LLOC),HL POP HL LD (FLOC),HL ; LD L,A ;RNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN----------------------------- ; RSTER: PUSH AF PUSH HL LD HL,RSTMSG CALL PRTS POP HL POP AF JP REST ;********tavNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DEB: ; ; BIAS DOWN TO CHAR FUNS ; SUB A,16 ; ; NNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNN # LD L,A ;SET FUNCTION # EX (SP),HL CALL XROMF INC SP INC SP ; RET ;++++++++++++++++++++++++++++++++++++++++2<'NNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNN------------------ ; ROM_INIT: ;XROM ENTRY INIT: ;EXTERNAL ENTRY ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PhNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMEM ; INC E ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEN REPEAT CP "?NNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNN! ; MAINLP: LD SP,MONSTK LD HL,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL CALL XROMF POP HL JR MAINLP SUBTT@)NNNNNNNNNNNNNNNNN sNNNNNNNNNNNNNNNNNNNNNNEI INSTRUCTION TO BE PATCHED IN ; DB 0 ;'NOP' OR PLACE FOR 'EI' ; ; RETURN TO EXECUTION ADDRESS ON STACK ; RET ;NNNNNNNNNNNNNNNNN&ٰNNNNNNNNNNNNNNNNNNNNNNEFRESH REGISTER LD A,I LD H,A LD (RLOC),HL ; LD (ELOC),DE LD (CLOC),BC ; ; FETCH RETURN ADDRESS FROM PGM STACK ;#2NNNNNNNNNNNNNNNNN,6{NNNNNNNNNNNNNNNNNNNNNN******************************************************************** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE[NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNIF NOT CHAR FUNCS THEN CHECK NEXT GROUP ; CP A,32 JR NC,NOT_CHR ; ; ELSE EXECUTE CHAR ROM ; ADD A,2 PUSH HL LD LNNNNNNNNNNNNNNNNN hNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTIONS ; ENTRY- D= DRIVER FUNCTION # ; ;++++++++++++++++++W9NNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNNAGE 0 IMAGE ; OUT (M2_CLDRES),A ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DD_FREE ;REMOVE DD WINDOW, IF PRESENT OUT {NNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNNA,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; LD A,IOBYTV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ; SET BANK Sa'NNNNNNNNNNNNNNNNNyNNNNNNNNNNNNNNNNNNNNNNL DEBUGGER SUPPORT ROUTINES ;**************************************************************************** ; ; GOTO STUB ; ;PNNNNNNNNNNNNNNNNN!@'NNNNNNNNNNNNNNNNNNNNNN**************************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENpNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN POP BC ; ; SAVE SP AT BREAKPOINT ; LD (SLOC),SP ; ; BACK UP RETURN ADDRESS TO POINT TO RESTART INSTRUCTION ; DENNNNNNNNNNNNNNNNN-JNNNNNNNNNNNNNNNNNNNNNN. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;*******************@xNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN,A LD H,CHR_RNUM EX (SP),HL CALL XROMF INC SP INC SP RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN ;NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DSK: ; ; BIAS DOWN TO MISC. FUNCTIONS ; SUB A,16 ; ;HNNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNN(DD_PRT3),A OUT (DD_PRT5),A OUT (DD_PRT8),A ; ; SET MEMORY BANK ; LD A,DEFBNK OUT (BNKREG),A ; ; INITIALIZE RESr+NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNTACK ; LD (THIS_STK),SP ; ; SET FUNCTION CALL RESTART ; LD HL,FUNENT LD (MFUNRSV),HL ; ; INIT ROMS (I/O) ; LD NNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN**************************************************************************** ; GOTOS: ; ; SCRUB FUNCTION DATA ON STACK ; -NNNNNNNNNNNNNNNN"tNNNNNNNNNNNNNNNNNNNNNNTS WHENEVER A BREAKPOINT ; RESTART INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE ; MONITOR VARIABLE AREA FORNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNC BC ; ; SET UP LOCAL STACK ; LD SP,MONSTK ;SET THE MONITOR STACK ; ; RETURN TO DEBUGGER ; LD HL,[DEB_RNUM SHL 8] fNNNNNNNNNNNNNNNNN.PNNNNNNNNNNNNNNNNNNNNNN********************************************************* ; PRTS: ; ; DISPLAY CHAR ; LD C,(HL) ;FETCH CHAR RES 7,C :NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++ ; ; DISK DRIVER FUNCTIONS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++vNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN SET ROM # ; ADD A,2 ;ADD OFFSET ; PUSH HL ;SAVE ARG LD H,CLK_RNUM ;SET ROM # LD L,A ;SET FUNCTION # EX (SP),HLNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNN!TART VECTORS IN PAGE 0 ; LD SP,003FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES ; INIT1:dNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHL,[CHR_RNUM SHL 8] + 1 ;CHAR PUSH HL CALL XROMF POP HL ; LD HL,[DEB_RNUM SHL 8] + 1 ;DEBUGGER PUSH HL CALL XROMFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN POP HL ;RET ADDR TO XROMF POP HL ;CALLER RETURN ADDR POP HL ;XROM ARGUMENT ; ; SET REGISTERS ; LD HL,(RLOC) ;L= -9NNNNNNNNNNNNNNNN#&ENNNNNNNNNNNNNNNNNNNNNN LATER ACCESS AND USE BY THE GOTO & THE EXAMINE ; REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF RESTDNNNNNNNNNNNNNNNNN)ɎNNNNNNNNNNNNNNNNNNNNNN+ 4 PUSH HL CALL XROMF POP HL JP MAINLP SUBTTL SUBROUTINES & FUNCTIONS ;-------------------------------------------BNNNNNNNNNNNNNNNN/c(NNNNNNNNNNNNNNNNNNNNN!;MAKE 7-BIT PUSH HL ;SAVE PTR CALL CO ;DISPLAY CHAR POP HL ;RESTORE PTR ; ; IF CHAR < 128 THEN REPEAT ; BIT 7,(HLNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNN+++++ ; NOT_CHR: ; ; BIAS DOWN TO DISK FUNCTIONS ; SUB A,32 ; ; IF NOT DISK FUNCTIONS THEN GO CHECK NEXT GROUP ; sNNNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNNN CALL XROMF INC SP INC SP ; RET SUBTTL INITIALIZATION CODE ;---------------------------------------------------GNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! PUSH DE PUSH HL DJNZ INIT1 ; ; SET STACK ; LD SP,MONSTK ; ; SET MEMORY BANK CONSTANT ; LD (THIS_BNK),A ;A STI NNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN POP HL ; LD HL,[DK_RNUM SHL 8] + 1 ;DISK PUSH HL CALL XROMF POP HL ; LD HL,[CLK_RNUM SHL 8] + 1 ;MISC PUSH HLCNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNN!R, H= I LD A,H ;SET I REG. LD I,A ; LD A,L ;SAVE R REG ; LD HL,(FLOC) ;FETCH AF PUSH HL ; LD HL,(LLOC) ;SET HL i|NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN. ; ;**************************************************************************** ; REST: ; ; SAVE 8080 REGS FIRST SO WE9NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN--------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;-----------------------------------------------K NNNNNNNNNNNNNNNN0peNNNNNNNNNNNNNNNNNNNNNN) INC HL ;NEXT CHAR JR Z,PRTS ; ; ELSE DONE ; RET SUBTTL EXTERNAL NON-FUNCTION CONSOLE I/O ;+++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN W&†]+Ȋe2Ўl:֒sAޖzG䚲O랹T"𢾣[)NNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN SYSTEM CONSOLE OUTPUT STATUS FUNCTION ; EXIT - A= 0: BNNNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++ ; CIS: XCROM MF_CIS ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++(NNNNNNNNNNNNNNNN eNNNNNNNNNNNNNNNNNNNNNNT STATUS FUNCTION ; EXIT - A= 0: BUSY, FFH: READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNN!************************************** ; ; This Monitor program resides at the top 2k of memory & supports the ;system resou/NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on staHBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ; 1.11- 27 DEC 87 GRH ; Add bank megNNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNnge bank port definition for SSM CB2 cpu. ; Add THIS_STK init for rom bank. ; VERSN EQU 124 ; ;****************************NNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!DEF ;GLOBAL DEFS LIST ON ; THIS_ROM EQU MR_RNUM ; ; BANK SELECTION ; BNKREG EQU BNKPORT ;MEMORY BANK SELECT REG\NNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNNNUSY, FFH: READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; COS: XCROM MF_COS ; ; NNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NEXT SYSTEM CONSOLE INPUT CHAR FUNCTION ; EXIT - A= CHAR (CTRL-Z: EOF) ;NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN++++ ; LOS: XCROM MF_LOS ; ; DONE ; RET SUBTTL MESSAGES RSTMSG: DM CR,LF,'RST ERR ' LOGMSG: DB CR,LF,'65K BAN[NNNNNNNNNNNNNNNNNNZNNNNNNNNNNNNNNNNNNNNNNrces and transfer to additional ROMs residing in the same memory ; area as this ROM. ; *INCLUDE B:ZBMH122.HDR ;*************NNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNNck. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; reset. ; 1.7 - 8 FEB 86 GRH3NNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNN!mory management routines. ; 1.12 20 JUL 88 GRH ; Add Monitor function call restart. ; 1.20 29 DEC 88 GRH ; Add banked meNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN************************************************ FORM FALSE EQU 0 TRUE EQU NOT FALSE ; ; INCLUDE SYSTEM DEFINITION F!NNNNNNNNNNNNNNNN,PfNNNNNNNNNNNNNNNNNNNNNNISTER PORT ADDRESS SUBTTL JUMP TARGETS FOR MONITOR ENTRY ORG MONROM ; ; COLD START VECTOR ; JP INIT ;COLD START NNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN DONE ; RET ;**************************************************************************** ; ; SEND CHAR TO SYSTEM CONDNNNNNNNNNNNNNNNNN uNNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: XCROM MF_CI ; ; DONE ; RET kNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKED ZMON V. ' PVERS VERSN DM CR,LF END HNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNN!*************************************************************** ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; Add DoubltjINNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNN ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-boot from reset function. ;iNNNNNNNNNNNNNNNNN!&:NNNNNNNNNNNNNNNNNNNNNNmory support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; 1.21 27 JAN 89 GRH ; Add new monitorSNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNILES ; ; NOTE: INCLUDE ONE OF THE FOLLOWING CPU FILES: ; ; BIGZ.DEF : JADE 'BIG Z' Z80 ; > CB2.DEF : SOLID STATE ԛRNNNNNNNNNNNNNNNN-cWNNNNNNNNNNNNNNNNNNNNNN(RESET) ; JP CI ;RETURN NEXT SYSTEM CONSOLE CHAR IN A ; FUNENT: JP MONFUNC ;EXECUTE MONITOR FUNCTION IN A ; JP CO ;SE~NNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNSOLE OUTPUT PROCEDURE ; ENTRY- C= CHAR ; ;**************************************************************************** ; CONNNNNNNNNNNNNNNNN &NNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; SEND CHAR TO LIST DEVICE OUTPUT PROCEDURE l^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN WITHOUT INTERRUPT OUT (C),A LD A,DD_MB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; ; FETCH FDC ADDRESS ; PNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNe D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot image, in caNNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNN 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE definitions. ; Remove initializaNNNNNNNNNNNNNNNNN"siNNNNNNNNNNNNNNNNNNNNN! function routines. ; ; 1.22 11-22-90 GRH ; Move debugger code to separate ROM in order to gain space for I/O ; drivers ahy9NNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNN!MUSIC 'CB2' Z80 ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCL NNNNNNNNNNNNNNNNN.6NNNNNNNNNNNNNNNNNNNNN!ND CHAR IN C TO SYSTEM CONSOLE ; JP COS ;RETURN SYSTEM CONSOLE OUTPUT STATUS IN A ; JP LO ;SEND CHAR IN C TO SYSTEM LISTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN: XCROM MF_CO ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RֵNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!; ENTRY- C= CHAR ; ;**************************************************************************** ; LO: XCROM MF_LO ; ; eNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN TITLE M5b Z-80 MONITOR RESIDENT ROM LIST NOCOND ;***************************************************************************NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNse logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4 - 2 JU= NNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNNtion of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; 1.9 - 16 AUG 86 GRH ; Fix bug in PRI driverrNNNNNNNNNNNNNNNN#@XNNNNNNNNNNNNNNNNNNNNNNnd interrupt code for SIO ports. ; Add serial I/O driver. ; Add rom xover function as include file so all modules can utilize 7NNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNUDE B:ZBMG101.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB ;VERSION # EXTRACTION *INCLUDE MONBOARD.DEF ;MONITOR II BOARD *INNNNNNNNNNNNNNNNNN/5NNNNNNNNNNNNNNNNNNNNNN DEVICE ; JP CIS ;RETURN SYSTEM CONSOLE INPUT STATUS IN A ; JP GETMEM ;RETURN BANKED MEMORY DATA ; JP PUTMEM ;STORE NNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNETURN SYSTEM CONSOLE INPUT STATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;+++++++++++++++++++++++++++++++++++++.NNNNNNNNNNNNNNNNN VNNNNNNNNNNNNNNNNNNNNNN DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE OUTPUsGNNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNN* ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983,1990 GRH Enterprises, Cupertino, CA ; ;**************************************NNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing the status incorrectly. ; 1HNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN which caused new Oki 93 to be busy. ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be NNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!it. ; ; 1.23 2-21-91 GRH ; Add function #7, return current bank #. Remove reading THIS_BNK. ; ; 1.24 8-13-91 GRH ; ChabNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNCLUDE CB2.DEF ;CPU *INCLUDE JDDCONT.DEF ;JADE CONTROLLER *INCLUDE B:ZBMF101.DEF ;MONITOR FUNCTIONS *INCLUDE B:ZBMG101.\NNNNNNNNNNNNNNNNN0xNNNNNNNNNNNNNNNNNNNNN!BANKED MEMORY DATA ; JP BNKSEL ;SELECT MEMORY BANK ; JP XMOVE ;SELECT MEMORY BANKS FOR MOVE ; JP BMOVE ;BANKED MEMORviNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN끸S!Z(Ê_-Ɏd2ϒj9Ӗn< ךq?ܞxG㢱NNNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN SUBTTL EXTERNAL DEFINITIONS FOR CLOCK ROM ;**************************************************************************** ; ;+CNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNN ENTRY POINTS ; ;============================================================================ STRUCT 0F800H ;START OF ROM GBNNNNNNNNNNNNNNNN RNNNNNNNNNNNNNNNNNNNNNN1 ;READ CLOCK DATA INTO BUFFER ; ENTRY- DE= PTR TO 13 BYTE BUFFER TO PUT DATA ; CLK_F2 EQU 2 ;SET CLOCK FROM DATA BUFFERgNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNN************************* ; ; This Monitor program resides at the top 2k of memory & supports the ;system resources and tran@ NNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNput command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add coNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN Change restart error to vector to breakpoint after message. ; ; 1.11- 27 DEC 87 GRH ; Add bank memory management routines.NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE ZMONROM.DEF ;*INCLUDE DKBTROM.DEF ;*INCLUDE CLOKΰNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN;BREAKPOINT RESTART # BP_RSTV EQU BP_RST ;BREAKPOINT RESTART VECTOR LOCATION BP_RSTI EQU 0C7H + BP_RSTV ;BREAKPOINT INSTRUCTIsiNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNN THIS INCLUDE FILE DEFINES THE EXTERNAL I/O FOR THE CLOCK/CALENDAR ; ROM. ; ;***********************************************NNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNNCLK_RDB DS 3 ;READ CLOCK DATA INTO BUFFER FUNCTION ; ENTRY- BC= PTR TO 13 BYTE BUFFER TO PLACE DATA ; CLK_WRB DS 3 ;SET \NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; ENTRY- DE= PTR TO 13 BYTE BUFFER TO SET CLOCK FROM ; CLK_F3 EQU 3 ;RETURN CLOCK CALENDAR DATA CLK_F4 EQU 4 ;RETURN CG|NNNNNNNNNNNNNNNNjNNNNNNNNNNNNNNNNNNNNNNsfer to additional ROMs residing in the same memory ; area as this ROM. ; ;**************************************************RNNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNNde to disable all Jade controllers from 40H to 43H after ; reset. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up rBcNNNNNNNNNNNNNNNN ";NNNNNNNNNNNNNNNNNNNNNN ; ; 1.12 20 JUL 88 GRH ; Add Monitor function call restart. ; ; 1.20 29 DEC 88 GRH ; Add banked memory support: ; kHNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNROM.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE PRI.DEF ; LIST OF!NNNNNNNNNNNNNNNNN,gVNNNNNNNNNNNNNNNNNNNNNNON ; ; MONITOR FUNCTION CALL ; MFUNRST EQU 20H ;FUNCTION RESTART VECTOR # MFUNRSV EQU MFUNRST ;FUNCTION RESTART VECTOqNNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNN***************************** ; ; REVISION HISTORY: ; ; 1.0 6 JUL 88 GRH ; First cut. ; ; 1.1 26 SEP 88 GRH ; Change p ; ARG :: 0..FNNNNNNNNNNNNNNNNN݊NNNNNNNNNNNNNNNNNNNNNN7 ;MASK OF EXTRANEOUS BITS & CLEAR ERROR FLAG CALL SWPROM ; LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXECNNNNNNNNNNNNNNNNN12NNNNNNNNNNNNNNNNNNNNN!EPEAT ; CALL HILO JR NC,FIO ; ; ELSE DONE ; JR WINIT ;---------------------------------------------------------nNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN EX (SP),HL ; ; FETCH SRC2 DATA ; LD DE,(A3_BNK) CALL GETMEM LD C,A ; ; FETCH SRC1 DATA ; EX (SP),HL LD DE,NNNNNNNNNNNNNNNNN cNNNNNNNNNNNNNNNNNNNNNN; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE STPNNNNNNNNNNNNNNNNNN&RNNNNNNNNNNNNNNNNNNNNNNSH HL ; ; TOP OF HEX DISPLAY LOOP ; DIS2: ; ; DISPLAY MEMORY DATA IN HEX ; PUSH DE ;FETCH BANK # IN E LD DE,(A1_`NNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN!DE ; AND A,7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP A,' ' JR C,DIS5 ; CP A,7EH JR C,DIS6 ; DIS5: LD C,'.' ;ELSE7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFSET = INDEX * 2 ; LD E,A LD D,0 LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE ; LD A,(HL) ;FETCH ADDRESS INC4NNNNNNNNNNNNNNNNN DNNNNNNNNNNNNNNNNNNNNN!H (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;-------------------------------------------------------------- NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;---------------------------------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINErrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFEDnNNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNN!(A1_BNK) CALL GETMEM LD B,A ;GET SOURCE 1 DATA ; ; IF SRC1 == SRC2 THEN EXIT ; LD A,C CP A,B ;IF S2=S1 THEN EXIT 5ONNNNNNNNNNNNNNNNN!RNNNNNNNNNNNNNNNNNNNNNNART & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16 BYTES PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACHrNNNNNNNNNNNNNNNNN'aNNNNNNNNNNNNNNNNNNNNNNBNK) CALL GETMEM ;FETCH DATA FROM E:HL TO A CALL HEX1 ;DISPLAY DATA IN A POP DE ; ; IF DONE THEN GO ON TO ASCII ; NNNNNNNNNNNNNNNN-?NNNNNNNNNNNNNNNNNNNNN! OUTPUT '.' ; DIS6: CALL CONOUT ; ; IF DONE THEN ABORT ; CALL HILOX RET C ; ; ELSE IF NOT ON EVEN 16 BYTE BOUNDARNNNNNNNNNNNNNNNNN2ANNNNNNNNNNNNNNNNNNNNNN HL LD H,(HL) LD L,A ; LD B,2 ;PASS IN DEFAULT OF 2 ARGUMENTS TO COMMAND ; JP (HL) ;EXECUTE THE COMMAND ;------vNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNN-------------- BOOTC: ; ; IF NO ARGS THEN USE DEFAULT ; CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JR C,BOOTCD ZNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; STARTNNNNNNNNNNNNNNNNWPNNNNNNNNNNNNNNNNNNNNNNRENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN JR Z,CMPB ; ; ELSE DISPLAY SRC1 & SRC2 DATA ; PUSH AF ;SAVE S2 DATA ; CALL LADRB ;OUTPUT S1BNK:S1ADR S1DTA- LD A NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN! ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;------------------------------------"NNNNNNNNNNNNNNNN(qNNNNNNNNNNNNNNNNNNNNNN CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY ; ; NEXT COLUMN ; CALL BLK ;MAKE COLUMNS ; ; IF NOT ON EVENwnNNNNNNNNNNNNNNNN.lNNNNNNNNNNNNNNNNNNNNNNY THEN REPEAT ; LD A,L AND A,0FH JR NZ,DIS4 ; ; ELSE NEXT LINE ; JR DIS1 ; ; ; PARTIAL HEX LINE, START ASCII }_NNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNN---------------------------------------------------------------------- ; ; PRINT COMMAND ERROR MESSAGE & RETURN TO CLI ; ;--NNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNN!; ; ELSE GET USER ARG ; CALL EXF ;GET USER BOOT # POP BC ; JR BOOTCC ; ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;----------------------------------------------[NNNNNNNNNNNNNNNNdaNNNNNNNNNNNNNNNNNNNNNN CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,B CALL DASH1 ; CALL BLK ;DISPLAY S2BNK:S2ADR S2DTA POP AF EX (SP),HL PUSH AF LD DE,(A3_BNK) CALL LADR CALL B>NNNNNNNNNNNNNNNNN#0NNNNNNNNNNNNNNNNNNNNNN---------------------------------------- DISP: ; ; GET ARGUMENTS ; CALL EXLF ;GET BLOCK LIMITS ; ; TOP OF LINE LOOP*rNNNNNNNNNNNNNNNN)BNNNNNNNNNNNNNNNNNNNNN! 16 BYTE BOUNDARY THEN REPEAT ; LD A,L ;READY FOR NEW LINE? AND A,0FH JR NZ,DIS2 ; ; DONE WITH HEX DISPLAY, DO ASCII\ NNNNNNNNNNNNNNNNN/]NNNNNNNNNNNNNNNNNNNNNNON PROPER COLUMN ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ;------------------------------------=NNNNNNNNNNNNNNNNNT#NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------------------- QPRT: ; ; DISPLAY ERROR PROMPT ; LD HL,QMSG ENNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!R BOOT. ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BlNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!------------------------------ FILL: ; ; GET 3 ARGUMENTS ; CALL EXPR3 ;HL= PTR, DE= LAST ADDR, BC= VALUE ; ; TOP OFNNNNNNNNNNNNNNNNNt_NNNNNNNNNNNNNNNNNNNNNN---------------------------------------------------------------------------- COMP: ; ; GET 3 ARGUMENTS FROM USER ; CALL NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!LK POP AF EX (SP),HL ; CALL HEX1 ;OUTPUT S2DTA ; CMPB: POP BC POP DE ; ; IF SRC == LAST THEN DONE ; CALL HILO@NNNNNNNNNNNNNNNN$4NNNNNNNNNNNNNNNNNNNNNN ; DIS1: ; ; DISPLAY START ADDRESS ; PUSH DE LD DE,(A1_BNK) CALL LADRB POP DE ; ; START DISPLAY ON PROPER COLXNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN! ; DIS3: ; ; RESTORE PTR ; POP HL ; ; POSITION START ON PROPER COLUMN ; LD A,L ;SKIP OVER TO RIGHT SPACE AND NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN---------------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOW5NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺V$\*Ɗc0͎h6ђm;Ֆq> ښvD}K梴ONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTEO6NNNNNNNNNNNNNNNNP"NNNNNNNNNNNNNNNNNNNNNN ; PUSH AF ;PRESET BANK # LD A,(BNKLOC) LD (A1_BNK),A ; CALL EXF POP DE ; LD (PLOC),DE ;PUT ADDR IN PC LOCATION NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN,(A1_BNK) LD (HL),A INC HL ; ; SAVE EXISTING LOCATION DATA IN TABLE ; PUSH HL ;SAVE REGS NEEDED FOR GETMEM & PUTMEM NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNESS ; ; INSERT RESTART BREAKPOINT VECTOR TO RESTORE ROUTINE ; LD HL,BP_RSTV LD DE,(BNKLOC) LD C,0C3H CALL PUTMEM NNNNNNNNNNNNNNNNNp^NNNNNNNNNNNNNNNNNNNNN!; LD HL,(RLOC) LD A,H LD I,A LD A,L ; ; DO AF ; LD HL,(FLOC) PUSH HL LD R,A ;MINIMIZE REFRESH REGISTER CHANGYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!T DATA ; IN E,(C) JP BITS2 ;OUTPUT VALUE ;---------------------------------------------------------------------------zNNNNNNNNNNNNNNNNN%0NNNNNNNNNNNNNNNNNNNNNN--------------------------------------------------------------------- MOVE: ; ; GET ARGS FROM USER ; CALL EXPR3 ;HL= SRNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!Y LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SvNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_NNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN LD A,(A1_BNK) LD (BNKLOC),A ; ; IF LAST CHAR == CR THEN NO MORE ARGS ; LD A,C ;IF LAST = CR THEN EXIT CP A,CR JR{lNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN EX DE,HL ;HL= PTR ; LD E,A ;E= BANK # CALL GETMEM PUSH AF ;SAVE DATA ; ; SET BREAKPOINT TO RESTART INSTRUCTION WNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNINC HL LD C,LOW REST CALL PUTMEM INC HL LD C,HIGH REST CALL PUTMEM ; ; THE FOLLOWING CODE RESTORES THE Z80 REGISTENNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNN!E POP AF ; ; FINALLY RESTORE HL & EXECUTE THE REQUESTED CODE ; LD HL,(LLOC) ; ; RESERVE SPACE FOR A EI INSTRUCTION 0NNNNNNNNNNNNNNNNN SNNNNNNNNNNNNNNNNNNNNNN- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;------------------------------------------------5HNNNNNNNNNNNNNNNNN&eNNNNNNNNNNNNNNNNNNNNNNC, DE= SRC_LAST, BC= DEST ; ; TOP OF MOVE LOOP ; MOV1: ; ; MOVE 1 BYTE OF DATA ; PUSH DE ;SAVE LAST PTR PUSH BC 9qNNNNNNNNNNNNNNNN,>NNNNNNNNNNNNNNNNNNNNNNPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINTNNNNNNNNNNNNNNNNN s-NNNNNNNNNNNNNNNNNNNNNN Z,GO3 ; ; GET & SET UP TO NBKPTS BREAKPOINTS ; GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ; GO1: PUSH BC ;SeNNNNNNNNNNNNNNNNNًNNNNNNNNNNNNNNNNNNNNNNHILE HERE ; PUSH BC ;SAVE LAST CHAR IN C LD C,BP_RSTI CALL PUTMEM POP BC ; POP AF ;RESTORE DATA EX DE,HL ;DE= PcCBNNNNNNNNNNNNNNNN53NNNNNNNNNNNNNNNNNNNNNNRS & EXECUTES THE 'PC' ; ; FIRST RESTORE THE Z80 ALTERNATE REGISTERS ; LD HL,(FPLOC) PUSH HL POP AF ; LD BC,(CPLOC@ NNNNNNNNNNNNNNNNN ; ;--------------------------NNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNN AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;------------------NNNNNNNNNNNNNNNNN &~NNNNNNNNNNNNNNNNNNNNN!AVE BREAKPOINTS REMAINING ; ; GET BREAKPOINT FROM USER ; PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!TR POP HL ;HL= RECORD.DATA PTR ; LD (HL),A ;STORE DATA INTO TABLE INC HL ;NEXT TABLE RECORD ; ; IF NO MORE ARGS THgNNNNNNNNNNNNNNNN``NNNNNNNNNNNNNNNNNNNNNN) LD DE,(EPLOC) LD HL,(LPLOC) EX AF,AF' EXX ; ; NOW DO THE Z80 & 8080 REGISTERS ; LD IY,(YLOC) LD IX,(XLOC) ; kNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN---------------- ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLINNNNNNNNNNNNNNNNN"1NNNNNNNNNNNNNNNNNNNNNN ; ; OUTPUT TO PORT ; OUT (C),E ; ; DONE ; JP WINIT ;--------------------------------------------------------NNNNNNNNNNNNNNNN(FNNNNNNNNNNNNNNNNNNNNNNA IN DEST LD C,A CALL PUTMEM ; EX (SP),HL ;HL= SRC PTR POP BC ;BC= DEST PTR POP DE ;DE= LAST PTR ; ; NEXT, IF wNNNNNNNNNNNNNNNNN.\NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------- SUBS: ; ; GET ADDRESS FROM USER ; CALL EXPR1 ;GET ADDR CALL CRLF 5NNNNNNNNNNNNNNNNN6@NNNNNNNNNNNNNNNNNNNNN!---------------------------------------------------------- GOTO: ; ; IF NO ARGS THEN USE CURRENT REGISTERS ; CALL PCHK 1NNNNNNNNNNNNNNNNNN ONNNNNNNNNNNNNNNNNNNNNNADDR POP HL ;SPTR ; ; IF BREAKPOINT == 0 (NONE) THEN STOP ; LD A,(A1_BNK) ;INSURE 0 WASN'T SPEC'D OR A,D OR A,E NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNEN DONE WITH BREAKPOINTS ; GO2: LD A,C CP A,CR POP BC ;BP COUNT JR Z,GO3 ; ; IF MORE ALLOWED THEN CONTINUE ; DJNd|NNNNNNNNNNNNNNNNNSQNNNNNNNNNNNNNNNNNNNNNN LD DE,(ELOC) LD BC,(CLOC) ; ; DO STACK ; LD SP,(SLOC) ; ; PUSH PC ON STACK FOR RETURN INSTRUCTION TO EXECUTE ; UNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLE DEVICE. ; ; I ; ;---------------------------------------------------------------------------- INPT: ; ; 4CmNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN-------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1S NNNNNNNNNNNNNNNNN)uNNNNNNNNNNNNNNNNNNNNN!SRC <= LAST THEN REPEAT ; CALL HILOXB JR NC,MOV1 ; ; ELSE DONE ; JP WINIT ;------------------------------------NNNNNNNNNNNNNNNNNN/mNNNNNNNNNNNNNNNNNNNNNN;START ON NEW LINE POP HL ; ; TOP OF LOOP ; SUB1: ; ; DISPLAY EXISTING CONTENTS ; LD DE,(A1_BNK) CALL GETMEM NNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNN JR C,GO3 ; ; IF NO GOTO ADDRESS THEN SET BREAKPOINTS ; JR Z,GO0 ; ; FETCH NEW GOTO ADDRESS & PUT INTO 'PC' REGISTER ]NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!JR Z,GO2 ; ; ELSE STORE BREAKPOINT ADDRESS IN TABLE ; LD (HL),E ;SAVE BP ADDR INC HL ; LD (HL),D INC HL ; LD AkNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNZ GO1 ; ; GOT ALL ARGS, EXECTUTE THE GOTO ; GO3: CALL CRLF ;NEW LINE FOR PGM ; POP HL ;GET RID OF WINIT RETURN ADDRzNNNNNNNNNNNNNNNNNCoNNNNNNNNNNNNNNNNNNNNN! LD A,(BNKLOC) CALL BNKSEL ; LD HL,(PLOC) PUSH HL ; ; DO INTERRUPT & REFRESH REGISTERS AS CLOSE TO EXIT AS POSSIBLE NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN GET PORT ARG FROM USER ; CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC ; ; FETCH PORNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!T BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;-------NNNNNNNNNNNNNNNN* NNNNNNNNNNNNNNNNNNNNNN---------------------------------------- ; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMOR NNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNNCALL DASH1 ; ; GET NEW VALUE FROM USER ; CALL PCHK ;GET NEW VALUE ; ; IF NONE THEN RETURN ; JP C,WINIT ;IF CHAR NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!Z(Ć`/ʊg5Ўl:גsAۖwEᚯ~L瞴OꢸU#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN= CR THEN RETURN ; ; IF LAST CHAR == SPACE OR COMMA THEN SKIP STORE ; JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT ; ; BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN JR SUB1 ;---------------------------------------------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFI&NNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNN!,BITS ;LOG ERR IF NOT ; ; RESTORE DATA IN MEMORY ; POP AF ;RESTORE BYTE LD C,A CALL PUTMEM POP DE ; ; IF NOT $NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!EXT ENTRY INC HL ; ; ; CONTINUATION FROM USER INPUT ; ENTRY- A= REGISTER REQUESTED CHAR ; XA: ; ; IF AT END OF TAB6NNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNN!L ;PTR CALL EXF POP HL ;HL= DATA ; ; PREFETCH DATA IN A ; LD A,L ; ; IF BYTE REGISTER THEN GO DO BYTE STORE ; 9NNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNN, RESTORE PTR TO ATTRIBUTES/OFFSET BYTE OF TABLE ; XE: POP HL ; ; IF LAST CHAR == CR THEN DONE ; XF: LD A,C ;IF LAST = {BNNNNNNNNNNNNNNNNN%q"NNNNNNNNNNNNNNNNNNNNN!''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; ; ; DISPLAY ALL REGISTER'S DATA ; XG: LD A,(HL) ;FPNNNNNNNNNNNNNNNNN+R-NNNNNNNNNNNNNNNNNNNNNN----------------------- EXF: ; ; SET UP FOR 1 ARGUMENT ; LD B,1 ; ; INIT BANK PTR ; LD HL,A1_BNK LD (ARGPTR),HLNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNELSE IF LAST CHAR == LINE FEED THEN BACK UP ; CP A,LF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 ; ; ELSE GET & STORE VALUE *NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!ED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION O ~NNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNDONE THEN REPEAT ; CALL HILOX JR NC,MTEST1 ; ; DONE ; JP WINIT ;-----------------------------------------------ܮNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNN!LE THEN DONE ; INC (HL) ;DOES NOT CHANGE IN ROM VERSION RET Z ; ; MAKE USER REQUEST BIT 7 SAME AS TABLE'S ; JP P,XA9NNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNN EX (SP),HL ;HL= ATTRIBUTE PTR BIT 7,(HL) JR Z,XBREG ; ; ELSE IF WORD REGISTER THEN GO DO WORD STORE ; BIT 6,(HL) &NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNCR THEN RETURN CP A,CR RET Z ; ;---------------------------------------------------------------------------- ; ; THIS IS$NNNNNNNNNNNNNNNNN&$qNNNNNNNNNNNNNNNNNNNNNNETCH TABLE ENTRY LD C,A ; ; IF AT END OF TABLE THEN DONE ; INC A ;IF AT END OF TABLE THEN RETURN RET Z ; ; IF BINNNNNNNNNNNNNNNNN,˺NNNNNNNNNNNNNNNNNNNNNN ; ; ACCUMULATOR = 0 ; LD HL,0 ; ; ENTER GETTER WITH CHAR IN A ALREADY ; JR EX1 ;****************************YNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNN ; PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR ; PUSH BC LD C,E LD DE,(A1_BNK) PINNNNNNNNNNNNNNNNN 2NNNNNNNNNNNNNNNNNNNNNNF THE MEMORY'S OPERATIVENESS. ; ; T ; ;-------------------------------------------------------------vNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN----------------------------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTNNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNNB ;SORT OUT BIT 7 OF TABLE OR A,80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND A,7FH ;RESET BIT 7 ; ; USER REQUESTEDENNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNN JR Z,XWREG ; ; ELSE DO INDIRECT BYTE STORE ; EX (SP),HL ;HL= DATA EX DE,HL ;HL= PTR LD DE,(BNKLOC) ;E= PC BANK PNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN THE ACTUAL COMMAND ENTRY POINT ; ;---------------------------------------------------------------------------- XMNE: ; ; NNNNNNNNNNNNNNNNNN'@NNNNNNNNNNNNNNNNNNNNNNT 7 SET THEN DISPLAY NEW LINE ; CALL M,CRLF ;NEW LINE IF BIT 7 SET ; ; DISPLAY REGISTER ; LD C,(HL) PUSH HL CALL ENNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNN!************************************************ ; ; EXPR3 ROUTINE GETS 3 ARGUMENTS FROM USER, DOES A CR-LF & THEN ; LOADS BJNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNCALL PUTMEM ;LOAD VALUE ; POP BC ; ; IF LAST CHAR == CR THEN DONE ; LD A,C ;IF DELIM = CR THEN DONE CP A,CR JP ZSyNNNNNNNNNNNNNNNNN gNNNNNNNNNNNNNNNNNNNNNN--------------- MTEST: ; ; GET ARGS FROM USER ; CALL EXLF ;HL= START, DE= LAST ; ; TOP OF LOOP ; MTEST1: PUSH DNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNN!ERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,HNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN REGISTER SHOULD MATCH NOW ; XAC: ; ; IF CHAR NOT MATCH THEN EXIT ; CP A,(HL) JR NZ,XAA ;NO MATCH, TRY AGAIN ; ; vdNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNUSH BC ;SAVE LAST CHAR LD C,A CALL PUTMEM POP BC JR XE ; ; ; WORD REGISTER WRITE ; XWREG: EX (SP),HL ;HL= DATA ANNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN! START AT BEGINNING OF TABLE ; LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE ; ; IF NO ARGS THEN DISPLAY ALL REGS ; XMNE1: CAL NNNNNNNNNNNNNNNNN(~NNNNNNNNNNNNNNNNNNNNNNCONOUT CALL DASH ; ; DISPLAY REGISTER VALUE ; POP HL CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG SUBTT5sNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNC, DE & HL WITH THE PARAMS. ; ENTRY- B= 2 ; EXIT - HL= ARG1 ; DE= ARG2 ; BC= ARG3 ; ;***********************************}NNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNNN,WINIT ; ; NEXT LOCATION ; SUB2: INC HL ;PTR = PTR + 2 INC HL ; ; PREVIOUS LOCATION ; SUB3: DEC HL ;PTR = PTR - sBNNNNNNNNNNNNNNNNN TNNNNNNNNNNNNNNNNNNNNNNE LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA PUSH AF ;SAVE IT CPL ;INVERT BITS LD C,A CALL PUTMEM ; ; TEST BY XO'NNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNNN,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;-----------------------------dHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN CHARS MATCH, SET UP TO DISPLAY CURRENT DATA ; CALL BLK CALL PRTVAL CALL DASH ; ; GET USER DATA ; CALL PCHK ; ; MNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! EX DE,HL ;DE= DATA, HL= PTR INC HL ;PRTVAL LEFT PTR TO LOW BYTE -1 LD (HL),E INC HL LD (HL),D JR XE ; ; ; BYTNNNNNNNNNNNNNNNN#ۄNNNNNNNNNNNNNNNNNNNNN!L PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL ; ; ELSE IF LAST CHAR == DELIMITER THEN REPEAT FOR ANOTHER REGISTER ; JR Z,NNNNNNNNNNNNNNNN)4ONNNNNNNNNNNNNNNNNNNNNNL PROCEDURES & FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXF FUNCTION READS NNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN***************************************** EXPR3: ; ; BUMP ARG COUNT TO 3 ; INC B ;B HAS 2 ALREADY ; ; GET ARGS ; dNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN1 ; ; IF ON MODULO 8 BOUNDARY, START ON NEW LINE & DISPLAY ADDRESS ; LD A,L AND A,7 CALL Z,LADRB ; ; CONTINUE ; 3NNNNNNNNNNNNNNNN \NNNNNNNNNNNNNNNNNNNNN!RING WITH DATA, RESULT SHOULD BE 0 ; CALL GETMEM XOR A,C ; ; IF NOT 0 THEN DISPLAY DATA ('1' BIT IS ERROR) ; CALL NZmNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!----------------------------------------------- ; ; CHARS NOT MATCH, TRY NEXT TABLE ENTRY ; XAA: INC HL ;SKIP OVER TO NBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN IF USER ENTERED CR THEN DONE ; RET C ; ; IF NO CHANGE THEN EXIT ; JR Z,XF ; ; GET NEW DATA FROM USER ; PUSH HQNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNE REGISTER WRITE ; XBREG: EX (SP),HL ;HL= DATA INC DE ;PRTVAL LEFT PTR TO LOW BYTE -1 LD (DE),A ; ; VALUE STORE DONEP\NNNNNNNNNNNNNNNN$BNNNNNNNNNNNNNNNNNNNNNNXMNE1 ;IF CHAR = ' ' OR ',' THEN IGNORE ; ; ELSE IF USER REQUESTS ALTERNATE REGISTER THEN REPEAT WITH ALT TABLE ; CP A,'NNNNNNNNNNNNNNNNN*aNNNNNNNNNNNNNNNNNNNNNN 1 ARGUMENT. ; ENTRY- A= ARGUMENT 1ST CHAR ; EXIT - STACK= ARGUMENT ; ;-----------------------------------------------------*^NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN CALL EXPR ; ; RETURN VALUES FROM STACK ; POP BC POP DE JP CRLFA ;GO DO CRLF ;*********************************rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺V$[)Ċa/̎h6Ӓn< זsAݚyG䞲N颸T#NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN******************************************* ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EArNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN IF NO ARGUMENTS LEFT THEN DONE ; EXPR1A: DEC B RET Z ; ; ARG = 0 ; EXPR0: LD HL,0 ; ; GET NEXT CHAR FROM USER ;HNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNNA: EX (SP),HL PUSH HL ; ; BUMP TO NEXT ARG PAGE ; LD HL,(ARGPTR) INC HL LD (ARGPTR),HL ; ; IF LAST CHAR NOT CR NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNN! TRPL2: LD B,A INC B ;CONVERT N-1 TO N ; TRPL1: PUSH BC CALL BLK ;DO SPACING POP BC DJNZ TRPL1 ; ; DONE ; RENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTRY- E= BINARY DATA ; EXIT - B= ? ; ;**************************************************************************** BITS2: ;NNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNN*************************************************** PRTVAL: ; ; FETCH ADDRESS OFFSET OF REGISTER DATA ; INC HL ;SKIP RE3iNNNNNNNNNNNNNNNNN%FNNNNNNNNNNNNNNNNNNNNNN CALL GETMEM EX DE,HL ;DE= PTR ; POP HL ; ; THIS IS TRICK, DECRIMENTS TO BYTE VALUE AND JUMPS AT SAME TIME ; DJNZIWNNNNNNNNNNNNNNNNN+eNNNNNNNNNNNNNNNNNNNNNN '-' ; ; GET CHAR FROM USER ; ECHO: CALL CONI ; ; ECHO TO USER ; PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD 8 NNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNN!CH ONE. A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARA7P\NNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNN EX0: CALL ECHO ;GET NEXT # ; ; CONVERT CHAR TO BINARY ; EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE ; ; IF NOT NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTHEN GET NEXT ARGUMENT ; LD A,C CALL P2C JR NC,EX3 ; ; ELSE IF COUNT NOT EXHUSTED THEN ERROR ; DJNZ EX2B ; ; E|NNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNN!T ;**************************************************************************** ; ; BITS PROCEDURE DISPLAYS ADDRESS AND D\NNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNN ; BIT COUNT = 8 ; LD B,8 ;BIT COUNT ; ; TOP OF OUTPUT LOOP ; BITS1: PUSH BC ; LD A,E ;USE MS BIT RLCA LD E WNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNGISTER CHAR LD A,(HL) ;GET OFFSET & ATTRIBUTES ; AND A,3FH ;ISOLATE OFFSET LD DE,RLOC ADD A,E ;BUILD ADDR OF REG CON`NNNNNNNNNNNNNNNNNN&ANNNNNNNNNNNNNNNNNNNNNN PV2 ;ALLWAYS JUMP ; ; ; FETCH DATA ; PV1: LD A,(DE) ;GET REG CONTENTS ; ; DISPLAY DATA ; PV2: CALL HEX1 ;OUTPUTONNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNA,C ;RESTORE CHAR IN A POP BC ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++`NNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNMETER ONLY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNUMBER THEN EXIT LOOP ; JR C,EX2 ; ; ELSE ADD TO ARGUMENT ; ADD HL,HL ;ARG *= 16 ADD HL,HL ADD HL,HL ADD HL,HL [aNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNLSE RETURN ; RET ; ; ; RELATIVE JUMP EXTENSION ; EX2B: JP QPRT ;*************************************************{NNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNATA AS BINARY BITS ; ENTRY- HL= ADDRESS ; A= BINARY DATA ; EXIT - A= ? ; ;************************************************GNNNNNNNNNNNNNNNN`NNNNNNNNNNNNNNNNNNNNNN,A ; ; CONVERT TO ASCII ; LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA ; ; DISPLAY ASCII DATA ; LD C,A PUSH DE CALL hNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNTENTS LD E,A LD A,0 ADC A,D LD D,A ; ; IF BIT 7 == 0 THEN SINGLE REGISTER (BYTE) VALUE ; LD A,(HL) ;NOW FIND ATT NNNNNNNNNNNNNNNNN' pNNNNNNNNNNNNNNNNNNNNNN VALUE ; ; NOW DO LOW BYTE IF NEEDED ; DEC DE ;MEM PTR ; ; IF --BYTE_COUNT > 0 THEN REPEAT FOR LOW BYTE ; DJNZ PV\NNNNNNNNNNNNNNNN-ϻNNNNNNNNNNNNNNNNNNNNNN+++++++++ ; ; HILO FUNCTION INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRPNNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNN!CAUSE A WARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;*****************************>NNNNNNNNNNNNNNNNN PNNNNNNNNNNNNNNNNNNNNNN OR A,L ;ADD IN NEW DIGIT LD L,A ; ; GET NEXT DIGIT ; JR EX0 ;GET NEXT ; ; ; NOT HEX NUMBER ENTERED, IF COLON TNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNN!*************************** ; ; OUTPUT 3 SPACES EACH COLUMN TO POSITION ON COLUMN PROCEDURE ; ENTRY- A= NUMBER OF COLUMNS - 1%aNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!**************************** BITS ; ; SAVE REG ; PUSH DE ; ; SAVE DATA ; PUSH AF ; ; DISPLAY ADDRESS ; CALzYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCONOUT POP DE ; ; IF NOT DONE THEN REPEAT ; POP BC DJNZ BITS1 ; ; DONE ; RET ;***************************ngNNNNNNNNNNNNNNNNNN"߅NNNNNNNNNNNNNNNNNNNNNNRIBUTES LD B,1 ;ASSUME BYTE VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT ; ; ELSE WORD VALUE ; INC B ; ; IF 0NNNNNNNNNNNNNNNNN(0NNNNNNNNNNNNNNNNNNNNNNN1 ; ; ELSE DONE ; RET ;**************************************************************************** ; ; ECHO ROUTI%9NNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ENTRY- HL= PTR NNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN*********************************************** ; ; ; EXPR: LD HL,A1_BNK LD (ARGPTR),HL ; JR EXPR0 ; ; ; ; EXPR1: 7NNNNNNNNNNNNNNNNN cNNNNNNNNNNNNNNNNNNNNNNHEN SAVE ACCUMULATOR IN BANK REGISTER ; EX2: LD A,C CP A,':' JR NZ,EX2A ; ; STORE BANK # ; LD A,L LD HL,(ARGPTRuNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN {0..15} ; EXIT - A, B= ? ; ;**************************************************************************** TRPLSP: ; ; CO"eHNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNL LADRB ;OUTPUT ADDR ; ; DISPLAY DATA ; POP DE LD E,D CALL BITS2 ; ; RESTORE & DONE ; POP DE RET ;****PNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!************************************************* ; ; DISPLAY REGISTER CONTENTS PROCEDURE ; ENTRY- HL= PTR TO TABLE 'REGISTERq8NNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNBIT 6 == 0 THEN DIRECT ADDRESS ; RLCA JR NC,PV1 ; ; ELSE INDIRECT ADDRESS, (HL) ; PUSH HL ;BUILD ADDR IN HL ; LDLNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!NE READS A BYTE FROM CONSOLE DEVICE & ECHOS THE CHAR BACK ; TO THE CONSOLE DEVICE. ; EXIT - A= CHAR ; ;*********************=NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN ; DE= LAST LOCATION ; EXIT - HL = HL + 1 ; CF = HL == 0 OR HL > DE ; A = ? ; ;+++++++++++++++++++++++++++++++++++++++++*NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLD HL,A1_BNK LD (ARGPTR),HL JR EXPR1A ; ; ; IF LAST CHAR NOT VALID THEN ERROR ; EX3: JP NZ,QPRT ;NON 0 IS ERR ; ; sZNNNNNNNNNNNNNNNNN lNNNNNNNNNNNNNNNNNNNNNN) LD (HL),A ; ; RESTART WITH ACCUMULATOR = 0 ; JR EXPR0 ; ; ; ELSE PUT VALUE UNDER RETURN ADDRESS ON STACK ; EX2NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMPUTE NUMBER OF SPACES ; AND A,0FH ;LIMIT TO 0..15 LD B,A ;MULTIPLY BY 3 (X= X * 2 + X) ADD A,A ; COLUMN ADD A,B ;NNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNN!************************************************************************ ; ; BITS2 PROCEDURE DISPLAYS DATA AS BINARY BITS ; ExNNNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNNN' ; EXIT - HL= PTR TO LAST BYTE OF TABLE RECORD ; DE= PTR TO LOW BYTE OF VALUE -1 ; A, BC= ? ; ;*************************ZNNNNNNNNNNNNNNNNN$u#NNNNNNNNNNNNNNNNNNNNNN A,(DE) ;USE CONTENTS OF HL AS ADDRESS OF VALUE LD H,A ; DEC DE LD A,(DE) LD L,A ; LD DE,(BNKLOC) ;FETCH (HL) VALUE NNNNNNNNNNNNNNNNN*V,NNNNNNNNNNNNNNNNNNNNNN******************************************************* ; ; 1ST ENTRY DISPLAYS A '-' FIRST ; DECHO: CALL DASH ;OUTPUT AiWNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++ HILO: ; ; BUMP HL ; INC HL ; ; IF HL == 0 THEN RETURN CF ; LD A,H ;IF HL = 0QNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!W$]+NJb1̎j8Ԓq@ۖwFᚰ}J枴QX%NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNNN; The monitor is made up of the following files: ; ; ZBMRrrr.* = Resident ROM code ; ZBMDrrr.* = Debugger ; ZBMCrrr.* = CH9NNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printerRzNNNNNNNNNNNNNNNN *NNNNNNNNNNNNNNNNNNNNNNipation of ; Cromemco bank select useage. ; ; 1.9 - 16 AUG 86 GRH ; Fix bug in PRI driver which caused new Oki 93 to be Z4rNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN************************* ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, proNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN 29 DEC 88 GRH ; Add banked memory support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; 1.21 2`gNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNN ;*INCLUDE MONBOARD.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE ANNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP PUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF NNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN############### ; ; SIGN-ON ; ;############################################################################ ; LOGMSG: DB CNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNNharacter I/O ; ZBMKrrr.* = Disk I/O ; ZBMVrrr.* = Miscellaneous I/O Drivers ; ZBMGrrr.DEF = Global definitions & RAM alloctNNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNN! status subroutine which hung the ; line printer by sensing the status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in InaNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbusy. ; ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be ; swapped prior to GOTO. ;!NNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNNNgram breakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; areMNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNN7 JAN 89 GRH ; Add new monitor function routines. ; ; 1.22 11-22-90 GRH ; Move code to separate ROM in order to gain spaNNNNNNNNNNNNNNNN Z9NNNNNNNNNNNNNNNNNNNNNN@MONBOARD.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU DEB_RNUM ;ROM # OF THIS ROM RESTNT EQU MBNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK INC SP RET ;*********************************************************WaNNNNNNNNNNNNNNNNNN,TNNNNNNNNNNNNNNNNNNNNNNR,LF,' 65K Banked Debugger V. ' PVERS VERSN DM CR,LF ;-----------------------------------------------------------------HNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!ation include ; XROM.Z80 = ROM Xover include ; ZBMHrrr.HDR = Common Header include ; 0NNNNNNNNNNNNNNNN GNNNNNNNNNNNNNNNNNNNNNNput command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add corNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNN Change restart error to vector to breakpoint after message. ; ; 1.11- 27 DEC 87 GRH ; Add bank memory management routines.NNNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNNa as this ROM. ; *INCLUDE B:ZBMH122.HDR ;**************************************************************************** ; ; RNNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNNce for I/O drivers and ; interrupt code. ; Add rom xover function as include file. ; Add function dispatcher for execution aNNNNNNNNNNNNNNNN!iNNNNNNNNNNNNNNNNNNNNNNR_BRK ;0F82AH ;BREAKPOINT ENTRY LOCATION IN RESIDENT ROM SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD STNNNNNNNNNNNNNNNNN'îNNNNNNNNNNNNNNNNNNNNNN******************* ; ; COLD INIT ONLY SWITCHES TO RESIDENT ROM ; ;*********************************************************[NNNNNNNNNNNNNNNNN-,eNNNNNNNNNNNNNNNNNNNNNN----------- ; ; THIS IS THE COLD START INIT CODE ; ;------------------------------------------------------------------------NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNsfer to additional ROMs residing in the same memory ; area as this ROM. ; ;**************************************************RNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!de to disable all Jade controllers from 40H to 43H after ; reset. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up rBcNNNNNNNNNNNNNNNNN_NNNNNNNNNNNNNNNNNNNNNN ; ; 1.12 20 JUL 88 GRH ; Add Monitor function call restart. ; ; 1.20 29 DEC 88 GRH ; Add banked memory support: ; kH!NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNevision status: ; ; 1.0 - Release ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; 1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnd breakpoint entries. ; Add disk read, write, & logon commands ; 1-13-91 grh ; Add clock set command. ; ; 1.23 2-22-91 NNNNNNNNNNNNNNNNN"<[NNNNNNNNNNNNNNNNNNNNN!ART ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++ğNNNNNNNNNNNNNNNNNN(ӐNNNNNNNNNNNNNNNNNNNNNN******************* ; CINIT: ; ; SET STACK ; LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN ; LD HL,[MR_R͜NNNNNNNNNNNNNNNN.y6NNNNNNNNNNNNNNNNNNNNNN---- ; ROM_INIT: ; ; SET MONITOR COMMAND ARGUMENT DEFAULTS ; LD A,DEFBNK LD HL,A1_BNK LD (ARGPTR),HL LD (HL),A NNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN************************** ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; Add Double D deselect upon reset code. ; ChaneNNNNNNNNNNNNNNNNN %NNNNNNNNNNNNNNNNNNNNNNeset code to allow ISHA to access ; ram. ; Remove the auto-boot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromp_BNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNN TITLE M5b Z-80 DEBUGGER ROM LIST NOCOND ;**************************************************************************** ; ; D NNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on staHBHNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN GRH ; Change references to THIS_BNK to CURBNK. ; VERSN EQU 123 ;***********************************************************҇$NNNNNNNNNNNNNNNNN#jNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++ ; ; EXTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECNNNNNNNNNNNNNNNNN/JNNNNNNNNNNNNNNNNNNNNNNINC HL LD (HL),A INC HL LD (HL),A ; ; FILL BREAKPOINT ADDRESSES WITH 0 (LAST BYTE OF EXIT ROUTINE ; LD BC,[NBKPTS *HNNNNNNNNNNNNNNNNNyNNNNNNNNNNNNNNNNNNNNN!ge printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot image, in case logic ; too slow. ; 1.3 - 17 M'NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNemco PRI printer driver as primary printer. ; Change IOBYTE definitions. ; Remove initialization of Jade FDC port 40H in antic3KNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNNSYSTEM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;***************************************************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNck. ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be ; swapped prior to GOTO. ; 1.20 NNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNN***************** FORM FALSE EQU 0 TRUE EQU NOT FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLBWNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++͆NNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL INITIALIZATION CODE ;#############################################################uNNNNNNNNNNNNNNNNN0YJNNNNNNNNNNNNNNNNNNNNNN BP_REC] - 1 LD HL,TLOC LD (HL),0 PUSH HL POP DE INC DE LDIR ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD HL,RLOCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN큻V%[)Ŋa/ˎf4Βj7Ԗo> ښvD|I墲NNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNN LD B,BNKLOC - RLOC + 1 ; INIT2: LD (HL),C ;C HAS 0 FROM LAST LDIR FINISH INC HL DJNZ INIT2 ; ; NOW CHANGE SP & PC ŐYNNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNN,HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET ;#########UnNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++NNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNNR Z,PRTA ; ; RESTORE & RETURN ; POP BC RET ;**********************************************************************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; PUSH HL ; ; DO HIGH BYTE 1ST ; LD C,H CALL PUTHXB ; ; NOW DO LOW NIBBLE ; POP HL LD C,L ; ; FALL INTO NNNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNN***************************************************************** ; PUTHXN: LD A,C AND A,0FH ADD A,90H ;PUT INTO ASCII iNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!0C3H LD HL,RESTNT ;RESIDENT ROM ENTRY VECTOR LD (BP_RSTV),A LD (BP_RSTV +1),HL ; ; SET DEFAULT BANK ; LD C,DEFBNK 'TNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!MAND INPUT ; ;---------------------------------------------------------------------------- ; QPRT: ; ; DISPLAY ERROR PRO_NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!TO 0100H ; LD HL,0100H LD (PLOC),HL LD (SLOC),HL ; ; DONE ; RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++NNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN################################################################### ; ; MONITOR FUNCTION TABLE ; ;##########################rNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;***************A[NNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNN!****** ; ; DISPLAY ADDRESS PROCEDURE ; ENTRY- E:HL= ADDRESS VALUE TO DISPLAY ; ;*******************************************9NNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNNBYTE OUTPUT ; ;**************************************************************************** ; ; DISPLAY HEX BYTE ON SYSTO|/NNNNNNNNNNNNNNNNN m NNNNNNNNNNNNNNNNNNNNNNZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A JP CO SUBTTL DEBUGGER COMMAND INPUT ;----------gNNNNNNNNNNNNNNNN&ǯNNNNNNNNNNNNNNNNNNNNNN XRROM 9 ; ; GET COMMAND FROM USER ; CALL CRLF CALL DECHO ; ; IF COMMAND NOT ALPHA THEN ERROR ; SUB A,'A' JR {NNNNNNNNNNNNNNNN,(dNNNNNNNNNNNNNNNNNNNNNNMPT ; LD HL,QMSG CALL PRTWA ; ; EXECUTE WARM RESTART ; JR WINIT SUBTTL COMMANDS ;----------------------------vNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;+++++++++++++++++++++++INNNNNNNNNNNNNNNN wNNNNNNNNNNNNNNNNNNNNNN################################################## ; FUNTABL: DW RETVERS ;0: RETURN MONITOR ROM VERSION DW DEBUG ;1: EXE\NNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNN************************************************************* ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; TNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNNN********************************* ; PUTHXA: ; ; DISPLAY BANK # ; PUSH HL LD C,E CALL PUTHXB ; ; DISPLAY COLON ;npNNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNNEM CONSOLE PROCEDURE ; ENTRY- C= BYTE TO DISPLAY ; ;*************************************************************************INNNNNNNNNNNNNNNN!^8NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------------ ; ; DEBUGGER FUNCTION ; ;--------------------------------NNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNC,QPRT ; CP A,'Z' - 'A' + 1 JR NC,QPRT ; ; USE COMMAND CHAR AS OFFSET TO TABLE OF COMMAND EXECUTION ADDRESSES ; ADD 6NNNNNNNNNNNNNNNNN-UNNNNNNNNNNNNNNNNNNNNNN------------------------------------------------ ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PR#wNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FEӰNNNNNNNNNNNNNNNN $NNNNNNNNNNNNNNNNNNNNNNCUTE THE DEBUGGER DW REST ;2: BREAKPOINT CONTINUE DW PUTHXN ;3: DISPLAY HEX NIBBLE ON CONSOLE DW PUTHXB ;4: DISPLAY HEX%urNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNNNHE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************ԤNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN LD C,':' CALL CO ; ; DISPLAY ADDRESS VALUE ; POP HL ; ; FALL INTO HEX WORD OUTPUT ; ;*********************OnNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN*** ; PUTHXB: ; ; SAVE LOW NIBBLE ; PUSH BC ; ; DO HIGH NIBBLE 1ST ; RRC C RRC C RRC C RRC C CALL PUTHXNu\NNNNNNNNNNNNNNN" kNNNNNNNNNNNNNNNNNNNNNN-------------------------------------------- ; DEBUG: ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL _NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNA,A ;OFFSET = INDEX * 2 ; LD E,A LD D,0 LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE ; LD A,(HL) ;FETCH ADDRE;NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNNOM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;-----------------------------------------+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ADD A,A ADD A,L LD L,A LD A,0 WNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN BYTE ON CONSOLE DW PUTHXW ;5: DISPLAY HEX WORD ON CONSOLE DW PUTHXA ;6: DISPLAY HEX ADDRESS ON CONSOLE DW PRTS ;7: DISO}NNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNN************************************************** ; PRTS: ; ; SAVE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; oNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!******************************************************* ; ; DISPLAY HEX WORD ON SYSTEM CONSOLE PROCEDURE ; ENTRY- HL= BYTE TONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; ; NOW DO LOW NIBBLE ; POP BC ; ; FALL INTO NIBBLE OUTPUT ; ;************************************************ÓNNNNNNNNNNNNNNNNN#8ZNNNNNNNNNNNNNNNNNNNNNNPRTS ; ; WARM RESTART ENTRY ; WINIT: ; ; FIRST RESTORE THE LOCAL STACK TO THE GLOBAL RAM ; LD SP,MONSTK ; ; PUTnzNNNNNNNNNNNNNNNNN)בNNNNNNNNNNNNNNNNNNNNNNSS INC HL LD H,(HL) LD L,A ; LD B,2 ;PASS IN DEFAULT OF 2 ARGUMENTS TO COMMAND ; JP (HL) ;EXECUTE THE COMMAND BNNNNNNNNNNNNNNNN/}7NNNNNNNNNNNNNNNNNNNNNN----------------------------------- BOOTC: ; ; IF NO ARGS THEN USE DEFAULT ; CALL PCHK ;IF NO FURTHER INPUT THEN USE DE`BNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNN ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP)NNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNNNPLAY BIT7 TERMINATED TEXT ON CONSOLE ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL DEBUGGER FUNCTIONS ;+++++++++++++++++++++++++2NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO ; BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL JNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN DISPLAY ; ;**************************************************************************** ; PUTHXW: ; ; SAVE LOW NIBBLE ONNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN**************************** ; ; DISPLAY NIBBLE ON SYSTEM CONSOLE ; ENTRY- C<3..0>= NIBBLE ; EXIT - A= C= ? ; ;***********NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN THE RETURN ON THE STACK FOR COMMANDS WHICH ARE SUBROUTINES ; LD HL,WINIT PUSH HL ; ; INIT BREAKPOINT VECTOR ; LD A,*NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN! ;---------------------------------------------------------------------------- ; ; PRINT COMMAND ERROR MESSAGE & RETURN TO COM^3NNNNNNNNNNNNNNNN0nzNNNNNNNNNNNNNNNNNNNNNNFAULT JR C,BOOTCD ; ; ELSE GET USER ARG ; CALL EXF ;GET USER BOOT # POP BC ; JR BOOTCC ; ; ; SPECIAL DISK BO8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!Y&†]*Ɗb/ʎe2Βj8Ԗo= ٚuBޞyG⢰~LNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ZNNNNNNNNNNNNNNNNNNNNN!OT CODE SWAPS ROMS FOR BOOT. ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNL VALUE ; ; F ; ;---------------------------------------------------------------------NNNNNNNNNNNNNNNNN \7NNNNNNNNNNNNNNNNNNNNNN---------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENNNNNNNNNNNNNNNNNNN |KNNNNNNNNNNNNNNNNNNNNNN********************** ; ; REVISION HISTORY: ; ; 1.0 - 23 SEP 83 GRH ; Initial version transferred from CBIOS routines. NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN========================================================================== LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBO+9NNNNNNNNNNNNNNNN 9&NNNNNNNNNNNNNNNNNNNNN!PUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK FiNNNNNNNNNNNNNNNNN %xNNNNNNNNNNNNNNNNNNNNN!NIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ; ; OUTPUT SIGN-ON j}NNNNNNNNNNNNNNNNN +wNNNNNNNNNNNNNNNNNNNNNNNT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNNNNNNNNNNNNNNNNN L NNNNNNNNNNNNNNNNNNNNNNK NOT INSERTED. ; BOOTCD: LD C,DK_RNUM ;PASS IN DEFAULT BOOT ROM ADDR ; BOOTCC: LD L,1 + 2 ;SET BOOT FUNCTION # LD A,C ;NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN------- ; FILL: ; ; GET 3 ARGUMENTS ; CALL EXPR3 ;HL= PTR, DE= LAST ADDR, BC= VALUE ; ; TOP OF FILL LOOP ; FIO: NNNNNNNNNNNNNNNN  dNNNNNNNNNNNNNNNNNNNNNNCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CO@~ NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN; ; 1.22 11-25-90 GRH ; Modify slightly for Shared ROM ZMON V. 1.22. ; ; 1-7-91 GRH ; Change read clock buffer functionWNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNARD.DEF *INCLUDE CLOCK.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU CLK_RNUM ;ROM # OF THIS NNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNN INC SP RET ;**************************************************************************** ; ; COLD INIT ONLY SWITCHES T6NNNNNNNNNNNNNNNNN &+NNNNNNNNNNNNNNNNNNNNNNMESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' Misc. Drivers V. ' PVERS VERSN DM CR,LF SNNNNNNNNNNNNNNNNN ,iNNNNNNNNNNNNNNNNNNNNNNERR: LD A,-1 OR A,A RET ;############################################################################ ; ; MONITOR F)NNNNNNNNNNNNNNNN 8NNNNNNNNNNNNNNNNNNNNNNBITS 2..0 = ROM # AND A,7 ;MASK OFF EXTRANEOUS BITS & CLEAR ERROR FLAG ; LD H,A PUSH HL CALL XROMF INC SP INC SP =NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! PUSH DE LD DE,(A1_BNK) ; ; IF IN PROTECTED AREA THEN IGNORE ; LD A,H ;IF IN MONITOR RAM THEN IGNORE CP A,HIGH MONS {NNNNNNNNNNNNNNNN :UNNNNNNNNNNNNNNNNNNNNN!NTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ;---jNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! (1) to set clock calendar, and ; write clock buffer function (2) to set clock time. ; 1-21-91 GRH ; Fix bug in clock timehNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!ROM SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT pNNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNNO RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ; SET STACK ;YzNNNNNNNNNNNNNNNNN 'NNNNNNNNNNNNNNNNNNNNN!UBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRS]NNNNNNNNNNNNNNNN -ZNNNNNNNNNNNNNNNNNNNNN!UNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0: RNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN; ; IF RETURNED THEN MUST BE ERROR ; LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;----------------rNNNNNNNNNNNNNNNN ŠNNNNNNNNNNNNNNNNNNNNN!TK JR NC,FILNO ; OR A,A ;ELSE IF NOT IN PAGE 0 THEN OK JP NZ,FILYES ; LD A,L ;ELSE IF IN 1ST 40H BYTES THEN IGNORE iONNNNNNNNNNNNNNNN )NNNNNNNNNNNNNNNNNNNNN!------------------------------------------------------------------------- ; COMP: ; ; GET 3 ARGUMENTS FROM USER ; CALL THNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN set function which set chip to 12 Hr format. ; VERSN EQU 122 ; ;***********************************************************+NNNNNNNNNNNNNNNN luNNNNNNNNNNNNNNNNNNNNNN ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EX NNNNNNNNNNNNNNNNN "JNNNNNNNNNNNNNNNNNNNNNN LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF !@NNNNNNNNNNNNNNNNNN ($NNNNNNNNNNNNNNNNNNNNNNY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS J#rNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNN!ETURN ROM VERSION # DW CLKSCAL ;1: SET CLOCK CALENDAR DW CLKSTIM ;2: SET CLOCK TIME DW CLKCAL ;3: RETURN CLOCK CALENDARm;NNNNNNNNNNNNNNNNN ՞NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------ ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORu NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN CP A,40H JR C,FILNO ; FILYES: CALL PUTMEM ;STORE THE FILL VALUE ; FILNO: POP DE ; ; IF NOT LAST LOCATION THEN REPE rNNNNNNNNNNNNNNNN )NNNNNNNNNNNNNNNNNNNNNN TITLE M5b MISCELLANEOUS I/O DRIVER ROM LIST NOCOND ;************************************************************************JNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN***************** SUBTTL DECLARATIONS ;============================================================================ ; ;*MNNNNNNNNNNNNNNNNN _DNNNNNNNNNNNNNNNNNNNNN!TERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A=I|NNNNNNNNNNNNNNNNN #yNNNNNNNNNNNNNNNNNNNNNN; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL I"NNNNNNNNNNNNNNNN )NNNNNNNNNNNNNNNNNNNNNNR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,F1<9NNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP NNNNNNNNNNNNNNNN $INNNNNNNNNNNNNNNNNNNNNNNITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS IS THE COLD START IpZNNNNNNNNNNNNNNNN *FNNNNNNNNNNNNNNNNNNNNNNUNTABL ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; RESTORE ARGUMEXWNNNNNNNNNNNNNNNNN 0/NNNNNNNNNNNNNNNNNNNNNNHANGE DW ISTHERE ;7: RETURN BOARD PRESENT STATUS DW CLKSTOP ;8: STOP CLOCK DW CLKSTRT ;9: START CLOCK ; MAXFUNS EQU (TNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺V#\*Ɗa/̎h7Ԓp> ږwE|I垳P좹U"NNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN .jNNNNNNNNNNNNNNNNNNNNNN$ - FUNTABL) / 2 SUBTTL ROM FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; R !NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN L= MSD ; CALL CLK_SET ; ; PROCESS DATE ; INC C POP HL ;WAS BC (DATE) LD A,H CALL H2BCD ; CALL CLK_SET ; 6;NNNNNNNNNNNNNNNN  kNNNNNNNNNNNNNNNNNNNNNNH REGISTER ; LD C,CLK_SECL ;SET REGISTER # ; ; PROCESS SECONDS ; LD A,B CALL H2BCD ; CALL CLK_SET ; LD A,L IuNNNNNNNNNNNNNNNNN K{NNNNNNNNNNNNNNNNNNNNNNE FOR AWHILE ; CALL CLKWAIT ; ; FETCH DAY OF WEEK & SAVE ; LD C,CLK_WEEK CALL GETD AND A,7 ;MASK OFF GARBAGE {0..NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNILIZE ; CALL CLKWAIT ; ; PROCESS SECONDS ; LD C,CLK_SECL CALL GET2D LD H,7 ;MASK {0..79} CALL GETN PUSH AF ;9NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!ET ; EX (SP),HL EX (SP),HL ; ; RETURN WITH DATA ; IN A,(CLK_DATA) ;RETURN DATA RET ;+++++++++++++++++++++++++ONNNNNNNNNNNNNNNNN %HNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IF BOARD PRESENT FUNCTION #7 ; EXIT - A,L= 0: THERE, /0: NOT THERE ; ~NNNNNNNNNNNNNNNNN +GNNNNNNNNNNNNNNNNNNNNN!EX (SP),HL DJNZ CLKSDL ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++BNNNNNNNNNNNNNNNNN {9NNNNNNNNNNNNNNNNNNNNNNETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++vNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNLD A,L INC C CALL CLK_SET ; ; PROCESS MONTH ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CAL%NNNNNNNNNNNNNNNNN >TNNNNNNNNNNNNNNNNNNNNNNNC C CALL CLK_SET ; ; PROCESS MINUTES ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SENNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN7} LD L,A ; ; PROCESS DAY ; INC C CALL GET2D LD H,3 ;MASK {0..39} CALL GETN PUSH AF ; ; PROCESS MONTH ; NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!SAVE ; ; PROCESS MINUTES ; CALL GET2D CALL GETN ;USE SAME MASK AS ABOVE {0..79} LD B,A ; ; PROCESS HOURS ; CA]rNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT FOR CLOCK TO CHANGE FUNCTION #6 ; EXIT - A= 0: OK, /0: BOARD NOTNNNNNNNNNNNNNNNNN &NNNNNNNNNNNNNNNNNNNNNN;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISTHERE: ; ; FETCH CLOCK DATA ; IN A,(CsNNNNNNNNNNNNNNNNN ,^NNNNNNNNNNNNNNNNNNNNN!+ ; ; START CLOCK FUNCTION #9 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTRT: NNNNNNNNNNNNNNNNN HNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++uNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNN!L CLK_SET ; ; PROCESS YEAR ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SET ; ; DONNNNNNNNNNNNNNNNNN  eNNNNNNNNNNNNNNNNNNNNNNT ; ; PROCESS HOURS ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L SET 3,A ;SET 24 HR FORMAT BIT (HOURS M\4NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN CALL GET2D LD H,1 ;MASK {0..19} CALL GETN LD B,A ; ; PROCESS YEAR ; CALL GET2D LD H,0FH ;MASK {0..99} CALL GNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNLL GET2D LD H,3 ;MASK {0..39} CALL GETN LD C,A ; ; RETURN MINUTES IN A ; POP AF RET ;++++++++++++++++++++++ | NNNNNNNNNNNNNNNN !(NNNNNNNNNNNNNNNNNNNNN! PRESENT ; C= CLK_SECL ; B= LO SECONDS DATA ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}NNNNNNNNNNNNNNNNNN '*NNNNNNNNNNNNNNNNNNNNNNLK_DATA) ; ; IF UPPER BITS NOT DRIVEN THEN BOARD IS NOT THERE ; AND A,11000000B ; ; ADJUST SENSE ; RET ;+++++_NNNNNNNNNNNNNNNNN -mNNNNNNNNNNNNNNNNNNNNNN; ; CLEAR HOLD ; XOR A,A OUT (CLK_DATA),A ; ; CLEAR COMMAND ; OUT (CLK_CMD),A ; ; DONE ; RET SUBTTL ?NNNNNNNNNNNNNNNN џNNNNNNNNNNNNNNNNNNNNNN+++++ ; ; SET CLOCK CALENDAR FUNCTION #1 ; ENTRY- B= DATE ; D= MONTH ; E= YEAR ; L= DAY OF WEEK ; EXIT - A= 0 ; BC, NNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNE, TURN ON CLOCK ; JP CLKSTRT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET CLBNNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNNSD) INC C CALL CLK_SET ; ; START CLOCK ; JP CLKSTRT ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++)NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNETN ; ; RETURN VALUES ; LD C,A ;RETURN YEAR IN C POP AF ;RETURN DAY IN A RET ;++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN [ENNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CLOCK DATA FUNCTION #5 ; ENTRY- C= CLOCK REGISTER # ; EXIT1HNNNNNNNNNNNNNNNNN "}NNNNNNNNNNNNNNNNNNNNN!+ ; CLKWAIT: ; ; IF BOARD NOT THERE THEN RETURN ERROR ; CALL ISTHERE RET NZ ; ; FETCH CURRENT SECONDS ; LD C,C NNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; STOP CLOCK FUNCTION #8 ; EXIT - A, B= ? ; ;++++&NNNNNNNNNNNNNNNN .8NNNNNNNNNNNNNNNNNNNNNNFUNCTIONS & PROCEDURES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN 2 BCD DIGITS gNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSCAL: ; ; STOP CLOCK ; PUS]NNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNN!OCK TIME FUNCTION #2 ; ENTRY- B= SECONDS ; D= MINUTES ; E= HOURS ; EXIT - A= 0 ; BC, DE= ? ; ;++++++++++++++++++++++++NNNNNNNNNNNNNNNNN -NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++ ; ; RETURN CALENDAR FUNCTION #3 ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; DE= ? ; ;]NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION #4 ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; DE1NNNNNNNNNNNNNNNN htNNNNNNNNNNNNNNNNNNNNNN - A= REGISTER DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKRETR: GETD: ; ; NNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNN!LK_SECL CALL GETD AND A,CLK_DMSK ;MASK OFF UNWANTED BITS LD B,A ; ; WAIT UNTIL SECONDS CHANGE ; CLKRWT: CALL GETD NNNNNNNNNNNNNNNNN )%NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTOP: ; ; PUT HOLD ON CLOCK ; LD A,[1 SHL݈HNNNNNNNNNNNNNNNNN / NNNNNNNNNNNNNNNNNNNNNNFROM CLOCK FUNCTION ; ENTRY- C= CLOCK REGISTER # ; EXIT- DE= DIGITS ; A= HIGH DIGIT ; C= C + 2 ; ;++++++++++++++++++++++#NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNH BC CALL CLKSTOP ; ; SET UP PTR TO REGS ; LD C,CLK_WEEK ; ; PROCESS DAY OF WEEK ; LD A,L CALL H2BCD ;A= LSD,z\NNNNNNNNNNNNNNNN  X6NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTIM: ; ; STOP CLOCK ; CALL CLKSTOP ; ; SET UP TO SET EACpNNNNNNNNNNNNNNNNN xJNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: ; ; WAIT FOR CLOCK DATA TO BE STABLNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: ; ; WAIT FOR CLOCK TO STABUNNNNNNNNNNNNNNNNN ='NNNNNNNNNNNNNNNNNNNNNN TELL CLOCK WHICH REGISTER TO READ ; LD A,C SET CLK_RD,A ;SET READ BIT OUT (CLK_CMD),A ; ; DELAY >= 5us PER DATA SHE/=NNNNNNNNNNNNNNNNN $yNNNNNNNNNNNNNNNNNNNNNN AND A,CLK_DMSK CP A,B JR Z,CLKRWT ; ; DONE, RETURN 0 ; LD B,A XOR A,A RET ;++++++++++++++++++++++++++++++++pNNNNNNNNNNNNNNNN *vNNNNNNNNNNNNNNNNNNNNN! CLK_HOLD] OUT (CLK_DATA),A ; ; DELAY >= 150us FROM HOLD ; LD B,20 ;DELAY >= 150us FROM HOLD ; CLKSDL: EX (SP),HL DNNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GET2D: ; ; FETCH LOW DIGIT ; CALL GETD LD E,A ; ; FETCH NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!Z'Æ^,Ɋe4Ўl:֒r@ݖyH⚰~L瞵PX&NNNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!HIGH DIGIT ; INC C CALL GETD LD D,A ; ; PRESETUP FOR NEXT TIME ; INC C ; ; DONE ; RET ;+++++++++++++++]gNNNNNNNNNNNNNNNNN ( NNNNNNNNNNNNNNNNNNNNNNIGIT ; TENSLP: ADD A,C DJNZ TENSLP ; ; DONE CONVERTING, RESTORE & RETURN ; NOTENS: POP BC ; RET ;+++++++++++++?BNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++ ; CLK_SET: ; ; OUTPUT DATA ; SET CLK_HOLD,A ;KEEP CLOCK STOPPED OUT (CLK_DATxNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNHL ; BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL JR Z,PRTS ; ; DONE ; RET ;***********************************NNNNNNNNNNNNNNNNN \NNNNNNNNNNNNNNNNNNNNNN LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISK EXECUTER FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ERROR ; ;**************************************************************************** ; ; ILLEGAL DRIVE REQUESTED ; EXlNNNNNNNNNNNNNNNNN %HNNNNNNNNNNNNNNNNNNNNNN,B CALL DASH1 ; CALL BLK ;DISPLAY S2BNK:S2ADR S2DTA POP AF EX (SP),HL PUSH AF LD DE,(A3_BNK) CALL LADR CALL B>NNNNNNNNNNNNNNNN +kNNNNNNNNNNNNNNNNNNNNN!---------------------------------------- ; DISP: ; ; GET ARGUMENTS ; CALL EXLF ;GET BLOCK LIMITS ; ; TOP OF LINE LNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BCD NUMBER TO BINARY FUNCTION ; ENTRY- E= LO BCD # "NNNNNNNNNNNNNNNN 8NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BINARY NUMBER TO BCD DIGITS FUNCTION ; ENTRY- A= NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNA),A ; ; OUTPUT REGISTER # ; LD A,C OUT (CLK_CMD),A ; ; STROBE DATA INTO REGISTER ; SET CLK_WRT,A OUT (CLK_CMDNNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNNN***************************************** ; ; SEND CHAR TO SYSTEM CONSOLE PROCEDURE ; ENTRY- C= CHAR ; ;*******************q%NNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS R NNNNNNNNNNNNNNNNN QNNNNNNNNNNNNNNNNNNNNNNIT - AF= -2 ; (IOPB.PB_STAT)= ILLEGAL COMMAND ERROR ; ;*********************************************************************ANNNNNNNNNNNNNNNNN &NNNNNNNNNNNNNNNNNNNNNNLK POP AF EX (SP),HL ; CALL HEX1 ;OUTPUT S2DTA ; CMPB: POP BC POP DE ; ; IF SRC == LAST THEN DONE ; CALL HILO@NNNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNN; ; A,BC,BC',HL,HL',DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DSKX: ; ; .NNNNNNNNNNNNNNNNN !`NNNNNNNNNNNNNNNNNNNNN!EXPR3 ;HL= SRC, DE= LAST, BC= SRC2 ; ; TOP OF VERIFY LOOP ; CMPA: PUSH DE ;SAVE LAST PUSH BC ;SWAP SRC & SRC2 PTRS NNNNNNNNNNNNNNNNN '.NNNNNNNNNNNNNNNNNNNNNNXB RET C ; ; ELSE REPEAT ; JR CMPA ;---------------------------------------------------------------------------- 4NNNNNNNNNNNNNNNNN - NNNNNNNNNNNNNNNNNNNNNNCOLUMN ; LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN ; ; SAVE PTR FOR CHAR DISPLAY ; nNNNNNNNNNNNNNNNNN }sNNNNNNNNNNNNNNNNNNNNNN+++++++++++++ ; GETN: ; ; SAVE REGS ; PUSH BC ; ; FETCH LOW BYTE ; LD A,E AND A,CLK_DMSK LD C,A ; ; FETCcrNNNNNNNNNNNNNNNN ^|NNNNNNNNNNNNNNNNNNNNNN++++++++ ; H2BCD: ; ; TENS = 0 ; LD L,0 ; ; IF UNITS < 10 THEN DONE ; H2BCDL: CP A,10 RET C ; ; ELSE UNITBNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!********** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LA>NNNNNNNNNNNNNNNNN bNNNNNNNNNNNNNNNNNNNNNNCALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR ;+++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! FETCH DRIVE # ; LD HL,(IOPBPTR) INC HL LD A,(HL) ; ; IF JADE 8" FLOPPY THEN GO EXECUTE IT ; SUB A,4 JP C,JADE8,NNNNNNNNNNNNNNNN "3NNNNNNNNNNNNNNNNNNNNNN EX (SP),HL ; ; FETCH SRC2 DATA ; LD DE,(A3_BNK) CALL GETMEM LD C,A ; ; FETCH SRC1 DATA ; EX (SP),HL LD DE,NNNNNNNNNNNNNNNNN (>NNNNNNNNNNNNNNNNNNNNNN; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE STPNNNNNNNNNNNNNNNN .^NNNNNNNNNNNNNNNNNNNNNN PUSH HL ; ; TOP OF HEX DISPLAY LOOP ; DIS2: ; ; DISPLAY MEMORY DATA IN HEX ; PUSH DE ;FETCH BANK # IN E LD DE,(KNNNNNNNNNNNNNNNN NBNNNNNNNNNNNNNNNNNNNNNNH HIGH BYTE ; LD A,D ; ; MASK OFF NON-NUMERICAL BITS ; AND A,H ; ; MULTIPLY TENS DIGIT BY 10 & ADD TO UNITS ; L!NNNNNNNNNNNNNNNNN mMNNNNNNNNNNNNNNNNNNNNNNS -= 10 ; SUB A,10 INC L JR H2BCDL ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!ST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** NNNNNNNNNNNNNNNNN +SNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION 4 ; ENTRY- E:HL= IOPB PTR ; EXIT - IOPB.STATUS= 0: OK, /0: ERROR ; ;++++NNNNNNNNNNNNNNNNN ĘNNNNNNNNNNNNNNNNNNNNNN ; ; ELSE IF SASI 8" HARD DISK THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX8 ; ; ELSE IF JADE 5" FLOPPY THEN GO EXECUTE @rNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNN(A1_BNK) CALL GETMEM LD B,A ;GET SOURCE 1 DATA ; ; IF SRC1 == SRC2 THEN EXIT ; LD A,C CP A,B ;IF S2=S1 THEN EXIT 5OxNNNNNNNNNNNNNNNNN ) NNNNNNNNNNNNNNNNNNNNNNART & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16 BYTES PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACHryNNNNNNNNNNNNNNNN /oNNNNNNNNNNNNNNNNNNNNNNA1_BNK) CALL GETMEM ;FETCH DATA FROM E:HL TO A CALL HEX1 ;DISPLAY DATA IN A POP DE ; ; IF DONE THEN GO ON TO ASCII yNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNND B,A ;SET CNT LD A,C ;GET UNITS DIGIT JR Z,NOTENS ;IF (TENS & MASK) == 0 THEN RETURN UNITS ; LD C,10 ;ELSE ADD TENS D!NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; SET CLOCK DIGIT PROCEDURE ; ENTRY- A= BCD DATA ; C= COMMAND ; EXIT - A= COMMAND ; ;++++++++++++++++++++++++++++++++++++ dNNNNNNNNNNNNNNNNN ԦNNNNNNNNNNNNNNNNNNNNNN ; PRTS: ; ; TOP OF PRINTING LOOP ; LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 PUSH HL CALL CO POP rNNNNNNNNNNNNNNNNN ;mNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EX_IOPB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL nNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNIT ; SUB A,4 JP C,JADE5 ; ; ELSE IF SASI 5" THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX5 ; ; ELSE FALL INTO SELECT/NNNNNNNNNNNNNNNNN ${NNNNNNNNNNNNNNNNNNNNNN JR Z,CMPB ; ; ELSE DISPLAY SRC1 & SRC2 DATA ; PUSH AF ;SAVE S2 DATA ; CALL LADRB ;OUTPUT S1BNK:S1ADR S1DTA- LD A NNNNNNNNNNNNNNNN *XNNNNNNNNNNNNNNNNNNNNNN ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;------------------------------------"NNNNNNNNNNNNNNNN 0"NNNNNNNNNNNNNNNNNNNNN!; CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY ; ; NEXT COLUMN ; CALL BLK ;MAKE COLUMNS ; ; IF NOT ON EYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN끹U$\*Ŋb0̎h5Вl:Ֆp= ٚvDߞ{J梴QNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!;**************************************************************************** ; ; M5b Z-80 Banked Monitor External Interface D9NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNtion definitions to add AUX & AUX2 devices & ; single, separate device driver and system function calls. ; ;****************}'yNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNN!TEM CONSOLE ; ; SYSTEM LIST DEVICE (PRINTER) FUNCTIONS ; MR_LOS EQU MR_BASE + 39 ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS NNNNNNNNNNNNNNNNN ЧNNNNNNNNNNNNNNNNNNNNNNS MR_REST EQU MR_BASE + 48 ;RESTART ERROR ; ; ;**************************************************************************** NNNNNNNNNNNNNNNNNN ?lNNNNNNNNNNNNNNNNNNNNNN BANK # IN A MF_BSEL EQU 9 ;SELECT BANK IN C ; MF_DVER EQU 16 ;RETURN DEBUGGER VERSION IN HL IN HUNDREDTHS (X.XX) MF_XDEB EQNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!38 ;RETURN STANDARD AUX DEVICE OUTPUT STATUS MF_AO EQU 39 ;SEND CHAR TO STANDARD AUX DEVICE MF_CIS EQU 40 ;RETURN SYSTEM CONSOLNNNNNNNNNNNNNNNNN %NNNNNNNNNNNNNNNNNNNNNN ;TEST IOPB (E:HL) FOR ERROR & DISPLAY IOPB DATA IF TRUE MF_DIOB EQU 67 ;DISPLAY IOPB (E:HL) DATA ON SYSTEM CONSOLE MF_XIOB EQNNNNNNNNNNNNNNNNN +\NNNNNNNNNNNNNNNNNNNNNNADDRESS FROM USER ; CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL ; ; TOP OF LOOP ; SUB1: ; ; DISPfNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNefinitions ; ;**************************************************************************** ; ; This file supplies the softwaNNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNNN************************************************************ ; ; ENTRY ADDRESSES ; MR_BASE EQU 0F800H ;BASE ADDRESS OF RO ANNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN MR_LO EQU MR_BASE + 15 ;SEND CHAR IN C TO SYSTEM LIST DEVICE ; ; BANKED MEMORY MANAGEMENT ; MR_GMEM EQU MR_BASE + 21 ;RETyNNNNNNNNNNNNNNNN I0NNNNNNNNNNNNNNNNNNNNN! ; ; MONITOR FUNCTION DEFINITIONS ; NOTE: ; ALL OTHER FUNCTION #S WILL RETURN -1 IN A (UNDEFINED FUNCTION ERROR) ; ;*****$NNNNNNNNNNNNNNNN j?NNNNNNNNNNNNNNNNNNNNNNU 17 ;EXECUTE THE DEBUGGER (DOES NOT RETURN) MF_PHXN EQU 19 ;DISPLAY HEX NIBBLE IN C<3..0> ON SYSTEM CONSOLE MF_PHXB EQU 20 ;DONNNNNNNNNNNNNNNNN  aNNNNNNNNNNNNNNNNNNNNNNLE INPUT STATUS IN A MF_CI EQU 41 ;RETURN NEXT SYSTEM CONSOLE CHAR IN A MF_COS EQU 42 ;RETURN SYSTEM CONSOLE OUTPUT STATUS IN NNNNNNNNNNNNNNNNN &*NNNNNNNNNNNNNNNNNNNNNNU 68 ;EXECUTE IOPB (E:HL) ; MF_VVER EQU 80 ;RETURN MISC. DRIVER VERSION IN HL IN HUNDREDTHS (X.XX) MF_SCAL EQU 81 ;SET CLOCK 'NNNNNNNNNNNNNNNNN , NNNNNNNNNNNNNNNNNNNNN!LAY EXISTING CONTENTS ; LD DE,(A1_BNK) CALL GETMEM CALL DASH1 ; ; GET NEW VALUE FROM USER ; CALL PCHK ;GET NEW VAjTNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNre interface definitions for the Vers. ; 1.22+ M5b Z-80 Banked Monitor ROMs. The definitions include the entry ; points at the`NNNNNNNNNNNNNNNNN  <NNNNNNNNNNNNNNNNNNNNNNM ; ; MONITOR FUNCTIONS ; MR_COLD EQU MR_BASE + 0 ;COLD RESET OF SYSTEM MR_FUN EQU MR_BASE + 6 ;EXECUTE FUNCTION IN A (SEz`NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!URN BANKED MEMORY (E:HL) CONTENTS IN A MR_PMEM EQU MR_BASE + 24 ;STORE DATA IN C TO BANKED MEMORY (E:HL) MR_BSEL EQU MR_BASE + NNNNNNNNNNNNNNNNN zNNNNNNNNNNNNNNNNNNNNNN*********************************************************************** ; MF_VERS EQU 0 ;RETURN MONITOR VERSION IN HL IN HUNDRNNNNNNNNNNNNNNNN YNNNNNNNNNNNNNNNNNNNNN!ISPLAY HEX BYTE IN C ON SYSTEM CONSOLE MF_PHXW EQU 21 ;DISPLAY HEX WORD IN HL ON SYSTEM CONSOLE MF_PHXA EQU 22 ;DISPLAY HEX AD|NNNNNNNNNNNNNNNNN !PNNNNNNNNNNNNNNNNNNNNNNA MF_CO EQU 43 ;SEND CHAR IN C TO SYSTEM CONSOLE MF_LOS EQU 44 ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS IN A MF_LO EQU 45 ;SENNNNNNNNNNNNNNNN 'NNNNNNNNNNNNNNNNNNNNNNCALENDAR MF_STIM EQU 82 ;SET CLOCK TIME MF_GCAL EQU 83 ;RETURN CLOCK CALENDAR MF_GTIM EQU 84 ;RETURN CLOCK TIME MF_GREG EQU 2NNNNNNNNNNNNNNNNN -=NNNNNNNNNNNNNNNNNNNNNNLUE ; ; IF NONE THEN RETURN ; JP C,WINIT ;IF CHAR = CR THEN RETURN ; ; IF LAST CHAR == SPACE OR COMMA THEN SKIP STORNNNNNNNNNNNNNNNNN JCNNNNNNNNNNNNNNNNNNNNNN beginning of the ROM as well as the function arguments. The ; function argument definitions are explained in the ZBM-122.DOC fNNNNNNNNNNNNNNNNN  iLNNNNNNNNNNNNNNNNNNNNNNE FOLLOWING FOR #S) ; ; SYSTEM CONSOLE FUNCTIONS ; MR_CIS EQU MR_BASE + 18 ;RETURN SYSTEM CONSOLE INPUT STATUS MR_CI EQU NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN 27 ;SELECT MEMORY BANK IN C MR_SBNK EQU MR_BASE + 30 ;SET SRC (B) & DEST (C) BANKS FOR BLOCK MOVE MR_BMOV EQU MR_BASE + 33 ;M+NNNNNNNNNNNNNNNN /RNNNNNNNNNNNNNNNNNNNNNNEDTHS (X.XX) MF_GMEM EQU 1 ;RETURN BANKED MEMORY (E:HL) DATA IN A MF_PMEM EQU 2 ;STORE BANKED MEMORY (E:HL) DATA IN C MF_EXECNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNDRESS IN E:HL ON SYSTEM CONSOLE MF_PUTS EQU 23 ;DIPLAY BIT-7 TERMINATED TEXT (HL) ON SYSTEM CONSOLE ; MF_CVER EQU 32 ;RETURN BNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNNND CHAR IN C TO SYSTEM LIST DEVICE MF_A2IS EQU 46 ;RETURN STANDARD AUX2 DEVICE INPUT STATUS MF_A2I EQU 47 ;RETURN STANDARD AUXNNNNNNNNNNNNNNNN ( NNNNNNNNNNNNNNNNNNNNN!85 ;RETURN CLOCK REGISTER DATA MF_CSYN EQU 86 ;WAIT FOR CLOCK SYNC/TEST BOARD PRESENCE MF_STPC EQU 88 ;STOP CLOCK MF_STC EQU ßNNNNNNNNNNNNNNNNN .nNNNNNNNNNNNNNNNNNNNNNNE ; JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT ; ; ELSE IF LAST CHAR == LINE FEED THEN BACK UP ; CP A,LF ;IF CHAR = LCNNNNNNNNNNNNNNNN yrNNNNNNNNNNNNNNNNNNNNNNile. ; ;**************************************************************************** ; ; Revision History: ; ; 1.00 11-26-NNNNNNNNNNNNNNNNN  Z}NNNNNNNNNNNNNNNNNNNNNNMR_BASE + 3 ;RETURN NEXT SYSTEM CONSOLE CHAR IN A MR_COS EQU MR_BASE + 12 ;RETURN SYSTEM CONSOLE OUTPUT STATUS IN A MR_CO EQU 6NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!OVE DATA (BC= CNT) FROM SRC (HL) TO ; DEST (DE) BANKS MR_EXEC EQU MR_BASE + 36 ;EXECUTE PROGRAM (E:HL) IN ANOTHER BANK ; NNNNNNNNNNNNNNNNN cNNNNNNNNNNNNNNNNNNNNNN EQU 3 ;EXECUTE PROCEDURE IN ANOTHER BANK (E:HL) MF_SBNK EQU 4 ;SELECT SRC (B) & DEST (C) BANKS FOR BLOCK MOVE MF_BMOV EQU 5 ;u NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNCHAR I/O VERSION IN HL IN HUNDREDTHS (X.XX) MF_XDFUN EQU 33 ;EXECUTE CHAR DEVICE DRIVER FUNCTION MF_SDEV EQU 35 ;SET STANDARD ˁNNNNNNNNNNNNNNNN #2NNNNNNNNNNNNNNNNNNNNN!2 DEVICE INPUT CHAR MF_A2OS EQU 48 ;RETURN STANDARD AUX2 DEVICE OUTPUT STATUS MF_A2O EQU 49 ;SEND CHAR TO STANDARD AUX2 DEVICE:NNNNNNNNNNNNNNNNN ):NNNNNNNNNNNNNNNNNNNNNN89 ;START CLOCK *NNNNNNNNNNNNNNNNN /_NNNNNNNNNNNNNNNNNNNNN!F THEN BACK UP JR Z,SUB3 ; ; ELSE GET & STORE VALUE ; PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUNNNNNNNNNNNNNNNNNN ,!NNNNNNNNNNNNNNNNNNNNN!90 grh ; First cut. ; ; 1.01 1-13-91 GRH ; Change clock function definitions for set clock. ; Change character i/o func NNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNMR_BASE + 9 ;SEND CHAR IN C TO SYSTEM CONSOLE MR_PUTS EQU MR_BASE + 51 ;DISPLAY BIT-7 TERMINATED CHAR STRING (HL) ON ; SYSNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; DEBUGGER SUPPORT ; MR_BRK EQU MR_BASE + 42 ;DEBUGGER BREAKPOINT ENTRY MR_GOTO EQU MR_BASE + 45 ;DEBUGGER INTERNAL PROCES NNNNNNNNNNNNNNNNN  ]NNNNNNNNNNNNNNNNNNNNNNMOVE N (BC) BYTES FROM SRC (HL) TO DEST (DE) BANKS MF_SELP EQU 6 ;SELECT NEW SS100 BUS PROCESSOR MF_GBNK EQU 7 ;RETURN CURRENT`$NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNDEVICE MF_AIS EQU 36 ;RETURN STANDARD AUX DEVICE INPUT STATUS MF_AI EQU 37 ;RETURN STANDARD AUX DEVICE INPUT CHAR MF_AOS EQU HNNNNNNNNNNNNNNNNN $LNNNNNNNNNNNNNNNNNNNNNN ; MF_KVER EQU 64 ;RETURN DISK DRIVER VERSION IN HL IN HUNDREDTHS (X.XX) MF_BOOT EQU 65 ;BOOT FROM DISK IN BC MF_TIOB EQU 66C\NNNNNNNNNNNNNNNNN *oNNNNNNNNNNNNNNNNNNNNNNLTER IT. ; ; S ; ;---------------------------------------------------------------------------- ; SUBS: ; ; GET NNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNNNE POP HL ;PTR ; PUSH BC LD C,E LD DE,(A1_BNK) CALL PUTMEM ;LOAD VALUE ; POP BC ; ; IF LAST CHAR == CR THEN Do6NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!W$],NJc1͎j8Ԓq?ܖxF⚰}K螶S V$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 2NNNNNNNNNNNNNNNNNNNNN! TITLE M5b Z-80 DEBUGGER ROM LIST NOCOND ;**************************************************************************** ; ; DNNNNNNNNNNNNNNNN ^NNNNNNNNNNNNNNNNNNNNNN - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on stacktHNNNNNNNNNNNNNNNN _NNNNNNNNNNNNNNNNNNNNNN************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE ; ; INCNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNN FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A= FUNCTION # ; ;+++cNNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNNNALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL INITIALIZATION CODE ;####rNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN!ES WITH 0 (LAST BYTE OF EXIT ROUTINE ; LD BC,[NBKPTS * BP_REC] - 1 LD HL,TLOC LD (HL),0 PUSH HL POP DE INC DE LDI6NNNNNNNNNNNNNNNNN %>NNNNNNNNNNNNNNNNNNNNNN ; LD HL,FUNTABL ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; REߥNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNXA ;6: DISPLAY HEX ADDRESS ON CONSOLE DW PRTS ;7: DISPLAY BIT7 TERMINATED TEXT ON CONSOLE ; MAXFUNS EQU ($ - FUNTABL) / 2 rNNNNNNNNNNNNNNNN aNNNNNNNNNNNNNNNNNNNNNNSYSTEM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;***************************************************NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNN. ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be ; swapped prior to GOTO. ; 1.20 2i}NNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE ZBMFUNS.DEF ;*INCLUDE COMIOPB2.DEF ;bNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP PUSH HL LD H,MR_RN1$NNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNN######################################################################## ; ; SIGN-ON ; ;####################################\"NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNR ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD HL,RLOC LD B,BNKLOC - RLOC + 1 ; INIT2: LD (HL),C ;C HAS 0 FROM LAST LDIR\NNNNNNNNNNNNNNNNN &kCNNNNNNNNNNNNNNNNNNNNN!STORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ER8NNNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNN SUBTTL DEBUGGER FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSIONNNNNNNNNNNNNNNN PNNNNNNNNNNNNNNNNNNNNNN************************* ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, pro NNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNNN9 DEC 88 GRH ; Add banked memory support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; 1.21 27 uNNNNNNNNNNNNNNNNN =NNNNNNNNNNNNNNNNNNNNNN LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE ZBMFUNS.DEF *INCLUDE COMIOPB2.DEF LIST ON *INCLUDE ZBMG1jNNNNNNNNNNNNNNNN ;NNNNNNNNNNNNNNNNNNNNNNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK INC SP RET ;'NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN######################################## ; LOGMSG: DB CR,LF,' 65K Banked Debugger V. ' PVERS VERSN DM CR,LF ;--------3=NNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNN! FINISH INC HL DJNZ INIT2 ; ; NOW CHANGE SP & PC TO 0100H ; LD HL,0100H LD (PLOC),HL LD (SLOC),HL ; ; DONE ;NNNNNNNNNNNNNNNNN 'XrNNNNNNNNNNNNNNNNNNNNNNROR ; MFUNERR: LD A,-1 OR A,A RET ;############################################################################ ; lNNNNNNNNNNNNNNNN -NNNNNNNNNNNNNNNNNNNNNNN FUNCTION ; EXIT - HL= VERSION # (123D = 1.23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*NNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNgram breakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; areMNNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNNJAN 89 GRH ; Add new monitor function routines. ; ; 1.22 11-22-90 GRH ; Move code to separate ROM in order to gain spaceNNNNNNNNNNNNNNNNN pNNNNNNNNNNNNNNNNNNNNNN22.DEF THIS_ROM EQU DEB_RNUM ;ROM # OF THIS ROM RESTNT EQU 0F82AH ;BREAKPOINT ENTRY LOCATION IN RESIDENT ROM SUBTTL ENNNNNNNNNNNNNNNN nNNNNNNNNNNNNNNNNNNNNNN**************************************************************************** ; ; COLD INIT ONLY SWITCHES TO RESIDENT ROM ; ;NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------------- ; ; THIS IS THE COLD START INIT CODE ; ;---------------*NNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNN RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++tNNNNNNNNNNNNNNNNN (HLNNNNNNNNNNNNNNNNNNNNNN ; MONITOR FUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RENNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNN!++ ; RETVERS: LD HL,VERSN RET ;**************************************************************************** ; ; PRT2NNNNNNNNNNNNNNNNN 8NNNNNNNNNNNNNNNNNNNNNNa as this ROM. ; *INCLUDE ZBMH122.HDR ;**************************************************************************** ; ; RevZNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN for I/O drivers and ; interrupt code. ; Add rom xover function as include file. ; Add function dispatcher for execution andiNNNNNNNNNNNNNNNN ANNNNNNNNNNNNNNNNNNNNNNXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ; DS (MONROM + [NNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNN**************************************************************************** ; CINIT: ; ; SET STACK ; LD SP,MONSTK ; NNNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------- ; ROM_INIT: ; ; SET MONITOR COMMAND ARGUMENT DEFAULTS ; L0NNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNN!+ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A!NNNNNNNNNNNNNNNN ){}NNNNNNNNNNNNNNNNNNNNNNTVERS ;0: RETURN MONITOR ROM VERSION DW DEBUG ;1: EXECUTE THE DEBUGGER DW REST ;2: BREAKPOINT CONTINUE DW PUTHXN ;3: DYdNNNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNNNS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRINNNNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNNNision status: ; ; 1.0 - Release ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; 1.5wNNNNNNNNNNNNNNNN nNNNNNNNNNNNNNNNNNNNNNN breakpoint entries. ; Add disk read, write, & logon commands ; 1-13-91 grh ; Add clock set command. ; VERSN EQU 122 ;**NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXTERNAL FUNCTION STUBNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNNN; RESET ROM FUNCTION SHOULD NOT RETURN ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; IF RETURNED THEN HNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNND A,DEFBNK LD HL,A1_BNK LD (ARGPTR),HL LD (HL),A INC HL LD (HL),A INC HL LD (HL),A ; ; FILL BREAKPOINT ADDRESSNNNNNNNNNNNNNNNNN $ !NNNNNNNNNNNNNNNNNNNNNN,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT NNNNNNNNNNNNNNNN *..NNNNNNNNNNNNNNNNNNNNNNISPLAY HEX NIBBLE ON CONSOLE DW PUTHXB ;4: DISPLAY HEX BYTE ON CONSOLE DW PUTHXW ;5: DISPLAY HEX WORD ON CONSOLE DW PUTH2NNNNNNNNNNNNNNNNNN 0–NNNNNNNNNNNNNNNNNNNNNNG. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; PRTS: ; ; SA ^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN끹U"X'Ê_.Ɏe3ϒk9Ԗo= ٚtBޞyH䢱MNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNVE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 CALLNNNNNNNNNNNNNNNN iNNNNNNNNNNNNNNNNNNNNN!EX WORD ON SYSTEM CONSOLE PROCEDURE ; ENTRY- HL= BYTE TO DISPLAY ; ;*********************************************************6NNNNNNNNNNNNNNNNN  oNNNNNNNNNNNNNNNNNNNNNN ; ;**************************************************************************** ; ; DISPLAY NIBBLE ON SYSTEM CONSOLE ; q^NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!CAL STACK TO THE GLOBAL RAM ; LD SP,MONSTK ; ; PUT THE RETURN ON THE STACK FOR COMMANDS WHICH ARE SUBROUTINES ; LD HL,iNNNNNNNNNNNNNNNNN INNNNNNNNNNNNNNNNNNNNNNUMENTS TO COMMAND ; JP (HL) ;EXECUTE THE COMMAND ;--------------------------------------------------------------------- NNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNNN DEFAULT ; CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JR C,BOOTCD ; ; ELSE GET USER ARG ; CALL EXF ;GET USER NNNNNNNNNNNNNNNN % NNNNNNNNNNNNNNNNNNNNNN MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERE?NNNNNNNNNNNNNNNNN +*/NNNNNNNNNNNNNNNNNNNNN! ; FILNO: POP DE ; ; IF NOT LAST LOCATION THEN REPEAT ; CALL HILO JR NC,FIO ; ; ELSE DONE ; JP WINIT ;---uNNNNNNNNNNNNNNNN QNNNNNNNNNNNNNNNNNNNNNN CO ; BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL JR Z,PRTA ; ; RESTORE & RETURN ; POP BC RET ;*************rNNNNNNNNNNNNNNNN yNNNNNNNNNNNNNNNNNNNNNN******************* ; PUTHXW: ; ; SAVE LOW NIBBLE ; PUSH HL ; ; DO HIGH BYTE 1ST ; LD C,H CALL PUTHXB ; ; "NNNNNNNNNNNNNNNNNN = NIBBLE ; EXIT - A= C= ? ; ;**************************************************************************** ; Pϭ$NNNNNNNNNNNNNNNNN ?NNNNNNNNNNNNNNNNNNNNNNWINIT PUSH HL ; ; INIT BREAKPOINT VECTOR ; LD A,0C3H LD HL,RESTNT ;RESIDENT ROM ENTRY VECTOR LD (BP_RSTV),A LD (NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN------- ; ; PRINT COMMAND ERROR MESSAGE & RETURN TO COMMAND INPUT ; ;-------------------------------------------------------CNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNBOOT # POP BC ; JR BOOTCC ; ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT. ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ;NNNNNNNNNNNNNNNN &\sNNNNNNNNNNNNNNNNNNNNN!D IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;------------uNNNNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARE}NNNNNNNNNNNNNNNN `NNNNNNNNNNNNNNNNNNNNNN*************************************************************** ; ; DISPLAY ADDRESS PROCEDURE ; ENTRY- E:HL= ADDRESS VALUE TONNNNNNNNNNNNNNNN  JNNNNNNNNNNNNNNNNNNNNNNNOW DO LOW NIBBLE ; POP HL LD C,L ; ; FALL INTO BYTE OUTPUT ; ;**************************************************NNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNUTHXN: LD A,C AND A,0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,ANNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNBP_RSTV +1),HL ; ; SET DEFAULT BANK ; LD C,DEFBNK XRROM 9 ; ; GET COMMAND FROM USER ; CALL CRLF CALL DECHO ; 4!NNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNNN--------------------- ; QPRT: ; ; DISPLAY ERROR PROMPT ; LD HL,QMSG CALL PRTWA ; ; EXECUTE WARM RESTART ; JR WNNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNN IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,DK_RNUM ;PASS IN DEFAULT BOOT ROM ADDRVNNNNNNNNNNNNNNNNN 'oBNNNNNNNNNNNNNNNNNNNNN!---------------------------------------------------------------- ; FILL: ; ; GET 3 ARGUMENTS ; CALL EXPR3 ;HL= PTR, DEWNNNNNNNNNNNNNNNNN -NNNNNNNNNNNNNNNNNNNNNNS 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; W(NNNNNNNNNNNNNNNN  ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAUL ; ;--------------------------------------------------------------------------;NNNNNNNNNNNNNNNNN ZNNNNNNNNNNNNNNNNNNNNNN FALL INTO HEX WORD OUTPUT ; ;**************************************************************************** ; ; DISPLAY HNNNNNNNNNNNNNNNNN  ^NNNNNNNNNNNNNNNNNNNNNNBBLE 1ST ; RRC C RRC C RRC C RRC C CALL PUTHXN ; ; NOW DO LOW NIBBLE ; POP BC ; ; FALL INTO NIBBLE OUTPUT NNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNNSIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; WARM RESTART ENTRY ; WINIT: ; ; FIRST RESTORE THE LO)NNNNNNNNNNNNNNNN zNNNNNNNNNNNNNNNNNNNNN!(TABLE + OFFSET) ADD HL,DE ; LD A,(HL) ;FETCH ADDRESS INC HL LD H,(HL) LD L,A ; LD B,2 ;PASS IN DEFAULT OF 2 ARGVNNNNNNNNNNNNNNNNN ONNNNNNNNNNNNNNNNNNNNNNT # = 02H) ; ;---------------------------------------------------------------------------- BOOTC: ; ; IF NO ARGS THEN USEJgNNNNNNNNNNNNNNNNN $:NNNNNNNNNNNNNNNNNNNNNN ; JR WINIT ;GO TO MONITOR EXEC ;---------------------------------------------------------------------------- ; ; FILL=rNNNNNNNNNNNNNNNN *NNNNNNNNNNNNNNNNNNNNNNLYES ; LD A,L ;ELSE IF IN 1ST 40H BYTES THEN IGNORE CP A,40H JR C,FILNO ; FILYES: CALL PUTMEM ;STORE THE FILL VALUE-zNNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNN!-- ; COMP: ; ; GET 3 ARGUMENTS FROM USER ; CALL EXPR3 ;HL= SRC, DE= LAST, BC= SRC2 ; ; TOP OF VERIFY LOOP ; CMPAX5NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!X&†^+Ȋd2Ύk8Ԓp?ܖyF⚰~L鞶R X'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!: PUSH DE ;SAVE LAST PUSH BC ;SWAP SRC & SRC2 PTRS EX (SP),HL ; ; FETCH SRC2 DATA ; LD DE,(A3_BNK) CALL GETMEM NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMONNNNNNNNNNNNNNNN rNNNNNNNNNNNNNNNNNNNNNNER TO RIGHT COLUMN ; ; SAVE PTR FOR CHAR DISPLAY ; PUSH HL ; ; TOP OF HEX DISPLAY LOOP ; DIS2: ; ; DISPLAY MEMO1NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!BANK IN E LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA POP DE ; AND A,7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP A,' ' JNNNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNNNY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC RNNNNNNNNNNNNNNNNN cNNNNNNNNNNNNNNNNNNNNN!L EXF POP DE ; LD (PLOC),DE ;PUT ADDR IN PC LOCATION LD A,(A1_BNK) LD (BNKLOC),A ; ; IF LAST CHAR == CR THEN NO MONNNNNNNNNNNNNNNNN %o=NNNNNNNNNNNNNNNNNNNNNN TABLE ; PUSH HL ;SAVE REGS NEEDED FOR GETMEM & PUTMEM EX DE,HL ;HL= PTR ; LD E,A ;E= BANK # CALL GETMEM PUSH AF iNNNNNNNNNNNNNNNNN +L2NNNNNNNNNNNNNNNNNNNNN!LD HL,BP_RSTV LD DE,(BNKLOC) LD C,0C3H CALL PUTMEM INC HL LD C,LOW REST CALL PUTMEM INC HL LD C,HIGH REST CALLWNNNNNNNNNNNNNNNNN LNNNNNNNNNNNNNNNNNNNNNN LD C,A ; ; FETCH SRC1 DATA ; EX (SP),HL LD DE,(A1_BNK) CALL GETMEM LD B,A ;GET SOURCE 1 DATA ; ; IF SRC1 == NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNRY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 169NNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNN!RY DATA IN HEX ; PUSH DE ;FETCH BANK # IN E LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA FROM E:HL TO A CALL HEX1 ;DISPLAY>$NNNNNNNNNNNNNNNNNN YNNNNNNNNNNNNNNNNNNNNNNR C,DIS5 ; CP A,7EH JR C,DIS6 ; DIS5: LD C,'.' ;ELSE OUTPUT '.' ; DIS6: CALL CO ; ; IF DONE THEN ABORT ; CALL HNNNNNNNNNNNNNNNNN zNNNNNNNNNNNNNNNNNNNNNNEG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START__+NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNRE ARGS ; LD A,C ;IF LAST = CR THEN EXIT CP A,CR JR Z,GO3 ; ; GET & SET UP TO NBKPTS BREAKPOINTS ; GO0: LD B,NBKPTNNNNNNNNNNNNNNNNN &:nNNNNNNNNNNNNNNNNNNNNNN ;SAVE DATA ; ; SET BREAKPOINT TO RESTART INSTRUCTION WHILE HERE ; PUSH BC ;SAVE LAST CHAR IN C LD C,BP_RSTI CALL PU{`NNNNNNNNNNNNNNNNN ,եNNNNNNNNNNNNNNNNNNNNNN PUTMEM ; ; THE FOLLOWING CODE RESTORES THE Z80 REGISTERS & EXECUTES THE 'PC' ; ; FIRST RESTORE THE Z80 ALTERNATE REGISTdNNNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNN!SRC2 THEN EXIT ; LD A,C CP A,B ;IF S2=S1 THEN EXIT JR Z,CMPB ; ; ELSE DISPLAY SRC1 & SRC2 DATA ; PUSH AF ;SAVE SV-NNNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNN! BYTES PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINTNNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNNS LD HL,TLOC ;POINT TO TRAP STORAGE ; GO1: PUSH BC ;SAVE BREAKPOINTS REMAINING ; ; GET BREAKPOINT FROM USER ; PUSH wFNNNNNNNNNNNNNNNNN ' _NNNNNNNNNNNNNNNNNNNNNNTMEM POP BC ; POP AF ;RESTORE DATA EX DE,HL ;DE= PTR POP HL ;HL= RECORD.DATA PTR ; LD (HL),A ;STORE DATA INTO TAhNNNNNNNNNNNNNNNN -NNNNNNNNNNNNNNNNNNNNNNERS ; LD HL,(FPLOC) PUSH HL POP AF ; LD BC,(CPLOC) LD DE,(EPLOC) LD HL,(LPLOC) EX AF,AF' EXX ; ; NOW DO TH NNNNNNNNNNNNNNNNN ZNNNNNNNNNNNNNNNNNNNNNN2 DATA ; CALL LADRB ;OUTPUT S1BNK:S1ADR S1DTA- LD A,B CALL DASH1 ; CALL BLK ;DISPLAY S2BNK:S2ADR S2DTA POP AF E |NNNNNNNNNNNNNNNNN yNNNNNNNNNNNNNNNNNNNNNNR>[ ] ; ;---------------------------------------------------------------------------- ; DISP: ; ; GET ARGUMENT>BNNNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNNT COLUMN ; CALL BLK ;MAKE COLUMNS ; ; IF NOT ON EVEN 16 BYTE BOUNDARY THEN REPEAT ; LD A,L ;READY FOR NEW LINE? AN1gNNNNNNNNNNNNNNNNN ?NNNNNNNNNNNNNNNNNNNNNNE ; JR DIS1 ; ; ; PARTIAL HEX LINE, START ASCII ON PROPER COLUMN ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRP*NNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNNN(S) AT ; BP1 & OPTIONAL BP2. ; ;---------------------------------------------------------------------------- ; GOTO: ; tNNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNNHL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR ; ; IF BREAKPOINT == 0 (NONE) THEN STOP ; GNNNNNNNNNNNNNNNN (aNNNNNNNNNNNNNNNNNNNNN!BLE INC HL ;NEXT TABLE RECORD ; ; IF NO MORE ARGS THEN DONE WITH BREAKPOINTS ; GO2: LD A,C CP A,CR POP BC ;BP COUNrNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNNNE Z80 & 8080 REGISTERS ; LD IY,(YLOC) LD IX,(XLOC) ; LD DE,(ELOC) LD BC,(CLOC) ; ; DO STACK ; LD SP,(SLOC) ; NNNNNNNNNNNNNNNNN iNNNNNNNNNNNNNNNNNNNNNNX (SP),HL PUSH AF LD DE,(A3_BNK) CALL LADR CALL BLK POP AF EX (SP),HL ; CALL HEX1 ;OUTPUT S2DTA ; CMPB: POP BCFNNNNNNNNNNNNNNNNN JNNNNNNNNNNNNNNNNNNNNNNS ; CALL EXLF ;GET BLOCK LIMITS ; ; TOP OF LINE LOOP ; DIS1: ; ; DISPLAY START ADDRESS ; PUSH DE LD DE,(A1_BN"oNNNNNNNNNNNNNNNNN lNNNNNNNNNNNNNNNNNNNNNND A,0FH JR NZ,DIS2 ; ; DONE WITH HEX DISPLAY, DO ASCII ; DIS3: ; ; RESTORE PTR ; POP HL ; ; POSITION START ON@9NNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNLSP JR DIS3 ;---------------------------------------------------------------------------- ; ; GOTO COMMAND ; ; GOTO C[NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; IF NO ARGS THEN USE CURRENT REGISTERS ; CALL PCHK JR C,GO3 ; ; IF NO GOTO ADDRESS THEN SET BREAKPOINTS ; JR Z,G9NNNNNNNNNNNNNNNNN #śNNNNNNNNNNNNNNNNNNNNN! LD A,(A1_BNK) ;INSURE 0 WASN'T SPEC'D OR A,D OR A,E JR Z,GO2 ; ; ELSE STORE BREAKPOINT ADDRESS IN TABLE ; LD (HL),&9NNNNNNNNNNNNNNNN )*PNNNNNNNNNNNNNNNNNNNNNNT JR Z,GO3 ; ; IF MORE ALLOWED THEN CONTINUE ; DJNZ GO1 ; ; GOT ALL ARGS, EXECTUTE THE GOTO ; GO3: CALL CRLF ;6NNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNNN; PUSH PC ON STACK FOR RETURN INSTRUCTION TO EXECUTE ; LD BC,(BNKLOC) XRROM 9 ; LD HL,(PLOC) PUSH HL ; XRROM 8 ;NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNN $\ NNNNNNNNNNNNNNNNNNNNNNE ;SAVE BP ADDR INC HL ; LD (HL),D INC HL ; LD A,(A1_BNK) LD (HL),A INC HL ; ; SAVE EXISTING LOCATION DATA INNNNNNNNNNNNNNNNNN *NNNNNNNNNNNNNNNNNNNNN!NEW LINE FOR PGM ; POP HL ;GET RID OF WINIT RETURN ADDRESS ; ; INSERT RESTART BREAKPOINT VECTOR TO RESTORE ROUTINE ; `NNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNN! ; IF RETURNED THEN ERROR ; JP WINIT ;---------------------------------------------------------------------------- ;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺W%^,Ȋe4Ўl9Ԓo= ٖuCߚ{I枵R![)NNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNNN ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; IƏNNNNNNNNNNNNNNNNN 8NNNNNNNNNNNNNNNNNNNNNNUT TO PORT ; OUT (C),E ; ; DONE ; JP WINIT ;---------------------------------------------------------------------kNNNNNNNNNNNNNNNNN  BNNNNNNNNNNNNNNNNNNNNNN LD C,A ; ; IF DESTINATION == PROTECTED THEN IGNORE ; LD A,H ;IF IN MONITOR RAM THEN IGNORE CP A,HIGH MONSTK JR NC,NNNNNNNNNNNNNNNNN >NNNNNNNNNNNNNNNNNNNNNNTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; RO^;rNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!EXIT ; ; ELSE IF LAST CHAR == LINE FEED THEN BACK UP ; CP A,LF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 ; ; ELSE GET &NNNNNNNNNNNNNNNNN SNNNNNNNNNNNNNNNNNNNNN!STS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ;gNNNNNNNNNNNNNNNNN %X NNNNNNNNNNNNNNNNNNNNN! ; ; IF NOT DONE THEN REPEAT ; CALL HILOX JR NC,MTEST1 ; ; DONE ; JP WINIT ;-------------------------------NNNNNNNNNNNNNNNNN +{NNNNNNNNNNNNNNNNNNNNNNIF AT END OF TABLE THEN DONE ; INC (HL) ;DOES NOT CHANGE IN ROM VERSION RET Z ; ; MAKE USER REQUEST BIT 7 SAME AS TABLNNNNNNNNNNNNNNNNN |NNNNNNNNNNNNNNNNNNNNNN ; ;---------------------------------------------------------------------------- ; INPT: ; ; GET PORT ARG FM}NNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNN------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, *NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!MOVNO ; OR A,A ;ELSE IF NOT PAGE 0 THEN OK JP NZ,MOVYES ; LD A,L ;ELSE IF IN 1ST 40H BYTES THEN IGNORE CP A,40H JR [NNNNNNNNNNNNNNNNN nNNNNNNNNNNNNNNNNNNNNNNUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;----------------NNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNNN STORE VALUE ; PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR ; PUSH BC LD C,E LD DǮNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;------------------------------------------------MNNNNNNNNNNNNNNNNN & ^NNNNNNNNNNNNNNNNNNNNNN--------------------------------------------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY 2hNNNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNNE'S ; JP P,XAB ;SORT OUT BIT 7 OF TABLE OR A,80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND A,7FH ;RESET BIT 7 ; ; mNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNNNROM USER ; CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC ; ; FETCH PORT DATA ; IN EWNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNN!SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;--------------------[NNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN C,MOVNO ; MOVYES: CALL PUTMEM ; MOVNO: EX (SP),HL ;HL= SRC PTR POP BC ;BC= DEST PTR POP DE ;DE= LAST PTR ; ; BNNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------ ; SUBS: ; ; GET ADDRESS FROM USER ; CALL EXPR1 ;GET ADDR MNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNN!E,(A1_BNK) CALL PUTMEM ;LOAD VALUE ; POP BC ; ; IF LAST CHAR == CR THEN DONE ; LD A,C ;IF DELIM = CR THEN DONE C NNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNN---------------------------- ; MTEST: ; ; GET ARGS FROM USER ; CALL EXLF ;HL= START, DE= LAST ; ; TOP OF LOOP ; wNNNNNNNNNNNNNNNNN '>oNNNNNNNNNNNNNNNNNNNNN!THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;uNNNNNNNNNNNNNNNNN -ѤNNNNNNNNNNNNNNNNNNNNNN USER REQUESTED REGISTER SHOULD MATCH NOW ; XAC: ; ; IF CHAR NOT MATCH THEN EXIT ; CP A,(HL) JR NZ,XAA ;NO MATCH, TNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNNN,(C) JP BITS2 ;OUTPUT VALUE ;---------------------------------------------------------------------------- ; ; OUTPUT D NNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------- ; MOVE: ; ; GET ARGS FROM USER ; CALL EXPR3 ;HL= SRC, DE= SRCFNNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNNN NEXT, IF SRC <= LAST THEN REPEAT ; CALL HILOXB JR NC,MOV1 ; ; ELSE DONE ; JP WINIT ;--------------------------dNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN CALL CRLF ;START ON NEW LINE POP HL ; ; TOP OF LOOP ; SUB1: ; ; DISPLAY EXISTING CONTENTS ; LD DE,(A1_BNK) C5NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!P A,CR JP Z,WINIT ; ; NEXT LOCATION ; SUB2: INC HL ;PTR = PTR + 2 INC HL ; ; PREVIOUS LOCATION ; SUB3: DEC HL wNNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNNMTEST1: PUSH DE LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA PUSH AF ;SAVE IT CPL ;INVERT BITS LD C,A CALL PUTMEM ;c$|NNNNNNNNNNNNNNNNN (.QNNNNNNNNNNNNNNNNNNNNNNr= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;-------------+NNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNNNRY AGAIN ; ; CHARS MATCH, SET UP TO DISPLAY CURRENT DATA ; CALL BLK CALL PRTVAL CALL DASH ; ; GET USER DATA ; HNNNNNNNNNNNNNNNNN ^NNNNNNNNNNNNNNNNNNNNNNATA TO PORT COMMAND ; ; O ; ;----------------------------------------------------------------aNNNNNNNNNNNNNNNNN  }NNNNNNNNNNNNNNNNNNNNN!_LAST, BC= DEST ; ; TOP OF MOVE LOOP ; MOV1: ; ; MOVE 1 BYTE OF DATA ; PUSH DE ;SAVE LAST PTR PUSH BC ;SAVE DESNNNNNNNNNNNNNNNNN \NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------- ; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT\NNNNNNNNNNNNNNNN ;NNNNNNNNNNNNNNNNNNNNNNALL GETMEM CALL DASH1 ; ; GET NEW VALUE FROM USER ; CALL PCHK ;GET NEW VALUE ; ; IF NONE THEN RETURN ; JP C,WINTNNNNNNNNNNNNNNNNN 1NNNNNNNNNNNNNNNNNNNNN!;PTR = PTR - 1 ; ; IF ON MODULO 8 BOUNDARY, START ON NEW LINE & DISPLAY ADDRESS ; LD A,L AND A,7 CALL Z,LADRB ; ; npNNNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNN ; TEST BY XORING WITH DATA, RESULT SHOULD BE 0 ; CALL GETMEM XOR A,C ; ; IF NOT 0 THEN DISPLAY DATA ('1' BIT IS ERRNNNNNNNNNNNNNNNNNN )`NNNNNNNNNNNNNNNNNNNNNN--------------------------------------------------------------- ; ; CHARS NOT MATCH, TRY NEXT TABLE ENTRY ; XAA: INC HL 8NNNNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNN!CALL PCHK ; ; IF USER ENTERED CR THEN DONE ; RET C ; ; IF NO CHANGE THEN EXIT ; JR Z,XF ; ; GET NEW DATA FROM xNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN------------ ; OUPT: ; ; GET ARGS FROM USER ; CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC ; ; OUTPNNNNNNNNNNNNNNNNNN  sNNNNNNNNNNNNNNNNNNNNNNT PTR ; LD DE,(A1_BNK) ;FETCH SRC DATA CALL GETMEM ; EX (SP),HL ;HL= DEST PTR LD DE,(A3_BNK) ;STORE SRC DATA IN DEST NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY EN NNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNIT ;IF CHAR = CR THEN RETURN ; ; IF LAST CHAR == SPACE OR COMMA THEN SKIP STORE ; JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN NNNNNNNNNNNNNNNNN bNNNNNNNNNNNNNNNNNNNNN! CONTINUE ; JR SUB1 ;---------------------------------------------------------------------------- ; ; MTEST COMMAND TENNNNNNNNNNNNNNNNN $k 0 THEN REPEAT FOR LOW BYTE ; DJNZ PV1 ; ; ELSE DONE ; RET ;********************************{$NNNNNNNNNNNNNNNNN } NNNNNNNNNNNNNNNNNNNNN! BC= ARG3 ; ;**************************************************************************** ; EXPR3: ; ; BUMP ARG COUNT TOIaNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN STACK= PARAMETERS ; ;**************************************************************************** ; ; ; EXPR: LD HL,A1_BNˍNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNET NEXT ; ; ; NOT HEX NUMBER ENTERED, IF COLON THEN SAVE ACCUMULATOR IN BANK REGISTER ; EX2: LD A,C CP A,':' JR NZ,bNNNNNNNNNNNNNNNN ]pNNNNNNNNNNNNNNNNNNNNNNN COLUMN PROCEDURE ; ENTRY- A= NUMBER OF COLUMNS - 1 {0..15} ; EXIT - A, B= ? ; ;*******************************************bNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN; SAVE DATA ; PUSH AF ; ; DISPLAY ADDRESS ; CALL LADRB ;OUTPUT ADDR ; ; DISPLAY DATA ; POP DE LD E,D CALNNNNNNNNNNNNNNNNN $NNNNNNNNNNNNNNNNNNNNNNS1 ; ; DONE ; RET ;**************************************************************************** ; ; DISPLAY REGISTNNNNNNNNNNNNNNNNN *>NNNNNNNNNNNNNNNNNNNNNN REG THEN EXIT ; ; ELSE WORD VALUE ; INC B ; ; IF BIT 6 == 0 THEN DIRECT ADDRESS ; RLCA JR NC,PV1 ; ; ELSE INNNNNNNNNNNNNNNNN 0?NNNNNNNNNNNNNNNNNNNNNN******************************************** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS THE CHAR BACK ; TO THE NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!Z(Ć`.ʊf5юn;֒r?ۖxFᚮ|I垳O뢹V$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHwNNNNNNNNNNNNNNNNNNNNN! CONSOLE DEVICE. ; EXIT - A= CHAR ; ;**************************************************************************** ; ; 1STNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; A = ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HILO: ; ; BUMP HL ; INC NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN+ 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; A= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ONNNNNNNNNNNNNNNN-fNNNNNNNNNNNNNNNNNNNNNN ; HILOX: ; ; BUMP & TEST HL ; CALL HILO RET C ;DONE IF CF ; ; NOT DONE, CHECK FOR CONSOLE ABORT ; CALL CIS INNNNNNNNNNNNNNNNN­NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++ ; NIBBLE: ; ; IF CHAR < 0 THEN RETURN ERROR ; SUB A,'0' RET C ; ; IF CHAR > F THEN 1NNNNNNNNNNNNNNNNNh NNNNNNNNNNNNNNNNNNNNNNHE CARRY FLAG. ; EXIT - A= CHAR ; NC, ZF= DELIMITER (' ' OR ',') ; CF, ZF= CR ; NC. NZ= ANY OTHER ; ;++++++++++++++++++.NNNNNNNNNNNNNNNN%UNNNNNNNNNNNNNNNNNNNNNNded precomp thresholds to disk parameter command. ; Added inhibit implied seek bit specification. ; ; 1.3 - 7 JUN 88 GRH ;V@NNNNNNNNNNNNNNNN+ZNNNNNNNNNNNNNNNNNNNNN!== ; ; THE COMMON IOPB STRUCTURE ; NOTE: ; A MINIMUM OF THE 1ST 10 BYTES UP TO STATUS FOR MOST IOPBS ARE ; TRANSFERREDɈNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN ENTRY DISPLAYS A '-' FIRST ; DECHO: CALL DASH ;OUTPUT A '-' ; ; GET CHAR FROM USER ; ECHO: CALL CONI ; ; ECHO TONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHL ; ; IF HL == 0 THEN RETURN CF ; LD A,H ;IF HL = 0 THEN RETURN CF OR A,L SCF RET Z ; ; ELSE CP DE,HL ; LD}$NNNNNNNNNNNNNNNNXINNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++ ; HILOXB: ; ; BUMP BC 1ST ; INC BC ; ; FALL INTO HILOX ; ;+++++++++++++++++++++++++++++++++PNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;IF NO CONSOLE BREAK THEN OR A,A ; RETURN RET Z ; ; IF CHAR != CONTROL-S THEN BREAK ; CALL CONI ;IF CHAR <> CTRL-SNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRETURN ERROR ; CP A,'G' - '0' CCF RET C ; ; IF CHAR <= 9 THEN RETURN OK ; CP A,'9' - '0' + 1 CCF RET NC ; ; rnNNNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; PCHK: ; ; GET CHAR FROM USER ; CALL ECHO P2C: ; ; INNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN THEN BREAK CP A,CTRLS SCF RET NZ ; ; ELSE PAUSE ; CALL CONI ;ELSE WAIT FOR NEXT CHAR ; ; RETURN CONTINUE ; KNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! ELSE IF CHAR < A THEN RETURN ERROR ; SUB A,'A' - '9' - 1 CP 10 ; ; ELSE RETURN CHAR - 7 ; RET ;++++++++++++++,\NNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNN9 ;START CLOCK ; ENDM NNNNNNNNNNNNNNNN'7NNNNNNNNNNNNNNNNNNNNNNAUG 88 GRH ; Update IOPB structure to include byte count for buffer size. Was in ; PBST4O but not included in input section NNNNNNNNNNNNNNNN- NNNNNNNNNNNNNNNNNNNNNN====================================================== STRUCT 0 ; ; ARGUMENT DATA XFERRED TO CONTROLLER ; PB_CMDO DS 1 ;fNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILO FUNCTION INCREMENTS HL. IT THEN CHECKS FOR (& DISA}NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++ ; ; HILOXB ROUTINE BUMPS BC & HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROU$\NNNNNNNNNNNNNNNNNx5NNNNNNNNNNNNNNNNNNNNNN SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SNNNNNNNNNNNNNNNNғNNNNNNNNNNNNNNNNNNNNNN OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; NIBBLE FUNCTION CONVERTS NNNNNNNNNNNNNNNN=XNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; PCHK FUNCTION READS A CHARACTER FROM THE CONSOLE, THEN CHEC$NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNE MODULE DEFINES THE SYSTEM COMMON IOPB FOR SMART ; I/O DEVICES. ; IT CURRENTLY ONLY SUPPORTS DISK I/O. ; ;***************NNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNN. ; Change '?' prefixes to 'PB_' prefixes. Needed due to CP/M 3.x data ; reserves '?' prefix. ; *** NOTE: THIS CHANGE IS NOTpNNNNNNNNNNNNNNNNN.^NNNNNNNNNNNNNNNNNNNNN!COMMAND BYTE (SEE BELOW) PB_DRVO DS 1 ;DRIVE PB_TRKO DS 2 ;TRACK PB_SECO DS 2 ;SECTOR BIT 15= SIDE (EXCEPT HARD DISK) PB_FLGxNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!LLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPA{NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGSNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNN!ET ; ACCORDINGLY. IT ALSO CHECKS FOR A KEYBOARD ABORT. ; ENTRY- HL = PTR ; DE = LAST PTR ; EXIT - HL = HL + 1 ; CF = (HL ˢNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTHE ASCII CHARACTERS 0-9 & A-F TO THEIR ; EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN RANGE, THE CARRY BIT IS ; SET TO FLNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNN!KS IT FOR A ; SPECIAL CHARACTER. IF IT IS NOT A SPECIAL CHARACTER, A NON-ZERO CONDITION ; IS RETURNED. IF IT IS A SPECIAL CHARNNNNNNNNNNNNNNNNN#(NNNNNNNNNNNNNNNNNNNNNN************************************************************* ; ; REVISIONS: ; ; 1.0 - 22 FEB 86 GRH ; Excerpted from then{NNNNNNNNNNNNNNNNN)8NNNNNNNNNNNNNNNNNNNNNN COMPATABLE WITH OLD VERSIONS!! *** ; ; 2.01 11-27-90 GRH ; Add PB_INHX flag definition. ; ;*****************************q3NNNNNNNNNNNNNNNNN/mNNNNNNNNNNNNNNNNNNNNNNO DS 1 ;FLAGS PB_DMAO DS 2 ;XFER ADDRESS PB_DMAXO DS 1 ;EXTENDED XFER ADDRESS ; ; ARGUMENT TO CONTROLLER AND RESULT RETURN(NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRED TO DE & THE FLAGS SET ACCORDINGLY. ; ENTRY- HL= PTR ; DE= LAST LOCATION ; EXIT - HL = HL + 1 ; CF = HL == 0 OR HL > DE6|NNNNNNNNNNNNNNNNN >+NNNNNNNNNNNNNNNNNNNNNN SET ; ACCORDINGLY. IT ALSO TESTS FOR A KEYBOARD ABORT. ; ENTRY- HL = PTR ; DE = LAST PTR ; EXIT - HL = HL + 1 ; BC = BC NNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNN== 0) OR (HL > DE) OR (CONSOLE ABORT) ; A= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAG THE ERR. ; ENTRY- A= ASCII-HEX CHAR ; EXIT - A= BINARY VALUE OF 'CHAR' ; ;+++++++++++++++++++++++++++++++++++++++++++++++>NNNNNNNNNNNNNNNNN[:NNNNNNNNNNNNNNNNNNNNNNACTER, A ZERO CONDITION IS RETURNED. ; FURTHER, IF THE CHARACTER IS A CR, THE CARRY FLAG IS SET. A BLANK OR A ; COMMA RESETS TxNNNNNNNNNNNNNNNNN$dNNNNNNNNNNNNNNNNNNNNNN 'JDDCONT.DEF' file & released. ; ; 1.1 - 24 SEP 86 GRH ; Changed structure and commands. ; ; 1.2 - 31 DEC 86 GRH ; AdNNNNNNNNNNNNNNNNN*kNNNNNNNNNNNNNNNNNNNNNN*********************************************** ;==========================================================================}NNNNNNNNNNNNNNNNN0~NNNNNNNNNNNNNNNNNNNNNNED ; WRITES= BYTE COUNT WRITES= BYTE COUNT ACTUALLY WRITTEN ; READS= 0 READS= BYTE COUNT ACTUALLY READ ; PB_BCNTO DS 2 ;BYTovNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN끸U$]+NJb1͎j8Ԓo> ٖtBޚyH䞱~L碴QNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNN! SUBTTL BOOT ROM EXTERNAL DEFINITIONS ;**************************************************************************** ; ; THISNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN================ ; ; ENTRY POINTS ; ;============================================================================ STRUCT NNNNNNNNNNNNNNNN :*NNNNNNNNNNNNNNNNNNNNN!================= ; ; CONSOLE OUTPUT STUB IS USED BY ERROR ROUTINES TO TALK TO THE CONSOLE ; DS 3 ;===================NNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNN================================== ; ; WRITE SECTOR COMMAND ; ;===========================================================/NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN====================== ; ; FORMAT TRACK COMMAND ; ;=======================================================================NNNNNNNNNNNNNNNNNN_;NNNNNNNNNNNNNNNNNNNNNNNED NUMBER OF BYTES FROM LAST SECTOR TO INDEX ;============================================================================vHNNNNNNNNNNNNNNNNN%eNNNNNNNNNNNNNNNNNNNNNN===================================================== ; ; ROM # ; ;========================================================3NNNNNNNNNNNNNNNN+jNNNNNNNNNNNNNNNNNNNNNNUPPORTED IOSET DS 3 ;UNSUPPORTED MEMCK DS 3 ;UNSUPPORTED IODEF DS 3 ;UNSUPPORTED I/O CONTROL MR_REST DS 3 ;BREAKPOINT ENT;rNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN INCLUDE FILE DEFINES THE DISK BOOT ROM EXTERNAL DEFINITIONS ; ;**************************************************************ܵNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!0F800H ;START OF ROM ; ; COLD START ENTRY ; DK_COLD DS 3 ;============================================================~NNNNNNNNNNNNNNNNNoyNNNNNNNNNNNNNNNNNNNNNN========================================================= ; ; EXECUTE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - AF= 0,ZNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN================= PB_WRITC EQU 2 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 2 ;PBDRVO BYTE DRIVE NUMBER ;PBTRKO WORD TRACK NUzNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN===== PB_FRMTC EQU 3 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 3 ;PBDRVO BYTE DRIVE NUMBER ;PBTRKO WORD TRACK NUMBER {0..N} TNNNNNNNNNNNNNNNNN JNNNNNNNNNNNNNNNNNNNNN! ; ; READ ADDRESS COMMAND ; ;============================================================================ PB_RADDC EQU 4 -NNNNNNNNNNNNNNNN&6NNNNNNNNNNNNNNNNNNNNNN==================== MR_RNUM EQU 0 ;============================================================================ ; ; ROMJdNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN!RY MR_LSTSTS DS 3 ;RETURN LIST DEVICE STATUS ; EXIT - A= 0: NOT READY, /0: READY FOR CHAR DS 3 ;SPARE DS 3 ;SPARE ENbvNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN************** ; ; REVISION HISTORY: ; ; 1.0 6 JUL 88 GRH ; First cut. ; ; 1.1 26 SEP 88 GRH ; Change all '?' symbolHNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN================ ; ; DUMMY CONSOLE INPUT VECTOR ONLY RETURNS ; DS 3 ;=================================================*NNNNNNNNNNNNNNNNN\HNNNNNNNNNNNNNNNNNNNNNNF: NO ERROR ; DK_DSKX DS 3 ENDM ;============================================================================ ; ; mNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMBER {0..N} ;PBSECO WORD SECTOR NUMBER {1..N} ;PBFLGO BYTE FLAGS ; ; 7 0 ; | | | | | | | | | ; ^ ^ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;PBSECO WORD HEAD IN PROPER BIT POSITION(S) ;PBFLGO BYTE (HARD DISK): INTERLEAVE FACTOR IN BITS 6..0 ; USE SET DISK PARAMS (:NNNNNNNNNNNNNNNN!yNNNNNNNNNNNNNNNNNNNNNN SUBTTL MONITOR ROM EXTERNAL DEFINITIONS ;**************************************************************************** ; ; IINNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN FUNCTIONS ; ;============================================================================ STRUCT 0F800H ;START OF ROM MR_MNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNRN FIRMWARE VERSION COMMAND ; ;============================================================================ PB_VERSC EQU 8 ;NNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNN!MAND: 0: SET PARAMS FROM SECT. BUFR & DISABLE LOGON ; 1: RETURN PARAMS IN SECT. BUFR & DISABLE LOGON ; 2: SET PARAMS FR NNNNNNNNNNNNNNNNNN {NNNNNNNNNNNNNNNNNNNNNNDUCED WRITE CURRENT CYLINDER ; BYTE (FLOPPY): FIRST TRACK FOR MEDIUM PRECOMP SELECT ; (HARD DISK): LOW BYTE OF FIRST TRACKNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNNBYTE RETURNED ERROR CODE ;PBST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE X ;=================================================qNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN PB_STDVC EQU 12 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 12 ;PBDRVO BYTE DRIVE NUMBER {0..3} ;PBTRKO WORD X ;PBSECO WORD XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN============== ; ; RETURN DRIVE STATUS COMMAND ; ;========================================================================NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!ECO WORD X ;PBFLGO BYTE X ;PBDMAO WORD X ;PBDMAXO BYTE X ;PBBCNT WORD 0 ; ;PBSTATO BYTE RETURNED ERROR CODE (0= NONE) ;PB^aNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN; ;PBSTATO BYTE RETURNED ERROR CODE (ALLWAYS 0) ;PBST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE X ;PBST4O BYTE X ;PBST5O BYTE XqNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNN ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 8 ;PBDRVO BYTE X ;PBTRKO WORD X ;PBSECO WORD X ;PBFLGO BYTE X ;PBDMAO WORD X ;PBD[NNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNNOM SECT. BUFR & ENABLE LOGON ; 3: RETURN PARAMS IN SECT. BUFR & ENABLE LOGON ;PBDMAO WORD XFER ADDRESS OF STRUCTURE ;PBDMcNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN FOR PRECOMP ; BYTE (FLOPPY): FIRST TRACK FOR HIGH PRECOMP SELECT ; (HARD DISK): HIGH BYTE OF FIRST TRACK FOR PRECOMP ; B_(NNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN=========================== ; ; SEEK TRACK COMMAND ; ;===================================================================='NNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNN ;PBFLGO BYTE SUBCOMMAND: 0: SET PARAMETERS FROM SECTOR BUFFER ; 1: RETURN PARAMETERS IN SECTOR BUFFER ;PBDMAO WORD XFER AdNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!==== PB_RDSTC EQU 13 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 13 ;PBDRVO BYTE DRIVE NUMBER ;PBTRKO WORD X ;PBSECO WORD X .NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE SUBCOMMAND, OUTPUT EIA BAUD RATE: ; 0: LEVEL STATUS ONLY 1: 600 (5" ONLY) ; 2: W!NNNNNNNNNNNNNNNNN,NyNNNNNNNNNNNNNNNNNNNNN! SUBTTL COMMON IOPB ERROR CODES ;============================================================================ ; ; COMMA ; ;---------------------------------------------------------------------------- ; MOVE: ; ; GET ARGSNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN (1) to set clock calendar, and ; write clock buffer function (2) to set clock time. ; 1-21-91 GRH ; Fix bug in clock timehNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNROM SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT pNNNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNNN; PB_IDERR EQU 10H ;ID READ ERROR PB_UNCDAT EQU 11H ;UNCORRECTABLE DATA PB_NOIDAM EQU 12H ;ID ADDRESS DATA MARK NOT FOUND PNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNNDRESS IS BEYOND MAX ADDR PB_ILFUN EQU 22H ;ILLEGAL FUNCTION FOR THE SPECIFIED DRIVE ; ; TYPE 3: MISCELLANEOUS ; PB_RAMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDDITIONAL DATA FROM SELF TEST: ; PBST20= 0: TRACK REGISTER FAILED, ; 1: SECTOR REGISTER FAILED ; PBST3O= 0: BIT OK, 1: BI'NNNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNNN " " " ) ; 03 - STATUS PHASE EXPECTED ; 04 - MESSAGE PHASE EXPECTED ; 05 - STATUS PHASE EXPECTED DURING REQUEST SENSE COMMwNNNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNNN------------------------------ ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;-------------------NNNNNNNNNNNNNNNN <$NNNNNNNNNNNNNNNNNNNNNN FROM USER ; CALL EXPR3 ;HL= SRC, DE= SRC_LAST, BC= DEST ; ; TOP OF MOVE LOOP ; MOV1: ; ; MOVE 1 BYTE OF DATA ; NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN set function which set chip to 12 Hr format. ; VERSN EQU 122 ; ;***********************************************************+NNNNNNNNNNNNNNNNN,yINNNNNNNNNNNNNNNNNNNNN! ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EX NNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNNNB_NODAM EQU 13H ;DATA ADDRESS MARK NOT FOUND PB_RNF EQU 14H ;RECORD NOT FOUND PB_SEEK EQU 15H ;SEEK ERROR ; PB_WPROT EvNNNNNNNNNNNNNNNNN ZNNNNNNNNNNNNNNNNNNNNNNERR EQU 30H ;CONTROLLER RAM TEST FAILED PB_ROMERR EQU 31H ;CONTROLLER ROM TEST FAILED PB_ECCBAD EQU 32H ;ECC HARDWARE FAILED ;LNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNT(S) FAILED ; PB_MTRON EQU 45H ;MOTOR ON FF DIAGNOSTIC FAILURE ; PBST2O= BLSTS ; PB_IFF EQU 46H ;INTERRUPT FF DIAGNOSTI-NNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNAND ; 06 - MESSAGE PHASE EXPECTED DURING REQUEST SENSE COMMAND ; PB_PARTY EQU 4BH ;PARITY ERROR ; ; TYPE 5: SYSTEM ERR NNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN--------------------------------------------------------- ; OUPT: ; ; GET ARGS FROM USER ; CALL EXPR ;GET DATA INTO E,hNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN TITLE M5b MISCELLANEOUS I/O DRIVER ROM LIST NOCOND ;************************************************************************JNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN***************** SUBTTL DECLARATIONS ;============================================================================ ; ;*MNNNNNNNNNNNNNNNNN-JxNNNNNNNNNNNNNNNNNNNNNNTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A=I|'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNQU 17H ;WRITE PROTECTED PB_CDAT EQU 18H ;ERROR BURST CORRECTED (THIS IS NOT A HARD ERROR!!) PB_BDBLK EQU 19H ;BAD BLOCK FOU$NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; ; TYPE 4: CONTROLLER ERRORS SENSED BY FIRMWARE ; PB_ILDRV EQU 40H ;ILLEGAL DRIVE REQUESTED PB_ILRAT EQU 41H ;ILLEGAL BsNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNNC FAILURE ; PBST2O= BLSTS ; PB_INTR EQU 48H ;ILLEGAL INTERRUPT PB_HNDSK EQU 49H ;CONTROLLER HANDSHAKE FAILURE ; SUB-ERR1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!ORS ; PB_CNP EQU 50H ;CONTROLLER FOR DRIVE IS NOT IN SYSTEM PB_BADPB EQU 51H ;BAD IOPB FORMAT OR DATA ; END FILE e-NNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNN PORT # INTO C POP DE POP BC ; ; OUTPUT TO PORT ; OUT (C),E ; ; DONE ; JP WINIT ;------------------------CaNNNNNNNNNNNNNNNNN"ZFNNNNNNNNNNNNNNNNNNNNN!**** ; ; MISC. I/O DRIVER ROUTINES FOR M5b ; *INCLUDE B:ZBMH122.HDR ;******************************************************xNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE CLOCK.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ; ;==v>NNNNNNNNNNNNNNNNN.+NNNNNNNNNNNNNNNNNNNNNN FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP NNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNND PB_BDFMT EQU 1AH ;BAD FORMAT ERROR PB_ACCALT EQU 1CH ;ILLEGAL (DIRECT) ACCESS TO ALTERNATE TRACK PB_ALTUSD EQU 1DH ;ALTERNNNNNNNNNNNNNNNNN 8NNNNNNNNNNNNNNNNNNNNNNAUD RATE REQUESTED ERROR PB_FDVR EQU 42H ;FORMAT DRIVER ERROR ; PB_FDCER EQU 44H ;FDC CHIP ERROR ; PBST1O= FDC STATUS: ; BNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNORS IN PBST1O ; 01 - TIMEOUT WHILE WAITING FOR SASI BUSY ; 02 - TIMEOUT WHILE WAITING FOR SASI ACK TO CLEAR ; 03 - TIMEOUT WHNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;----------------------------------------------------------------+JNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNN---------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE NNNNNNNNNNNNNNNNN#iwNNNNNNNNNNNNNNNNNNNNNN********************** ; ; REVISION HISTORY: ; ; 1.0 - 23 SEP 83 GRH ; Initial version transferred from CBIOS routines. NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!========================================================================== LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBO+HNNNNNNNNNNNNNNNNN/,NNNNNNNNNNNNNNNNNNNNNNPUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK FNNNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNNNATE TRACK ALREADY USED PB_ALTNMK EQU 1EH ;ALTERNATE TRACK NOT MARKED AS ALTERNATE PB_ALTBAD EQU 1FH ;ALTERNATE TRACK EQUALS BNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!IT# SEEK COMMAND READ WRITE ; 0 FDC BUSY = = ; 1 INDEX DATA REQUEST = ; 2 TRACK 0 LOST DATA = ; 3 CRC ERROR = = ; NNNNNNNNNNNNNNNNNN_NNNNNNNNNNNNNNNNNNNNN!ILE WAITING FOR SASI REQUEST ; PB_SYNC EQU 4AH ;CONTROLLER PROTOCOL SYNC FAILURE ; SUB-ERRORS IN PBST1O (STATUS BYTE CAUSING BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!------------ ; INPT: ; ; GET PORT ARG FROM USER ; CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M DZNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN; ; 1.22 11-25-90 GRH ; Modify slightly for Shared ROM ZMON V. 1.22. ; ; 1-7-91 GRH ; Change read clock buffer functionWHNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!ARD.DEF *INCLUDE CLOCK.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU CLK_RNUM ;ROM # OF THIS HNNNNNNNNNNNNNNNNN0?WNNNNNNNNNNNNNNNNNNNNNN INC SP RET ;**************************************************************************** ; ; COLD INIT ONLY SWITCHES T6NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!Y&_-Ȋc1͎i7Ԓq@ݖxG嚳O랹W%\*NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!O RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ; SET STACK ;YzNNNNNNNNNNNNNNNNN[,NNNNNNNNNNNNNNNNNNNNNNUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRS]NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0: RNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++uNNNNNNNNNNNNNNNN{PNNNNNNNNNNNNNNNNNNNNN!L CLK_SET ; ; PROCESS YEAR ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SET ; ; DONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNT ; ; PROCESS HOURS ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L SET 3,A ;SET 24 HR FORMAT BIT (HOURS M\NNNNNNNNNNNNNNN%;NNNNNNNNNNNNNNNNNNNNNN CALL GET2D LD H,1 ;MASK {0..19} CALL GETN LD B,A ; ; PROCESS YEAR ; CALL GET2D LD H,0FH ;MASK {0..99} CALL GNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNLL GET2D LD H,3 ;MASK {0..39} CALL GETN LD C,A ; ; RETURN MINUTES IN A ; POP AF RET ;++++++++++++++++++++++ |NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF !@NNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS J#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNETURN ROM VERSION # DW CLKSCAL ;1: SET CLOCK CALENDAR DW CLKSTIM ;2: SET CLOCK TIME DW CLKCAL ;3: RETURN CLOCK CALENDARm;NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN+++++ ; ; SET CLOCK CALENDAR FUNCTION #1 ; ENTRY- B= DATE ; D= MONTH ; E= YEAR ; L= DAY OF WEEK ; EXIT - A= 0 ; BC, ~NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!E, TURN ON CLOCK ; JP CLKSTRT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET CLBNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNNSD) INC C CALL CLK_SET ; ; START CLOCK ; JP CLKSTRT ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++)NNNNNNNNNNNNNNNN&nNNNNNNNNNNNNNNNNNNNNNNETN ; ; RETURN VALUES ; LD C,A ;RETURN YEAR IN C POP AF ;RETURN DAY IN A RET ;++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN,0NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CLOCK DATA FUNCTION #5 ; ENTRY- C= CLOCK REGISTER # ; EXIT1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL I"NNNNNNNNNNNNNNNNN x#NNNNNNNNNNNNNNNNNNNNN!R NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,F1=NNNNNNNNNNNNNNNNNNNNNNDE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSCAL: ; ; STOP CLOCK ; PUS]NNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNNOCK TIME FUNCTION #2 ; ENTRY- B= SECONDS ; D= MINUTES ; E= HOURS ; EXIT - A= 0 ; BC, DE= ? ; ;++++++++++++++++++++++++rNNNNNNNNNNNNNNNN!lNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++ ; ; RETURN CALENDAR FUNCTION #3 ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; DE= ? ; ;]dNNNNNNNNNNNNNNNNN']NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION #4 ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; DE1NNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN - A= REGISTER DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKRETR: GETD: ; ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS IS THE COLD START IpZNNNNNNNNNNNNNNNNN -pNNNNNNNNNNNNNNNNNNNNNNUNTABL ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; RESTORE ARGUMEXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHANGE DW ISTHERE ;7: RETURN BOARD PRESENT STATUS DW CLKSTOP ;8: STOP CLOCK DW CLKSTRT ;9: START CLOCK ; MAXFUNS EQU (TxNNNNNNNNNNNNNNNNNknNNNNNNNNNNNNNNNNNNNNN!H BC CALL CLKSTOP ; ; SET UP PTR TO REGS ; LD C,CLK_WEEK ; ; PROCESS DAY OF WEEK ; LD A,L CALL H2BCD ;A= LSD,zNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTIM: ; ; STOP CLOCK ; CALL CLKSTOP ; ; SET UP TO SET EACNNNNNNNNNNNNNNNN"?NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: ; ; WAIT FOR CLOCK DATA TO BE STABLNNNNNNNNNNNNNNNNN(MNNNNNNNNNNNNNNNNNNNNNN= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: ; ; WAIT FOR CLOCK TO STABUNNNNNNNNNNNNNNNNN.RNNNNNNNNNNNNNNNNNNNNNN TELL CLOCK WHICH REGISTER TO READ ; LD A,C SET CLK_RD,A ;SET READ BIT OUT (CLK_CMD),A ; ; DELAY >= 5us PER DATA SHE/=NNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN!NIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ; ; OUTPUT SIGN-ON jgNNNNNNNNNNNNNNNNN ANNNNNNNNNNNNNNNNNNNNN!NT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$ - FUNTABL) / 2 SUBTTL ROM FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; R !NNNNNNNNNNNNNNNNX_NNNNNNNNNNNNNNNNNNNNNN L= MSD ; CALL CLK_SET ; ; PROCESS DATE ; INC C POP HL ;WAS BC (DATE) LD A,H CALL H2BCD ; CALL CLK_SET ; 6;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!H REGISTER ; LD C,CLK_SECL ;SET REGISTER # ; ; PROCESS SECONDS ; LD A,B CALL H2BCD ; CALL CLK_SET ; LD A,L IuNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNE FOR AWHILE ; CALL CLKWAIT ; ; FETCH DAY OF WEEK & SAVE ; LD C,CLK_WEEK CALL GETD AND A,7 ;MASK OFF GARBAGE {0..NNNNNNNNNNNNNNNNN)~NNNNNNNNNNNNNNNNNNNNNNILIZE ; CALL CLKWAIT ; ; PROCESS SECONDS ; LD C,CLK_SECL CALL GET2D LD H,7 ;MASK {0..79} CALL GETN PUSH AF ;NNNNNNNNNNNNNNNNN/cNNNNNNNNNNNNNNNNNNNNNNET ; EX (SP),HL EX (SP),HL ; ; RETURN WITH DATA ; IN A,(CLK_DATA) ;RETURN DATA RET ;+++++++++++++++++++++++++ONNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNNNMESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' Misc. Drivers V. ' PVERS VERSN DM CR,LF SNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!ERR: LD A,-1 OR A,A RET ;############################################################################ ; ; MONITOR F)NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++vmNNNNNNNNNNNNNNNNHaNNNNNNNNNNNNNNNNNNNNN!LD A,L INC C CALL CLK_SET ; ; PROCESS MONTH ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CAL%NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNC C CALL CLK_SET ; ; PROCESS MINUTES ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SENNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN7} LD L,A ; ; PROCESS DAY ; INC C CALL GET2D LD H,3 ;MASK {0..39} CALL GETN PUSH AF ; ; PROCESS MONTH ; \NNNNNNNNNNNNNNNN*+NNNNNNNNNNNNNNNNNNNNN!SAVE ; ; PROCESS MINUTES ; CALL GET2D CALL GETN ;USE SAME MASK AS ABOVE {0..79} LD B,A ; ; PROCESS HOURS ; CA]NNNNNNNNNNNNNNNNN0.NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT FOR CLOCK TO CHANGE FUNCTION #6 ; EXIT - A= 0: OK, /0: BOARD NOTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺T"\)Ŋa0͎i7Ғo= ږtC|J垴R!X&NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNƺNNNNNNNNNNNNNNNNNNNNNN PRESENT ; C= CLK_SECL ; B= LO SECONDS DATA ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}NNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNNLK_DATA) ; ; IF UPPER BITS NOT DRIVEN THEN BOARD IS NOT THERE ; AND A,11000000B ; ; ADJUST SENSE ; RET ;+++++_NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!; ; CLEAR HOLD ; XOR A,A OUT (CLK_DATA),A ; ; CLEAR COMMAND ; OUT (CLK_CMD),A ; ; DONE ; RET SUBTTL ?NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! ; D= HI BCD # ; H= MASK FOR HI BYTE ; EXIT - A= NUMBER ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++X!NNNNNNNNNNNNNNNNL`NNNNNNNNNNNNNNNNNNNNNNBINARY DATA ; EXIT - A= UNITS DIGIT ; L= TENS DIGIT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN),A ; LD A,C OUT (CLK_CMD),A ; ; DONE ; RET ;******************************************************************`X~NNNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNN********************************************************* ; CO: XCROM MF_CO ; ; DONE ; RET ENDNNNNNNNNNNNNNNNN+/NNNNNNNNNNNNNNNNNNNNNN,0FFH ;IF NOT LAST BANK THEN REPEAT CP A,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; LD A,IOBYTV ;SET TO INITIAL IOBYTJ_NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+ ; CLKWAIT: ; ; IF BOARD NOT THERE THEN RETURN ERROR ; CALL ISTHERE RET NZ ; ; FETCH CURRENT SECONDS ; LD C,C NNNNNNNNNNNNNNNNN|"NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; STOP CLOCK FUNCTION #8 ; EXIT - A, B= ? ; ;++++&NNNNNNNNNNNNNNNNքNNNNNNNNNNNNNNNNNNNNNNFUNCTIONS & PROCEDURES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN 2 BCD DIGITS gdNNNNNNNNNNNNNNNN:'NNNNNNNNNNNNNNNNN&YNNNNNNNNNNNNNNNNNNNNN! WINDOW, IF PRESENT OUT (DD_PRT3),A OUT (DD_PRT5),A OUT (DD_PRT8),A ; ; SET MEMORY BANK ; LD A,DEFBNK OUT (BNKREGcNNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNE VALUE LD (IOBYTE),A ; ; SET BANK STACK ; LD (THIS_STK),SP ; ; SET FUNCTION CALL RESTART ; LD HL,FUNENT LD (M+9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!LK_SECL CALL GETD AND A,CLK_DMSK ;MASK OFF UNWANTED BITS LD B,A ; ; WAIT UNTIL SECONDS CHANGE ; CLKRWT: CALL GETD NNNNNNNNNNNNNNNNN ONNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTOP: ; ; PUT HOLD ON CLOCK ; LD A,[1 SHL݈NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!FROM CLOCK FUNCTION ; ENTRY- C= CLOCK REGISTER # ; EXIT- DE= DIGITS ; A= HIGH DIGIT ; C= C + 2 ; ;++++++++++++++++++++++#}NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNH HIGH BYTE ; LD A,D ; ; MASK OFF NON-NUMERICAL BITS ; AND A,H ; ; MULTIPLY TENS DIGIT BY 10 & ADD TO UNITS ; L!NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNS -= 10 ; SUB A,10 INC L JR H2BCDL ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; INNNNNNNNNNNNNNNN!\NNNNNNNNNNNNNNNNNNNNNNST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** NNNNNNNNNNNNNNNN'jNNNNNNNNNNNNNNNNNNNNNN),A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,003FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD @~NNNNNNNNNNNNNNNNN-1NNNNNNNNNNNNNNNNNNNNNNFUNRSV),HL ; ; INIT ROMS (I/O) ; LD HL,[CHR_RNUM SHL 8] + 1 ;CHAR PUSH HL CALL XROMF POP HL ; LD HL,[DEB_RNUM SHL[NNNNNNNNNNNNNNNNN9ONNNNNNNNNNNNNNNNNNNNNN AND A,CLK_DMSK CP A,B JR Z,CLKRWT ; ; DONE, RETURN 0 ; LD B,A XOR A,A RET ;++++++++++++++++++++++++++++++++pNNNNNNNNNNNNNNNNN @NNNNNNNNNNNNNNNNNNNNN! CLK_HOLD] OUT (CLK_DATA),A ; ; DELAY >= 150us FROM HOLD ; LD B,20 ;DELAY >= 150us FROM HOLD ; CLKSDL: EX (SP),HL NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GET2D: ; ; FETCH LOW DIGIT ; CALL GETD LD E,A ; ; FETCH NNNNNNNNNNNNNNNNN\^NNNNNNNNNNNNNNNNNNNNNND B,A ;SET CNT LD A,C ;GET UNITS DIGIT JR Z,NOTENS ;IF (TENS & MASK) == 0 THEN RETURN UNITS ; LD C,10 ;ELSE ADD TENS D!}NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! ; SET CLOCK DIGIT PROCEDURE ; ENTRY- A= BCD DATA ; C= COMMAND ; EXIT - A= COMMAND ; ;++++++++++++++++++++++++++++++++++++ HNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN ; PRTS: ; ; TOP OF PRINTING LOOP ; LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 PUSH HL CALL CO POP NNNNNNNNNNNNNNNNN(zNNNNNNNNNNNNNNNNNNNNNNB,16 ;64 BYTES ; INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET STACK ; LD SP,MONSTK ; ; SET MEMORY BANK CONSTANT uNNNNNNNNNNNNNNNNN.bNNNNNNNNNNNNNNNNNNNNNNL 8] + 1 ;DEBUGGER PUSH HL CALL XROMF POP HL ; LD HL,[DK_RNUM SHL 8] + 1 ;DISK PUSH HL CALL XROMF POP HL ; L NNNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IF BOARD PRESENT FUNCTION #7 ; EXIT - A,L= 0: THERE, /0: NOT THERE ; NNNNNNNNNNNNNNNNN )qNNNNNNNNNNNNNNNNNNNNNNEX (SP),HL DJNZ CLKSDL ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHIGH DIGIT ; INC C CALL GETD LD D,A ; ; PRESETUP FOR NEXT TIME ; INC C ; ; DONE ; RET ;+++++++++++++++]gNNNNNNNNNNNNNNNNNooNNNNNNNNNNNNNNNNNNNNN!IGIT ; TENSLP: ADD A,C DJNZ TENSLP ; ; DONE CONVERTING, RESTORE & RETURN ; NOTENS: POP BC ; RET ;+++++++++++++?NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++ ; CLK_SET: ; ; OUTPUT DATA ; SET CLK_HOLD,A ;KEEP CLOCK STOPPED OUT (CLK_DATxaNNNNNNNNNNNNNNNN#>NNNNNNNNNNNNNNNNNNNNNNHL ; BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL JR Z,PRTS ; ; DONE ; RET ;***********************************NNNNNNNNNNNNNNNNN)INNNNNNNNNNNNNNNNNNNNN!; LD (THIS_BNK),A ;A STILL HAS DEFAULT BANK # LD (CURBNK),A ; ; INIT ALL BANKS ; LD E,A ;START WITH ALL Z80 BANKS NNNNNNNNNNNNNNNNNN/SNNNNNNNNNNNNNNNNNNNNN!D HL,[CLK_RNUM SHL 8] + 1 ;MISC PUSH HL CALL XROMF POP HL ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-O*ZNNNNNNNNNNNNNNNNNN_-NNNNNNNNNNNNNNNNNNNNNN;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISTHERE: ; ; FETCH CLOCK DATA ; IN A,(CsNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN+ ; ; START CLOCK FUNCTION #9 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTRT: NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BCD NUMBER TO BINARY FUNCTION ; ENTRY- E= LO BCD # "NNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BINARY NUMBER TO BCD DIGITS FUNCTION ; ENTRY- A= gNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNA),A ; ; OUTPUT REGISTER # ; LD A,C OUT (CLK_CMD),A ; ; STROBE DATA INTO REGISTER ; SET CLK_WRT,A OUT (CLK_CMDNNNNNNNNNNNNNNNNN$?NNNNNNNNNNNNNNNNNNNNNN***************************************** ; ; SEND CHAR TO SYSTEM CONSOLE PROCEDURE ; ENTRY- C= CHAR ; ;*******************q%NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNLD HL,THIS_BNK ;POINT TO LOCATION TO STORE BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMEM ; INC E ;NEXT BANK ; LD AwNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNN CALL PRTS ; ; EXECUTE THE DEBUGGER ; MAINLP: LD SP,MONSTK LD HL,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL kNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!Y'Æ`.ˊh5юn< ْvD}L蚶RힼY'\*nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNN! TITLE M5b MISCELLANEOUS I/O DRIVER ROM LIST NOCOND ;************************************************************************JNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNN!***************** SUBTTL DECLARATIONS ;============================================================================ ; ;*MNNNNNNNNNNNNNNNNN SNNNNNNNNNNNNNNNNNNNNN!TERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A=I|NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL I"NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!R NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,F1<|NNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNN DATA DW CLKTIM ;4: RETURN CLOCK TIME DATA DW CLKRETR ;5: RETURN CLOCK REGISTER DATA DW CLKWAIT ;6: WAIT FOR CLOCK TO CcNNNNNNNNNNNNNNNNN%MNNNNNNNNNNNNNNNNNNNNNNDE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSCAL: ; ; STOP CLOCK ; PUS]NNNNNNNNNNNNNNNN+nNNNNNNNNNNNNNNNNNNNNNNOCK TIME FUNCTION #2 ; ENTRY- B= SECONDS ; D= MINUTES ; E= HOURS ; EXIT - A= 0 ; BC, DE= ? ; ;++++++++++++++++++++++++NNNNNNNNNNNNNNNNNmNNNNNNNNNNNNNNNNNNNNN!**** ; ; MISC. I/O DRIVER ROUTINES FOR M5b ; *INCLUDE B:ZBMH122.HDR ;******************************************************xNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNNACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE CLOCK.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ; ;==v>NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP NNNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNN!NITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS IS THE COLD START IpZNNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNNUNTABL ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; RESTORE ARGUMEXNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNHANGE DW ISTHERE ;7: RETURN BOARD PRESENT STATUS DW CLKSTOP ;8: STOP CLOCK DW CLKSTRT ;9: START CLOCK ; MAXFUNS EQU (TNNNNNNNNNNNNNNNNN&ONNNNNNNNNNNNNNNNNNNNNNH BC CALL CLKSTOP ; ; SET UP PTR TO REGS ; LD C,CLK_WEEK ; ; PROCESS DAY OF WEEK ; LD A,L CALL H2BCD ;A= LSD,zNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTIM: ; ; STOP CLOCK ; CALL CLKSTOP ; ; SET UP TO SET EACNNNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNNN********************** ; ; REVISION HISTORY: ; ; 1.0 - 23 SEP 83 GRH ; Initial version transferred from CBIOS routines. !NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!========================================================================== LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBO+BNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNPUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK FNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ; ; OUTPUT SIGN-ON jNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNNNT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNnNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN$ - FUNTABL) / 2 SUBTTL ROM FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; R !NNNNNNNNNNNNNNNN'+~NNNNNNNNNNNNNNNNNNNNNN L= MSD ; CALL CLK_SET ; ; PROCESS DATE ; INC C POP HL ;WAS BC (DATE) LD A,H CALL H2BCD ; CALL CLK_SET ; 6;NNNNNNNNNNNNNNNNN-ĵNNNNNNNNNNNNNNNNNNNNNNH REGISTER ; LD C,CLK_SECL ;SET REGISTER # ; ; PROCESS SECONDS ; LD A,B CALL H2BCD ; CALL CLK_SET ; LD A,L IuNNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNN!; ; 1.22 11-25-90 GRH ; Modify slightly for Shared ROM ZMON V. 1.22. ; ; 1-7-91 GRH ; Change read clock buffer functionWNNNNNNNNNNNNNNNNNN [NNNNNNNNNNNNNNNNNNNNNNARD.DEF *INCLUDE CLOCK.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU CLK_RNUM ;ROM # OF THIS NNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNN INC SP RET ;**************************************************************************** ; ; COLD INIT ONLY SWITCHES T6NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' Misc. Drivers V. ' PVERS VERSN DM CR,LF S[NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNERR: LD A,-1 OR A,A RET ;############################################################################ ; ; MONITOR F)NNNNNNNNNNNNNNNNN"ԋNNNNNNNNNNNNNNNNNNNNNNETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++vNNNNNNNNNNNNNNNNN(;@NNNNNNNNNNNNNNNNNNNNNNLD A,L INC C CALL CLK_SET ; ; PROCESS MONTH ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CAL%NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNNC C CALL CLK_SET ; ; PROCESS MINUTES ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SEPNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNN! (1) to set clock calendar, and ; write clock buffer function (2) to set clock time. ; 1-21-91 GRH ; Fix bug in clock timehNNNNNNNNNNNNNNNNN hNNNNNNNNNNNNNNNNNNNNNNROM SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT p NNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNN!O RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ; SET STACK ;YzNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!UBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRS]NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0: RNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++u=NNNNNNNNNNNNNNNNN)qNNNNNNNNNNNNNNNNNNNNNNL CLK_SET ; ; PROCESS YEAR ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SET ; ; DONNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNT ; ; PROCESS HOURS ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L SET 3,A ;SET 24 HR FORMAT BIT (HOURS M\NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! set function which set chip to 12 Hr format. ; VERSN EQU 122 ; ;***********************************************************+NNNNNNNNNNNNNNNNN bNNNNNNNNNNNNNNNNNNNNN! ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EX NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF !@NNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNN!Y- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS J#rNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNNNETURN ROM VERSION # DW CLKSCAL ;1: SET CLOCK CALENDAR DW CLKSTIM ;2: SET CLOCK TIME DW CLKCAL ;3: RETURN CLOCK CALENDARm;NNNNNNNNNNNNNNNN$~-NNNNNNNNNNNNNNNNNNNNNN+++++ ; ; SET CLOCK CALENDAR FUNCTION #1 ; ENTRY- B= DATE ; D= MONTH ; E= YEAR ; L= DAY OF WEEK ; EXIT - A= 0 ; BC, NNNNNNNNNNNNNNNNN*]"NNNNNNNNNNNNNNNNNNNNN!E, TURN ON CLOCK ; JP CLKSTRT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET CLBNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNSD) INC C CALL CLK_SET ; ; START CLOCK ; JP CLKSTRT ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++)NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN큻X&^,Ȋd3Ўl; גtCߖ{J暵QힻW$\+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN SUBTTL SOLID STATE MUSIC CB2 Z-80 CPU DEFINITIONS ;***************************************************************************1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTO CHECK FOR CHANGE ; OR A,A JR Z,DOMOVE ; ; ELSE OTHER COMMANDS NEED TO CHECK DATA TO STOP ; D3LP: IN A,(HDATA) ;IF XNNNNNNNNNNNNNNNNN cNNNNNNNNNNNNNNNNNNNNNN PUSH HL PUSH DE EXX POP DE POP HL LD BC,1000H ADD HL,BC EXX ; ; SET COUNT ; LD BC,1000H ; ; FETCH DATq^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************************************** ; ; REVISION STATUS: ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to NNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN ROMs not set up. ; 3.03 25 JUN 88 GRH ; Modify floppy boot to include new disk format with disk system tracks ; directorYNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNNn calls. All Rom ; functions are supported thru the Rom swap address from the Monitor ; Rom. ; 3.07 11-25-90 GRH ; ModifMNNNNNNNNNNNNNNNNN%z,NNNNNNNNNNNNNNNNNNNNN!============================================= ; ; CONSTANTS ; ;==========================================================fdNNNNNNNNNNNNNNNN+Y#NNNNNNNNNNNNNNNNNNNNNN ; ;============================================================================ LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE @NNNNNNNNNNNNNNNN]NNNNNNNNNNNNNNNNNNNNNN* ; ; Solid State Music model CB2, Z-80 CPU definitions ; ;*****************************************************************NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNDATA == 1 THEN READ CP A,2 JR C,DOREAD ; JR Z,DOWRITE ;ELSE IF DATA == 2 THEN WRITE ; XOR A,A ;ELSE QUIT WITHOUT ERROZQ|NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!A ; DOMOVLP: CALL GETBI ; ; STORE DATA ; EXX LD C,A CALL PUTBI EXX DEC BC LD A,C OR A,B JP NZ,DOMOVLP !NNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNresident prom version. ; Implement disk I/O driver functions & vectors and COMIOPB. ; Add error message output. ; Add prom # چ?NNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNNNy like the hard disk has (removed DCM & BLT loader). ; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change bootNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNy slightly for ZMON Vers. 1.22. ; 3.08 2-20-91 GRH ; Make IOPB Sector for ISHA the same as floppies (0..n -> 1..n-1). ; Th:NNNNNNNNNNNNNNNNN&/NNNNNNNNNNNNNNNNNNNNNN================== FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DISKԣNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN MONBOARD.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE B:ZBMF101.DEF \6SNNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNN*********** ; ; REVISION HISTORY: ; 1.0 - 8-13-91 GRH ; First cut. ; ;**************************************************?aNNNNNNNNNNNNNNNNN 9NNNNNNNNNNNNNNNNNNNNNNR RET ; ;---------------------------------------------------------------------------- ; ; CONTINUOUS WRITES COMMAND ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; ; ONLY DO THIS ONE ONCE ; XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN& drive passed in page 0. ; Drives now assigned the following logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..(NNNNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNNN system tracks directory references to new format. ; 3.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB for)NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNis also make 5" ISHA same as 8". ; Change references to THIS_BNK to CURBNK. ; ; 3.09 5-18-91 GRH ; Add hung ISHA reset cod:NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNN SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE DEFBFR EQU 0080H ;USE CPM DEFAUt)NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU DK_RNUM ;ROM # OF THIS ROM DSKBNK EQU 0FEH ;BANK # OF FLOPPY DISK CONTROLLE\nNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNN!************************** ;============================================================================ ; ; EXTENDED ADDRE/NNNNNNNNNNNNNNNNNN lNNNNNNNNNNNNNNNNNNNNNNDOWRITE: LD C,A ;USE ARGUMENT AS DATA CALL PUTB JR D3LP ; ;-------------------------------------------------------------WENNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNN!+ ; ; PRINT TEXT ON THE PRINTER COMMAND 0FH, EXERCISES THE I/O CAPABILITY ; ENTRY- A= PORT # ; (IOPB)= TEXT STRING PTR (TER4NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 8" Micromation Doubler (ISIS) ; 10..13= 3" JadeNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNN!mat. ; 3.06 26 SEP 88 GRH ; Add code for ISHA 5" Hard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; ENNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNe to driver. It was in BIOS. ; ; 3.10 8-26-91 GRH ; Remove drive manipulation overhead. ISHA v3.02A now masks off ; unuse=NNNNNNNNNNNNNNNNNN( pNNNNNNNNNNNNNNNNNNNNNNLT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ;===================NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!RS BTENTS EQU 86H ;BOOT DIRECTORY VALIDITY CONSTANT ;####################################################################-NNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNNSS PORT ; ;============================================================================ ; BNKPORT EQU 0FEH ]BNNNNNNNNNNNNNNNNN _NNNNNNNNNNNNNNNNNNNNNN--------------- ; ; CONTINUOUS READS COMMAND ; DOREAD: CALL GETB JR D3LP ; ; ;-------------------------------------NNNNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNNN TITLE M5b BANKED MONITOR DISK DRIVER ROM LIST NOCOND ;********************************************************************** NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN floppy ; 3.01 4 JUN 88 GRH ; Fix bug in ISHAX that prevented the clear controller command from ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8..B = 5" Jade floppy ; C..F = 5" ISHA Hard Disk ; 10..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3"NNNNNNNNNNNNNNNNN#ЊNNNNNNNNNNNNNNNNNNNNNNd bits. ; Fix problem with Clear Controller IOPB Command (drive == 0FFh). ; Move flag to track. ; VERSN EQU 310 ; ;****** NNNNNNNNNNNNNNNNN)?ANNNNNNNNNNNNNNNNNNNNN!========================================================= ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE JD@NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN######## ; ; PAGE 0 RESERVED AREA ; ;############################################################################ ORG 00!NNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++ ; DIAG3: ; ; SET UP PTRS ; LD HL,(IOPBL) LD DE,(IOPBXA) ; ; IF BLOCK MOVE THEN NO NEED aNNNNNNNNNNNNNNNN RNNNNNNNNNNNNNNNNNNNNNN--------------------------------------- ; ; BLOCK MOVE COMMAND TO LOW MEMORY ; DOMOVE: ; ; COMPUTE DESTINATION PTR ; :@NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN****** ; ; DISK CONTROLLER BOOTSTRAP DRIVER FOR M5B WITH ZMON MONITOR. ; *INCLUDE B:ZBMH122.HDR ;**************************ЃnNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN working. ; 3.02 12 JUN 88 GRH ; Change 'RET'urns in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because&&!NNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN Jade floppy ; Change ?xxx symbols to x_xx symbols. ; First interim version supporting Monitor functioNNNNNNNNNNNNNNNNN$INNNNNNNNNNNNNNNNNNNNNN********************************************************************** SUBTTL DECLARATIONS ;===============================NNNNNNNNNNNNNNNNN*jNNNNNNNNNNNNNNNNNNNNNNDCONT.DEF ;*INCLUDE ISHA.DEF ;*INCLUDE DISKS3.DEF ;*INCLUDE BDIR.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN40H ; ; BOOT VARIABLES ; DK_PROM DS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT BIOSNT D;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!W&]+Ɗc2Ύj9Ւq? ۖwE⚯|K瞴QW%NNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!S 2 ;BIOS ENTRY SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURINtNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNY SWITCHES TO RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ; NNNNNNNNNNNNNNNNN YNNNNNNNNNNNNNNNNNNNNNN DM CR,LF SUBTTL LOW MEMORY PROCEDURES ;**************************************************************************** ; ;h>NNNNNNNNNNNNNNNNyNNNNNNNNNNNNNNNNNNNNNNDESTINATION BANK ; B= SOURCE BANK ; EXIT - AF=BC=DE=HL= ? ; ;**************************************************************PjNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN++ ; GETB: XRROM MF_GMEM RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;+++++++++++++++++++++++++++++++++++++++++++++/NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNN!TRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; PUTS: PRTS: NNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNN*** ; ; PERFORM BANKED MEMORY BLOCK MOVE ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - AF=BC=DjDNNNNNNNNNNNNNNNNNZNNNNNNNNNNNNNNNNNNNNN!++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN TEST IOPB STATUS FOR ERROR ; E:HL= PTR TO IOPB DW DIS_PB ;3: DISPLAY IOPB DATA ; E:HL= PTR TO IOPB DW EX_IOPB ;|'NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNMATION (INTEL M2FM) ; 14..17 = 3" JADE FLOPPY ; ;-----------------------------------------------------------------------NNNNNNNNNNNNNNNNNN-_iNNNNNNNNNNNNNNNNNNNNN!IT JP C,M8BOOT ; CP A,18H ;IF 3" FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; ;-KxNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 0rNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN0 SUBTTL INITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS IS TH`NNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN ; ; SAVE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7(NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNE=HL= ? ; ;**************************************************************************** ; BMOVE: XRROM MF_BMOV RET NNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNNNH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL NNNNNNNNNNNNNNNNN"OWNNNNNNNNNNNNNNNNNNNNNN4: EXECUTE IOPB ; E:HL= PTR TO IOPB ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS ;++++++++++++++++++++++NNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN----- ; MBOOT: ; ; SAVE PROM # FOR BIOS ; LD A,C AND A,7 LD (DK_PROM),A ; ; EXTRACT DRIVE # FROM ARGUMENT ; Q|NNNNNNNNNNNNNNNNN. :NNNNNNNNNNNNNNNNNNNNNN--------------------------------------------------------------------------- ; ; ABORT RETURNS CONTROL TO THE MONITOR ROM WITH 6NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN ;BIAS UP PUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALaNNNNNNNNNNNNNNNN )NNNNNNNNNNNNNNNNNNNNN!E COLD START INIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ; ; O=BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN = 0 CALL CO ; LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA ; ; RESTORE & RETURN ; POP BC RET \NNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY BYTE FUNCTION ; ENTRY-3rNNNNNNNNNNNNNNNNNZNNNNNNNNNNNNNNNNNNNNN! LD H,(HL) LD L,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS NNNNNNNNNNNNNNNNN#|fNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ;DNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNREPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT ; LD A,B OR A,A JP NZ,ABORT ; ; +NNNNNNNNNNNNNNNNNN/9 NNNNNNNNNNNNNNNNNNNNN!ERROR FLAG (CF) SET ; ;---------------------------------------------------------------------------- ; ABORT: SCF ;HAVE MONrNNNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNNNANCE STACK INC SP RET ;**************************************************************************** ; ; COLD INIT ONLkd NNNNNNNNNNNNNNNN jNNNNNNNNNNNNNNNNNNNNNNUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' M5b Disk Driver V. ' PVERS VERSN 6NNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; SETUP BANKS FOR BLOCK MOVE ; ENTRY- C= 5NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN E:HL= PTR TO LOCATION OF DATA ; EXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; DKRET: RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET ;############################################$NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;---------NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN SAVE DRIVE # AS LOGIN DRIVE FOR BIOS ; LD A,C LD (LOGINBYTE),A LD (DK_PROM + 1),A ; ; NOW VECTOR TO DISK BOOT ROUTIN1NNNNNNNNNNNNNNNNN0*FNNNNNNNNNNNNNNNNNNNNNNITOR PRINT ERROR MESSAGE JP DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TESNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN큻W$\+Ɗa/ˎg5Ӓn< זsAܚwE➰~M颸T"NNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!T IOPB STATUS FOR ERROR FUNCTION 2 ; ENTRY- E:HL= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Lx~NNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNN2) ; ; IF NO ERROR THEN RETURN IT ; OR A,A RET Z ; ; ELSE FALL INTO ERROR OUTPUT ; ;+++++++++++++++++++++++++rNNNNNNNNNNNNNNNN nNNNNNNNNNNNNNNNNNNNNNNL,(IOPBPTR) LD DE,(IOPBPTR + 2) LD B,PB_SIZE ; DBTE1: PUSH DE PUSH HL CALL GETB ; CALL HTOA ; CALL SPACE ;DISPLsmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISK EXECUTER FUNCTION ; ;++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!C,ISHAX5 ; ; ELSE FALL INTO SELECT ERROR ; ;**************************************************************************NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN; CONTROLLER NOT SENSED ERROR ; EXIT - AF= -2 ; (IOPB.PB_STAT)= CONTROLLER NOT PRESENT ERROR ; ;***************************y%NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PB_DRVO),A ; LD A,-1 ;SET CONTROLLER RESET FUNCTION LD (IOPB + PB_TRKO),A NNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN! ; LD HL,(DEFBFR + BD_SIOSS) LD A,H LD H,0 LD (IOPB + PB_SECO),HL LD L,A LD (IOPB + PB_TRKO),HL ; ; READ 1ST BINNNNNNNNNNNNNNNNN~NNNNNNNNNNNNNNNNNNNNNN+++++++++++++ ; TST_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO LOCAL FUNCTI1NNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION 3 ; ENTRY- E:HL= IOPB PTR ; ;+++++++++++NNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNN!AY SEPARATOR ; POP HL POP DE INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ; CALm= NNNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPkNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNN** ; ; ILLEGAL DRIVE REQUESTED ; EXIT - AF= -2 ; (IOPB.PB_STAT)= ILLEGAL COMMAND ERROR ; ;*******************************pNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN************************************************* ; JCNP: LD (IX + PB_STATO),PB_CNP JR DSKERR SUBTTL JADE 5" & 8" FLD NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN ; LD HL,IOPB LD (IOPBPTR),HL LD A,(CURBNK) LD (IOPBPTR + 2),A CALL JADEX8 CALL DQERR JP NZ,ABORT ; ; PREPAREɰNNNNNNNNNNNNNNNNN,[hNNNNNNNNNNNNNNNNNNNNN!OS SECTOR INTO BUFFER ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIONNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNON ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB STATUS FOR ERROR FUNCTIXNNNNNNNNNNNNNNNNN {NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DIS_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E"NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNL SPACE CALL SPACE ;OUTPUT PORT # LD A,(DDPORT) CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE LD A,(DDADNNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNNB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++^NNNNNNNNNNNNNNNNjNNNNNNNNNNNNNNNNNNNNNN********************************************* ; JSELERR: LD HL,(IOPBPTR) ;CALCULATE PTR TO STATUS LD DE,PB_STATO ADD HL,A[NNNNNNNNNNNNNNNNN!-4NNNNNNNNNNNNNNNNNNNNNNOPPY CONTROLLER DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" JADE FLOPPY BOOT RNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN IOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PB_DRVO),A ; LD A,ID_SECT ;SET SECTOR yNNNNNNNNNNNNNNNN-hYNNNNNNNNNNNNNNNNNNNNN!S 1ST SECTOR ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; LD NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNON 2 ; ENTRY- (IOPBPTR)= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DQERR: NNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNN LD (IOPBPTR + 2),A ; ; FALL INTO DISPLAY ROUTINE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDR + 1) CALL HTOA LD A,(DDADDR) CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR ;+++++++++++++++lNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++ ; DSKX: ; ; FETCH DRIVE # ; LD HL,(IOPBPTR) INC HL LD A,(HL) ; ; IF JADE 8" FLOPPY THEN GNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNDE LD (HL),PB_ILCMD ; ; FALL INTO DISK ERROR ; ;********************************************************************NNNNNNNNNNNNNNNNN"xgNNNNNNNNNNNNNNNNNNNNNN ; THIS ROUTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BKNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNN!LD (IOPB + PB_SECO),A ; ; LOG ON DRIVE ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; READ THE DIRECTORY SECTOR ; mPNNNNNNNNNNNNNNNN.= NNNNNNNNNNNNNNNNNNNNN!HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP LOAD ADDRESS LD DE,(IOPBkNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; ; RESTORE PTRS ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) ; ; CALCULATE PTR TO STATUS ; LD A,PB_STATO ADD A,L LvwuNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN+++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION ; ENTRY- (IOPBPTR)= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION 4 ; ENTRY- E:HL= IOPB PTR ; EXIT - I^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNO EXECUTE IT ; SUB A,4 JP C,JADE8 ; ; ELSE IF SASI 8" HARD DISK THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX8 ; ; ExgyNNNNNNNNNNNNNNNNNmNNNNNNNNNNNNNNNNNNNNN!******** ; ; COMMON ERROR CODE ; EXIT - AF= -2 ; ;*************************************************************************D NNNNNNNNNNNNNNNNN#KVNNNNNNNNNNNNNNNNNNNNNNIOS FROM THE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOS. ; ENTRY- C, (LOGINBYTE)= DRIVE ; ;++++++++++++++++++++++NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN LD A,BD_SEC LD (IOPB + PB_SECO),A LD A,PB_READC LD (IOPB + PB_CMDO),A CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ;XnsNNNNNNNNNNNNNNNNN/;NNNNNNNNNNNNNNNNNNNNNN + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF --COUNT != 0 THEN REPEAT DEC (HL) JR NZ,JAD NNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNND L,A LD A,0 ADC A,H LD H,A ; ; FETCH DATA ; CALL GETB ; ; RESTORE PTR ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + fqNNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ ; DBERR: ; ; DISPLAY HEADER ; LD HL,DERM CALL PUTS ; ; DISPLAY IOPB DATA ; LD H9NNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNNNOPB.STATUS= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EX_IOPB: ; NNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNNLSE IF JADE 5" FLOPPY THEN GO EXECUTE IT ; SUB A,4 JP C,JADE5 ; ; ELSE IF SASI 5" THEN GO EXECUTE IT ; SUB A,4 JP #0NNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN*** ; DSKERR: LD A,-2 OR A,A RET ;**************************************************************************** ; NNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F8BOOT: ; ; RESET THE CONTROLLER ; LD HL,CLRIOPB CALL IIOPB NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN! IF NOT DIRECTORY SECTOR THEN ERROR ; LD A,(DEFBFR) CP A,BTENTS JP C,DKRET ; ; ELSE FETCH THE LOCATION FOR THE BIOSqNNNNNNNNNNNNNNNNN0vNNNNNNNNNNNNNNNNNNNNNNRDB IF DEBUG ; ; RETURN TO MONITOR ; OR A,A ;RETURN NO ERROR JP DKRET ELSE ; ; EXECUTE THE BIOS COLD STARNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!X&_,Ɋc0ˎh6ђm;֖q?ܚxF㞱~L颶R NNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNjVNNNNNNNNNNNNNNNNNNNNN!T ENTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROM 8 JP DKRET ENDIF ;+++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,(IOPBPTR) INC HL LD (HL),B ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++q\NNNNNNNNNNNNNNNN /;NNNNNNNNNNNNNNNNNNNNNN; FALL INTO JADE EXECUTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE ۵ NNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNX LD IX,(IOPBPTR) ; ; IF COMMAND == CLEAR THEN EXIT ; LD A,(IX + PB_CMDO) CP A,PB_CLRC JP NZ,JNOCLR8 ; ; IF ALL NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNUNT LD BC,(DDPORT) LD A,DD_MB1 OUT (C),A PUSH HL ;SAVE SRC PTR ; LD B,(IX + PB_DMAXO) ;SET BANKS LD C,DSKBNK CALsLNNNNNNNNNNNNNNNNNNJ*NNNNNNNNNNNNNNNNNNNNNNT ;WAIT FOR COMPLETION JP NZ,JERET ;IF ERROR THEN RETURN ERROR ; ; COMMAND EXECUTED, XFER RESULTS FUNCTION ; SELECT CONNNNNNNNNNNNNNNNN%tNNNNNNNNNNNNNNNNNNNNN!ION ADDRESS ; LD E,(IX + PB_DMAO) LD D,(IX + PB_DMAO + 1) ; ; FETCH XFER COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PNNNNNNNNNNNNNNNN+{NNNNNNNNNNNNNNNNNNNNN!SIZE TOO BIG ERROR ; JXERR: LD (IX + PB_STATO),PB_BADPB ;PASS BACK ERROR JR JDONE ; ; ; RETURN ERROR STATUS EXIT ; EqNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK READ IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS eNNNNNNNNNNNNNNNNzhNNNNNNNNNNNNNNNNNNNNNNTHE JADE FLOPPY DISK IOPB COMMON FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; C= CONTROLLER PORT ADDRESS ; EXIT - AF= 0: NO EnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DRIVES THEN HARD RESET ; LD A,(IX + PB_DRVO) INC A JP NZ,JNOCLR8 ; LD A,DD_BGN JR JDOCMD ; ; ; FETCH SOURCE AD$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNL BNKSEL ; POP HL ;SRC PTR POP BC ;COUNT LD DE,(DDADDR) ;DEST PTR CALL BMOVE ; ; EXECUTE THE COMMAND ; JEX: ; :dNNNNNNNNNNNNNNNN _NNNNNNNNNNNNNNNNNNNNNNMMAND BLOCK WINDOW ; LD BC,(DDPORT) LD A,DD_MB0 OUT (C),A ; ; XFER IOPB STATUS TO HOST ; LD BC,(IOPBPTR + 2) ;SET + NNNNNNNNNNNNNNNN&'NNNNNNNNNNNNNNNNNNNNNNB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO UPLOAD ; LD A,C OR A,B JR Z,JDONE ; ; ELSE IF COUNT < 1024 THEN UPLOAD SEC]NNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN!NTRY- A= ERROR CODE ; JERET: LD (IX + PB_STATO),A JR JDONE ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ONNNNNNNNNNNNNNNNN 4NNNNNNNNNNNNNNNNNNNNNN ; A= DRIVE# -4 ; EXIT - AF= 0: NO ERRORS ; C= CONTROLLER PORT ADDRESS ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++wNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX8R: LD HL,0 LD (IFNNNNNNNNNNNNNNNNIYNNNNNNNNNNNNNNNNNNNNNNRRORS ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX: ; ; SAVEDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDRESS FROM IOPB ; JNOCLR8: LD L,(IX + PB_DMAO) LD H,(IX + PB_DMAO + 1) ; ; FETCH COUNT ; LD C,(IX + PB_BCNTO) LD 8rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; OPEN WINDOW TO COMMAND BUFFER ; LD BC,(DDPORT) ;FETCH PORT # LD A,DD_MB0 ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT 1024 THEN ERROR ; LD A,C OR A,A JR NZ,JXERR ; ; UPL,oNNNNNNNNNNNNNNNNN-)NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; EXIT - AF= 0: OK, /0: ERROR ; .~rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 5" ENTRY ; JADE5: LD C,DD_PRT5 JP JADEC ; ; ; JADE 8" ENT= NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNOPB + PB_BCNTO),HL ; ; FALL INTO LOCAL READ FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!)aNNNNNNNNNNNNNNNNZNNNNNNNNNNNNNNNNNNNNNN PORT # ; LD A,C LD (DDPORT),A ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(C) INC A ;0FFH IF NOT THERE JP Z,JCNP NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNB,(IX + PB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO DOWNLOAD ; LD A,C OR A,B JR Z,JEX ; ; ELSE IF COUNT < 1024 THEN DwNNNNNNNNNNNNNNNNNyNNNNNNNNNNNNNNNNNNNNN! (C),A ; ; XFER THE IOPB TO THE CONTROLLER ; LD A,(IOPBPTR + 2) ;SET SRC BANK LD B,A LD C,DSKBNK CALL BNKSEL ; LqNNNNNNNNNNNNNNNN"9NNNNNNNNNNNNNNNNNNNNN! BC,PB_BCNTO ADD HL,BC EX DE,HL ; LD BC,PB_SIZE - PB_BCNTO ; CALL BMOVE ; ; IF UPLOAD INHIBITED THEN SKIP IT ; NNNNNNNNNNNNNNNNN((NNNNNNNNNNNNNNNNNNNNNNOAD SECTOR DATA ; JXUP: PUSH DE ;DEST PTR PUSH BC ;BYTE CNT ; LD C,(IX + PB_DMAXO) LD B,DSKBNK CALL BNKSEL ; POP0NNNNNNNNNNNNNNNNN.|NNNNNNNNNNNNNNNNNNNNNNC= PORT # OF CONTROLLER ; DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JWAITNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRY ; JADE8: LD C,DD_PRT8 ; ; COMMON INITIAL CODE ; JADEC: ADD A,4 ;BIAS DRIVE BACK UP LD B,A ; LD A,(HL) ;SAVE ~6rNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN++++++++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS NNNNNNNNNNNNNNNNNi%NNNNNNNNNNNNNNNNNNNNNN; ; COMPUTE JADE CONTROLLER BASE ADDRESS ; DEC A ;FETCH ADDRESS SELECT SWITCH DATA AND A,DD_SASW RLCA OR A,HIGH DD_SNNNNNNNNNNNNNNNNNÃNNNNNNNNNNNNNNNNNNNNN!OWNLOAD DATA ; LD A,B CP A,4 JR C,JDOWN ; ; ELSE IF COUNT > 1024 THEN ERROR, SECTOR SIZE TOO BIG ; LD A,C OR A,AjNNNNNNNNNNNNNNNN,HNNNNNNNNNNNNNNNNNNNNN!D HL,(DDADDR) ;COMPUTE DEST PTR LD DE,DD_CBO ADD HL,DE EX DE,HL ; LD HL,(IOPBPTR) ;SRC PTR = IOPB ADDRESS ; LD BC,PB&NNNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNNNBIT PB_INHX,(IX + PB_FLGO) JR NZ,JDONE ; ; XFER SECTOR DATA FROM CONTROLLER ; LD BC,(DDPORT) LD A,DD_MB0 ;SOFTLY GRAB|NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN! BC ;BYTE CNT POP DE ;DEST PTR LD HL,(DDADDR) CALL BMOVE ; ; RELEASE IOPB WINDOW ; JDONE: LD A,DD_FREE LD BC,(0NNNNNNNNNNNNNNNN/ONNNNNNNNNNNNNNNNNNNNNN: ; ; ISSUE PASSED COMMAND ; LD BC,(DDPORT) OUT (C),A ; ; PAUSE A WHILE FOR CONTROLLER TO CATCH UP ; EX (SP),HL %NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCURRENT DRIVE LD (HL),B ;CHANGE TO LOCAL DRIVE # PUSH AF CALL JADEX ;EXECUTE FUNCTION POP BC ;RESTORE DRIVE # LD HLjNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX8: LD C,DD_PRT8 ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN׼NNNNNNNNNNNNNNNNNNNNNNh the request thus ; yanking the processor out of it's sleep. ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option and boot NNNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNNN = 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; 3.01 4 JUN 88 GRH NNNNNNNNNNNNNNNNN%DNNNNNNNNNNNNNNNNNNNNN!ard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 5" ISHA Hard Disk ; 1NNNNNNNNNNNNNNNNN+KNNNNNNNNNNNNNNNNNNNNNN************************************************************************** SUBTTL DECLARATIONS ;===========================tNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNKERR ; JWAIT2: IN A,(C) ;IF NOT DONE THEN WAIT AND A,DD_SHLT JR NZ,JWAIT1 ; RET ;RETURN ZF IF ($ AND 7FFFH) =NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!OMATION 8" FLOPPY DISK DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" MICROMATIONNNNNNNNNNNNNNNNNMXNNNNNNNNNNNNNNNNNNNNNN********************************************* ; H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; LD BC,0341H XOR A,A H8B1: OUرNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN2 - 18 JUL 82, Move DD to high memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true recalib,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNcommand source disk option. ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also GNNNNNNNNNNNNNNNNN hNNNNNNNNNNNNNNNNNNNNNN ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; 3.02 12 JUN 88 GRH ; Change 'RET'urns KNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN0..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3" Jade floppy ; Change ?xxx syNNNNNNNNNNNNNNNNNN,-NNNNNNNNNNNNNNNNNNNNNN================================================= ; ; CONSTANTS ; ;======================================================laNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN>= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL JADE 5" FLOPPY DISK DRIVER5NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNN M2FM BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M8BOOT: EQU ABORT ;UNSUPPORTEDۥNNNNNNNNNNNNNNNNN~iNNNNNNNNNNNNNNNNNNNNN!T (C),A INC C DJNZ H8B1 ; ; ISSUE CLEAR CONTROLLER IOPB ; LD HL,CLRIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNrate ; on boot in case the head is outside track 0. ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; 1.5 - 23 MAR 83 GRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNallow boot from 2nd platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD 2 ; 62 C DRIVE 1 HEAD 0 fgNNNNNNNNNNNNNNNNN![NNNNNNNNNNNNNNNNNNNNNNin 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; 3.03 25 JUN 88 GRH ; Modify fl]NNNNNNNNNNNNNNNNN'&NNNNNNNNNNNNNNNNNNNNNNmbols to x_xx symbols. ; First interim version supporting Monitor function calls. All Rom ; functions are supported thru the NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN====================== FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIVER ; ;++++++++++++++3NNNNNNNNNNNNNNNNm$NNNNNNNNNNNNNNNNNNNNN!E # LD (IOPB + PB_DRVO),A ; LD A,-1 ;SET CONTROLLER RESET, NOT JUST DRIVE LD (IOPB + PB_TRKO),A ; LD HL,IOPB LD (IZNNNNNNNNNNNNNNNNNǂNNNNNNNNNNNNNNNNNNNNN!H ; Fix bug in recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; 1.6 - 3 BNNNNNNNNNNNNNNNN(INNNNNNNNNNNNNNNNNNNNNN; 72 D DRIVE 1 HEAD 2 ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement disk I/O driver fu?ONNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNoppy boot to include new disk format with disk system tracks ; directory like the hard disk has (removed DCM & BLT loader). ^NNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNRom swap address from the Monitor ; Rom. ; 3.07 11-25-90 GRH ; Modify slightly for ZMON Vers. 1.22. ; 3.08 2-20-91 GRH -yNNNNNNNNNNNNNNNN.KNNNNNNNNNNNNNNNNNNNNNNDISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE DEFBFR EQU 0080H ;USE CPM DNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F5BOOT: EQU ABORT ;UNSUPPORTED SUBTTL JADE 3" FLOPPY NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M2X: EQU DSKERR SUBTTL ISHA 5" & 8" HARD DISK DRIVER ;rNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNN TITLE M5b BANKED MONITOR DISK DRIVER ROM LIST NOCOND ;**********************************************************************gNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAPR 83 GRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out that if 'NNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNNnctions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives now assigned the fNNNNNNNNNNNNNNNNN#=NNNNNNNNNNNNNNNNNNNNNN; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory references to new format. ; nNNNNNNNNNNNNNNNNN))NNNNNNNNNNNNNNNNNNNNN! ; Make IOPB Sector for ISHA the same as floppies (0..n -> 1..n-1). ; This also make 5" ISHA same as 8". ; Change references hsNNNNNNNNNNNNNNNN/xNNNNNNNNNNNNNNNNNNNNNNEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ;===============NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDISK DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;+ 0..3 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 LD (IOPB + PB_DRVO),A @o7NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; 7NNNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNNC A LD (BIOSLN),A JR NZ,HDRDLP IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENT ROM ROUTINE NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNER USE LD B,A ; ; SET ID SECTOR FOR LOGIN ; LD A,ID_SECT ADD A,B LD (IOPB + PB_SECO),A EXX ; ; ISSUE CLEAR NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL{]oNNNNNNNNNNNNNNNNN!=NNNNNNNNNNNNNNNNNNNNNNL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ADD HL,DE LD (IOPB + PB_kHNNNNNNNNNNNNNNNNN';NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SETBIOPB: ; ; FETCH BIOS LOAD PARAMETER OFFSET ; LD HL,(DEFBF}NNNNNNNNNNNNNNNNNN-xNNNNNNNNNNNNNNNNNNNNN!EAD ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; INC (IX + PB_SECO) ;NEXT SECTOR ; ; COMPUTE SECTOR COUNT FROM LBNNNNNNNNNNNNNNNNNNĎNNNNNNNNNNNNNNNNNNNNNN; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,80H EXX ;SAVE SECTOR OFFSET IN qNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SETNNNNNNNNNNNNNNNNN 9NNNNNNNNNNNNNNNNNNNNN! ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT PUSH HL XRROM 8 JP DKRET ELSE ;IF DEBUG THEN RETURN NO ERRORS OR dNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD IX,IOPB CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL NNNNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNNN DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; NNNNNNNNNNNNNNNNN"hNNNNNNNNNNNNNNNNNNNNNNDMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP5 ; LD HL,(BIOSNT) ;BIOS LOADED, GO NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNR + 1) ; ; IF NOT IN 1ST SECTOR THEN RETURN ERROR ; EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; LD A,H ;LIMIT TNNNNNNNNNNNNNNNN.-NNNNNNNNNNNNNNNNNNNNNNENGTH ; EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; XOR A,A ;COUNT = 0 ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LE0NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNB' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THEN USE PLATTER 1 ADD A,B LD (IOPB + PB_SECO),~NNNNNNNNNNNNNNNNN ԰NNNNNNNNNNNNNNNNNNNNNNCO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQER NNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNA JP DKRET ENDIF FORM ;---------------------------------------------------------------------------- ; ; 5" HARD DNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDQERR ; ; FORCE HOST ADAPTER LOG-ON ; LD A,PB_LOGC LD (IOPB + PB_CMDO),A ; CALL ISHAX CALL DQERR JP NZ,DKRET ; vNNNNNNNNNNNNNNNNN}eNNNNNNNNNNNNNNNNNNNNNN ; SAVE TRACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A LNNNNNNNNNNNNNNNNN#[NNNNNNNNNNNNNNNNNNNNNNEXECUTE IT IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) PUgNNNNNNNNNNNNNNNNN)4NNNNNNNNNNNNNNNNNNNNN!O 1K ([3]FF AND A,3 LD H,A SBC HL,DE CCF RET C ; ; SAVE SECTOR SIZE ; PUSH DE ; ; COMPUTE PTR TO PARAMETERS)NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNN_LP: SBC HL,DE JR C,LEN_OK ; INC A JP LEN_LP ; ; ; SECTOR COUNT IN A ; LEN_OK: DEC A ;ALREADY HAVE 1ST SECTORNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNA EXX ; ; FORCE HOST ADAPTER LOG-ON ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; NOW READ THE DIRECTORY SECTOR ; gNNNNNNNNNNNNNNNNN M'NNNNNNNNNNNNNNNNNNNNNNR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: CALL ISHAX CALL DQNNNNNNNNNNNNNNNNm[NNNNNNNNNNNNNNNNNNNNNNISK BOOT ; H5BOOT: ; ; BIAS DOWN DRIVE ; SUB A,8 ;5" = 8..B -> 4..7 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; PUSH A#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; FETCH THE SECTOR SIZE ; LD A,(DEFBFR + ID_SSZ0O) EXX LD HL,128 ; OR A,A HBTSSZ: JR Z,GOTSSZ ; ADD HL,HL DECYaNNNNNNNNNNNNNNNNNN(6NNNNNNNNNNNNNNNNNNNNNND B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX PROMSIZ IF PROMSIZ = 2048 CONMSG **** ERROR! Code Too Large for 2k PROM! **** ELSE CONMSG **** ERRO_zNNNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNNN,GETLADE ; ; IF TRACK DATA OUT OF RANGE THEN RETRUN ERROR ; LD A,(IOPB + PB_TRKO + 1) ;{0..255} OR A,A JR NZ,GETLADE NNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN.0 - Release ; 1.22 11-22-90 GRH ; Split off from Monitor code to separate ROM in order to gain space ; for I/O drivers anNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN.DEF *INCLUDE B:ZBMG101.DEF *INCLUDE CB2.DEF LIST ON THIS_ROM EQU CHR_RNUM BNKREG EQU BNKPORT SUBTTL EXTERNAL EN`NNNNNNNNNNNNNNNN"zNNNNNNNNNNNNNNNNNNNNNN******************************************************************** ; ; COLD INIT ONLY SWITCHES TO RESIDENT ROM ; ;********ldNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN: PUSH HL LD HL,2006H ;SET FUNCTION HANDLER ADDRESS ; DO_X: LD (RXOFF),HL LD L,0FEH ;SET BANK # LD (RXBNK),HL ; PO!NNNNNNNNNNNNNNNNN.[NNNNNNNNNNNNNNNNNNNNNN########### ; ; HARD DISK SECTOR BUFFER ; ;########################################################################### ; sNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNPT CA' DM CR,LF ;############################################################################ ; ; LOGIN IOPB ; ;#####]NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNR! Code Too Large for 4k PROM! **** ENDIF ENDIF END _NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! TITLE M5b Z-80 MONITOR CHARACTER I/O ROM LIST NOCOND ;**********************************************************************,TNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNd interrupt code. ; Add rom xover function as include file. ; Add function dispatcher for execution and breakpoint entries. ;)|NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!TRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ; DS (MONROM + 6) - $ Jf:@NNNNNNNNNNNNNNNNN#-KNNNNNNNNNNNNNNNNNNNNNN******************************************************************** ; CINIT: ; ; SET STACK ; LD SP,MONSTK ; ; RESE:NNNNNNNNNNNNNNNNN)€NNNNNNNNNNNNNNNNNNNNNNP HL JP CALLBNK ;GO EXECUTE ;**************************************************************************** ; ; INITIALI_NNNNNNNNNNNNNNNN/h&NNNNNNNNNNNNNNNNNNNNNNHDBUFSZ EQU 256 HDSECB DS HDBUFSZ ; ;########################################################################### ; ; JA[NNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNN####################################################################### ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW ENNNNNNNNNNNNNNNNN ;NNNNNNNNNNNNNNNNNNNNNN;PUT IN PROPER FIELD RRCA RRCA ; ; SAVE LUN # FOR LATER USE ; LD (LUNSV), A LD (IY + LUN), A ; RET ;*******NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN****** ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;**************************************HNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN Add CON: selection based on Naked Terminal presence. ; ; 1.23 8-16-91 GRH ; Move code to banked rom. Add rom swapper. ; |NNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNNNE COMIOPB3.DEF ; LIST ON ;============================================================================ ; ; ASSEMBLE TIME CTNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNUMBER FOR WARM RESTART ; IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; ; MEMORY BANK DANNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN! ; CP A,',' RET Z ; ; IF CHAR == RETURN THEN RETURN CF, ZF ; CP A,CR SCF RET Z ; ; ELSE RETURN NC,NZ ; CCFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LD D,NBKPTS ; RS2: LD A,C SUB A,(HL) ;SEE IF SOFTWARE TRAP INC HL LD A,B SBC A,(HL) ;MAYBE, TRY REST OF ADDR INENNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNNN ;FETCH BREAKPOINT ADDRESS LD (HL),0 ;CLEAR BREAKPOINT INC HL LD D,(HL) LD (HL),0 INC HL LD C,(HL) LD (HL),0 INπNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; EXIT ?"NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN********************************************* ; ; 1ST ENTRY STARTS ON A NEW LINE ; PRTWD: CALL CRLF ; ; THIS ENTRY STA }NNNNNNNNNNNNNNNNN0L[NNNNNNNNNNNNNNNNNNNNNN-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;************************************************************************:NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!X'Æ^-Ɋf4юm< ؒsAޖzH暴OꞸT#񢿣Z(NNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!**** ; CRLF: ; ; SAVE REG ; PUSH HL ; ; DISPLAY CRLF MESSAGE ; CRLFA: LD HL,CRMSG CALL PRTS ; ; RESTORE REG:\NNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNN!********* ; ; DISPLAY HEX BYTE ON SYSTEM CONSOLE PROCEDURE ; ENTRY- A= BYTE TO DISPLAY ; ;*********************************M|$NNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNNNACE. ; ENTRY- E:HL= WORD VALUE TO DISPLAY ; ;**************************************************************************** ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN Rev. A January 5,1991 GRH Enterprises %NNNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNNNystem. The Monitor is designed with the following features: * CP/M 3.x compatability. * Banked memory supp9NNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNNNDFFFFF Motorola MC68010 CPU E00000..EFFFFF Intel 80286 CPU F00000..F7FFFF Reserve*.NNNNNNNNNNNNNNNNN%1NNNNNNNNNNNNNNNNNNNNNNE (Not used) 4 CP/M Default Disk 5..7 CP/M System Call 8..A Debugger breakpoint (RST 8) B C D E F 10.NNNNNNNNNNNNNNNNN+?>NNNNNNNNNNNNNNNNNNNNNNoftwar i devide u int logica tas modules Thi allow change t caus th minimu impac t othe module with NNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN & RETURN ; POP HL RET ;**************************************************************************** ; ; LADR ROUTINeNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNN!******************************************* ; HEX1: PUSH BC ;ADJUST REGS LD C,A CALL PUTHXB POP BC RET ;******"^NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN LADRB: ; ; DISPLAY WORD VALUE ; CALL LADRA ; ; FALL INTO DISPLAY BLANK PROCEDURE ; ;**************************^NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN 1129 Stonylake Ct Sunnyvale, CA .PA .HE TABLE OF CONTENTS 4 NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNort. * Multiple processor support (Super S100). Thi versio i a interi versio unti releas i finNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!d F80000..F8FFFF Z80BNK0 Z80 Bank 0 F90000..F9FFFF Z80BNK1 Z80 Bank 1 FA0000..FAFFFF Z80BNK2 Z80 Bank 2 dNNNNNNNNNNNNNNNNNN&IbNNNNNNNNNNNNNNNNNNNNNN.12 (RST 16) 13 14 15 16 17 18..1A (RST 24) 1B Reserved 1C..1D Stack pointer for this bank (saved when b9NNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNi th system Th interfac t thes module wil b a standard for as long as possible. These modules are made up oflNNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNNE OUTPUTS THE ADDRESS VALUE ON THE CONSOLE, EITHER AT ; THE START OF A NEW LINE (LADRA) OR AT THE CURRENT CURSOR LOCATION (LADRUNNNNNNNNNNNNNNNNN _NNNNNNNNNNNNNNNNNNNNNN********************************************************************** ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE ;JDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************************************** ; ; DISPLAY A BLANK (SPACE) ON THE SYSTEM CONSOLE PROCEDURE ; ;**********NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 1. Overview 2. Hardware Description 3. Software Description 4. Rom Modules 5. Monitor Function Call FacmNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNN!ished. .PA .HE 2. HARDWARE DESCRIPTION The M5b hardware to support the System Monitor includes: NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN FB0000..FDFFFF Reserved FE0000..FE7FFF ROMBNK 32k ROM card FE8000..FE83FF Jade 8" FloppRNNNNNNNNNNNNNNNNN'zSNNNNNNNNNNNNNNNNNNNNNNank swapped) 1E Reserved 1F Reserved 20..22 (RST 32) Monitor System Call facility 23 24..26 (8085 TRAP)NNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNN! the following files: ZBMR.* Thi modul contain th RO residen cod in ROM 0. * The Cold Reset initializat=GNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN). ; ENTRY- E:HL= ADDRESS VALUE TO DISPLAY ; ;**************************************************************************** ;NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; 1ST ENTRY DISPLAYS DATA BYTE IN A FIRST 5NNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNN****************************************************************** ; BLK: ; ; PASS A BLANK TO CO PROCEDURE ; LD C,' ' GNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNN!ility 6. Debugger Commands .PA .HE 1. OVERVIEW Th M5 Syste Monito i syste o KNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN another Bank ENTRY- E:HL= ADDRESS TO EXECUTE EXIT - Whatever the called program returns F827ةNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! .HE MONITOR DEVICES .PA Character I/O DEVICE ASSIGNMENT 0 Naked Terminal board 1 JBNNNNNNNNNNNNNNNNN&~RNNNNNNNNNNNNNNNNNNNNNNValues: A= Byte HL= Word BC, DE= Additional values Return values: NOTE Al function assum al register ar jNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN Exit - A= Data 2 SET BANKED MEMORY DATA Unbanked systems ignore E. Entry- A= 2 = 8NNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNdisk driver. * Console ASCII-HEX & HEX-ASCII conversion. ZBMC.* Thi modul contain th Characte I/ driversINNNNNNNNNNNNNNNNN hNNNNNNNNNNNNNNNNNNNNNNϠ drivers I reside i RO 7 (F800..FFFFh i th RO memor board I is responsible for: * Real time clockJNNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN Function F800 Cold start vector gets control upon Reset. F803 Return next System Console character E;rNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!Banked Memory Contents ENTRY- E:HL= ADDRESS C= DATA F81B Select 64K Memory Bank f8NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN Return System List device output status EXIT - A= 0: BUSY, /0: READY F82 Reserve fo interna DeVNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN Logical device #1 2 Logical device #2 . . . 15 Logical device #15 .pa .HE 5. MONITOR2NNNNNNNNNNNNNNNNN'McNNNNNNNNNNNNNNNNNNNNN!free B sur t sav an dat prio t callin thi function. Th registe ma contai th followin reservelNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNData E:HL= Address ptr 3: EXECUTE A PROCEDURE IN ANOTHER BANK Entry- A= 3 E:0bNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN I reside i RO͠ (F800..FFFFh i th RO͠ memor board I i responsibl for: * Character I/O hardware7NNNNNNNNNNNNNNNNNN =NNNNNNNNNNNNNNNNNNNNNN-calendar support. .PA .HE 4. ROM MODULES Th Monito Syste make us o se o ROMNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNNNXIT - A= CHAR F806 Execute Monitor Function (Same as RST 20H) ENTRY- Various, see section 5 F809 2DpNNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNNor execution **** WARNING! Stack must be in Common RAM! **** ENTRY- C= BANK # EXIT - PNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNbugge progra breakpoin entry F82D Reserved for internal Debugger program execution support F830 Restart Error$2NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN FUNCTION CALL FACILITY Th Syste Monito implement syste cal facilit i orde t simplif th interfac۹NNNNNNNNNNNNNNNNN(]]NNNNNNNNNNNNNNNNNNNNNN erro value o return. -1: Function not implemented error. -2: Function argument error. Th follokjNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!HL= Procedure address 4 SELECT MEMORY BANKS FOR BANKED MEMORY BLOCK MOVE Entry- A= 4 = SourcyNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN & software initialization. * Logical-physical device conversion. * Single entry point support of driver function ca NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN i Memor board Al RO͠ shar th sam addres rang fro F800 thr FFFFh. ROM USE 0 Resident ROM, gets 9NNNNNNNNNNNNNNNNPNNNNNNNNNNNNNNNNNNNNNN Send character to System Console device. ENTRY- C= Character to output F80C Return System Console outpuNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNA= BANK # ON ENTRY F81Š SeSourcanDestinatioBankfoBlocMov function ENTRY- B= SOURCE BANK #bNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN F833 Display character string on the System Console The last character must have Bit 7 set. 3HNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN t th syste resources Thi wil allo flexabilit o implementin th I/Ϡ driver whil preserving the software iuNNNNNNNNNNNNNNNNN)nlNNNNNNNNNNNNNNNNNNNNN!win page describ eac functio an th argument and returned values. .he *** Resident Functions descriptions NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNe bank bank number C= Destination bank number. 5 PERFORM THE INTRABANK BLOCK MOVE Entry- A= 5 NNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNNlls. * Function bypass entry points for Console, List & stdio. ZBMK.* Thi modul contain th Dis I/ driversĶNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNcontrol on reset. Allways installed when the processor is executing outside the monitor system. (ZBMR) RAM NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNt status EXIT - A= 0: Busy, /0: Ready F80F Send character to System List Device. ENTRY- yNNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNN C= DESTINATION BANK # F821 Move data from Source bank to destination bank ENTRY-&NNNNNNNNNNNNNNNNnNNNNNNNNNNNNNNNNNNNNNNENTRY- HL= Character string pointer F836 F839 F83C .PA CHARACTER ROM: ADDRESS FUNCTION 2000SNNNNNNNNNNNNNNNNN$0NNNNNNNNNNNNNNNNNNNNNNnterface. Thes function ar execute b placin th argument int th prope register an executin Restar 9INNNNNNNNNNNNNNNNN*;?NNNNNNNNNNNNNNNNNNNNNN*** .pa 0: RETURN SYSTEM MONITOR VERSION NUMBER ENTRY- A= 0 EXIT - HL= BINARY VERSION # IN HUNDREDTHS (X.XX) 1NNNNNNNNNNNNNNNNN0ׇNNNNNNNNNNNNNNNNNNNNNN HL Sourc pointer D= Destinatio pointer B= Byt coun t move. 6: UNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!Y(Ć`.ʊg5Ўm< ْvDᖰM隷S!Z(ģ`/NNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN SELECT A NEW BUS PROCESSOR (SS100) Entry- A= 6 C= Processor number {0,..7} 7: RETURN CURRENTNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!M CONSOLE. Entry- A= 14H C= Byte 21: DISPLAY HEX WORD ON THE SYSTEM CONSOLE. Entry- &oNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ENTRY- A= 21H B= Device # {0..15} C= Sub-function: 0: NNNNNNNNNNNNNNNNNNŶNNNNNNNNNNNNNNNNNNNNNN H= Baud rate index 4: Set device data ENTRY- E= MNNNNNNNNNNNNNNNN*}NNNNNNNNNNNNNNNNNNNNNN 1: System list 2: System AUX 3: System AUX2 EXIT - NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNATUS ENTRY- A= 28H EXIT - A= 0: NOT READY, /0: CHAR READY 41: RETURN NEXT STANDARD CONSOLE CHAR NNNNNNNNNNNNNNNNN%jNNNNNNNNNNNNNNNNNNNNNN A= 2FH EXIT - A= CHAR 48: RETURN STANDARD AUX2 OUTPUT STATUS ENTRY- A= 30H EXIT - A= 0: BUgrNNNNNNNNNNNNNNNNN+INNNNNNNNNNNNNNNNNNNNNNurn if successful 66: TEST IOPB.PBSTATO FOR ERROR AND DUMP IOPB IF TRUE ENTRY- A= 42H E:HrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLY SELECTED BANK NUMBER Entry- A= 7 Exit - A= Bank number 8: Reserved for internal debugger function G yNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNA= 15H HL= Word 22 DISPLAY HEX ADDRESS ON SYSTEM CONSOLE. Thi functio i use i Banke memorNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOP (Can be used to test device presence) 1: Initialize device !E[NNNNNNNNNNNNNNNNN\!NNNNNNNNNNNNNNNNNNNNNNode bits D= Baud rate index 5: Return Baud rate NNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN A= 0: Ok -2: Illegal device -3Illegaargumen  NNNNNNNNNNNNNNNNN pNNNNNNNNNNNNNNNNNNNNNN ENTRY- A= 29H EXIT - A= CHAR 42: RETURN STANDARD CONSOLE OUTPUT STATUS ENTRY- A= 2AH EpNNNNNNNNNNNNNNNNNN&?NNNNNNNNNNNNNNNNNNNNNNSY, /0: READY 49: SEND CHAR TO STANDARD AUX2 OUTPUT ENTRY- A= 31H C= CHAR .HE [NNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNL= IOPB Ptr EXIT - A= 0: NO ERROR, /0: ERROR CODE 67: DISPLAY IOPB ERROR DATA ENTRY- A= 43H NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN Entry- A= 8 9: Select Bank for execution Entry- A= 9 C= Bank # .he *NNNNNNNNNNNNNNNNN )NNNNNNNNNNNNNNNNNNNNNN systems I th syste i no banked the i i redundan wit functio #3. Entry- A= 16H oNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 2: Execute self test EXIT- A= 0: Ok, /0: error code 6NNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNNN EXIT - L= Baud rate index 6: Set Baud rate ENTRY- E= BauJNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNN (Stdevicno exist) L= Device # on entry 36: RETURN STANDARD AUX INPUT STATUS ENTRY- A{NNNNNNNNNNNNNNNNN!ANNNNNNNNNNNNNNNNNNNNNNXIT - A= 0: BUSY, /0: READY 43: SEND CHAR TO STANDARD CONSOLE OUTPUT ENTRY- A= 2BH C= CHAR 4bodNNNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNNN *** Disk I/O Driver Functions *** .pa 64: RETURN DISK DRIVER VERSION # ENTRY- A= 40H EXIT - HL= nibble 20: DISPLAY HEX BYTE ON THE SYSTENNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNY- A= 20H EXIT - HL= Binary version # in hundredths (X.XX) 33: EXECUTE CHAR DEVICE DRIVER FUNCTION NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 3: XON/OFF Ok 4: XON/OFF enabled NNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNvice # to set to {0..15} C= Standard device to set 0: System console NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN9: SEND CHAR TO STANDARD AUX OUTPUT ENTRY- A= 27H C= CHAR 40: RETURN STANDARD CONSOLE INPUT ST@rNNNNNNNNNNNNNNNN$YNNNNNNNNNNNNNNNNNNNNNN ENTRY- A= 2EH EXIT - A= 0: NOT READY, /0: CHAR READY 47: RETURN NEXT STANDARD AUX2 CHAR ENTRY-ՎNNNNNNNNNNNNNNNNN*zNNNNNNNNNNNNNNNNNNNNNN 7..4= Drive # 15..8= Controller # EXIT - Error, will not retNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNsion # in hundredths (X.XX) 81: SET CLOCK CALENDAR DATA ENTRY- A= 51H B= Day of month {1.؈NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺W$\*Ɗb/ˎh6Ғo= ٖvD|J枴P뢺W&NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.31} D= Month {1..12} E= Year {0..99} L= Day of week {0:Sun, 1:Mo tNNNNNNNNNNNNNNNNN=1NNNNNNNNNNNNNNNNNNNNNNster # EXIT - A= Data from clock register 86: WAIT FOR CLOCK TO CHANGE. DOES NOT RETURN UNTIL CLOCK SECONDS CH-NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN monito i controlle b one- characte command entere fro th keyboar i repons t th monito prompt daswNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! digit ar correct I banke memor systems th ban numbe i delimite b colo (:) I.E bb:aaaa Th addrescNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNN!angeably I certai command spac o comm ca als b interchange wit carriag return Thes ar command fo sNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN -DFFB,100A[CR] -DFFB 100A[space] -D0EF0FFB,100A[space] NNNNNNNNNNNNNNNNN%]NNNNNNNNNNNNNNNNNNNNNNP ; LLOC DS 1 ;L HLOC DS 1 ;H PLOC DS 2 ;PC BNKLOC DS 1 ;PC BANK # ; ; BANKED MEMORY MANAGEMENT ; CBANK DS 1 ;CURRENTNNNNNNNNNNNNNNNNN+~NNNNNNNNNNNNNNNNNNNNNNDDRESS, BANK DDPORT DS 1 ;JADE CONTROLLER PORT IOPBPTR DS 3 ;CURRENT IOPB POINTER ; ; CHARACTER I/O DEVICES ; C_CDEV DS UrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNn,..6:Sat} 82: SET CLOCK TIME DATA ENTRY- A= 52H B= Seconds {0..59} NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNANGE. ENTRY- A= 56H EXIT - A= 0: OK /0: Board not present 87: SPARE ΣNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN (-) N spac i allowe betwee th prompt and the command character. Addres an dat entries Th genera for BNNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNN entr rule abov appl t ban numbe entries I addition i ban i no specified the th las ban settin }xNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNwhic th Monito expect fixe numbe o entrie (an hence delimiters) following the command character. Th fNNNNNNNNNNNNNNNNNNNNN! ENTRY- A= 57H EXIT - A= -1 88: STOP CLOCK ENTRY- A= 58H 89: START CLOCK NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!fo a addres i fou digi He number fo data tw digi He number Leadin zero nee no b entered th D NNNNNNNNNNNNNNNNNNX NNNNNNNNNNNNNNNNNNNNNNis used by default. Delimiters Th Monito recognize thre delimiters carriag retur (CR) space o NNNNNNNNNNNNNNNN{/NNNNNNNNNNNNNNNNNNNNNNollowin command t displa th bloc o memor 120FFB t 12100A ar al equivalent Althoug th spacin i noJ: NNNNNNNNNNNNNNNNN!qNNNNNNNNNNNNNNNNNNNNNN=================== ; ; RAM VARIABLES ; ;============================================================================ ; ] NNNNNNNNNNNNNNNNN';NNNNNNNNNNNNNNNNNNNNNN NOT, /0: CHANGED) ; ; BREAKPOINTS ; STRUCT 0 BPADDR DS 2 ;ADDRESS OF BREAKPOINT BPABNK DS 1 ;BANK # OF BREAKPOINT BPD yNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN; BANK SWAPPING ; RCHL DS 2 ;ROM CALLER HL SAVE RXOFF DS 2 ;ROM CALL ADDRESS RXBNK DS 2 ;ROM CALL BANK IF ($ AND 7[NNNNNNNNNNNNNNNNNhbNNNNNNNNNNNNNNNNNNNNNN EXIT - A= Day B= Month C= Year L= Day of week (0= Sunday, 1NNNNNNNNNNNNNNNNN KmNNNNNNNNNNNNNNNNNNNNNN ENTRY- A= 59H .HE *** Monitor Commands *** .PA Th Monito command mus confor t specifi NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmonito wil suppl them N spac i allowe betwee th comman characte an th firs addres o dat entry Subseque NNNNNNNNNNNNNNNNN sNNNNNNNNNNNNNNNNNNNNNN comma carriag retur indicate t th monito tha th curren comman i complet an shoul b executed Eithe ~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN for free som variet i th comman for i allowed Not tha th displa comman require tw an onl tw addreY$NNNNNNNNNNNNNNNNNN""NNNNNNNNNNNNNNNNNNNNNN; SAVE 128 BYTES FOR MONITOR ; ORG MONROM - 128 MONSTK EQU $ ; ; REGISTER IMAGE STORAGE ; RLOC DS 1 ;R ILOC DS 1 ;I;wNNNNNNNNNNNNNNNNN(+NNNNNNNNNNNNNNNNNNNNNNATA DS 1 ;DATA DISPLACED BY RESTART INSTRUCTION BP_REC DS 0 ;NUMBER OF BYTES IN RECORD ENDM TLOC: REPT NBKPTS DS BP_REC ޖ|NNNNNNNNNNNNNNNNN.ONNNNNNNNNNNNNNNNNNNNNNFFFH) > 7800H CONMSG **** RAM Allocation Too Large! **** ENDIF CNNNNNNNNNNNNNNNNN[SNNNNNNNNNNNNNNNNNNNNNN= Monday..) 84: RETURN CLOCK TIME DATA ENTRY- A= 54H EXIT - A= Seconds B= M7NNNNNNNNNNNNNNNNN x\NNNNNNNNNNNNNNNNNNNNNNformat Th general form is: -Ca1 a2 a3 wher à i th comman characte an a1-a ar th~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!n entrie mus b separate b delimiter Th monito look a onl th las fou addres character o las tw dE[NNNNNNNNNNNNNNNNN>BNNNNNNNNNNNNNNNNNNNNNN spac o comm ca mar th en o a argumen entry I ou comman example w wil generall us spac a delimit6rNNNNNNNNNNNNNNNNNщNNNNNNNNNNNNNNNNNNNNNNs arguments s tha th las delimite ca b comm o spac as well as a carriage return. sNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN YLOC DS 2 ;IY XLOC DS 2 ;IX FPLOC DS 1 ;F' APLOC DS 1 ;A' CPLOC DS 1 ;C' BPLOC DS 1 ;B' EPLOC DS 1 ;E' DPLOC DS 1 ;D' 3NNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN ENDM ; ; BANK #S ASSOCIATED WITH ARGUMENTS ; ARGPTR DS 2 ;PTR TO CURRENT ARGUMENT'S BANK A1_BNK DS 1 ;ARG #1 BANK A2_BrNNNNNNNNNNNNNNNNN/~NNNNNNNNNNNNNNNNNNNNNNPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OFW~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNinutes C= Hours 85: RETURN CLOCK REGISTER DATA ENTRY- A= 55H C= RegiF#|NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN addres an dat entries i any Th essentia part o comman ar a follows: Th Comman Character Th*NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNat character befor delimiter S i yo mak mistak whil typin a entry kee typin unti th las fou o twNNNNNNNNNNNNNNNNN.|NNNNNNNNNNNNNNNNNNNNNNer unles comm make th comman for clearer Pleas note however tha yo ca us th spac an th comm interchNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN -D12:0FFB 100A[CR] -D0FFB 100A[CR] (After 12: first used) -DFFB,100A, pNNNNNNNNNNNNNNNNN$nNNNNNNNNNNNNNNNNNNNNNNLPLOC DS 1 ;L' HPLOC DS 1 ;H' ELOC DS 1 ;E DLOC DS 1 ;D CLOC DS 1 ;C BLOC DS 1 ;B FLOC DS 1 ;F ALOC DS 1 ;A SLOC DS 2 ;S^pNNNNNNNNNNNNNNNNNN*MNNNNNNNNNNNNNNNNNNNNNNNK DS 1 A3_BNK DS 1 ; ; DISK IOPB RESERVATION ; IOPB: DS PB_SIZE ; ; DISK ROM VARS ; DDADDR DS 3 ;JADE CONTROLLER A}NNNNNNNNNNNNNNNNN03NNNNNNNNNNNNNNNNNNNNNN HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; ,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!X%†]+Ɗb0̎h6Ғm< ؖtBޚyG䞱N颸T"NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNtINNNNNNNNNNNNNNNNNNNNNNY BLOCK MOVE ; JP REST ;(NOT IMPLIMENTED) ;EXECUTE BANK FUNCTION ; JP LOS ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS IN A CNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN**************** ; FBSEL: LD A,C ; BNKSEL: ; ; SELECT NEW BANK ; OUT (BNKREG),A ; ; STORE IN BANK PAGE 0 ; LBNNNNNNNNNNNNNNNN 1$NNNNNNNNNNNNNNNNNNNNN!TION #5 ; NOTE: THIS FUNCTION IS NOT CP/M 3.0 COMPATABLE. HL & DE ARE REVERSED ; (Z-80 COMPATABLE) ; ENTRY- HL= SOURCE PTR qBNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNN) LD A,H CP A,L POP HL ;PTR JP NZ,NTSAME ; ; SELECT BANK OF MOVE ; DI ;NO INTERRUPTS WHILE BANK SWAPPED ; OHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! ;NEXT BYTE INC DE ; EXX ;CHECK FOR DONE DEC BC LD A,C OR A,B EXX JP NZ,BMOVE4 ; ; DONE ; JP BMOVE3 ښvDឯ|J袷T"NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCyNNNNNNNNNNNNNNNNNNNNNNRR ; JR C,MFUNERR ; ; ELSE IF FUN# > LAST THEN GO CHECK NEXT GROUP ; CP A,16 JR NC,NOT_DEB ; ; ELSE EXECUTE DEBUNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++ ; ; DISK DRIVER FUNCTIONS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; N1NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN# ; ADD A,2 ;ADD OFFSET ; PUSH HL ;SAVE ARG LD H,CLK_RNUM ;SET ROM # LD L,A ;SET FUNCTION # EX (SP),HL CALL XRONNNNNNNNNNNNNNNN&hNNNNNNNNNNNNNNNNNNNNNN************************************** ; ; This code module contains the system character I/O drivers and ; resides in the s"NNNNNNNNNNNNNNNNNɣNNNNNNNNNNNNNNNNNNNNN!************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE SERIAL EQU[NNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNNTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A=I|$NNNNNNNNNNNNNNNNN%[NNNNNNNNNNNNNNNNNNNNNN IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL MONITOXNNNNNNNNNNNNNNNNN+TNNNNNNNNNNNNNNNNNNNNN!-1 OR A,A RET ;############################################################################ ; ; MONITOR FUNCTION TABLNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNGGER FUNCTION ; ADD A,2 ;BIAS UP PUSH HL LD H,DEB_RNUM LD L,A EX (SP),HL CALL XROMF INC SP INC SP RET ;XzNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!OT_CHR: ; ; BIAS DOWN TO DISK FUNCTIONS ; SUB A,32 ; ; IF NOT DISK FUNCTIONS THEN GO CHECK NEXT GROUP ; CP A,16 B(NNNNNNNNNNNNNNNNSGNNNNNNNNNNNNNNNNNNNNNNMF INC SP INC SP ; RET SUBTTL MONITOR FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#)NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNName address space as the resident Monitor ROM. The ROMs ; communicate with each other through a ROM transfer function. ; *INCBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN TRUE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE NAKEDT.DEF ;*INCLNNNNNNNNNNNNNNNN vNNNNNNNNNNNNNNNNNNNNNN FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP nNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTI^,NNNNNNNNNNNNNNNNN,3NNNNNNNNNNNNNNNNNNNNNNE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0: RETURN MONITOXNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CHAR FUNCTIONS ; ;+++++++++++++++++++++++++NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNJR NC,NOT_DSK ; ; ELSE EXECUTE DISK ROM ; ADD A,2 ;ADD OFFSET ; PUSH HL ;SAVE ARG LD H,DK_RNUM ;SET ROM # LD L,ANPHNNNNNNNNNNNNNNNNN`vNNNNNNNNNNNNNNNNNNNNNN++++++++++++ ; ; RETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++++++++++++++++++++++++++++++++++++++8BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLUDE ZBMH122.HDR ;**************************************************************************** ; ; Revision status: ; ; 1.0`NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!UDE PRI.DEF ;*INCLUDE ZBMFUNS.DEF ;*INCLUDE COMIOPB2.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE?dNNNNNNNNNNNNNNNNN!ENNNNNNNNNNNNNNNNNNNNNNPUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK FNNNNNNNNNNNNNNNNN'9NNNNNNNNNNNNNNNNNNNNNNON # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERR NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNR ROM VERSION ; DW MFUNERR ;1: RETURN CHAR DEVICE PARAMETERS DW MFUNERR ;2: EXECUTE SELF TEST DW MFUNERR ;3: SET STANDHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DEB: ; ; BIAS DOWN TO CHAR FUNS ; SUB A,16 ; ; IF NOT CHARNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;SET FUNCTION # EX (SP),HL CALL XROMF INC SP INC SP ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++pNNNNNNNNNNNNNNNNNs;NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++$NNNNNNNNNNNNNNNNNٝNNNNNNNNNNNNNNNNNNNNNN - Release ; ; 1.22 11-22-90 GRH ; Separate code from monitor ROM. ; Move code to separate ROM in order to gain space for mrNNNNNNNNNNNNNNNN6VNNNNNNNNNNNNNNNNNNNNNN NAKEDT.DEF *INCLUDE PRI.DEF *INCLUDE ZBMFUNS.DEF *INCLUDE COMIOPB2.DEF LIST ON *INCLUDE ZBMG122.DEF THIS_ROM EQU CHR 3NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN INC SP RET ;**************************************************************************** ; ; COLD INIT ONLY SWITCHES T6NNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ADD(#NNNNNNNNNNNNNNNN.UNNNNNNNNNNNNNNNNNNNNNNARD CONSOLE DEVICE DW MFUNERR ;4: SET STANDARD LIST DEVICE DW MFUNERR ;5: INITIALIZE CHAR DEVICE DW MFUNERR ;6: SET DEV NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN FUNCS THEN CHECK NEXT GROUP ; CP A,32 JR NC,NOT_CHR ; ; ELSE EXECUTE CHAR ROM ; ADD A,2 PUSH HL LD L,A LD H,C>, NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTIONS ; ENTRY- D= DRIVER FUNCTION # ; ;+++++++++++++++++++++++++++++\NNNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNNN TITLE M5b Z-80 MONITOR CHARACTER I/O ROM LIST NOCOND ;**********************************************************************,TNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNI/O drivers and ; interrupt code. ; Add rom xover function as include file. ; Add function dispatcher for execution and breaNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNN_RNUM SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ˛NNNNNNNNNNNNNNNNN##NNNNNNNNNNNNNNNNNNNNNNO RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ; SET STACK ;YzNNNNNNNNNNNNNNNNN)6NNNNNNNNNNNNNNNNNNNNNN A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; RESTORE ARGUMENT & PUT EXE=BNNNNNNNNNNNNNNNN/fNNNNNNNNNNNNNNNNNNNNNNICE BAUD RATE DW MFUNERR ;7: SPARE DW CIS ;8: RETURN STANDARD CONSOLE INPUT STATUS DW CI ;9: RETURN STANDARD CONSOLE CHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHR_RNUM EX (SP),HL CALL XROMF INC SP INC SP RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&NNNNNNNNNNNNNNNNNN 5%NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DSK: ; ; BIAS DOWN TO MISC. FUNCTIONS ; SUB A,16 ; ; SET ROM ~nNNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNN****** ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;**************************************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNkpoint entries. ; ; 1-9-91 GRH ; Add conditional ASSY for default CON:. Add SIO driver as alternate. ; VERSN EQU 122 ;**4NNNNNNNNNNNNNNNNNP4NNNNNNNNNNNNNNNNNNNNNN ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EX NNNNNNNNNNNNNNNNN$jNNNNNNNNNNNNNNNNNNNNNN LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; ~NNNNNNNNNNNNNNNN*eNNNNNNNNNNNNNNNNNNNNNNCUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,TigNNNNNNNNNNNNNNNNN0uNNNNNNNNNNNNNNNNNNNNNNAR DW COS ;10: RETURN STANDARD CONSOLE OUTPUT STATUS DW CO ;11: SEND CHAR TO STANDARD CONSOLE DW LOS ;12: RETURN STANDAGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!Z(Ć`/ˊf4юm; ؒtBߖ{I皶Q W%[(NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRD LIST DEVICE OUTPUT STATUS DW LO ;13: SEND CHAR TO STANDARD LIST DEVICE ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL DEBUGG`rNNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNNE XOR A,A ENDIF LD (IOBYTE),A ; ; INIT SIO ANYWAY ; LD HL,IOIDTA ;SET TABLE PTR ; IOILP: LD C,(HL) ;FETCH PORT rNNNNNNNNNNNNNNNNN GNNNNNNNNNNNNNNNNNNNNN!A BAUD ; DB 3CH DB 2 DB 01000101B DB 64 ; ; CTC 1: SIO #0B BAUD ; DB 3DH DB 2 DB 01000101B DB 64 ; DB -W NNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNNBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= 0: BUSY, FFH: READY ; ;***************************************C*NNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN************************* ; ; SYSTEM CONSOLE INPUT STATUS SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: gNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNCONSOLE 1 JP Z,CI2 ;CONSOLE 2 JP CI3 ;CONSOLE 3 ;********************************************************************NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!***** ; LOS: LD A,(IOBYTE) AND A,0C0H JP Z,LOS0 ;PRINTER 0 CP A,80H JP M,LOS1 ;PRINTER 1 JP Z,LOS2 ;PRINTER 2 JP CINNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN0B RET Z LD A,-1 RET ; ; ; OUTPUT CHAR ; CO0: CALL COS0 ;IF BUSY THEN WAIT JR Z,CO0 ; LD A,C ;OUTPUT CHAR & NNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNNER FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION ; EXINNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNN INC HL ; LD A,C ;IF PORT == -1 THEN DONE INC A JR Z,IOIDN ; LD B,(HL) ;FETCH COUNT INC HL OTIR JR IOILP ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN1 ;END-OF-TABLE SUBTTL FUNCTIONS AND PROCEDURES ;************************************************************************vNNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNN************************************* ; COS: LD A,(IOBYTE) AND A,3 JP Z,COS0 ;CONSOLE 0 CP A,2 JP M,COS1 ;CONSOLE 1 Q1NNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNNCON3 ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;***************************************************************************NNNNNNNNNNNNNNNN 7*NNNNNNNNNNNNNNNNNNNNNN******** ; ; LIST DEVICE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; 4NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNOS ;CONSOLE SUBTTL PRIMITIVE I/O DRIVERS IF SERIAL CONMSG -- SERIAL VERSION -- ;**************************************NNNNNNNNNNNNNNNNN,rGNNNNNNNNNNNNNNNNNNNNNNRETURN OUT (34H),A RET ELSE CONMSG -- NAKED TERMINAL VERSION -- ;*****************************************************NNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNN!T - HL= VERSION # (123D = 1.23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: NNNNNNNNNNNNNNNNN TNNNNNNNNNNNNNNNNNNNNNN; SIO DONE ; IOIDN: ; ; DISPLAY SIGN-ON ; LD HL,LOGMSG CALL PRTS ; ; DONE ; RET ;######################PNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN**** ; ; DISPLAY TEXT ON CONSOLE PROCEDURE ; ENTRY- HL= PTR TO BIT-7 TERMINATED ASCII TEXT ; ;*****************************tNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNN JP Z,COS2 ;CONSOLE 2 JP COS3 ;CONSOLE 3 ;****************************************************************************WHNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN* ; CIS: LD A,(IOBYTE) AND A,3 JP Z,CIS0 ;CONSOLE 0 CP A,2 JP M,CIS1 ;CONSOLE 1 JP Z,CIS2 ;CONSOLE 2 JP CIS3 ;"NNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN;**************************************************************************** ; LO: LD A,(IOBYTE) AND A,0C0H JP Z,LO0 ;PR TRUE ; ; IF NAKED=NNNNNNNNNNNNNNNNN 6NNNNNNNNNNNNNNNNNNNNNN############################################ ; IOIDTA: ; ; SIO #0A ; DB 35H ;PORT DB 8 DB 18H DB 4,44H DB 3,0C1tyNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNP HL ; ; IF CHAR < 128 THEN DO NEXT CHAR ; BIT 7,(HL) INC HL JR Z,PRTS ; RET SUBTTL IOBYTE HANDLERS ;******zNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN******************************************************************* ; CO: LD A,(IOBYTE) AND A,3 JP Z,CO0 ;CONSOLE 0 CP =nNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;**************************m[NNNNNNNNNNNNNNNNN#byNNNNNNNNNNNNNNNNNNNNNN************************************* ; ; LIST DEVICE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 8NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNSE RETURN -1 RET ; ; ; RETURN INPUT CHAR ; CI0: CALL CIS0 ;IF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(34H) ;ELS4NNNNNNNNNNNNNNNNN/'NNNNNNNNNNNNNNNNNNNNN!,1 SHL NT_READY RET Z LD A,-1 ;ELSE RETURN -1 RET ; ; ; RETURN INPUT CHAR ; CI0: CALL CIS0 ;IF CHAR NOT READY THENNNNNNNNNNNNNNNNjNNNNNNNNNNNNNNNNNNNNN! TERMINAL INSTALLED THEN SET IOBYTE TO IT ; ELSE SET IOBYTE TO SIO ; IN A,(NT_STAT) AND A,[1 SHL NT_PRSNT] RRCA ELSNNNNNNNNNNNNNNNNN tNNNNNNNNNNNNNNNNNNNNNNH DB 5,0EAH DB 0 ; ; SIO #0B ; DB 37H DB 8 DB 18H DB 4,44H DB 3,0C1H DB 5,0EAH DB 0 ; ; CTC 0: SIO #0?NNNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNNN********************************************************************** ; ; SYSTEM CONSOLE OUTPUT STATUS SELECTOR ; ENTRY- (IO NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNA,2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;***************************************************xNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************************************** ; CI: LD A,(IOBYTE) AND A,3 JP Z,CI0 ;CONSOLE 0 CP A,2 JP M,CI1 ;]iNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!0H: LST2, C0H: CON ; EXIT - A= 0: BUSY, FFH: READY ; ;***********************************************************************LyNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNE RETURN CHAR RET ; ; ; RETURN OUTPUT STATUS ; COS0: IN A,(35H) ;IF NOT READY TO ACCEPT CHAR THEN WAIT AND A,0000010NNNNNNNNNNNNNNNN04YNNNNNNNNNNNNNNNNNNNNNNN WAIT JR Z,CI0 ; IN A,(NT_DATA) ;ELSE RETURN CHAR RET ; ; ; RETURN OUTPUT STATUS ; COS0: IN A,(NT_STAT) ;IF NOT RI<|NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNY'Ć`-ˊg5юm; ؒuC|J皵QW%£^,NNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNEADY TO ACCEPT CHAR THEN WAIT CPL AND A,1 SHL NT_BUSY RET Z LD A,-1 RET ; ; ; OUTPUT CHAR ; CO0: CALL COS0 ;IFjiNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON3) ; ;******kNNNNNNNNNNNNNNNNN pNNNNNNNNNNNNNNNNNNNNN!E JR Z,LO0 ; LD A,C ;OUTPUT CHARACTER OUT (PRI_1DO),A LD A,NOT [1 SHL PRI_1CSB] ;OUTPUT STROBE OUT (PRI_2CNT),A LNNNNNNNNNNNNNNNNNNPNNNNNNNNNNNNNNNNNNNNNNLL HAS DEFAULT BANK # ; ; INIT ALL BANKS ; LD E,A ;START WITH ALL Z80 BANKS LD HL,THIS_BNK ;POINT TO LOCATION TO STORENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN CALL XROMF POP HL ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; EXECUTE THE DEBUGGER [NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! ; ; DO AT LAST MINUTE TO MINIMIZE REFRESH REGISTER CHANGE ; LD R,A ;SET R POP AF ;SET AF ; ; RESERVE SPACE FOR A ErNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNY ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT (M2_CLDRES),A ; ; REMOVE JADE DOUBLE D WINNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNEM ; INC E ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEN REPEAT CP A,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; NNNNNNNNNNNNNNNNN`NNNNNNNNNNNNNNNNNNNNNN BUSY THEN WAIT JR Z,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NT_DATA),A RET ENDIF ;***************************|vNNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNN********************************************************************** ; CIS3: EQU CIS0 CI3: EQU CI0 COS3: EQU COS0 CO3: EQ NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNND A,0BFH OUT (PRI_2CNT),A ;CLEAR STROBE RET ;*************************************************************************9NNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMEM ; INC E ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEN REPEAT CP "?gNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN ; MAINLP: LD SP,MONSTK LD HL,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL CALL XROMF POP HL JR MAINLP SUBTT@)NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNEI INSTRUCTION TO BE PATCHED IN ; DB 0 ;'NOP' OR PLACE FOR 'EI' ; ; RETURN TO EXECUTION ADDRESS ON STACK ; RET ; NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNDOW(S) ; LD A,DD_FREE ;REMOVE DD WINDOW, IF PRESENT OUT (DD_PRT3),A OUT (DD_PRT5),A OUT (DD_PRT8),A ; ; SET MEMORY ֨NNNNNNNNNNNNNNNNN,EwNNNNNNNNNNNNNNNNNNNNNN LD A,IOBYTV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ; SET BANK STACK ; LD (THIS_STK),SP ; DEC E ;BACK UP TO -xNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNN!************************************************* ; ; ALTERNATE CONSOLE DEVICE (CON1) : SIO #0 ; ;**************************>'NNNNNNNNNNNNNNNNN dNNNNNNNNNNNNNNNNNNNNNNU CO0 ;**************************************************************************** ; ; LIST DEVICE 1 (LST1) : PRI CENTRONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!*** ; ; LIST DEVICE 1 (LST1) ; ;**************************************************************************** ; LOS1: EQU LNNNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNNNA,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; LD A,IOBYTV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ; SET BANK Sa'BNNNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNN!L DEBUGGER SUPPORT ROUTINES ;**************************************************************************** ; ; GOTO STUB ; ;PrNNNNNNNNNNNNNNNNN!3+NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++ ; ; RETURN CURRENTLY SELECTED BANK FUNCTION #7 ; EXIT - A= BANK ; ;++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNBANK ; LD A,DEFBNK OUT (BNKREG),A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,003FH ;USE STACK TO INIT RESTARTSNNNNNNNNNNNNNNNNN-vFNNNNNNNNNNNNNNNNNNNNNNBANK 0FEH (ROM BANK) LD HL,THIS_STK ;SET PTR LD C,0 ;SET TO 0800H CALL PUTMEM ; INC HL LD C,8 CALL PUTMEM ; ; (NNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNN!************************************************** ; CIS1: EQU CIS0 CI1: EQU CI0 COS1: EQU COS0 CO1: EQU CO0 ;********kHNNNNNNNNNNNNNNNNN 7NNNNNNNNNNNNNNNNNNNNNNNICS ; ;**************************************************************************** ; ; RETURN OUTPUT STATUS ; LOS0: NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOS0 LO1: EQU LO0 ;**************************************************************************** ; ; LIST DEVICE 2 (LST2) f NNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!TACK ; LD (THIS_STK),SP ; ; SET FUNCTION CALL RESTART ; LD HL,FUNENT LD (MFUNRSV),HL ; ; INIT ROMS (I/O) ; LD NNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNN!**************************************************************************** ; GOTOS: ; ; SCRUB FUNCTION DATA ON STACK ; -NNNNNNNNNNNNNNNN"fxNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++ ; RETCBNK: LD A,(CURBNK) CP A,A ;RETURN ZF RET SUBTTL INITIALIZATINNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES ; INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET STACK ; LD SP,MONSTK/NNNNNNNNNNNNNNNN.#NNNNNNNNNNNNNNNNNNNNNNSET FUNCTION CALL RESTART ; LD HL,FUNENT LD (MFUNRSV),HL ; ; INIT ROMS (I/O) ; LD HL,[CHR_RNUM SHL 8] + 1 ;CHAR PUdNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN******************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;****************]NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! LD A,0BFH ;THIS PRINTER NEEDS STB=F FOR BUSY OUT (PRI_2CNT),A ; TO WORK PROPERLY ; IN A,(PRI_1ST) ;FETCH STATUS CPL ^NNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNN ; ;**************************************************************************** ; LOS2: EQU LOS0 LO2: EQU LO0 LOGMSGQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHL,[CHR_RNUM SHL 8] + 1 ;CHAR PUSH HL CALL XROMF POP HL ; LD HL,[DEB_RNUM SHL 8] + 1 ;DEBUGGER PUSH HL CALL XROMFHNNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNNN POP HL ;RET ADDR TO XROMF POP HL ;CALLER RETURN ADDR POP HL ;XROM ARGUMENT ; ; SET REGISTERS ; LD HL,(RLOC) ;L= -9NNNNNNNNNNNNNNNNN#UINNNNNNNNNNNNNNNNNNNNNNON CODE ;---------------------------------------------------------------------------- ; ; THIS IS THE COLD START INIT CODE ;ENNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN ; ; SET MEMORY BANK CONSTANT ; LD (THIS_BNK),A ;A STILL HAS DEFAULT BANK # LD (CURBNK),A ; ; INIT ALL BANKS ; LGNNNNNNNNNNNNNNNN/$NNNNNNNNNNNNNNNNNNNNN!SH HL CALL XROMF POP HL ; LD HL,[DEB_RNUM SHL 8] + 1 ;DEBUGGER PUSH HL CALL XROMF POP HL ; LD HL,[DK_RNUM SHL 8NNNNNNNNNNNNNNNNNZNNNNNNNNNNNNNNNNNNNNN!************************************************************ ; CIS2: EQU CIS0 CI2: EQU CI0 COS2: EQU COS0 CO2: EQU CO0 -NNNNNNNNNNNNNNNNN CNNNNNNNNNNNNNNNNNNNNN! AND A,[1 SHL PRI_1BSB] ;TEST BUSY RET Z ; LD A,-1 RET ; ; ; OUTPUT CHAR ; LO0: CALL LOS0 ;WAIT FOR BUSY=FALS NNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNN DB ' M5b Character I/O V. ' PVERS VERSN DM CR,LF END NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN POP HL ; LD HL,[DK_RNUM SHL 8] + 1 ;DISK PUSH HL CALL XROMF POP HL ; LD HL,[CLK_RNUM SHL 8] + 1 ;MISC PUSH HLCNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNR, H= I LD A,H ;SET I REG. LD I,A ; LD A,L ;SAVE R REG ; LD HL,(FLOC) ;FETCH AF PUSH HL ; LD HL,(LLOC) ;SET HL iNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN! ;---------------------------------------------------------------------------- ; ROM_INIT: ;XROM ENTRY INIT: ;EXTERNAL ENTRY]NNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNND E,A ;START WITH ALL Z80 BANKS LD HL,THIS_BNK ;POINT TO LOCATION TO STORE BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTM5NNNNNNNNNNNNNNNNN0iNNNNNNNNNNNNNNNNNNNNN!] + 1 ;DISK PUSH HL CALL XROMF POP HL ; LD HL,[CLK_RNUM SHL 8] + 1 ;MISC PUSH HL CALL XROMF POP HL ; ; OUTPbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!X'Æ^,Ȋd2͎j8Ӓp> ٖvE⚰~L瞶R X&NNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; EXECUTE THE DEBUGGER ; MAINLP: LD SP,MONSTK LD HL/NNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNN! MINIMIZE REFRESH REGISTER CHANGE ; LD R,A ;SET R POP AF ;SET AF ; ; RESERVE SPACE FOR A EI INSTRUCTION TO BE PATCHED9NNNNNNNNNNNNNNNN LNNNNNNNNNNNNNNNNNNNNNNA,R ;DO REFRESH REGISTER AS SOON AS POSSIBLE LD (LLOC),HL POP HL LD (FLOC),HL ; LD L,A ;REFRESH REGISTER LD A,I LƀNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN- ; RSTER: PUSH AF PUSH HL LD HL,RSTMSG CALL PRTS POP HL POP AF JP REST ;************************************9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++ ; ; RETURN SYSTEM CONSOLE OUTPUT STATUS FUNCTION ; EXIT - A= 0: BUSY, FFH: READY ; ;+++++++PNNNNNNNNNNNNNNNNN]NNNNNNNNNNNNNNNNNNNNNN+++++++++++ ; CIS: XCROM MF_CIS ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%NNNNNNNNNNNNNNNN%SNNNNNNNNNNNNNNNNNNNNN!A= 0: BUSY, FFH: READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LOS: XCROM MF_LOSDNNNNNNNNNNNNNNNNN+p NNNNNNNNNNNNNNNNNNNNN!FROM PROM DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAG;NNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNN!,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL CALL XROMF POP HL JR MAINLP SUBTTL DEBUGGER SUPPORT ROUTINES ;*****nNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN IN ; DB 0 ;'NOP' OR PLACE FOR 'EI' ; ; RETURN TO EXECUTION ADDRESS ON STACK ; RET ;****************************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNND H,A LD (RLOC),HL ; LD (ELOC),DE LD (CLOC),BC ; ; FETCH RETURN ADDRESS FROM PGM STACK ; POP BC ; ; SAVE SP ATNNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNN**************************************** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; COS: XCROM MF_COS ; ; DONE ; RET ;******OpNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!++++++++++++ ; ; RETURN NEXT SYSTEM CONSOLE INPUT CHAR FUNCTION ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;+++++++++++++++++++++++++aNNNNNNNNNNNNNNNN&PNNNNNNNNNNNNNNNNNNNNNN ; ; DONE ; RET SUBTTL MESSAGES RSTMSG: DM CR,LF,'RST ERR ' LOGMSG: DB CR,LF,'65K BANKED ZMON V. ' PVERS VERSN NNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;===============================================================jnNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN*********************************************************************** ; ; GOTO FUNCTION #8 ; ;****************************NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN************************************************ ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A BREAKPOINT ; NNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN BREAKPOINT ; LD (SLOC),SP ; ; BACK UP RETURN ADDRESS TO POINT TO RESTART INSTRUCTION ; DEC BC ; ; SET UP LOCAL ST{NNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNN!MINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;***********************************************NNNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNNN********************************************************************** ; ; SEND CHAR TO SYSTEM CONSOLE OUTPUT PROCEDURE ; ENTNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: XCROM MF_CI ; ; DONE ; RET ;**************************yNNNNNNNNNNNNNNNN'5aNNNNNNNNNNNNNNNNNNNNNN DM CR,LF END &NNNNNNNNNNNNNNNNN-ڪNNNNNNNNNNNNNNNNNNNNNN============= ; ; OTHER DECLARATIONS ; ;============================================================================ ; MR_`NNNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNN!************************************************ ; GOTOS: ; ; SCRUB FUNCTION DATA ON STACK ; POP HL ;RET ADDR TO XROMF[VHNNNNNNNNNNNNNNNNN ENNNNNNNNNNNNNNNNNNNNN!RESTART INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE ; MONITOR VARIABLE AREA FOR LATER ACCESS AND USE BY THE3NNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNNACK ; LD SP,MONSTK ;SET THE MONITOR STACK ; ; RETURN TO DEBUGGER ; LD HL,[DEB_RNUM SHL 8] + 2 PUSH HL CALL XROMF t!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN***************************** ; PRTS: ; ; DISPLAY CHAR ; LD C,(HL) ;FETCH CHAR RES 7,C ;MAKE 7-BIT PUSH HL ;SAVE1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRY- C= CHAR ; ;**************************************************************************** ; CO: XCROM MF_CO ; ; DONEKwBNNNNNNNNNNNNNNNN"ʔNNNNNNNNNNNNNNNNNNNNNN************************************************** ; ; SEND CHAR TO LIST DEVICE OUTPUT PROCEDURE ; ENTRY- C= CHAR ; ;******'NNNNNNNNNNNNNNNNN(%_NNNNNNNNNNNNNNNNNNNNNNQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ;HNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!RNUM EQU 0 ;INTERIM DEFINITION FOR INTERRUPT ROM SWAP ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BNNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNN POP HL ;CALLER RETURN ADDR POP HL ;XROM ARGUMENT ; ; SET REGISTERS ; LD HL,(RLOC) ;L= R, H= I LD A,H ;SET I REG:NNNNNNNNNNNNNNNNN vNNNNNNNNNNNNNNNNNNNNNN GOTO & THE EXAMINE ; REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;*********************WNNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNN POP HL JP MAINLP SUBTTL SUBROUTINES & FUNCTIONS ;-----------------------------------------------------------------------[NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN PTR CALL CO ;DISPLAY CHAR POP HL ;RESTORE PTR ; ; IF CHAR < 128 THEN REPEAT ; BIT 7,(HL) INC HL ;NEXT CHAR JR "NNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNN! ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN SYSTEM CONSOLE INPUT SDNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN********************************************************************** ; LO: XCROM MF_LO ; ; DONE ; RET ;+++++++'NNNNNNNNNNNNNNNNNN)nNNNNNNNNNNNNNNNNNNNNNN PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV "CNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNOOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LO6,aNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN. LD I,A ; LD A,L ;SAVE R REG ; LD HL,(FLOC) ;FETCH AF PUSH HL ; LD HL,(LLOC) ;SET HL ; ; DO AT LAST MINUTE TO NNNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNN!******************************************************* ; REST: ; ; SAVE 8080 REGS FIRST SO WE CAN WORK ; PUSH AF LD "TNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN----- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;---------------------------------------------------------------------------(NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNZ,PRTS ; ; ELSE DONE ; RET SUBTTL EXTERNAL NON-FUNCTION CONSOLE I/O ;+++++++++++++++++++++++++++++++++++++++++++++.pNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNNTATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++HNNNNNNNNNNNNNNNNN$`2NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE OUTPUT STATUS FUNCTION ; EXIT - NNNNNNNNNNNNNNNNN*C=NNNNNNNNNNNNNNNNNNNNNNEQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_BNK EQU PAGE0 + 001BH ;BANK # OF THE CURRENT BANK DK_BDRV EQU 0041H ;BOOT DRIVE # NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ;ZNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁻V$򅿆Z(Ċ`.ʎf4ϒl:Ֆq> ۚvD|J梴PNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++ ; ; RETURN CALENDAR FUNCTION #3 ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; DE= ? ; ;]NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION #4 ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; DE1NNNNNNNNNNNNNNNNN |NNNNNNNNNNNNNNNNNNNNNN - A= REGISTER DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKRETR: GETD: ; ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!LK_SECL CALL GETD AND A,CLK_DMSK ;MASK OFF UNWANTED BITS LD B,A ; ; WAIT UNTIL SECONDS CHANGE ; CLKRWT: CALL GETD BNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTOP: ; ; PUT HOLD ON CLOCK ; LD A,[1 SHL݈NNNNNNNNNNNNNNNNNmNNNNNNNNNNNNNNNNNNNNN!FROM CLOCK FUNCTION ; ENTRY- C= CLOCK REGISTER # ; EXIT- DE= DIGITS ; A= HIGH DIGIT ; C= C + 2 ; ;++++++++++++++++++++++#NNNNNNNNNNNNNNNNN%d3NNNNNNNNNNNNNNNNNNNNN!H HIGH BYTE ; LD A,D ; ; MASK OFF NON-NUMERICAL BITS ; AND A,H ; ; MULTIPLY TENS DIGIT BY 10 & ADD TO UNITS ; L!NNNNNNNNNNNNNNNN+G= 5us PER DATA SHE/=NNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNN AND A,CLK_DMSK CP A,B JR Z,CLKRWT ; ; DONE, RETURN 0 ; LD B,A XOR A,A RET ;++++++++++++++++++++++++++++++++pNNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNN CLK_HOLD] OUT (CLK_DATA),A ; ; DELAY >= 150us FROM HOLD ; LD B,20 ;DELAY >= 150us FROM HOLD ; CLKSDL: EX (SP),HL NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GET2D: ; ; FETCH LOW DIGIT ; CALL GETD LD E,A ; ; FETCH gNNNNNNNNNNNNNNNNN&1`NNNNNNNNNNNNNNNNNNNNNND B,A ;SET CNT LD A,C ;GET UNITS DIGIT JR Z,NOTENS ;IF (TENS & MASK) == 0 THEN RETURN UNITS ; LD C,10 ;ELSE ADD TENS D!NNNNNNNNNNNNNNNN,ޫNNNNNNNNNNNNNNNNNNNNNN ; SET CLOCK DIGIT PROCEDURE ; ENTRY- A= BCD DATA ; C= COMMAND ; EXIT - A= COMMAND ; ;++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNNNE FOR AWHILE ; CALL CLKWAIT ; ; FETCH DAY OF WEEK & SAVE ; LD C,CLK_WEEK CALL GETD AND A,7 ;MASK OFF GARBAGE {0..NNNNNNNNNNNNNNNNN 'NNNNNNNNNNNNNNNNNNNNNNILIZE ; CALL CLKWAIT ; ; PROCESS SECONDS ; LD C,CLK_SECL CALL GET2D LD H,7 ;MASK {0..79} CALL GETN PUSH AF ;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNET ; EX (SP),HL EX (SP),HL ; ; RETURN WITH DATA ; IN A,(CLK_DATA) ;RETURN DATA RET ;+++++++++++++++++++++++++ONNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IF BOARD PRESENT FUNCTION #7 ; EXIT - A,L= 0: THERE, /0: NOT THERE ; NNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNEX (SP),HL DJNZ CLKSDL ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++B$NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNN!HIGH DIGIT ; INC C CALL GETD LD D,A ; ; PRESETUP FOR NEXT TIME ; INC C ; ; DONE ; RET ;+++++++++++++++]gNNNNNNNNNNNNNNNN'QNNNNNNNNNNNNNNNNNNNNNNIGIT ; TENSLP: ADD A,C DJNZ TENSLP ; ; DONE CONVERTING, RESTORE & RETURN ; NOTENS: POP BC ; RET ;+++++++++++++?NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++ ; CLK_SET: ; ; OUTPUT DATA ; SET CLK_HOLD,A ;KEEP CLOCK STOPPED OUT (CLK_DATxNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNN7} LD L,A ; ; PROCESS DAY ; INC C CALL GET2D LD H,3 ;MASK {0..39} CALL GETN PUSH AF ; ; PROCESS MONTH ; NNNNNNNNNNNNNNNNN rNNNNNNNNNNNNNNNNNNNNN!SAVE ; ; PROCESS MINUTES ; CALL GET2D CALL GETN ;USE SAME MASK AS ABOVE {0..79} LD B,A ; ; PROCESS HOURS ; CA] NNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT FOR CLOCK TO CHANGE FUNCTION #6 ; EXIT - A= 0: OK, /0: BOARD NOTNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISTHERE: ; ; FETCH CLOCK DATA ; IN A,(CsNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN+ ; ; START CLOCK FUNCTION #9 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTRT: NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BCD NUMBER TO BINARY FUNCTION ; ENTRY- E= LO BCD # "dNNNNNNNNNNNNNNNN(oNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BINARY NUMBER TO BCD DIGITS FUNCTION ; ENTRY- A= NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!A),A ; ; OUTPUT REGISTER # ; LD A,C OUT (CLK_CMD),A ; ; STROBE DATA INTO REGISTER ; SET CLK_WRT,A OUT (CLK_CMDNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNN! CALL GET2D LD H,1 ;MASK {0..19} CALL GETN LD B,A ; ; PROCESS YEAR ; CALL GET2D LD H,0FH ;MASK {0..99} CALL GNNNNNNNNNNNNNNNN ANNNNNNNNNNNNNNNNNNNNNNLL GET2D LD H,3 ;MASK {0..39} CALL GETN LD C,A ; ; RETURN MINUTES IN A ; POP AF RET ;++++++++++++++++++++++ |NNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNN PRESENT ; C= CLK_SECL ; B= LO SECONDS DATA ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLK_DATA) ; ; IF UPPER BITS NOT DRIVEN THEN BOARD IS NOT THERE ; AND A,11000000B ; ; ADJUST SENSE ; RET ;+++++_NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; ; CLEAR HOLD ; XOR A,A OUT (CLK_DATA),A ; ; CLEAR COMMAND ; OUT (CLK_CMD),A ; ; DONE ; RET SUBTTL ?dNNNNNNNNNNNNNNNN#ΕNNNNNNNNNNNNNNNNNNNNN! ; D= HI BCD # ; H= MASK FOR HI BYTE ; EXIT - A= NUMBER ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++XNNNNNNNNNNNNNNNN)!^NNNNNNNNNNNNNNNNNNNNNNBINARY DATA ; EXIT - A= UNITS DIGIT ; L= TENS DIGIT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN),A ; LD A,C OUT (CLK_CMD),A ; ; DONE ; RET ;******************************************************************`X[NNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNN!ETN ; ; RETURN VALUES ; LD C,A ;RETURN YEAR IN C POP AF ;RETURN DAY IN A RET ;++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CLOCK DATA FUNCTION #5 ; ENTRY- C= CLOCK REGISTER # ; EXIT1NNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNN+ ; CLKWAIT: ; ; IF BOARD NOT THERE THEN RETURN ERROR ; CALL ISTHERE RET NZ ; ; FETCH CURRENT SECONDS ; LD C,C NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; STOP CLOCK FUNCTION #8 ; EXIT - A, B= ? ; ;++++&NNNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNNNFUNCTIONS & PROCEDURES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN 2 BCD DIGITS g|NNNNNNNNNNNNNNNN$WNNNNNNNNNNNNNNNNNNNNN!+++++++++++++ ; GETN: ; ; SAVE REGS ; PUSH BC ; ; FETCH LOW BYTE ; LD A,E AND A,CLK_DMSK LD C,A ; ; FETCcNNNNNNNNNNNNNNNNN*t NNNNNNNNNNNNNNNNNNNNNN++++++++ ; H2BCD: ; ; TENS = 0 ; LD L,0 ; ; IF UNITS < 10 THEN DONE ; H2BCDL: CP A,10 RET C ; ; ELSE UNITBINNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN********** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LA>NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!Y'†^,Ɋc1͎i7ђm; זr@ܚxG➰~L袵R NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!ST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** NNNNNNNNNNNNNNNNE3NNNNNNNNNNNNNNNNNNNNN! + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUN_NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++3eNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!DISABLE UPLOAD (READ DATA) ; LD A,1 SHL PB_INHX LD (BTFLG),A ; ; ENABLE DOWNLOAD (WRITE DATA) ; LD HL,SECSZ LD (IOeNNNNNNNNNNNNNNNNNeONNNNNNNNNNNNNNNNNNNNN!LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL IN C REGISTER LD (DVRTPTR),HL NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PB_ST2O) CP A,-2 ;0: NO ID, -1: JADE ID, -2: EXNNNNNNNNNNNNNNNNN%%NNNNNNNNNNNNNNNNNNNNN!,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV) IF STHD <> 0 CP A,STHD JR C,LGCKFD NNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!********************************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;************************************************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; PRTS: ; ; TOP OF PRINTING LOOP ; LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 PUSH HL CALL CO POP \NNNNNNNNNNNNNNNNU NNNNNNNNNNNNNNNNNNNNNNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ;SELECT WRITE OP JP DISKOP ;+++++++++++++++++++++++++++++WNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESS INC HL LD D,(HL) INC HL LD (DVRXADR),3NNNNNNNNNNNNNNNN BNNNNNNNNNNNNNNNNNNNNN!TENDED ID JR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNONE ;ASSUME NO TRANSLATION ; ; IF HARD DISKL\NNNNNNNNNNNNNNNN&pNNNNNNNNNNNNNNNNNNNNNN ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; ^NNNNNNNNNNNNNNNNN,/NNNNNNNNNNNNNNNNNNNNN!**************************** ; SETTRK: LD (BTTRK),BC RET ;***********************************************************M@NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHL ; BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL JR Z,PRTS ; ; DONE ; RET ;***********************************NNNNNNNNNNNNNNNNN fyNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOP JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; ENNNNNNNNNNNNNNNNNNF@NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++ ; SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ; IF UNSUPPORTED DRIVE REQUESTED THEN RETURN 0 (ERRORiNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!N TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTyNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNBC,DPBSZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ID_FLGO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DEINNNNNNNNNNNNNNNNN)`NNNNNNNNNNNNNNNNNNNNNN******************* ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;**********************************************nNNNNNNNNNNNNNNNNN/|NNNNNNNNNNNNNNNNNNNNNN ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;*************************************************************9NNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNNAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOSD!NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKWR: ; ; VNNNNNNNNNNNNNNNNV~NNNNNNNNNNNNNNNNNNNNNN) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (BTDRV),A ; ; SAVE LOGON REQUEST FLAG ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE REVISED LD (IOPB + PB_ST2O),A ; CALL DISKLaNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURN DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A:INNNNNNNNNNNNNNNNN*5NNNNNNNNNNNNNNNNNNNNNN****************************** ; HOME: LD BC,0 ; ; FALL INTO SET TRACK ; ;******************************************v\NNNNNNNNNNNNNNNN01NNNNNNNNNNNNNNNNNNNNNN*************** ; SETDMA: LD (BTDMA),BC CALL GETBNK ;FETCH BANK ADDRESS FROM MONITOR LD (BTDMAX),A RET ;++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺V%]+Ɗb0̎h6Ӓp> ږvD{J枴O뢹U"NNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNإNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, *0NNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN+++++++++++++ ; ; COMMON DISK I/O CODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++ؑNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNITY LD E,A LD HL,IOPB LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNN************************************************ ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO D}-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSENNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!ECTOR LD D,0 LD HL,(IOPB + PB_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + PB_SECO),HL ; NNNNNNNNNNNNNNNNN+1NNNNNNNNNNNNNNNNNNNNN!ON ; OR A,A ;FUNCTION ERR? RET NZ ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET {1'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++͉NNNNNNNNNNNNNNNNNb=NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++ ; DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DE7 NNNNNNNNNNNNNNNNNțNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PB_TRKO LD NNNNNNNNNNNNNNNNN$#NNNNNNNNNNNNNNNNNNNNNNSKEB CALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CABNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNTP ; EXIT - DE, HL= ? ; ;**************************************************************************** ; TR8: TR3740: LD DENNNNNNNNNNNNNNNNN rNNNNNNNNNNNNNNNNNNNNN!T OF DPB PTR ADD HL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;++++++++++++++:pNNNNNNNNNNNNNNNNN&GNNNNNNNNNNNNNNNNNNNNNN ; EXECUTE IOPB ; CALL XPRIM ; ; RESTORE SECTOR ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET ;++++NgNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN SUBTTL JADE FLOPPY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE ÁdNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOIRNNNNNNNNNNNNNNNNN Q NNNNNNNNNNNNNNNNNNNNNNFBFR LD (IOPB + PB_DMAO),HL CALL GETBNK LD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,ID_SECT LNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBC,PB_BCNTO - PB_TRKO LDIR ; DISKOP2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLL COC POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRY THEN RETURN T)=NNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN,SDTRAN ; SETTR: LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;************************************************** NNNNNNNNNNNNNNNNN!CNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ;-NNNNNNNNNNNNNNNN'tNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0XNNNNNNNNNNNNNNNNN-.NNNNNNNNNNNNNNNNNNNNNN8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++,NNNNNNNNNNNNNNNNN'PNNNNNNNNNNNNNNNNNNNNNNR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; =NNNNNNNNNNNNNNNNN _NNNNNNNNNNNNNNNNNNNNNND (IOPB + PB_SECO),HL ; ; SET DESCRIPTOR SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + PB_TRKO)NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVXENNNNNNNNNNNNNNNNNBANNNNNNNNNNNNNNNNNNNNNNO CALLER JR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF IGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;**********************************aNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: ; ; \9NNNNNNNNNNNNNNNN(dNNNNNNNNNNNNNNNNNNNNNN: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; SET BANK ADDRESS TOTyNNNNNNNNNNNNNNNNN.}NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++ ; FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDANNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNN!EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1.BNNNNNNNNNNNNNNNN 7nNNNNNNNNNNNNNNNNNNNNN!,HL ; ; ENABLE UPLOAD ; LD A,L ;L= 0 LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD (IOPB + PB_BCNTO),HL ; ;>NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRXADR) ;FETCH DRIVER ADDRESS PREFETCHED FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRNNNNNNNNNNNNNNNNNqpNNNNNNNNNNNNNNNNNNNNN!NORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKER: NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN****************************************** ; TRNONE: LD DE,0 JR SETTR ;++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN#!NNNNNNNNNNNNNNNNNNNNN! CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO),A ; ; OFFSE4NNNNNNNNNNNNNNNNN)WNNNNNNNNNNNNNNNNNNNNNN THIS BANK FOR NOW ; CALL GETBNK LD E,A ;PRESET IOPB BANK LD (IOPB + PB_DMAXO),A ; ; EXECUTE THE PRIMITIVE IN ROM ;NNNNNNNNNNNNNNNNN/LNNNNNNNNNNNNNNNNNNNNNNRV) LD (IOPB + PB_DRVO),A ; ; FETCH SECTOR DATA ; LD HL,(IOPB + PB_SECO) PUSH HL ;SAVE FOR XPRIM RESTORE ; ; ; [IBNNNNNNNNNNNNNNNNA2NNNNNNNNNNNNNNNNNNNNNN.N} ; NOTRAN: LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN PASS COMMAND TO EXECUTOR ; LD A,PB_LOGC JR DISKOP2 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; CALL GETBNK ;SETUP BANK FOR FUTURE COMPATABIL_NNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNNNNLD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;****************************9gNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ; ;+++++++++++++$NNNNNNNNNNNNNNNN$!NNNNNNNNNNNNNNNNNNNNN!T LOGICAL ADDRESS WITH LOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SҹNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN LD HL,IOPB ;BANKED COMPATABILITY LD DE,(THIS_BNK) LD A,MF_XIOB ;SET MONITOR FUNCTION # CALL XMROM ;EXECUTE THE FUNCTIBNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED SECTOR SO RETRY WILL WORK ; POP HL LD (IOPB + PB_SECO),HL ;ONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"Z(ņb1Ίk9Վq? ܒxF▰~L蚷S"񞾟Z(ţa/NNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN THEN RETURN CF OR A,L SCF RET Z ; ; ELSE CP DE,HL ; LD A,E ;ELSE COMPARE HL TO DE SUB A,L LD A,D SBC A,H ;rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; ; FALL INTO HILOX ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILO FUNCTION(NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN CHAR != CONTROL-S THEN BREAK ; CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP A,CTRLS SCF RET NZ ; ; ELSE PAUSE ; nBNNNNNNNNNNNNNNNNN۩NNNNNNNNNNNNNNNNNNNNNN THEN RETURN OK ; CP A,'9' - '0' + 1 CCF RET NC ; ; ELSE IF CHAR < A THEN RETURN ERROR ; SUB A,'A' - '9' - 1 CP ANNNNNNNNNNNNNNNNN4bNNNNNNNNNNNNNNNNNNNNNN; ; GET CHAR FROM USER ; CALL ECHO P2C: ; ; IF CHAR == SPACE THEN RETURN NC,ZF ; CP A,' ' ;IF CHAR = ' ' THEN R t!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN******************************************** REST: ; ; SAVE 8080 REGS FIRST SO WE CAN WORK ; PUSH AF LD A,R ;DO REFRENNNNNNNNNNNNNNNNN%tNNNNNNNNNNNNNNNNNNNNNNBC A,(HL) JR Z,RS5 ;FOUND 1, RESET IT ; ; NOT FOUND, SKIP TO NEXT RECORD ; INC HL ;SKIP BANK INC HL ;SKIP DATA ; mNNNNNNNNNNNNNNNNN+WNNNNNNNNNNNNNNNNNNNNNNDATA ; ; IF BREAKPOINT ALREADY CLEARED THEN SKIP RESTORE ; LD A,E ;IF LOC = 0:0 THEN SKIP RESTORE OR A,D OR A,C JR,CNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; RETURN RESULTS ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILOXB RO*xNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ƐNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!CALL CONI ;ELSE WAIT FOR NEXT CHAR ; ; RETURN CONTINUE ; OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++uNNNNNNNNNNNNNNNNNNB>NNNNNNNNNNNNNNNNNNNNNN10 ; ; ELSE RETURN CHAR - 7 ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NNNNNNNNNNNNNNNNNa1NNNNNNNNNNNNNNNNNNNNNNETURN RET Z ; ; IF CHAR == COMMA THEN RETURN NC, ZF ; CP A,',' RET Z ; ; IF CHAR == RETURN THEN RETURN CF, ZF ; NNNNNNNNNNNNNNNNN oNNNNNNNNNNNNNNNNNNNNNNSH REGISTER AS SOON AS POSSIBLE LD (LLOC),HL POP HL LD (FLOC),HL ; LD L,A ;REFRESH REGISTER LD A,I LD H,A LD (RLֵyNNNNNNNNNNNNNNNNN&!NNNNNNNNNNNNNNNNNNNNNN DEC D JR NZ,RS2 ; ; NO BREAKPOINTS MATCH, ASSUME NOT SET ; INC BC ;BACK UP PTR TO RETURN ADDRESS ; RS5: ; ; DIpNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN! Z,RS8 ; ; ELSE RESTORE ORIGINAL DATA ; LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. PUSH HL EX DE,HL ;HL= MEMPTR LD EݦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!UTINE BUMPS BC & HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETNNNNNNNNNNNNNNNNN 7NNNNNNNNNNNNNNNNNNNNNN ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ; ACCORDINGLY. IT ALSO CHECKS FOR A KEYBOARD ABORT. ; ENTRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++ ; ; NIBBLE FUNCTION CONVERTS THE ASCII CHARACTERS 0-9 & A-F TO THEIR ; EQUIVALENT HEX VALUE.JNNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNN!; PCHK FUNCTION READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; SPECIAL CHARACTER. IF IT IS NOT A SPECIAL CHARACTER,lNNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNN! CP A,CR SCF RET Z ; ; ELSE RETURN NC,NZ ; CCF ;ELSE RETURN NC RET ;***************************************{DNNNNNNNNNNNNNNNNN!^NNNNNNNNNNNNNNNNNNNNN!OC),HL ; LD (ELOC),DE LD (CLOC),BC ; ; FETCH RETURN ADDRESS FROM PGM STACK ; POP BC ; ; SAVE SP AT BREAKPOINT ;]NNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNSPLAY BREAKPOINT INDICATOR ; PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT ; ; STORE PC ; POP DE LD (PLINNNNNNNNNNNNNNNNN-3NNNNNNNNNNNNNNNNNNNNNN,C ;E= BANK LD C,A ;C= DATA CALL PUTMEM POP HL ; ; NEXT BREAKPOINT ; RS8: INC HL ;DO NEXT BP DJNZ RS7 ; ; S~NNNNNNNNNNNNNNNNNAMNNNNNNNNNNNNNNNNNNNNNNURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ; ACCORDINGLY. IT ALSO TESTS FOR A KEYBOARD ABORT. ; =>NNNNNNNNNNNNNNNN bBNNNNNNNNNNNNNNNNNNNNNNY- HL = PTR ; DE = LAST PTR ; EXIT - HL = HL + 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; A= ? ; ;+++++++++++kNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN IF THE CHARACTER IS NOT IN RANGE, THE CARRY BIT IS ; SET TO FLAG THE ERR. ; ENTRY- A= ASCII-HEX CHAR ; EXIT - A= BINARY VALUչNNNNNNNNNNNNNNNNN$\NNNNNNNNNNNNNNNNNNNNNN A NON-ZERO CONDITION ; IS RETURNED. IF IT IS A SPECIAL CHARACTER, A ZERO CONDITION IS RETURNED. ; FURTHER, IF THE CHARACTER I2A NNNNNNNNNNNNNNNN˗NNNNNNNNNNNNNNNNNNNNNN************************************* ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A BREAKPOINT ; RESTART INS&NNNNNNNNNNNNNNNNN" NNNNNNNNNNNNNNNNNNNNNN LD (SLOC),SP ; ; BACK UP RETURN ADDRESS TO POINT TO RESTART INSTRUCTION ; DEC BC ; ; SET UP LOCAL STACK ; LD SP NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNOC),DE LD A,(THIS_BNK) LD (BNKLOC),A ; ; DISPLAY BREAK ADDRESS ; EX DE,HL ;HL= ADDR LD E,A ;E= BANK CALL LADR ?NNNNNNNNNNNNNNNNN.`NNNNNNNNNNNNNNNNNNNNNNAVE THE Z80 UNIQUES ; EX AF,AF' EXX LD (LPLOC),HL LD (EPLOC),DE LD (CPLOC),BC PUSH AF POP HL LD (FPLOC),HL LDR:NNNNNNNNNNNNNNNNNr|NNNNNNNNNNNNNNNNNNNNNNENTRY- HL = PTR ; DE = LAST PTR ; EXIT - HL = HL + 1 ; BC = BC + 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; AàNNNNNNNNNNNNNNNNN QsNNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HILOX: ; ; BUMP & TEST HL ; CALL HILO RET C ;DONE IRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNE OF 'CHAR' ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NIBBLE: ; ; IF CHAR < 0 THEN brNNNNNNNNNNNNNNNNmNNNNNNNNNNNNNNNNNNNNNNS A CR, THE CARRY FLAG IS SET. A BLANK OR A ; COMMA RESETS THE CARRY FLAG. ; EXIT - A= CHAR ; NC, ZF= DELIMITER (' ' OR ',')!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!TRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE ; MONITOR VARIABLE AREA FOR LATER ACCESS AND USE BY THE GOTO & THENNNNNNNNNNNNNNNNNNN# F THEN RETURN ERROR ; CP A,'G' - '0' CCF RET C ; ; IF CHAR <= 9NNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNN! ; CF, ZF= CR ; NC. NZ= ANY OTHER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PCHK: qrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN EXAMINE ; REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;********************************z6NNNNNNNNNNNNNNNN$GNNNNNNNNNNNNNNNNNNNNNN A,C SUB A,(HL) ;SEE IF SOFTWARE TRAP INC HL LD A,B SBC A,(HL) ;MAYBE, TRY REST OF ADDR INC HL LD A,(THIS_BNK) S$9NNNNNNNNNNNNNNNN*dNNNNNNNNNNNNNNNNNNNNNN ADDRESS LD (HL),0 ;CLEAR BREAKPOINT INC HL LD D,(HL) LD (HL),0 INC HL LD C,(HL) LD (HL),0 INC HL ;SET PTR TO eD NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!----------------------------------- ; ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN*NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNZ(Æ_-Ɋe4Ўl:֒rAޖzH㚱M랹T"𢽣Y'NNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN PROGRAM ERRORS (DETERMINED BY PARTICULAR ROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO dNNNNNNNNNNNNNNNNN#.NNNNNNNNNNNNNNNNNNNNNN--------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;------------------------------------eNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNT BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;***************************************A$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNL= ARG1 ; DE= ARG2 ; A, BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EXLF: ; ;&NNNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNN!LUE ON THE CONSOLE, EITHER AT ; THE START OF A NEW LINE (LADRA) OR AT THE CURRENT CURSOR LOCATION (LADR). ; ENTRY- E:HL= ADDRE,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN******************** HEX1: ; ; SAVE LOW NIBBLE ; PUSH AF ; ; DO HIGH NIBBLE 1ST ; RRCA RRCA RRCA RRCA CALqrNNNNNNNNNNNNNNNN%CNNNNNNNNNNNNNNNNNNNNNNPROCEDURE ; ;**************************************************************************** COLON: LD C,':' JP CO ;***~NNNNNNNNNNNNNNNNN+`NNNNNNNNNNNNNNNNNNNNNN LADRB: ; ; DISPLAY WORD VALUE ; CALL LADRA ; ; FALL INTO DISPLAY BLANK PROCEDURE ; ;**************************^rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBE ; PRINTED, THEN DOES A WARM INIT OF THE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSI%NNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN---------------------------------------- COMERR: CALL PRTWD JP WSVEC ;++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************************* ; ; 1ST ENTRY STARTS ON A NEW LINE ; PRTWD: CALL CRLF ; ; THIS ENTRY STARTS WHERTaNNNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNNN GET THE ARGS ; CALL EXPR ; ; RETURN THE ARGS ; POP DE POP HL ; ; FOLLOW WITH A NEW LINE ; JP CRLF ;**hNNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNNSS VALUE TO DISPLAY ; ;**************************************************************************** ; ; 1ST ENTRY STARTS OzNNNNNNNNNNNNNNNNN _NNNNNNNNNNNNNNNNNNNNNNL HEX2 ; ; NOW DO LOW NIBBLE ; POP AF HEX2: CALL CONV JR CO ;****************************************************NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN************************************************************************* ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICENNNNNNNNNNNNNNNNNNN,2NNNNNNNNNNNNNNNNNNNNN!************************************************** ; ; DISPLAY A BLANK (SPACE) ON THE SYSTEM CONSOLE PROCEDURE ; ;**********NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGNMENT. ; ;---------------------------------------------------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFANNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++ ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; EXIT - A= CHAR AND 7FH ; ;++++lNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNEVER THE CURSOR IS ; PRTWA: ; ; SAVE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR NNNNNNNNNNNNNNNNNF?NNNNNNNNNNNNNNNNNNNNNN************************************************************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEViNNNNNNNNNNNNNNNNNNe0NNNNNNNNNNNNNNNNNNNNNNN A NEW LINE ; LADRA: CALL CRLF ; ; ENTRY TO CONTINUE AT CURRENT CURSOR LOCATION ; LADR: ; ; DISPLAY BANK # ; LD (NNNNNNNNNNNNNNNN!nNNNNNNNNNNNNNNNNNNNNNN************************ ; ; CONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; ENT 4rNNNNNNNNNNNNNNNNN'%NNNNNNNNNNNNNNNNNNNNNN ; ;**************************************************************************** ; ; 1ST ENTRY DISPLAYS DATA BYTE IN A FIRlNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN****************************************************************** BLK: ; ; PASS A BLANK TO CO PROCEDURE ; LD C,' ' ; XNNNNNNNNNNNNNNNNNv}NNNNNNNNNNNNNNNNNNNNNNULT LD (IOBYTE),A LD HL,IOMSG JR COMERR ;----------------------------------------------------------------------------zNNNNNNNNNNNNNNNNN UrNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CONI: ; ; GET CHAR FROM CONSOLE ; CALL CI ; ;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO ; LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA ; ; RESTORESNNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNNICE TO ; START A NEW LINE. ; ;**************************************************************************** CRLF: ; ; SANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNA,E CALL HEX1 ; CALL COLON ; ; DO HIGH BYTE 1ST ; LD A,H CALL HEX1 ; ; NOW DO LOW BYTE ; LD A,L ; ; FALNNNNNNNNNNNNNNNNN"=NNNNNNNNNNNNNNNNNNNNNNRY- A= NUMBER (LO NIBBLE) ; EXIT - A= C= ASCII NUMBER ; ;********************************************************************zNNNNNNNNNNNNNNNNN(5NNNNNNNNNNNNNNNNNNNNNNST ; DASH1: CALL HEX1 ;OUTPUT A AS HEX ; ; THIS ENTRY DISPLAYS ONLY THE DASH ; DASH: LD C,'-' JR CO ;***********NNNNNNNNNNNNNNNN.PNNNNNNNNNNNNNNNNNNNNN!; FALLS INTO CO SUBR ; SUBTTL IOBYTE HANDLERS ;***********************************************************************NNNNNNNNNNNNNNNNNELNNNNNNNNNNNNNNNNNNNNNN ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;---------------------------------------------------------------------------- RS2oBNNNNNNNNNNNNNNNNN fCNNNNNNNNNNNNNNNNNNNNNN MASK OUT BIT 7 ; AND A,7FH ; ; THIS RETURN DOES DOUBLE DUTY AS A STUB ; RTS: RET ;*****************************oNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN & RETURN ; POP BC RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXLF FUNCTI 'NNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNNVE REG ; PUSH HL ; ; DISPLAY CRLF MESSAGE ; CRLFA: LD HL,CRMSG CALL PRTWA ; ; RESTORE REG & RETURN ; POP HL c=HNNNNNNNNNNNNNNNNNϖNNNNNNNNNNNNNNNNNNNNN!L INTO BYTE OUTPUT PROCEDURE ; ;**************************************************************************** ; ; DISPLAYCNNNNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNNN******** CONV: AND A,0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A !NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!***************************************************************** ; ; PRINT ADDR PROCEDURE DISPLAYS A WORD VALUE FOLLOWED BY AqNNNNNNNNNNNNNNNN/aNNNNNNNNNNNNNNNNNNNNN!***** ; ; CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; C= CHAR ; ;***********NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTER: PUSH AF PUSH HL LD HL,RSTMSG CALL PRTWD POP HL POP AF JP REST ;-------------------------------------------GINNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN*********************************************** ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUS-NNNNNNNNNNNNNNNNNߨNNNNNNNNNNNNNNNNNNNNN!ON READS 2 ARGUMENTS FROM THE SYSTEM CONSOLE AND RETURNS ; WITH THE CONSOLE CURSOR ON THE NEXT LINE. ; ENTRY- B= 2 ; EXIT - H9NNNNNNNNNNNNNNNN0cNNNNNNNNNNNNNNNNNNNNN!RET ;**************************************************************************** ; ; LADR ROUTINE OUTPUTS THE ADDRESS VAn!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN HEX BYTE ON SYSTEM CONSOLE PROCEDURE ; ENTRY- A= BYTE TO DISPLAY ; ;********************************************************@NNNNNNNNNNNNNNNNN$pNNNNNNNNNNNNNNNNNNNNNN RET ;**************************************************************************** ; ; DISPLAY A COLON ON SYSTEM CONSOLE xNNNNNNNNNNNNNNNNN*SNNNNNNNNNNNNNNNNNNNNNN SPACE. ; ENTRY- E:HL= WORD VALUE TO DISPLAY ; ;**************************************************************************** dNNNNNNNNNNNNNNNNN0,NNNNNNNNNNNNNNNNNNNNNN***************************************************************** CO: LD A,(IOBYTE) AND A,3 JP Z,CO0 ;CONSOLE 0 CP A,2 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!Z(Æ`.ˊf5юm;֒q? ۖwEᚯ~L鞸T"񢿣[)NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;********************************************************vNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNN********************************* CI: LD A,(IOBYTE) AND A,3 JP Z,CI0 ;CONSOLE 0 CP A,2 JP M,CI1 ;CONSOLE 1 JP Z,CI2NNNNNNNNNNNNNNNNN aNNNNNNNNNNNNNNNNNNNNNNXIT - A= 0: BUSY, FFH: READY ; ;**************************************************************************** LSTAT: LD A,(IOB8gNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************************************ ; ; SERIAL CHANNEL OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 4..5)= 0: SC0, 10H: NNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNN! NOT READY TO ACCEPT CHAR THEN WAIT AND A,1 SHL NT_BUSY JR NZ,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NT_DATA),A RET`NNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNN!CI0 ;IOER ;**************************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON4!NNNNNNNNNNNNNNNN%.NNNNNNNNNNNNNNNNNNNNNN ; TO WORK PROPERLY ; IN A,(PRI_1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI_1BSB] ;TEST BUSY RET Z ; LD A,-1 RET VNNNNNNNNNNNNNNNN+!!NNNNNNNNNNNNNNNNNNNNNN SI0: EQU IOER SO0: EQU IOER ;**************************************************************************** ; ; SERIAL CYNNNNNNNNNNNNNNNNNN_NNNNNNNNNNNNNNNNNNNNNN******************** ; ; CONSOLE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT;mNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNN ;CONSOLE 2 JP CI3 ;CONSOLE 3 ;**************************************************************************** ; ; LIST d~NNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNNYTE) AND A,0C0H JP Z,LSTAT0 ;PRINTER 0 CP A,80H JP M,LSTAT1 ;PRINTER 1 JP Z,LSTAT2 ;PRINTER 2 LD A,-1 ;CONSOLE (ASSݦrNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNSC1, 20H: SC2, 30H: SC3 ; C= CHAR ; ;**************************************************************************** PUNO: LD TNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN CSTS0: IN A,(NT_STAT) ;IF NOT CHAR NOT READY THEN RETURN 0 AND A,1 SHL NT_READY RET Z ; LD A,-1 ;ELSE RETURN -1 L9NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN3) ; ;**************************************************************************** CO3: EQU CO0 ;IOER CSTS3: EQU CSTS0 ;IOERNNNNNNNNNNNNNNNN&W}NNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; LIST DEVICE 1 (LST1) ; ;****************1NNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNHANNEL 1 (SC1) ; ;**************************************************************************** SI1: EQU IOER SO1 EQU IOER NNNNNNNNNNNNNNNNNnNNNNNNNNNNNNNNNNNNNNNN - A= 0: NOT READY, FFH: CHAR READY ; ;**************************************************************************** CSTS: LD NNNNNNNNNNNNNNNNN ANNNNNNNNNNNNNNNNNNNNNNDEVICE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ;*******************HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNUME READY) RET ;**************************************************************************** ; ; SERIAL CHANNEL INPUT SjNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNA,(IOBYTE) AND A,30H JP Z,SO0 ;SERIAL CHANNEL 0 CP A,20H JP M,SO1 ;SERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JPNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNRET ;**************************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON1) -NNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN CI3: EQU CI0 ;IOER ;**************************************************************************** ; ; LIST DEVICE 1 (LSTDNNNNNNNNNNNNNNNN'dLNNNNNNNNNNNNNNNNNNNNN!************************************************************ LO1: EQU IOER LSTAT1: EQU IOER ;****************************NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; SERIAL CHANNEL 2 (SC1) ; ;*************NNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNA,(IOBYTE) AND A,3 JP Z,CSTS0 ;CONSOLE 0 CP A,2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CSTS3 ;CONSOLE 3 NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!********************************************************* LO: LD A,(IOBYTE) AND A,0C0H JP Z,LO0 ;PRINTER 0 CP A,80H JPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNELECTOR ; ENTRY- (IOBYTE BIT 2..3)= 0: SC0, 4: SC1, 8: SC2, 0CH: SC3 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;*************ZrNNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNN! SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITIVE I/O DRIVERS ;*********************************************************************ANNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN; ;**************************************************************************** CI1: EQU CI0 CO1: EQU CO0 CSTS1: EQU CSTS0 ONNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN1) ; ;**************************************************************************** LO0: CALL LSTAT0 ;WAIT FOR BUSY=FALSET[NNNNNNNNNNNNNNNNN(trNNNNNNNNNNNNNNNNNNNNNN************************************************ ; ; LIST DEVICE 2 (LST2) ; ;***********************************************{:NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN*************************************************************** SI2 EQU IOER SO2 EQU IOER ;******************************+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; CONSOLE INPUT SELECTOR ; ENTRY- (IOBYT NNNNNNNNNNNNNNNNN 'NNNNNNNNNNNNNNNNNNNNNN M,LO1 ;PRINTER 1 JP Z,LO2 ;PRINTER 2 JP CO ;CONSOLE ;**************************************************************-$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!*************************************************************** RI: LD A,(IOBYTE) AND A,0CH JP Z,SI0 ;SERIAL CHANNEL 0 CMNNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNNN******* ; ; PRIMARY CONSOLE DEVICE (CON0) ; ;**************************************************************************** Ce^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;***LNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN JR Z,LO0 ; LD A,C ;OUTPUT CHARACTER OUT (PRI_1DO),A LD A,NOT [1 SHL PRI_1CSB] ;OUTPUT STROBE OUT (PRI_2CNT),A LD6NNNNNNNNNNNNNNNNNN)GCNNNNNNNNNNNNNNNNNNNNNN***************************** LO2: EQU IOER LSTAT2: EQU IOER ;***********************************************************ONNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN********************************************** ; ; SERIAL CHANNEL 3 (SC1) ; ;***********************************************KNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;*******************************************fFNNNNNNNNNNNNNNNNN PNNNNNNNNNNNNNNNNNNNNNN************** ; ; LIST DEVICE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; ENNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNP A,8 JP M,SI1 ;SERIAL CHANNEL 1 JP Z,SI2 ;SERIAL CHANNEL 2 JP SI3 ;SERIAL CHANNEL 3 ;****************************NNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNNI0: CALL CSTS0 ;IF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NT_DATA) ;ELSE RETURN CHAR RET CO0: IN A,(NT_STAT) ;IFMNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNN************************************************************************* CO2: EQU CO0 ;IOER CSTS2: EQU CSTS0 ;IOER CI2: EQU NNNNNNNNNNNNNNNNN$1NNNNNNNNNNNNNNNNNNNNNN A,0BFH OUT (PRI_2CNT),A ;CLEAR STROBE RET LSTAT0: LD A,0BFH ;THIS PRINTER NEEDS STB=F FOR BUSY OUT (PRI_2CNT),A:NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!***************** ; ; SERIAL CHANNEL 0 (SC0) ; ;**************************************************************************** NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN***************************** SI3: EQU IOER SO3: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR ' BOOTEubNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN큺V$񅾆Z'Ê]*Ŏb0̒h6Ӗo= ٚvDឯ}K碵QNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN (DIRBF + SECSZ) CONMSG **** WARNNNNNNNNNNNNNNNN&`MNNNNNNNNNNNNNNNNNNNNNNUPTS ; IN A,(M2_STAT) OR A,M2_IEN OUT (M2_STAT),A EI ENDIF ; IF BOOT = 10H ; TEST ISHA HOST ADAPTER FOR A HUYNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LJ$NNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNN!ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;##########################################'+dNNNNNNNNNNNNNNNN vNNNNNNNNNNNNNNNNNNNNNN---------------------------------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;--------------------------------rNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNN! 80H DB 'Y',[YLOC - RLOC + 1 ] + 80H DB 'R',RLOC - RLOC ; ; BANK REGISTER ; DB 80H + 'K',BNKLOC - RLOC DB -1 YNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH I)aNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PASSd'NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENmNNNNNNNNNNNNNNNNN'S|NNNNNNNNNNNNNNNNNNNNNNNG CONDITION AND CLEAR IF TRUE ; IN A,(ISH_STATUS) ;IF HOST ADAPTER BUSY THEN BIT ISH_BSYB,A JR Z,NTHUNG ; LD A,PB_CLR,}dNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNND HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CALL SP[NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN################################## TBL: DW QPRT ;A DW BOOTC ;B BOOT DISK DW QPRT ;C DW DISP ;D DISPLAY MEMORY DW Q%NNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------- ACTBL: DB 80H + 'A',ALOC - RLOC DB 'B',BLOC - RLOC DB 'C',CLOC - RLOC DB 'D'xNNNNNNNNNNNNNNNNN~NNNNNNNNNNNNNNNNNNNNNNEND ^mNNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNNNIT ; INIT1: JR INIT ;############################################################################ ; ; DIRECTORY SECTORNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD STARKlrNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!DIF ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS $NNNNNNNNNNNNNNNNN(CBNNNNNNNNNNNNNNNNNNNNNNC LD (IOPB + PB_CMDO),A CALL XPRIM ; NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,3 VNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BTSEC INC NNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNPRT ;E DW FILL ;F FILL MEMORY DW GOTO ;G GOTO PGM & SET BREAKPOINTS DW QPRT ;H DW INPT ;I DISPLAY INPUT PORT DATA NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!,DLOC - RLOC DB 'E',ELOC - RLOC DB 'F',FLOC - RLOC DB 'H',HLOC - RLOC DB 'L',LLOC - RLOC DB 80H + 'M',[HLOC - RLOC] + NNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;#################NNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNN BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECKpgNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!T VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;#########################hnNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNUP VARIABLES ; ;---------------------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; LD SP,DE9NNNNNNNNNNNNNNNNN)psNNNNNNNNNNNNNNNNNNNNNN;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; ą'NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN(HL) ; LD DE,(IOPB + PB_BCNTO) ;SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT INNNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNN DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M MOVE MEMORY DW QPRT ;N DW OUPT ;O OUTPUT DATA TO OUTPUT PORT DW Q8KNNNNNNNNNNNNNNNNN `NNNNNNNNNNNNNNNNNNNNNN0C0H DB 'P',[PLOC - RLOC + 1 ] + 80H DB 'S',[SLOC - RLOC + 1 ] + 80H DB 'I',ILOC - RLOC ; ; PRIME Z80 REGISTER OFFSETS 9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN########################################################### ; ; THESE BOOT PARAMS MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD-NNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNN! FOR DISK CHANGE. ; ;############################################################################ ; DIRBF: EQU $ ;BUFFER BENNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNN################################################### ; ; SIGN-ON MESSAGE ; ;#################################################PpNNNNNNNNNNNNNNNNN$/NNNNNNNNNNNNNNNNNNNNNNFBFR ; IF INTRPTS ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; SET INTERRUPT MODE TO 2 ; IANNNNNNNNNNNNNNNNN*% NNNNNNNNNNNNNNNNNNNNNN LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; Lv NNNNNNNNNNNNNNNN0ɘNNNNNNNNNNNNNNNNNNNNNNTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UeNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!Y'†^,Ɋe3Ўl:֒r@ܖwEᚮ}K枴PX&NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNP NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP NNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNN ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; .NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+J.rNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNN!DOWNLOAD (WRITE DATA) ; LD HL,SECSZ LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ;SELECT WRITE OP aJBNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNRIVE IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESFNNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNN!ST2O) CP A,-2 ;0: NO ID, -1: JADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNOANNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNV) IF STHD <> 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; kNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN*************************************************************************** ; SETTRK: LD (BTTRK),BC RET ;************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!C,WREAD ; ; ELSE DONE READING SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/cNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTORNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; ENABLE UPLOAD (READ DATA) ; Xm[NNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNN JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOONNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNNS INC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE ADDRESNNNNNNNNNNNNNNNNN fNNNNNNNNNNNNNNNNNNNNNNNE ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + ID_FLGO) AND A,[1 SHErNNNNNNNNNNNNNNNNN&̡NNNNNNNNNNNNNNNNNNNNN!CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL^NNNNNNNNNNNNNNNNN,#jNNNNNNNNNNNNNNNNNNNNNN**************************************************************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;******************NNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNSECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WAANNNNNNNNNNNNNNNNN yNNNNNNNNNNNNNNNNNNNNN! INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TESTLHNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNN!OR A,A LD (BTFLG),A ; ; DISABLE DOWNLOAD (WRITE DATA) ; LD (IOPB + PB_BCNTO),A LD (IOPB + PB_BCNTO + 1),A ; ; PAS^yNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNN!G-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++++rNNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNNNS ; LD HL,(BTDRV) LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE ; ; IFBNNNNNNNNNNNNNNNN!U6NNNNNNNNNNNNNNNNNNNNNNL DF_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBAD NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNN! LD BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;**********hNNNNNNNNNNNNNNNN-[NNNNNNNNNNNNNNNNNNNNNN********************************************************** ; SETSEC: LD (BTSEC),BC RET ;*****************************QvNNNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNRM BOOT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PAGEH NNNNNNNNNNNNNNNNN *NNNNNNNNNNNNNNNNNNNNNN FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,NNNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNNS READ COMMAND ; LD A,PB_READC ;SELECT READ OP JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++HNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ; IF ULNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE LOG O NNNNNNNNNNNNNNNN"eNNNNNNNNNNNNNNNNNNNNN!;GET ADDR OF DPB LD HL,DEFBFR + ID_SPTO LD BC,DPBSZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ID_FSNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN****************************************************************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ANNNNNNNNNNNNNNNNN.ENNNNNNNNNNNNNNNNNNNNNN*********************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;**************TNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; XNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; RNNNNNNNNNNNNNNNNNNPNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++cNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSUPPORTED DRIVE REQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD QFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE NNNNNNNNNNNNNNNN#3TNNNNNNNNNNNNNNNNNNNNNNLGO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RENNNNNNNNNNNNNNNN)ܟNNNNNNNNNNNNNNNNNNNNNN;**************************************************************************** ; HOME: LD BC,0 ; ; FALL INTO SET TRACK ; NNNNNNNNNNNNNNNNNN/v9NNNNNNNNNNNNNNNNNNNNNN************************************************************** ; SETDMA: LD (BTDMA),BC LD A,(THIS_BNK) LD (BTDMAX),A RET@NNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNINIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0<^NNNNNNNNNNNNNNNNN %NNNNNNNNNNNNNNNNNNNNNN ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;++++++++++ENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++ ; DISKWR: ; ; DISABLE UPLOAD (READ DATA) ; LD A,1 SHL PB_INHX LD (BTFLG),A ; ; ENABLE NNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN(BTDRV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;D' NNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNREVISED LD (IOPB + PB_ST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PB_'NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNTURN DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRXV9NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;*NNNNNNNNNNNNNNNNN0etNNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- )!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁻W%Æ_.ʊf4юm< גsAݖxF⚯|J枴P좺V$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNNDE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; ANNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUF$NNNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNION ; LD HL,DSKEB CALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A BNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNNMUST BE PTR TO DTP ; EXIT - DE, HL= ? ; ;**************************************************************************** ; TR8WaNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNE,10 ;ADD OFFSET OF DPB PTR ADD HL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES HNNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN! PB_SECO),HL ; ; EXECUTE IOPB ; CALL XPRIM ; ; RESTORE SECTOR ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; NNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN) OR A,A RET SUBTTL JADE FLOPPY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++7NNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNN, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION LGNNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNNFER ; LD HL,DEFBFR LD (IOPB + PB_DMAO),HL LD A,(THIS_BNK) LD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR KNNNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNN,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; DISKOP2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISsNNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNN ;ECHO CHAR CALL COC POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETFNNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNNN: TR3740: LD DE,SDTRAN ; SETTR: LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;**********************************+NNNNNNNNNNNNNNNNN Q7NNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRINNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXICNNNNNNNNNNNNNNNNN,ZNNNNNNNNNNNNNNNNNNNNNN++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTHEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR{NNNNNNNNNNNNNNNNN INNNNNNNNNNNNNNNNNNNNNN; LD HL,ID_SECT LD (IOPB + PB_SECO),HL ; ; SET DESCRIPTOR SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) NNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PvNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNNRY THEN RETURN TO CALLER JR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ;NNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNN!****************************************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;******************poNNNNNNNNNNNNNNNNN!bNNNNNNNNNNNNNNNNNNNNNNVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;#rNNNNNNNNNNNNNNNN'ȠNNNNNNNNNNNNNNNNNNNNNNT - A= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; SETNNNNNNNNNNNNNNNNN-'kNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE bP[NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHoNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN LD (IOPB + PB_TRKO),HL ; ; ENABLE UPLOAD ; LD A,L ;L= 0 LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD (IOPBNNNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNN!USH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRESS PREFETCHED FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP{NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO By*NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN********************************************************** ; TRNONE: LD DE,0 JR SETTR ;++++++++++++++++++++++++++++++++6NNNNNNNNNNNNNNNN"7UNNNNNNNNNNNNNNNNNNNNNN HDEXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO)>HNNNNNNNNNNNNNNNNN(؞NNNNNNNNNNNNNNNNNNNNNN BANK ADDRESS TO THIS BANK FOR NOW ; LD A,(THIS_BNK) LD E,A ;PRESET IOPB BANK LD (IOPB + PB_DMAXO),A ; ; EXECUTE THE4!NNNNNNNNNNNNNNNNN.r8NNNNNNNNNNNNNNNNNNNNNN; LD A,(IY + DVRPDRV) LD (IOPB + PB_DRVO),A ; ; FETCH SECTOR DATA ; LD HL,(IOPB + PB_SECO) PUSH HL ;SAVE FOR XPRIUNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;+++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNN + PB_BCNTO),HL ; ; PASS COMMAND TO EXECUTOR ; LD A,PB_LOGC JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++9NNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNN IY ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; LD DE,(THIS_BNK) ;SETUP B NNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNDOS ; FDSKER: LD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;************NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ;SNNNNNNNNNNNNNNNN#dNNNNNNNNNNNNNNNNNNNNNN,A ; ; OFFSET LOGICAL ADDRESS WITH LOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD XNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN PRIMITIVE IN ROM ; LD HL,IOPB ;BANKED COMPATABILITY LD DE,(THIS_BNK) LD A,MF_XIOB ;SET MONITOR FUNCTION # CALL XMROM aNNNNNNNNNNNNNNNNN/A NNNNNNNNNNNNNNNNNNNNNNM RESTORE ; ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED SECTOR SO RETRY WILL WORK ; POP HL LD (I-dNNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++ ; ; COMMON DISK I/O CODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;+++++NNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNN!ANK FOR FUTURE COMPATABILITY LD HL,IOPB LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTTNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN**************************************************************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= #DNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DtNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!E,A ;COMPUTE SECTOR LD D,0 LD HL,(IOPB + PB_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB +RNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN! ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION ERR? RET NZ ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO NNNNNNNNNNNNNNNNN0RDNNNNNNNNNNNNNNNNNNNNNNOPB + PB_SECO),HL ; ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++haNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"Z(ņb1Ίj8Վr@ݒyG㖱N욺W%\*ƣb1NNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN%dNNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN################################ ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATP9NNNNNNNNNNNNNNNNN ` NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ;S/= STHD) AND ((DD - 1) <= NDHD) D#D(DD)t$NNNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNNORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1\NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASNNNNNNNNNNNNNNNNN TNNNNNNNNNNNNNNNNNNNNN! DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) &NNNNNNNNNNNNNNNNN lNNNNNNNNNNNNNNNNNNNNN! ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;############################################################################ ; (;NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@yDNNNNNNNNNNNNNNNNN 1NNNNNNNNNNNNNNNNNNNNNNDE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;########################################################mNNNNNNNNNNNNNNNN !ۅNNNNNNNNNNNNNNNNNNNNNN DVRXADR DS 2 ;DRIVE DRIVER EXECUTION ADDRESS SECOFF DS 2 ;LOGICAL DRIVE SECTOR OFFSET (ADD TO SECTOR) ; ROMSAV EQU 0048H ;DS5 NNNNNNNNNNNNNNNN 'q#NNNNNNNNNNNNNNNNNNNNNNALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)AL NNNNNNNNNNNNNNNNN -NNNNNNNNNNNNNNNNNNNNNN ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, NNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNNK ; DW 0 ;SECTOR OFFSET (FOR LOGICAL DRIVE) ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS DB 26,0,26,0,26,0 ;SEbNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) ; DW 0 ;SECTOR OFFSET (FOR LOGICAL DRIVE) ; tqgNNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNN ; MESSAGES ; ;############################################################################ ; MSGLE: DM CR,LF,'LOAD ERROR'BNNNNNNNNNNNNNNNNN GNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (ORnNNNNNNNNNNNNNNNNNN LNNNNNNNNNNNNNNNNNNNNNN#################### ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;##########################KrNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNN 1 ;ROM SWAP SAVE OF ORIGINAL ROM SPSAV DS 2 ;USER SP SAVE WHILE USING LOCAL STACK DS 64 ;LOCAL STACK (32 ENTRIES) LSTACK EQNNNNNNNNNNNNNNNNN (aNNNNNNNNNNNNNNNNNNNNN!L: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIFoNNNNNNNNNNNNNNNNN .˻NNNNNNNNNNNNNNNNNNNNNN4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INTpNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNCTORS PER TRACK, SECTOR SIZE (128) DB 0 ;TYPE DW 77 ;CYLS DB 1 ;HEADS ;###########################################NNNNNNNNNNNNNNNNN 2NNNNNNNNNNNNNNNNNNNNNN; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 32,1,32,1,32,1 ;32 SPT, 256 BPS DB 10H ;TYPE DW 256 ;CYLS DB 4 ;HEA65 NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF IF INNNNNNNNNNNNNNNNN tNNNNNNNNNNNNNNNNNNNNNN 0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMENNNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNNN################################################## ; BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR # BTFLG DSrNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNNU $ ;############################################################################ ; ; DRIVE ALLOCATION AREAS ; ;#####9NNNNNNNNNNNNNNNNN )R,NNNNNNNNNNNNNNNNNNNNNN LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 bCNNNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNNN(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DIRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECT0`NNNNNNNNNNNNNNNN DNNNNNNNNNNNNNNNNNNNNNN################################# ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;############################################## ZNNNNNNNNNNNNNNNNN ?NNNNNNNNNNNNNNNNNNNNNNDS ;############################################################################ ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;#>NNNNNNNNNNNNNNNNN CNNNNNNNNNNNNNNNNNNNNNNINTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int. Abort? (Y/N/I/M) - ' ENDIF ;####################=NNNNNNNNNNNNNNNNN dNNNNNNNNNNNNNNNNNNNNNNTER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DiWNNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNNN 1 ;RESERVED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;#######################################CNNNNNNNNNNNNNNNNN $$pNNNNNNNNNNNNNNNNNNNNNN####################################################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NNNNNNNNNNNNNNNNN *NNNNNNNNNNNNNNNNNNNNNNLIST ON ENDM ;############################################################################ ; ; RESERVE DRIVE PARAMETE'dNNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNNNORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPa:NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺W%\*Ɗa/ˎg5ђm;֖q? ۚvDߞ{I梴PNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN SNNNNNNNNNNNNNNNNNNNNNNBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; D4 NNNNNNNNNNNNNNNNN @NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gNNNNNNNNNNNNNNNNN  >NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN BNNNNNNNNNNNNNNNNNNNNNNan negativ checksu o rang o memor contents Th genera for o th command is C is the last byte of the block to be displayed. Th resultin displa d@kNNNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNNNor th command and return to the monitor command entry mode. Fill (F) Th fil comman allow yo t fil b[NNNNNNNNNNNNNNNNN % qNNNNNNNNNNNNNNNNNNNNN!ntr addres an t se u t tw breakpoint fo returnin contro t th monitor Whe th monito encounter bretNNNNNNNNNNNNNNNN +~NNNNNNNNNNNNNNNNNNNNNN thi command however whic make i powerfu an convenien command Yo hav th optio o establishin 0 1 o NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;PHM- PHYSIC2NNNNNNNNNNNNNNNNN PNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESENNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNss> where is the 1st location to checksum, wher 07700H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END 0WNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN pNNNNNNNNNNNNNNNNNNNNNN pppp-nnnn wher ppp i th positiv checksu valu an nnn i th negative checksum value (nRNNNNNNNNNNNNNNNNN |NNNNNNNNNNNNNNNNNNNNN!ligne vertically Period represen dat fo whic ther ar n ASCI equivalents A th outpu fill th screen i wNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNNh memor bloc t b filled an ZNNNNNNNNNNNNNNNNN CNNNNNNNNNNNNNNNNNNNNNNegated pppp). Display (D) Thi comman allow yo t displa th content o specified block of memory. T1NNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNN!il automaticall scrol up T freez th display typ control-Ӡ (pres CTR an key together) T star i again8NNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNN -F12:10AA 10BB 1 fill th memor bloc 1210AA throug 1210BB wit th constan 1. Goto (G) aNNNNNNNNNNNNNNNNN )eNNNNNNNNNNNNNNNNNNNNNNl form for the G command is G,, is the physical disk drive number. Checksum Memory (C) Checksu memor display th tota positiv NNNNNNNNNNNNNNNNN SNNNNNNNNNNNNNNNNNNNNNNhe general form for the command is D wher wher wher ,- I yoNNNNNNNNNNNNNNNNN!%aNNNNNNNNNNNNNNNNNNNNNN Lin Fee (CTRL-J) Yo ca continu examinin an changin memor byte-by-byt i thi wa a lon a yo wish T m>NNNNNNNNNNNNNNNNN!+BNNNNNNNNNNNNNNNNNNNNNN byt i error followe b a 8-bi binar representatio o th bit i error i whic a 1 indicates a bit in error. FN}NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNransferring program control to the address in the PC register is -G[CR] gNNNNNNNNNNNNNNNNNN!ONNNNNNNNNNNNNNNNNNNNNNt byte from any input port. The general form of this command is I wher `NNNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNN! wis t leav th dat unchanged simpl ente delimiter I th delimite i spac o comma th monito wil NNNNNNNNNNNNNNNNN!&4NNNNNNNNNNNNNNNNNNNNNNak i easie fo yo t kee trac o wher yo are o ever 8-byt boundar (tha is a addres endin i o 8a$NNNNNNNNNNNNNNNNN!,mNNNNNNNNNNNNNNNNNNNNNNor example, the display F038 00010000 woul indicat tha bi o th byt i memor locatio F INNNNNNNNNNNNNNNNN!͵NNNNNNNNNNNNNNNNNNNNNN or -G,, Ther ar tw mor point reguardin breakpoint tha ough4NNNNNNNNNNNNNNNNNN! "~NNNNNNNNNNNNNNNNNNNNNNdress i th I/ por addres i hex Th monito will respond by printing the data byte in binary Display clock/cale7NNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN set u dis controlle dis forma table neede t perfor rea & write operations. The general form of the command is dNNNNNNNNNNNNNNNNN!d`NNNNNNNNNNNNNNNNNNNNN!cat th destinatio addres withi th sourc block Sinc th bloc i move byte-by-byte startin wit th byt sNNNNNNNNNNNNNNNNN!GoNNNNNNNNNNNNNNNNNNNNNN wher堠
wher
is the sector # of ID sector. Move (M) NNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN bloc tha follow th destination address. This will be corrected in a future release. Output (O) Thi generaqBNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNexamin th content o specifi memor locatio an alte i i yo desire Begi th S command by entering =NNNNNNNNNNNNNNNNNN!#SNNNNNNNNNNNNNNNNNNNNNNe th desire dat followe b delimiter carriag retur i yo wan t terminat th comman o spac o commgNNNNNNNNNNNNNNNNN!)$NNNNNNNNNNNNNNNNNNNNNNy for bit failures, enter T wher NNNNNNNNNNNNNNNNNNNNN!yste clock-calendar The general form of the command is U::: soNNNNNNNNNNNNNNNNN!2@NNNNNNNNNNNNNNNNNNNNNN breakpoin mus b use i plac o vali CPՠ instructio op-cod i th program I i i specifie i operanNNNNNNNNNNNNNNNN! ݋NNNNNNNNNNNNNNNNNNNNNNM DD YY ww wher h i th tim i hour (2 hou format) m i th tim i minutes s i th tim i seconds M i tyNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN Th comman move (Copies bloc o dat t specifie address. The general form of the command is M wher
cause th CP regNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN register ar displayed in the following format A-xx B-xx C-xx D-xx E-xx F-xx H-xx L-xx M-xx P-xxxnNNNNNNNNNNNNNNNNN!=NNNNNNNNNNNNNNNNNNNNN! will display the contents of the register and a prompt: -Xr,Dh- A i th substitut memo`NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN2733 ; BIOS CALL ENTRY (E= DRIVE #) 2734 ; 2735 RETDVRTF: ED78 4B 2736 LDrNNNNNNNNNNNNNNNNN!%VNNNNNNNNNNNNNNNNNNNNN! true recalibrate ; on boot in case the head is outside track 0. ; ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; ; 1\(NNNNNNNNNNNNNNNNN!+uNNNNNNNNNNNNNNNNNNNNNN. Needs logon. Also ; Also allow boot from 2nd platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD|NNNNNNNNNNNNNNNNN!ɴNNNNNNNNNNNNNNNNNNNNN!numbe {0:Sun 1:Mon,..6:Sat} NOTE al number currentl mus b entere i hex. Verify (V) Yo ca us ttNNNNNNNNNNNNNNNNN!&NNNNNNNNNNNNNNNNNNNNNNurin th executio o th command th displa ca b froze o contro returne t th monito a describe fo th Tes@NNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNiste image currentl store i RA͠ t b displaye fo examination Thes register ar th mai an alternat堠 _NNNNNNNNNNNNNNNN!`aNNNNNNNNNNNNNNNNNNNNNNx S-xxxx I-xx A'-xx B'-xx C'-xx D'-xx E'-xx F'-xx H'-xx L'-xx M'-xx X-xxxx Y-xxxx R-xx K-xx d[NNNNNNNNNNNNNNNNN!CnNNNNNNNNNNNNNNNNNNNNNNr command yo hav th optio o changin th registe valu (enterin th desire content followe b delNNNNNNNNNNNNNNNN! 0NNNNNNNNNNNNNNNNNNNNNND C,E 2737 ; 2738 RETDVRT: ED79 219FEE 2739 LD HL,DVR0 ;START AT 1ST TABLE SgNNNNNNNNNNNNNNNNN!&NNNNNNNNNNNNNNNNNNNNNN.5 - 23 MAR 83 GRH ; Fix bug in recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to n{dNNNNNNNNNNNNNNNNN!,]NNNNNNNNNNNNNNNNNNNNNN 2 ; 62 C DRIVE 1 HEAD 0 ; 72 D DRIVE 1 HEAD 2 ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNh comman t compar tw block o memor and verify that they are the same. Type V <2nd start address> wher wher
or WNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNN! spac ot comm cause th content o th nex registe t b displayed Not tha changin th content o th Ƞ a,rNNNNNNNNNNNNNNNNN!"RNNNNNNNNNNNNNNNNNNNNN!****** ; ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; *INCLUDE ZBMH122.HDR ;**********************OjNNNNNNNNNNNNNNNNN!( NNNNNNNNNNNNNNNNNNNNNNit. Found out that if the Z-80 is ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output tYNNNNNNNNNNNNNNNNNNN!.?NNNNNNNNNNNNNNNNNNNNN!0. ; Drives now assigned the following logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk NNNNNNNNNNNNNNNNN!P#NNNNNNNNNNNNNNNNNNNNNNbloc an <2n star address i th startin addres o th bloc t b verified Shoul th tw block match th monitLNNNNNNNNNNNNNNNNN! s,NNNNNNNNNNNNNNNNNNNNNN ge th secto dat from is theNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN location addresse b th mai an alternat an ̠ register ar als displaye ( an M') Fo banke memor systNNNNNNNNNNNNNNNNNN!52NNNNNNNNNNNNNNNNNNNNNN -X'r wher i mai registe an ' i a alternat register (Not tha i yo wisDNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNn register change th address i yo wis t alte th contents of the memory location, alter the M register GRH!NNNNNNNNNNNNNNNNN!#cNNNNNNNNNNNNNNNNNNNNNN****************************************************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; ; 1.1 - Fix bugNNNNNNNNNNNNNNNNN!)NNNNNNNNNNNNNNNNNNNNNNhe RESET bit along with the request thus ; yanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard d`NNNNNNNNNNNNNNNNNN!/NNNNNNNNNNNNNNNNNNNNNN; 8..B = 5" Jade floppy ; C..F = 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; ; 3.01 4 JUN 88 GRH ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; ; 3.02;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"Y'Ć`.ˊg4Ўl; ؒtBޖzH嚳OꞸT"],NNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"0 NNNNNNNNNNNNNNNNNNNNNN 12 JUN 88 GRH ; Change 'RET'urns in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up.'dNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN floppy ; Change ?xxx symbols to x_xx symbols. ; First interim version supporting Monitor function calqx NNNNNNNNNNNNNNNNN" ufNNNNNNNNNNNNNNNNNNNNNNCURRENT DRIVE & USER BYTE DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIJNNNNNNNNNNNNNNNNN"UNNNNNNNNNNNNNNNNNNNNN!ONTROLLERS BTENTS EQU 86H ;BOOT DIRECTORY VALIDITY CONSTANT ;############################################################TcBNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNT ROMS. ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: _ NNNNNNNNNNNNNNNN"wNNNNNNNNNNNNNNNNNNNNNNROM.Z80 SUBTTL INITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS2NNNNNNNNNNNNNNNNNN"%)NNNNNNNNNNNNNNNNNNNNNN PRTS: ; ; SAVE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SUREENNNNNNNNNNNNNNNNN""cNNNNNNNNNNNNNNNNNNNNNNVERSN DM CR,LF SUBTTL LOW MEMORY PROCEDURES ;****************************************************************************LNNNNNNNNNNNNNNNN"(uNNNNNNNNNNNNNNNNNNNNN!Y- C= DESTINATION BANK ; B= SOURCE BANK ; EXIT - AF=BC=DE=HL= ? ; ;********************************************************tNNNNNNNNNNNNNNNNN".&NNNNNNNNNNNNNNNNNNNNNN++++++++ ; GETB: XRROM MF_GMEM RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;+++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN ; 3.06 26 SEP 88 GRH ; Add code for ISHA 5" Hard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B .QNNNNNNNNNNNNNNNNN" NNNNNNNNNNNNNNNNNNNNN!;============================================================================ FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALb NNNNNNNNNNNNNNNN"3xNNNNNNNNNNNNNNNNNNNNNNTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE COMIOPB2.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE DISKS.DEF *INCLUDE ZBa NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNRY DURING INTERRUPT ; DS (MONROM + 6) - $ JP I_STUB ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++$yNNNNNNNNNNNNNNNNN"vNNNNNNNNNNNNNNNNNNNNN! ; ; SET STACK ; LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PU]NNNNNNNNNNNNNNNN"#PNNNNNNNNNNNNNNNNNNNNNN ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OFRNNNNNNNNNNNNNNNNN")DNNNNNNNNNNNNNNNNNNNNN!******************** ; BNKSEL: XRROM MF_SBNK RET ;*******************************************************************wNNNNNNNNNNNNNNNNN"/NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++wINNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!= 5" Jade floppy ; C..F = 5" ISHA Hard Disk ; 10..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3" JadeVNNNNNNNNNNNNNNNNN" FWNNNNNNNNNNNNNNNNNNNNNNSE ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M [NNNNNNNNNNNNNNNNN"f+NNNNNNNNNNNNNNNNNNNNNNMFUNS.DEF LIST ON *INCLUDE ZBMG122.DEF THIS_ROM EQU DK_RNUM ;ROM # OF THIS ROM DSKBNK EQU 0FEH ;BANK # OF FLOPPY DISK CeNNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN+++++++++++ ; ; EXTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENNNNNNNNNNNNNNNNNN"#FNNNNNNNNNNNNNNNNNNNNNNSH HL CALL XROMF ; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XbjNNNNNNNNNNNNNNNNNN"$NNNNNNNNNNNNNNNNNNNNNN THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; PUTS: "NNNNNNNNNNNNNNNNNN"*NNNNNNNNNNNNNNNNNNNNNN********* ; ; PERFORM BANKED MEMORY BLOCK MOVE ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - ANNNNNNNNNNNNNNNNNN"0NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ;oNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN큼X%\*Ɗb/ˎg5ђl; ؖtAݚzH䞱NꢸT"NNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN";NNNNNNNNNNNNNNNNNNNNNN PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INj$NNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNOPB ;4: EXECUTE IOPB ; E:HL= PTR TO IOPB ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS ;++++++++++++++++PNNNNNNNNNNNNNNNNN" BVNNNNNNNNNNNNNNNNNNNNN!----------- ; MBOOT: ; ; SAVE PROM # FOR BIOS ; LD A,C AND A,7 LD (DK_PROM),A ; ; EXTRACT DRIVE # FROM ARGUMENTDNNNNNNNNNNNNNNNNN"b*NNNNNNNNNNNNNNNNNNNNNN ;---------------------------------------------------------------------------- ; ; ABORT RETURNS CONTROL TO THE MONITOR ROMNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!FUNCTION 2 ; ENTRY- (IOPBPTR)= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DWNNNNNNNNNNNNNNNN"'GNNNNNNNNNNNNNNNNNNNNN!LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISPLAY ROUTINE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++HNNNNNNNNNNNNNNNNN"%NNNNNNNNNNNNNNNNNNNNNN,(DDADDR + 1) CALL HTOA LD A,(DDADDR) CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR ;+++++++++bNNNNNNNNNNNNNNNNN"+NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++ ; DSKX: ; ; FETCH DRIVE # ; LD HL,(IOPBPTR) INC HL LD A,(HL) ; ; IF JADE 8" FLOPPY dNNNNNNNNNNNNNNNN"RhNNNNNNNNNNNNNNNNNNNNNNC HL LD H,(HL) LD L,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDIrNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.>DNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT ; LD A,B OR A,A JP NZ,ABORT yNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN WITH ERROR FLAG (CF) SET ; ;---------------------------------------------------------------------------- ; ABORT: SCF ;HA u NNNNNNNNNNNNNNNNN"زNNNNNNNNNNNNNNNNNNNNNNQERR: ; ; RESTORE PTRS ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) ; ; CALCULATE PTR TO STATUS ; LD A,PB_STATO ADD AyNNNNNNNNNNNNNNNNN" 2NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION ; ENTRY- (IOPBPTR)= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++~NNNNNNNNNNNNNNNNN"&JNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION 4 ; ENTRY- E:HL= IOPB PTR ; EXENNNNNNNNNNNNNNNNN"A%NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION 3 ; ENTRY- E:HL= IOPB PTR ; ;+++++ NNNNNNNNNNNNNNNNN"#gNNNNNNNNNNNNNNNNNNNNN!;DISPLAY SEPARATOR ; POP HL POP DE INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ;7NNNNNNNNNNNNNNNN")tNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR$NNNNNNNNNNNNNNNNN"/"NNNNNNNNNNNNNNNNNNNNNN******** ; ; ILLEGAL DRIVE REQUESTED ; EXIT - AF= -2 ; (IOPB.PB_STAT)= ILLEGAL COMMAND ERROR ; ;*************************=NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNB ;2: TEST IOPB STATUS FOR ERROR ; E:HL= PTR TO IOPB DW DIS_PB ;3: DISPLAY IOPB DATA ; E:HL= PTR TO IOPB DW EX_Iq^NNNNNNNNNNNNNNNNN" qgNNNNNNNNNNNNNNNNNNNNNN MICROMATION (INTEL M2FM) ; 14..17 = 3" JADE FLOPPY ; ;-----------------------------------------------------------------GNNNNNNNNNNNNNNNNN"QNNNNNNNNNNNNNNNNNNNNNNHEN EXIT JP C,M8BOOT ; CP A,18H ;IF 3" FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; vNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNFUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB STATUS FOR ERROR "NNNNNNNNNNNNNNNNNN"vNNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DIS_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL NNNNNNNNNNNNNNNN"$(NNNNNNNNNNNNNNNNNNNNN! CALL SPACE CALL SPACE ;OUTPUT PORT # LD A,(DDPORT) CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE LD ANNNNNNNNNNNNNNNNN"*'NNNNNNNNNNNNNNNNNNNNNN)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN"01NNNNNNNNNNNNNNNNNNNNN!*************************************************** ; JSELERR: LD (IX + PB_STATO),PB_ILCMD ; ; FALL INTO DISK ERROR ; l/NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN![)Ɔb0̊g5Ҏn< גsAݖyG㚲NꞸT!X%NNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#FNNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; COMMON ERROR CODE ; EXIT - AF= -2 ; ;@{NNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNN!TH ON-BOARD PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM THE DISK AND ; EXECUTE THE COLD START ENTRYY [NNNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNN!JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; IF NOT DIRECTORY SECTOR THEN ERROR ; LD A,(DEFBFR) CP A,BTENTS JP C,DKRET NNNNNNNNNNNNNNNNNN##NNNNNNNNNNNNNNNNNNNNNNUNT != 0 THEN REPEAT DEC (HL) JR NZ,JADRDB IF DEBUG ; ; RETURN TO MONITOR ; OR A,A ;RETURN NO ERROR JP DKRET NNNNNNNNNNNNNNNNN#eNNNNNNNNNNNNNNNNNNNNNNIVE BACK UP LD B,A ; LD A,(HL) ;SAVE CURRENT DRIVE LD (HL),B ;CHANGE TO LOCAL DRIVE # PUSH AF CALL JADEX ;EXECUTE NNNNNNNNNNNNNNNNN#fNNNNNNNNNNNNNNNNNNNNNN)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; A,B,HL,DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNN#%NNNNNNNNNNNNNNNNNNNNNNDATA AND A,DD_SASW RLCA OR A,HIGH DD_BASE LD H,A LD L,0 LD (DDADDR),HL LD A,(THIS_BNK) LD (DDADDR + 2),A ; ; jNNNNNNNNNNNNNNNNN#+NNNNNNNNNNNNNNNNNNNNNNROR, SECTOR SIZE TOO BIG ; LD A,C OR A,A JP NZ,JXERR ; ; DOWNLOAD SECTOR DATA TO CONTROLLER ; JDOWN: ; ; OPEN WNNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN**************************************************************************** ; DSKERR: LD A,-2 OR A,A RET ;********A!NNNNNNNNNNNNNNNN#'NNNNNNNNNNNNNNNNNNNNNN IN THE BIOS. ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F8BOOT: ; ; RESET THE CONNNNNNNNNNNNNNNNN#VNNNNNNNNNNNNNNNNNNNNNN; ; ELSE FETCH THE LOCATION FOR THE BIOS ; LD HL,(DEFBFR + BD_SIOSS) LD A,H LD H,0 LD (IOPB + PB_SECO),HL LD L,A %8NNNNNNNNNNNNNNNNN#9NNNNNNNNNNNNNNNNNNNNNN ELSE ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROM 8 J6NNNNNNNNNNNNNNNNN#6NNNNNNNNNNNNNNNNNNNNN!FUNCTION POP BC ;RESTORE DRIVE # LD HL,(IOPBPTR) INC HL LD (HL),B ; ; DONE ; RET ;+++++++++++++++++++++++++gNNNNNNNNNNNNNNNNN# shNNNNNNNNNNNNNNNNNNNNNN+++++++++++++ ; JADEX8: LD C,DD_PRT8 ; ; FALL INTO JADE EXECUTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++~aNNNNNNNNNNNNNNNN#&NNNNNNNNNNNNNNNNNNNNNN SETUP IOPB PTR ; LD HL,(IOPBPTR) PUSH IX LD IX,(IOPBPTR) ; ; IF COMMAND == CLEAR THEN EXIT ; LD A,(IX + PB_CMDO) )&NNNNNNNNNNNNNNNNN#,6NNNNNNNNNNNNNNNNNNNNNNINDOW TO SECTOR BUFFER ; PUSH BC ;SAVE COUNT LD BC,(DDPORT) LD A,DD_MB1 OUT (C),A PUSH HL ;SAVE SRC PTR ; LD B,(NNNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNNN******************************************************************** ; ; CONTROLLER NOT SENSED ERROR ; EXIT - AF= -2 ; (IOP(NNNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNNNNTROLLER ; LD HL,CLRIOPB CALL IIOPB ; LD HL,IOPB LD (IOPBPTR),HL LD A,(THIS_BNK) LD (IOPBPTR + 2),A CALL JADEX8 NNNNNNNNNNNNNNNNN#eNNNNNNNNNNNNNNNNNNNNNN LD (IOPB + PB_TRKO),HL ; ; READ 1ST BIOS SECTOR INTO BUFFER ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNN!P DKRET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPBNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK READ IOPB FUNCTION ; ENTRY- (IOPBPTR)NNNNNNNNNNNNNNNN#!@YNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE FLOPPY DISK IOPB COMMON FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; C= COCNNNNNNNNNNNNNNNN#'NNNNNNNNNNNNNNNNNNNNNN CP A,PB_CLRC JP NZ,JNOCLR8 ; ; IF ALL DRIVES THEN HARD RESET ; LD A,(IX + PB_DRVO) INC A JP NZ,JNOCLR8 ; LD A,~cNNNNNNNNNNNNNNNNN#-4NNNNNNNNNNNNNNNNNNNNNNIX + PB_DMAXO) ;SET BANKS LD C,DSKBNK CALL BNKSEL ; POP HL ;SRC PTR POP BC ;COUNT LD DE,(DDADDR) ;DEST PTR CALL BNNNNNNNNNNNNNNNN#JNNNNNNNNNNNNNNNNNNNNNNB.PB_STAT)= CONTROLLER NOT PRESENT ERROR ; ;**************************************************************************** ; JnNNNNNNNNNNNNNNNN# ENNNNNNNNNNNNNNNNNNNNNN CALL DQERR JP NZ,ABORT ; ; PREPARE IOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PNNNNNNNNNNNNNNNN#vNNNNNNNNNNNNNNNNNNNNNNIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1ST SECTOR ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CALL JAD 1024 THEN ER9NNNNNNNNNNNNNNNN#0pNNNNNNNNNNNNNNNNNNNNNNK LD B,A LD C,DSKBNK CALL BNKSEL ; LD HL,(DDADDR) ;COMPUTE DEST PTR LD DE,DD_CBO ADD HL,DE EX DE,HL ; LD HL,(INNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNY'†`.ʊf5юm;֒r@ܖwF⚰~L螶R W%NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#qNNNNNNNNNNNNNNNNNNNNNNOPBPTR) ;SRC PTR = IOPB ADDRESS ; LD BC,PB_STATO ;ONLY XFER PERTINENT BYTES CALL BMOVE ; ; EXECUTE THE COMMAND ; LD NNNNNNNNNNNNNNNNNN#)NNNNNNNNNNNNNNNNNNNNNN; LD BC,(DDPORT) LD A,DD_MB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,DD_MB1 ;OPEN WINDOW TO SECTOR BUFFENNNNNNNNNNNNNNNNN# 4NNNNNNNNNNNNNNNNNNNNNNPB WINDOW ; JDONE: LD A,DD_FREE LD BC,(DDPORT) OUT (C),A ; ; CHECK FOR ERROR ; LD A,(IX + PB_STATO) OR A,A ; %NNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNE FOR CONTROLLER TO CATCH UP ; EX (SP),HL EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP aNNNNNNNNNNNNNNNNN#UNNNNNNNNNNNNNNNNNNNNNNORT ;UNSUPPORTED SUBTTL JADE 3" FLOPPY DISK DRIVER ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN#QNNNNNNNNNNNNNNNNNNNNNN SUBTTL ISHA 5" & 8" HARD DISK DRIVER ;**************************************************************************** ; ; hgNNNNNNNNNNNNNNNNN#%NNNNNNNNNNNNNNNNNNNNNN(LOGINBYTE) ;COMPUTE & SET DRIVE SUB A,4 ;8" = 4..7 -> 0..3 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICBNNNNNNNNNNNNNNNN#+NNNNNNNNNNNNNNNNNNNNNNLL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY \NNNNNNNNNNNNNNNNN#$NNNNNNNNNNNNNNNNNNNNNNA,DD_EXC ;START COMMAND ; JDOCMD: CALL JWAIT ;WAIT FOR COMPLETION JP NZ,JERET ;IF ERROR THEN RETURN ERROR ; ; COMMAND E&~NNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNR (BANK 1) OUT (C),A ; ; FETCH DESTINATION ADDRESS ; LD E,(IX + PB_DMAO) LD D,(IX + PB_DMAO + 1) ; ; FETCH XFER CKNNNNNNNNNNNNNNNNN#aNNNNNNNNNNNNNNNNNNNNNN; DONE ; POP IX RET ; ; ; SECTOR SIZE TOO BIG ERROR ; JXERR: LD (IX + PB_STATO),PB_BADPB ;PASS BACK ERROR JR JNNNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNNNTIMOUT LD DE,0 ; JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTINUE TO WAIT LD A,E OR A,D JR NZ,JWAIT2 ; DEC L ;IF TIME ONNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN+++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F3B&cNNNNNNNNNNNNNNNNN# DXNNNNNNNNNNNNNNNNNNNNNNHard disk boot function. ; This module reads the BIOS image to the proper system ; address & jumps to the BIOS cold start entr$NNNNNNNNNNNNNNNNN#&NNNNNNNNNNNNNNNNNNNNNNAL_DRIVE / 2 LD (IOPB + PB_DRVO),A ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND-JNNNNNNNNNNNNNNNNN#,5NNNNNNNNNNNNNNNNNNNNNN; ; SAVE TRACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A {NNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNXECUTED, XFER RESULTS FUNCTION ; SELECT COMMAND BLOCK WINDOW ; LD BC,(DDPORT) LD A,DD_MB0 OUT (C),A ; ; XFER IOPB 'NNNNNNNNNNNNNNNNN# &NNNNNNNNNNNNNNNNNNNNNNOUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO UPLOAD ; LD A,C OR A,B JR Z,JDONE0NNNNNNNNNNNNNNNNN#RNNNNNNNNNNNNNNNNNNNNNNDONE ; ; ; RETURN ERROR STATUS EXIT ; ENTRY- A= ERROR CODE ; JERET: LD (IX + PB_STATO),A JR JDONE ;++++++++++++++lNNNNNNNNNNNNNNNNN#8NNNNNNNNNNNNNNNNNNNNNNOUT THEN RETURN TO MONITOR OR A,L JP Z,DSKERR ; JWAIT2: IN A,(C) ;IF NOT DONE THEN WAIT AND A,DD_SHLT JR NZ,JWAIT1 UNNNNNNNNNNNNNNNNN#7NNNNNNNNNNNNNNNNNNNNN!OOT: EQU ABORT ;UNSUPPORTED SUBTTL MICROMATION 8" FLOPPY DISK DRIVER ;+++++++++++++++++++++++++++++++++++++++++++++++++++aNNNNNNNNNNNNNNNN#!wiNNNNNNNNNNNNNNNNNNNNN!y point. ; ;**************************************************************************** ; H8BOOT: ; ; INSURE FDC WINDOW9xNNNNNNNNNNNNNNNNN#'NNNNNNNNNNNNNNNNNNNNNN A,80H EXX ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THEN USE PLAT-NNNNNNNNNNNNNNNNN#-2NNNNNNNNNNNNNNNNNNNNNN LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX1aNNNNNNNNNNNNNNNNN#zNNNNNNNNNNNNNNNNNNNNNNSTATUS TO HOST ; LD BC,(IOPBPTR + 2) ;SET BANKS LD B,DSKBNK CALL BNKSEL ; LD HL,(DDADDR) LD DE,DD_CBO + PB_BCNTO A"NNNNNNNNNNNNNNNNN# uNNNNNNNNNNNNNNNNNNNNN! ; ; ELSE IF COUNT < 1024 THEN UPLOAD SECTOR DATA ; LD A,B CP A,4 JP C,JXUP ; ; ELSE IF COUNT > 1024 THEN ERROR dNNNNNNNNNNNNNNNNN#ANNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND NNNNNNNNNNNNNNNNN#kNNNNNNNNNNNNNNNNNNNNNN ; RET ;RETURN ZF IF ($ AND 7FFFH) >= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** LXNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++ ; ; 8" MICROMATION M2FM BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++YyNNNNNNNNNNNNNNNN#"":NNNNNNNNNNNNNNNNNNNNNN REMOVED ; LD BC,0341H XOR A,A H8B1: OUT (C),A INC C DJNZ H8B1 ; ; ISSUE CLEAR CONTROLLER IOPB ; LD HL,CLRIOPB /.NNNNNNNNNNNNNNNNN#(NNNNNNNNNNNNNNNNNNNNNNTER 1 ADD A,B LD (IOPB + PB_SECO),A EXX ; ; FORCE HOST ADAPTER LOG-ON ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ;\NNNNNNNNNNNNNNNNN#.gWNNNNNNNNNNNNNNNNNNNNNN ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DK-6NNNNNNNNNNNNNNNN#KNNNNNNNNNNNNNNNNNNNNNNDD HL,DE ; EX DE,HL LD HL,(IOPBPTR) LD BC,PB_BCNTO ADD HL,BC EX DE,HL ; LD BC,PB_SIZE - PB_BCNTO ; CALL BMOVE )NNNNNNNNNNNNNNNNN# DNNNNNNNNNNNNNNNNNNNNNN; LD A,C OR A,A JR NZ,JXERR ; ; UPLOAD SECTOR DATA ; JXUP: PUSH DE ;DEST PTR PUSH BC ;BYTE CNT ; LD C,(IX + PaqNNNNNNNNNNNNNNNNN#rNNNNNNNNNNNNNNNNNNNNNNTO OUTPUT ; EXIT - AF= 0: OK, /0: ERROR ; C= PORT # OF CONTROLLER ; DE,HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN#ZNNNNNNNNNNNNNNNNNNNNNN ENDIF SUBTTL JADE 5" FLOPPY DISK DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; gNNNNNNNNNNNNNNNNN#7NNNNNNNNNNNNNNNNNNNNNN++++++++++ ; M8BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/NNNNNNNNNNNNNNNN## NNNNNNNNNNNNNNNNNNNNN! CALL IIOPB ; LD HL,IOPB LD (IOPBPTR),HL LD A,(THIS_BNK) LD (IOPBPTR + 2),A ; CALL ISHAX ; ; CHECK SELF TEST ST6lNNNNNNNNNNNNNNNNN#)NNNNNNNNNNNNNNNNNNNNNN NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_CMDO),PB_READC ; EXX LD A,B EXX LD HL,BD_SEC ;SECTOR = SECTOR + (DRV NNNNNNNNNNNNNNNNN#/TfNNNNNNNNNNNNNNNNNNNNNNRET ; HDRDLP: CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),ʹNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN; ; IF UPLOAD INHIBITED THEN SKIP IT ; BIT PB_INHX,(IX + PB_FLGO) JR NZ,JDONE ; ; XFER SECTOR DATA FROM CONTROLLER :NNNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNNNB_DMAXO) LD B,DSKBNK CALL BNKSEL ; POP BC ;BYTE CNT POP DE ;DEST PTR LD HL,(DDADDR) CALL BMOVE ; ; RELEASE IO8NNNNNNNNNNNNNNNNN#'NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++ ; JWAIT: ; ; ISSUE PASSED COMMAND ; LD BC,(DDPORT) OUT (C),A ; ; PAUSE A WHILQ8\NNNNNNNNNNNNNNNN#dNNNNNNNNNNNNNNNNNNNNNN ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F5BOOT: EQU AB<[NNNNNNNNNNNNNNNNN#bNNNNNNNNNNNNNNNNNNNNNN ; ; MICROMATION DRIVER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M2X: EQU DSKERR xNNNNNNNNNNNNNNNNN#$NNNNNNNNNNNNNNNNNNNNNNATUS ; CALL DQERR ; ; SET UP IOPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,NNNNNNNNNNNNNNNNN#*NNNNNNNNNNNNNNNNNNNNNN/ 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CA\NNNNNNNNNNNNNNN#0G+NNNNNNNNNNNNNNNNNNNNNNHL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS LD DE,(IOPB + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD y NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!Y'Æa/ˊg6ӎp? ےyG㖱M隶S"]+ǣc1nNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNA,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENwNNNNNNNNNNNNNNNNN$4NNNNNNNNNNNNNNNNNNNNNNXX ;SAVE SECTOR OFFSET IN B' FOR LATER USE LD B,A ; ; SET ID SECTOR FOR LOGIN ; LD A,ID_SECT ADD A,B LD (IOPB +yNNNNNNNNNNNNNNNNN$ RNNNNNNNNNNNNNNNNNNNNN!D HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THEdNNNNNNNNNNNNNNNN$rNNNNNNNNNNNNNNNNNNNNNNECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS EXX ;FETCH SECTOR SIZE PUSH HL EXXrNNNNNNNNNNNNNNNNN$HNNNNNNNNNNNNNNNNNNNNNNHL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SETBIOPB: ; ; FETCH BIOS L[NNNNNNNNNNNNNNNNN$7NNNNNNNNNNNNNNNNNNNNNN LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; INC (IX + PB_SECO) ;NEXT SECT NNNNNNNNNNNNNNNNN$%ݰNNNNNNNNNNNNNNNNNNNNNN+++++++++++++ ; ISHAX8: ; ADD A,4 LD B,A LD A,(HL) LD (HL),B PUSH AF CALL ISHAX POP BC LD HL,(IOPBPTR) INC + HNNNNNNNNNNNNNNNNN$+NNNNNNNNNNNNNNNNNNNNNNH BC ;SAVE FOR RESTORE DEC BC ;CONVERT TO LOGICAL SECTOR LD (IX + PB_SECO),C LD (IX + PB_SECO + 1),B ; ; PUT IOPB 8sNNNNNNNNNNNNNNNNN$BNNNNNNNNNNNNNNNNNNNNNNTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT PUSH HL XRROM 8 JP DKRET ELSE SNNNNNNNNNNNNNNNNNN$ NNNNNNNNNNNNNNNNNNNNN! PB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD IX,IOPB CALL ISHAX ; ~NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) HNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN POP DE ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP5_wNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNOAD PARAMETER OFFSET ; LD HL,(DEFBFR + 1) ; ; IF NOT IN 1ST SECTOR THEN RETURN ERROR ; EXX ;FETCH SECTOR SIZE PUSH NNNNNNNNNNNNNNNNN$ "ENNNNNNNNNNNNNNNNNNNNNNOR ; ; COMPUTE SECTOR COUNT FROM LENGTH ; EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; XOR A,A ;COUNT = 0 ; NNNNNNNNNNNNNNNNN$&NNNNNNNNNNNNNNNNNNNNNNHL LD (HL),B RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON ISHA DRIVERKNNNNNNNNNNNNNNNNNN$,g(NNNNNNNNNNNNNNNNNNNNNNADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; LD BC,(IOPBPTR) ; ; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD A,C O!NNNNNNNNNNNNNNNNNN$qNNNNNNNNNNNNNNNNNNNNNN ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF FORM ;--------------------------------------------------------~NNNNNNNNNNNNNNNNN$ ;NNNNNNNNNNNNNNNNNNNNNN ; CHECK SELF TEST STATUS ; CALL DQERR ; ; FORCE HOST ADAPTER LOG-ON ; LD A,PB_LOGC LD (IOPB + PB_CMDO),A ; CAL7NNNNNNNNNNNNNNNNN$4NNNNNNNNNNNNNNNNNNNNN!;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRZrNNNNNNNNNNNNNNNNN$%NNNNNNNNNNNNNNNNNNNNNN ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENNNNNNNNNNNNNNNNNNN$*NNNNNNNNNNNNNNNNNNNNNNHL EXX POP DE ; LD A,H ;LIMIT TO 1K ([3]FF AND A,3 LD H,A SBC HL,DE CCF RET C ; ; SAVE SECTOR SIZE ; PUS{NNNNNNNNNNNNNNNNN$!tNNNNNNNNNNNNNNNNNNNNN! LD HL,(BIOSLN) ;COMPUTE # SECTORS LEN_LP: SBC HL,DE JR C,LEN_OK ; INC A JP LEN_LP ; ; ; SECTOR COUNT IN A ; LEN_}NNNNNNNNNNNNNNNNN$'NNNNNNNNNNNNNNNNNNNNNN ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++49NNNNNNNNNNNNNNNNN$-TNNNNNNNNNNNNNNNNNNNNNNUT (ISH_DATA),A LD A,ISH_SPBL OUT (ISH_CMD),A CALL HWBUSY ; LD A,B OUT (ISH_DATA),A LD A,ISH_SPBH OUT (ISH_CMD),A:ENNNNNNNNNNNNNNNNNN$gNNNNNNNNNNNNNNNNNNNNNN-------------------- ; ; 5" HARD DISK BOOT ; H5BOOT: ; ; BIAS DOWN DRIVE ; SUB A,8 ;5" = 8..B -> 4..7 ; ; COMPZNNNNNNNNNNNNNNNNN$ hNNNNNNNNNNNNNNNNNNNNNNL ISHAX CALL DQERR JP NZ,DKRET ; ; FETCH THE SECTOR SIZE ; LD A,(DEFBFR + ID_SSZ0O) EXX LD HL,128 ; OR A,A HBtNNNNNNNNNNNNNNNNN$'NNNNNNNNNNNNNNNNNNNNNNIVE OFFSET LD A,B EXX LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LDNNNNNNNNNNNNNNNNNN$vNNNNNNNNNNNNNNNNNNNNNNT ROM ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROM 8 JP DKRET ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET eNNNNNNNNNNNNNNNNN$bNNNNNNNNNNNNNNNNNNNNN!H DE ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD DE,(DEFBFR + 1) LD D,A ADD HL,DE ; ; FETCH LOAD ADDRESS NNNNNNNNNNNNNNNNN$"D'NNNNNNNNNNNNNNNNNNNNN!OK: DEC A ;ALREADY HAVE 1ST SECTOR ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,AƘNNNNNNNNNNNNNNNNN$(NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++ ; ISHAX: ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(ISH_STATUS) INC A JP Z,JCNP ; ; IF CLEAR COMM!BNNNNNNNNNNNNNNNNN$.JNNNNNNNNNNNNNNNNNNNNN! CALL HWBUSY ; LD A,(THIS_BNK) OUT (ISH_DATA),A LD A,ISH_SPBX OUT (ISH_CMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTNNNNNNNNNNNNNNNNN$VNNNNNNNNNNNNNNNNNNNNNNUTE LOGICAL DRIVE FOR IOPB ; PUSH AF ;BIAS DRIVE UP ADD A,0CH ;ISHA5 - DRVPRT AND A,0FH LD (IOPB + PB_DRVO),A POP ANNNNNNNNNNNNNNNN$ YNNNNNNNNNNNNNNNNNNNNNNTSSZ: JR Z,GOTSSZ ; ADD HL,HL DEC A JR HBTSSZ ; ; ; SECTOR SIZE COMPUTED IN HL ; GOTSSZ: EXX ;SAVE IN ALT REG ;@NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL SETBIOPB <"NNNNNNNNNNNNNNNNN$GNNNNNNNNNNNNNNNNNNNNNN ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SETUP IOPB FOR BIOS READ SUBR muNNNNNNNNNNNNNNNNN$QNNNNNNNNNNNNNNNNNNNNNN& SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL)8NNNNNNNNNNNNNNNNN$#wNNNNNNNNNNNNNNNNNNNNNN RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA 8" DRIVE HARD DISK DRIVER AdNNNNNNNNNNNNNNNNN$)NNNNNNNNNNNNNNNNNNNNNNAND THEN DO DIFFERENTLY ; PUSH IX LD IX,(IOPBPTR) ; LD A,(IX + PB_CMDO) CP A,PB_CLRC JR Z,ISHACLR ; ; TEMPORARIL.NNNNNNNNNNNNNNNNN$/2{NNNNNNNNNNNNNNNNNNNNNNE IOPB COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD),A CALL HWBUSY ; ; RESTORE THE IOPB ; POP BC ;SECTOR LD (IX + PB_SNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; ADD A,A ;UPPER NIBBLE = HEAD ADD A,A AND A,0C0H ;MASK OFF UNUSED BITS E&NNNNNNNNNNNNNNNNN$ aNNNNNNNNNNNNNNNNNNNNN! ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_CMDO),PB_READC ; EXX ;FETCH LOGICAL DRIVE HEAD # LD A,B EXX ; LNNNNNNNNNNNNNNNNN$ANNNNNNNNNNNNNNNNNNNNNN;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP5: CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT S{c[NNNNNNNNNNNNNNNN$yNNNNNNNNNNNNNNNNNNNNNN ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; HL'= SECTOR BYTE COUNT {128, 256, 512, 1024} ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR POP BC ;SECTOR SIZE NNNNNNNNNNNNNNNNN$$NNNNNNNNNNNNNNNNNNNNNN; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++LNNNNNNNNNNNNNNNNN$*͎NNNNNNNNNNNNNNNNNNNNNNY CONVERT LOGICAL SECTOR TO PHYSICAL SECTOR UNTIL ISHA IS CHANGED ; ISHAC: LD C,(IX + PB_SECO) LD B,(IX + PB_SECO + 1) PUS} NNNNNNNNNNNNNNNNN$0!6NNNNNNNNNNNNNNNNNNNNNNECO),C LD (IX + PB_SECO + 1),B ; ; RETURN THE ERROR STATUS ; HDONE: LD A,(IX + PB_STATO) OR A,A POP IX RET ; ;BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺V$\+Ȋf5Ўl:֒r@ܖxG䚲O잺W&£^,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$ NNNNNNNNNNNNNNNNNNNNNN ; CLEAR COMMAND ; ISHACLR: ; ; IF NOT ALL DRIVES THEN EXECUTE NORMALLY ; LD A,(IX + PB_DRVO) INC A JR NZ,ISHAC CNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNO),A ;RETURN NO ERRORS FOR NOW JR HDONE ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ޛdNNNNNNNNNNNNNNNNN$ eNNNNNNNNNNNNNNNNNNNNN!ESENT ; IN A,(ISH_STATUS) INC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; PUSH IX LD IX,(IOPBPTR) ; N NNNNNNNNNNNNNNNNN$ENNNNNNNNNNNNNNNNNNNNNNTHEN EXECUTE NORMALLY ; LD A,(IX + PB_DRVO) INC A JR NZ,ISHAC5 ; ; ELSE RESET THE CONTROLLER ; JP ISHACC ;***BNNNNNNNNNNNNNNNNN$xNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++ ; STUPBIOS: ; ; FETCH BIOS LOAD PARAMETER OFFSET FROM LO BYTE OF COLD START JUMP ADDRESS ; LD A!WNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNOMPUTE SECTOR COUNT FROM LENGTH ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD DE,(IOPB + PB_BCNTO) ;USE BYTES READ XOR A,A ; BZfNNNNNNNNNNNNNNNN$%NNNNNNNNNNNNNNNNNNNNNN**************** ; ; DISPLAY BYTE ON SYSTEM CONSOLE PROCEDURE ; ENTRY- A= BINARY ; ;*************************************** PROMSIZ CONMSG **** ERROR! Code Too Large for PROM! **** ENDIF END #NNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNNALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE 5 F3B7 (0020) 4181+ D5CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SsmNNNNNNNNNNNNNNNNN%QdNNNNNNNNNNNNNNNNNNNNNN= 6, 16K= 7 0003 (0001) 4198- DPBBLM DS 1 ;BLM- BLOCK MASK 4199- ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, [rNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNTA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;############################################NNNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # (E FONNNNNNNNNNNNNNNN%"2NNNNNNNNNNNNNNNNNNNNNN+++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - A= 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++M-NNNNNNNNNNNNNNNNN%(XNNNNNNNNNNNNNNNNNNNNNNF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;*************************************************************************NNNNNNNNNNNNNNNNN%.wNNNNNNNNNNNNNNNNNNNNNNLLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;*********oNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN 4104 ALLDAL 0123456789ABCDEF 4105 DD DL DD + 1 4106 LIST ON 4107 qBNNNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNNECTOR) 4186 4187 4188 ;###########################################kNNNNNNNNNNNNNNNNN%bUNNNNNNNNNNNNNNNNNNNNNN ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++_NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN################################ ; ; BIOS FUNCTION TABLE ; ;################################################################NNNNNNNNNNNNNNNNN%'8NNNNNNNNNNNNNNNNNNNNNNR FUNCTION CALL) ; EXIT - HL= DRIVER TABLE BASE PTR ; A, C= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++aNNNNNNNNNNNNNNNN%#NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++ ; EXIOPB: ; ; SET UP FOR CALL ; CALL GETBNK ;E= IOPB PTR IS IN THIS BANK LD E,A yNNNNNNNNNNNNNNNNN%)iNNNNNNNNNNNNNNNNNNNNNN*** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;*********************************************5NNNNNNNNNNNNNNNNN%/DNNNNNNNNNNNNNNNNNNNNNN****************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN ENDM F129 (007F) 4112+ D0ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE 0 F1A8 (007F) 4125+ D1ALL: DS 127 ;ALaDNNNNNNNNNNNNNNNNNN% zNNNNNNNNNNNNNNNNNNNNNN################################# 4189 ; 4190 ; RESERVE DRIVE PARAMETER BLOCKS NNNNNNNNNNNNNNNNN%7NNNNNNNNNNNNNNNNNNNNNN+++ ; ; FUNCTION DISPATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!############ ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR DW E[ NNNNNNNNNNNNNNNN%rkNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ;START AT 1ST TABLE ;\NNNNNNNNNNNNNNNN%$5NNNNNNNNNNNNNNNNNNNNNNPUSH IX ;MAKE HL = IX FOR NOW POP HL ; LD A,MF_XIOB ;MONITOR FUNCTION # (DISK FUNCTION) CALL XMROM ;EXECUTE MONITOR FUNNNNNNNNNNNNNNNNNN%*:NNNNNNNNNNNNNNNNNNNNNN******************************* ; PRHEX: LD C,A LD A,MF_PHXB JP XMROM ;********************************************6rNNNNNNNNNNNNNNNN%0WNNNNNNNNNNNNNNNNNNNNNNEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFI8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺V$񅿆[)Ċ_-Ȏc0̒i7Ӗo= ٚtBߞ{I墲NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN%VNNNNNNNNNNNNNNNNNNNNN!ED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN ITNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENNNNNNNNNNNNNNNNNN% {NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_GTIM JR XMROM ENDIF ;+++++++++++++FNNNNNNNNNNNNNNNNN%3NNNNNNNNNNNNNNNNNNNNNNCI: LD A,MF_CI JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN! READER: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;********************************************************NNNNNNNNNNNNNNNNN%vjNNNNNNNNNNNNNNNNNNNNNN ; LISTST: LD A,MF_LOS JR XMROM ;**************************************************************************** ; ; MEaNNNNNNNNNNNNNNNN%%4NNNNNNNNNNNNNNNNNNNNNNT PROMPT ; LD HL,ITMSG IQCONT: LD A,MF_PUTS CALL MR_FUN ; LD HL,IQMSG ;QUERY USER LD A,MF_PUTS CALL MR_FUN ; ; }NNNNNNNNNNNNNNNNN%+;NNNNNNNNNNNNNNNNNNNNNNRN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (M2_RSEL),A ; POP DE POP BC POP HL POP AF EI ;RE-ENABLE INTERRUNNNNNNNNNNNNNNNNN%ENNNNNNNNNNNNNNNNNNNNN! IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETU(NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETCVER: LD B,1x"NNNNNNNNNNNNNNNNN%F(NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTER ; ENTRY- A= FUNCTION # ; ;++++++++NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++HNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN******************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*******************************************************(NNNNNNNNNNNNNNNN% cNNNNNNNNNNNNNNNNNNNNNNSSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;**********************************************yNNNNNNNNNNNNNNNNN%&gNNNNNNNNNNNNNNNNNNNNNN GET & ECHO USER INPUT ; LD A,MF_CI CALL MR_FUN ; PUSH AF LD C,A LD A,MF_CO CALL MR_FUN POP AF ; ; IF OPTIOQ+ NNNNNNNNNNNNNNNN%,&NNNNNNNNNNNNNNNNNNNNNNPTS RET ;---------------------------------------------------------------------------- ; ; UNSUPPORTED INTERRUPT ; ;--NNNNNNNNNNNNNNNN%0tNNNNNNNNNNNNNNNNNNNNNNRN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92HÖNNNNNNNNNNNNNNNNN% ߿NNNNNNNNNNNNNNNNNNNNN! RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALLNNNNNNNNNNNNNNNNN%uNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: ; ; SWITCH TO LOCAL (LARGER) STACK ; LD 3NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN+++++++++++++ ; CNSCK: LD A,MF_CIS JR XMROM ;************************************************************************yNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN********************* ; PUNCH: RET ;**************************************************************************** ; ; PRACXNNNNNNNNNNNNNNNNN%!PNNNNNNNNNNNNNNNNNNNNNN****************************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JR XMROM IF INTRPTS SUBTTL INTERRUPTS BNNNNNNNNNNNNNNNNN%'VNNNNNNNNNNNNNNNNNNNNNNN IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPTION IS YES THEN WARM BOOT ; AND 7NNNNNNNNNNNNNNNNN%-NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------------------- ; ILLINT: PUSH AF ;SAVE ALL 8080 REGS PUSH HL WNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTPUT WARNING MESS8NNNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNNENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;+++++++++++++++++++++++++++++++++++++++++++/jBNNNNNNNNNNNNNNNN%fTNNNNNNNNNNNNNNNNNNNNNN(SPSAV),SP LD SP,LSTACK ; ; EXECUTE THE FUNCTION ; CALL MR_FUN ;EXECUTE MONITOR FUNCTION ; ; RESTORE THE STACK ; |aNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN**** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;*********************************************************************AuNNNNNNNNNNNNNNNNN%#9NNNNNNNNNNNNNNNNNNNNNNINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; L٨~NNNNNNNNNNNNNNNNN%"NNNNNNNNNNNNNNNNNNNNN! ;---------------------------------------------------------------------------- ; ; USER INTERRUPT ; ;-----------------------NNNNNNNNNNNNNNNNN%(hNNNNNNNNNNNNNNNNNNNNN!A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RESTART 7 ; CP A,'I' JR NZ,ITRAP\rNNNNNNNNNNNNNNNN%.@NNNNNNNNNNNNNNNNNNNNNN PUSH BC PUSH DE LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL INITIALIZED DATA ;##############################lNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP HL LD A,L CALL PRHEX ; ; OUTPUT NNNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++rNNNNNNNNNNNNNNNN%UeNNNNNNNNNNNNNNNNNNNNNN LD SP,(SPSAV) RET SUBTTL CHAR I/O ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++BNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!******* ; COC: LD A,MF_CO JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNO: LD A,MF_LO JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST ,NNNNNNNNNNNNNNNNNN%#6NNNNNNNNNNNNNNNNNNNNNN----------------------------------------------------- ; ITRAP: ; ; SAVE REGS FIRST ; PUSH AF PUSH HL PUSH BC PUSH[lNNNNNNNNNNNNNNNNN%)YNNNNNNNNNNNNNNNNNNNNNN1 ; POP DE POP BC ;RESTORE REGS 1ST POP HL POP AF JP 0038H ; ; ; IF OPTION IS MONITOR THEN EXECUTE MONITOR BREAUNNNNNNNNNNNNNNNN%/sNNNNNNNNNNNNNNNNNNNNNN############################################## ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;#######q$NNNNNNNNNNNNNNNNN%ρNNNNNNNNNNNNNNNNNNNNN!EW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;+++++iNNNNNNNNNNNNNNNN% JNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; ;++++++++++++++++ 2[NNNNNNNNNNNNNNNNN%6NNNNNNNNNNNNNNNNNNNNN!+++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; uENNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;NNNNNNNNNNNNNNNNN%E[NNNNNNNNNNNNNNNNNNNNNNDEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \iNNNNNNNNNNNNNNNNN%$NNNNNNNNNNNNNNNNNNNNNN DE ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMSAV),A LD A,MR_RNUM OUT (M2_RSEL),A ; ; PRINNNNNNNNNNNNNNNNN%* NNNNNNNNNNNNNNNNNNNNN!KPOINT ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; POP DE POP BC POP HL POP AF JP 0008H ; ; ; ELSE RESTORE REGS & RETUbNNNNNNNNNNNNNNNNNN%0`NNNNNNNNNNNNNNNNNNNNNN##################################################################### ; SDTRAN: GXLATE 26,6 ;############################2NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!X&†^+Ȋd2ώl:֒sAݖyH㚱M鞸T"񢿣[)NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN################################################ ; ; COMMON I/O PARAMETER BLOCK ; ;#########################################NNNNNNNNNNNNNNNNN&P\NNNNNNNNNNNNNNNNNNNNNN DS 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ DS 1 DVRDTYP DS 1 ;RESERVED FOR DISK TYPE DVRCYLS DS 2 ;DISK CYLINDERS DVRHDS DS 1 ;NNNNNNNNNNNNNNNN& NNNNNNNNNNNNNNNNNNNNN!DB #S0,#Z0,#S1,#Z1,#SD,#ZD DB #DT ;;DISK TYPE DW #CY ;;CYLS DB #HD ;;HEADS LIST OFF ENDM DVR0: IF BOOT = 10H ejNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN-90 grh ; Initial separation from main module ; ;**************************************************************************gNNNNNNNNNNNNNNNNN&p NNNNNNNNNNNNNNNNNNNNNNMONITOR ADDRESSES ; MONROM EQU 0F800H ;ROM START ADDR ; ; PAGE 0 LOCATIONS ; WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTANNNNNNNNNNNNNNNNN&چNNNNNNNNNNNNNNNNNNNNNN; ; RAM VARIABLES ; ;============================================================================ ; ; SAVE 128 BYTES FONNNNNNNNNNNNNNNN&%0NNNNNNNNNNNNNNNNNNNNNN ; ; BREAKPOINTS ; STRUCT 0 BPADDR DS 2 ;ADDRESS OF BREAKPOINT BPABNK DS 1 ;BANK # OF BREAKPOINT BPDATA DS 1 ;DATA DIv0NNNNNNNNNNNNNNNNN&+NNNNNNNNNNNNNNNNNNNNNNA,(THIS_BNK) LD (BNKLOC),A ; ; DISPLAY BREAK ADDRESS ; EX DE,HL ;HL= ADDR LD E,A ;E= BANK CALL LADR ; ; CLEARNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN!################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;############################$NNNNNNNNNNNNNNNNN&@bNNNNNNNNNNNNNNNNNNNNN!HEADS ; ; DEFINE THE STRUCTURE SIZE ; DVRSIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@aSBNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,"PsNNNNNNNNNNNNNNNNN&|NNNNNNNNNNNNNNNNNNNNN!** ; ;============================================================================ ; ; ASSEMBLE TIME CONSTANTS ; ;======nNNNNNNNNNNNNNNNNN&%sNNNNNNNNNNNNNNNNNNNNNNRT ; IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; ; MEMORY BANK DATA IN PAGE 0 ; THI?PNNNNNNNNNNNNNNNNN& -NNNNNNNNNNNNNNNNNNNNNNR MONITOR ; ORG MONROM - 128 MONSTK EQU $ ; ; REGISTER IMAGE STORAGE ; RLOC DS 1 ;R ILOC DS 1 ;I YLOC DS 2 ;IY XLOC0NNNNNNNNNNNNNNNNN&&eNNNNNNNNNNNNNNNNNNNNNNSPLACED BY RESTART INSTRUCTION BP_REC DS 0 ;NUMBER OF BYTES IN RECORD ENDM TLOC: REPT NBKPTS DS BP_REC ENDM ; ; ENNNNNNNNNNNNNNNNN&,@NNNNNNNNNNNNNNNNNNNNNN BREAKPOINTS ; LD HL,TLOC LD B,NBKPTS ; ; TOP OF RESTORATION LOOP ; RS7: LD E,(HL) ;FETCH BREAKPOINT ADDRESS LD (HuNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN################################################ ; ; DISK DRIVER TABLES ; ;#################################################]rNNNNNNNNNNNNNNNNN& sSNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FBNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 ALLDRV FD8EXEC,1,0,26,0,ONNNNNNNNNNNNNNNNN&5MNNNNNNNNNNNNNNNNNNNNNN====================================================================== ; DEFBNK EQU 0 ;DEFAULT BANK # ; ; BREAKPOINTS ; 6NNNNNNNNNNNNNNNNN&BNNNNNNNNNNNNNNNNNNNNNNS_BNK EQU 001BH ;BANK # FOR THIS BANK (CONSTANT) THIS_STK EQU 001CH ;STACK PTR WHILE THIS BANK IS SELECTED PREV_BNK EQU 001EfNNNNNNNNNNNNNNNN&!NNNNNNNNNNNNNNNNNNNNNN DS 2 ;IX FPLOC DS 1 ;F' APLOC DS 1 ;A' CPLOC DS 1 ;C' BPLOC DS 1 ;B' EPLOC DS 1 ;E' DPLOC DS 1 ;D' LPLOC DS 1 ;L' HPLOC-UNNNNNNNNNNNNNNNNN&'VNNNNNNNNNNNNNNNNNNNNN!BANK #S ASSOCIATED WITH ARGUMENTS ; ARGPTR DS 2 ;PTR TO CURRENT ARGUMENT'S BANK A1_BNK DS 1 ;ARG #1 BANK A2_BNK DS 1 A3_BNK'NNNNNNNNNNNNNNNNN&-qNNNNNNNNNNNNNNNNNNNNNNL),0 ;CLEAR BREAKPOINT INC HL LD D,(HL) LD (HL),0 INC HL LD C,(HL) LD (HL),0 INC HL ;SET PTR TO DATA ; ; IF hNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN!########################### ; STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DS 1 ;FLAGS (BIT 0= 1: INHIBIT LOGONO NNNNNNNNNNNNNNNNN& &NNNNNNNNNNNNNNNNNNNNNNG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ; #Z0= TRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRK 1 SIZE ; #SD= DATA TRKS SPT ; |NNNNNNNNNNNNNNNN&ʸNNNNNNNNNNNNNNNNNNNNNN26,0,26,0,0,77,1 ENDIF IF BOOT = 3 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1zNNNNNNNNNNNNNNNNN&`NNNNNNNNNNNNNNNNNNNNN! NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS BP_RST EQU 8 ;BREAKPOINT RESTART # BP_RSTV EQU BP_RST ;BREAKPOINT RESTART VECTOR LOCATENNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNH ;LINK BACK TO PREVIOUS BANK ; ; ASCII CONSTANTS ; CTRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ; ; ZNNNNNNNNNNNNNNNN&"ONNNNNNNNNNNNNNNNNNNNNN DS 1 ;H' ELOC DS 1 ;E DLOC DS 1 ;D CLOC DS 1 ;C BLOC DS 1 ;B FLOC DS 1 ;F ALOC DS 1 ;A SLOC DS 2 ;SP ; LLOC DS 1 ;L H~kNNNNNNNNNNNNNNNNN&(FNNNNNNNNNNNNNNNNNNNNN! DS 1 ; ; DISK IOPB RESERVATION ; IOPB: DS PB_SIZE ; ; DISK ROM VARS ; DDADDR DS 3 ;JADE CONTROLLER ADDRESS, BANK D{sNNNNNNNNNNNNNNNN&."NNNNNNNNNNNNNNNNNNNNNNBREAKPOINT ALREADY CLEARED THEN SKIP RESTORE ; LD A,E ;IF LOC = 0:0 THEN SKIP RESTORE OR A,D OR A,C JR Z,RS8 ; ; E"NNNNNNNNNNNNNNNN&6>NNNNNNNNNNNNNNNNNNNNNN) DVRPDRV DS 1 ;PHYSICAL DRIVE ;DVRLDRV DS 1 ;LOGICAL DRIVE {0..N-1} ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR aNNNNNNNNNNNNNNNNN& 1NNNNNNNNNNNNNNNNNNNNNN #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDRV MACRO #DADD,#P>zNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN;**************************************************************************** ; ; M5b Z-80 Banked Memory Monitor Global DefiniDXNNNNNNNNNNNNNNNN&S/NNNNNNNNNNNNNNNNNNNNNNION BP_RSTI EQU 0C7H + BP_RSTV ;BREAKPOINT INSTRUCTION ; ; MONITOR FUNCTION CALL ; MFUNRST EQU 20H ;FUNCTION RESTART VECe$NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN MONITOR ROM EXTENSIONS ; MR_RNUM EQU 0 ;RESIDENT ROM DK_RNUM EQU 2 ;DISK ROM DEB_RNUM EQU 3 ;DEBUGGER ROM CHR_RNUM EQU 4 ;NNNNNNNNNNNNNNNN&#~NNNNNNNNNNNNNNNNNNNNNNLOC DS 1 ;H PLOC DS 2 ;PC BNKLOC DS 1 ;PC BANK # ; ; BANKED MEMORY MANAGEMENT ; CBANK DS 1 ;CURRENT EXECUTION BANK DBNNNNNNNNNNNNNNNNNN&)uNNNNNNNNNNNNNNNNNNNNN!DPORT DS 1 ;JADE CONTROLLER PORT IOPBPTR DS 3 ;CURRENT IOPB POINTER IF ($ AND 7FFFH) > 7800H CONMSG **** RAM AllocationNNNNNNNNNNNNNNNN&/NNNNNNNNNNNNNNNNNNNNN!LSE RESTORE ORIGINAL DATA ; LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. PUSH HL EX DE,HL ;HL= MEMPTR LD E,C ;E= BANK LL.gNNNNNNNNNNNNNNNNN&cmNNNNNNNNNNNNNNNNNNNNNNOR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DISK FLAGS DVR0SPT DS 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPTEoNNNNNNNNNNNNNNNN& NNNNNNNNNNNNNNNNNNNNNND,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD,#DT,#CY,#HD LIST ON DW #DADD DB 0 ;;LOGON INHIBIT FLAG (LOGON ENABLED) DB #PD DB #FG NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNtions ; ;**************************************************************************** ; ; Revision History: ; ; 1.00 11-22zNNNNNNNNNNNNNNNN&CNNNNNNNNNNNNNNNNNNNNN!TOR # MFUNRSV EQU MFUNRST ;FUNCTION RESTART VECTOR LOCATION MFUNRSI EQU 0C7H + MFUNRST ;FUNCTION RESTART INSTRUCTION ; ; aNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNCHAR I/O ROM CLK_RNUM EQU 7 ;MISC. I/O ROM ;============================================================================ NNNNNNNNNNNNNNNNN&$NNNNNNNNNNNNNNNNNNNNNNANK DS 1 ;DESTINATION BANK # FOR MOVE SBANK DS 1 ;SOURCE BANK # FOR MOVE BNKCHG DS 1 ;BANK CHANGED FLAG (0: NOT, /0: CHANGED) .NNNNNNNNNNNNNNNN&* NNNNNNNNNNNNNNNNNNNNNN Too Large! **** ENDIF :^NNNNNNNNNNNNNNNNN&0^NNNNNNNNNNNNNNNNNNNNNND C,A ;C= DATA CALL PUTMEM POP HL ; ; NEXT BREAKPOINT ; RS8: INC HL ;DO NEXT BP DJNZ RS7 ; ; SAVE THE Z80 UNIQ$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺V$\*NJc1͎i7Ғo< ؖs@ܚxF{I䢲MNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN! TITLE M5b Z-80 MONITOR CHARACTER I/O ROM LIST NOCOND ;**********************************************************************,TNNNNNNNNNNNNNNNNN&glNNNNNNNNNNNNNNNNNNNNNNd interrupt code. ; Add rom xover function as include file. ; Add function dispatcher for execution and breakpoint entries. ;)HNNNNNNNNNNNNNNNN& NNNNNNNNNNNNNNNNNNNNNNTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ; DS (MONROM + 6) - $ Jf:NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN******************************************************************** ; CINIT: ; ; SET STACK ; LD SP,MONSTK ; ; RESE:gNNNNNNNNNNNNNNNNN&GNNNNNNNNNNNNNNNNNNNNN! A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK EXK[NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN;7: SPARE DW CIS ;8: RETURN STANDARD CONSOLE INPUT STATUS DW CI ;9: RETURN STANDARD CONSOLE CHAR DW COS ;10: RETURN STANNNNNNNNNNNNNNNNN&%NNNNNNNNNNNNNNNNNNNNNN*************************************************************** ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; Add DoubltjNNNNNNNNNNNNNNNN&+$NNNNNNNNNNNNNNNNNNNNNN ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-boot from reset function. ;iaNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN****** ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;**************************************NNNNNNNNNNNNNNNNN&wRNNNNNNNNNNNNNNNNNNNNNN Add CON: selection based on Naked Terminal presence. ; VERSN EQU 122 ;****************************************************** 'NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXTERNAL FUNCTION STUB FOR USER|NNNNNNNNNNNNNNNNNN&1LNNNNNNNNNNNNNNNNNNNNNNT ROM FUNCTION SHOULD NOT RETURN ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; IF RETURNED THEN HALT ; NNNNNNNNNNNNNNNNN&CNNNNNNNNNNNNNNNNNNNNN! (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET ;####ؤNNNNNNNNNNNNNNNNN& NNNNNNNNNNNNNNNNNNNNNNNDARD CONSOLE OUTPUT STATUS DW CO ;11: SEND CHAR TO STANDARD CONSOLE DW LOS ;12: RETURN STANDARD LIST DEVICE OUTPUT STATUS3NNNNNNNNNNNNNNNNN&&RNNNNNNNNNNNNNNNNNNNNN!e D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot image, in caNNNNNNNNNNNNNNNNN&,pNNNNNNNNNNNNNNNNNNNNNN 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE definitions. ; Remove initializaNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN************************************** ; ; This code module contains the system character I/O drivers and ; resides in the s"~NNNNNNNNNNNNNNNNN& DcNNNNNNNNNNNNNNNNNNNNNN********************** FORM FALSE EQU 0 TRUE EQU NOT FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOONNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN! DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A= FUNCTION # ; ;+++++++++++sNNNNNNNNNNNNNNNNN&}NNNNNNNNNNNNNNNNNNNNNN HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL MONITOR FUNCTION CALL DISPATCHER rNNNNNNNNNNNNNNNN&!rNNNNNNNNNNNNNNNNNNNNNN######################################################################## ; ; MONITOR FUNCTION TABLE ; ;#####################F[NNNNNNNNNNNNNNNNN&!,NNNNNNNNNNNNNNNNNNNNNN TITLE M5b Z-80 MONITOR RESIDENT ROM LIST NOCOND ;***************************************************************************NNNNNNNNNNNNNNNN&'aNNNNNNNNNNNNNNNNNNNNNNse logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4 - 2 JU= NNNNNNNNNNNNNNNNN&-ANNNNNNNNNNNNNNNNNNNNNNtion of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; 1.9 - 16 AUG 86 GRH ; Fix bug in PRI driverrNNNNNNNNNNNNNNNN&2?NNNNNNNNNNNNNNNNNNNNNName address space as the resident Monitor ROM. The ROMs ; communicate with each other through a ROM transfer function. ; *INCNNNNNNNNNNNNNNNN& 0NNNNNNNNNNNNNNNNNNNNNNL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE PRI.DEF ;*INCLUDE PSIO.DEF ;*INCLUDE B:ZBMF101.DEF ;*I_PNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP PUSH HL LD H,MR_RNUM ;USE NNNNNNNNNNNNNNNNN&W.NNNNNNNNNNNNNNNNNNNNN!;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++?NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN####################################################### ; FUNTABL: DW RETVERS ;0: RETURN MONITOR ROM VERSION ; DW MFUNER aNNNNNNNNNNNNNNNN&"NNNNNNNNNNNNNNNNNNNNNN* ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983,1990 GRH Enterprises, Cupertino, CA ; ;**************************************NNNNNNNNNNNNNNNN&(qNNNNNNNNNNNNNNNNNNNNN!N 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing the status incorrectly. ; 1gNNNNNNNNNNNNNNNNN&.NNNNNNNNNNNNNNNNNNNNNN which caused new Oki 93 to be busy. ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNLUDE B:ZBMH122.HDR ;**************************************************************************** ; ; Revision status: ; ; 1UgNNNNNNNNNNNNNNNNN& "NNNNNNNNNNNNNNNNNNNNNNNCLUDE B:ZBMG101.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE NAKEDT.DEF *INCLUDE PRI.DEF lNNNNNNNNNNNNNNNNN&ιNNNNNNNNNNNNNNNNNNNNNNRESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK INC SP RET ;********mrNNNNNNNNNNNNNNNN&dNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGA^dNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNR ;1: RETURN CHAR DEVICE PARAMETERS DW MFUNERR ;2: EXECUTE SELF TEST DW MFUNERR ;3: SET STANDARD CONSOLE DEVICE DW MFUN{ANNNNNNNNNNNNNNNN&#NNNNNNNNNNNNNNNNNNNNNNN************************************** ; ; This Monitor program resides at the top 2k of memory & supports the ;system resou/NNNNNNNNNNNNNNNN&)BNNNNNNNNNNNNNNNNNNNNN!.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on staHBNNNNNNNNNNNNNNNN&/#NNNNNNNNNNNNNNNNNNNNNN; swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ; 1.11- 27 DEC 87 GRH ; Add bank megNNNNNNNNNNNNNNNN&T]NNNNNNNNNNNNNNNNNNNNNN.0 - Release ; 1.22 11-22-90 GRH ; Split off from Monitor code to separate ROM in order to gain space ; for I/O drivers anNNNNNNNNNNNNNNNNN& NNNNNNNNNNNNNNNNNNNNNN *INCLUDE PSIO.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU CHR_RNUM SUBTTL EXTERNAL ENNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN******************************************************************** ; ; COLD INIT ONLY SWITCHES TO RESIDENT ROM ; ;********lNNNNNNNNNNNNNNNN&t!NNNNNNNNNNNNNNNNNNNNNNL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ADD A,A ADD A,L LD L,A LDnNNNNNNNNNNNNNNNNN&އNNNNNNNNNNNNNNNNNNNNN!ERR ;4: SET STANDARD LIST DEVICE DW MFUNERR ;5: INITIALIZE CHAR DEVICE DW MFUNERR ;6: SET DEVICE BAUD RATE DW MFUNERR CrNNNNNNNNNNNNNNNN&$4NNNNNNNNNNNNNNNNNNNNNNrces and transfer to additional ROMs residing in the same memory ; area as this ROM. ; *INCLUDE B:ZBMH122.HDR ;*************NNNNNNNNNNNNNNNN&*NNNNNNNNNNNNNNNNNNNNNNck. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; reset. ; 1.7 - 8 FEB 86 GRH3NNNNNNNNNNNNNNNNN&0nNNNNNNNNNNNNNNNNNNNNNNmory management routines. ; 1.12 20 JUL 88 GRH ; Add Monitor function call restart. ; 1.20 29 DEC 88 GRH ; Add banked meNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"񁿂\)ņc1͊h6Ҏn< גtB}L隷S!Y'ģa/~NNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNNmory support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; 1.21 27 JAN 89 GRH ; Add new monitorSNNNNNNNNNNNNNNNNN'&NNNNNNNNNNNNNNNNNNNNNN;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE BIGyNNNNNNNNNNNNNNNNN' #NNNNNNNNNNNNNNNNNNNNNNA ; JP GETMEM ;RETURN BANKED MEMORY DATA ; JP PUTMEM ;STORE BANKED MEMORY DATA ; JP BNKSEL ;SELECT MEMORY BANK ; NNNNNNNNNNNNNNNN'_NNNNNNNNNNNNNNNNNNNNNNGS ; PUSH HL PUSH DE PUSH BC XCROM MF_CO ; ; RESTORE REGS ; POP BC POP DE POP HL ; ; DONE ; RET NNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNND MEMORY DATA FUNCTION ; ENTRY- HL= OFFSET PTR ; E= BANK # ; EXIT - A= DATA ; ;+++++++++++++++++++++++++++++++++++++++++++fWNNNNNNNNNNNNNNNN'2NNNNNNNNNNNNNNNNNNNNN! OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;###################################################'NNNNNNNNNNNNNNNNN'%FlNNNNNNNNNNNNNNNNNNNNNNE DISK SECTOR DW XMNE ;X EXAMINE & CHANGE REGISTERS DW QPRT ;Y DW QPRT ;Z ;--------------------------------------zNNNNNNNNNNNNNNNN'+ecNNNNNNNNNNNNNNNNNNNNNN DB 'H',HPLOC - RLOC DB 'L',LPLOC - RLOC DB 'M' + 80H,[HPLOC - RLOC] + 0C0H DB 'X',[XLOC - RLOC + 1 ] + 80H DB 'Y',[YLNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN function routines. ; ; 1.22 11-22-90 GRH ; Move debugger code to separate ROM in order to gain space for I/O ; drivers ahy NNNNNNNNNNNNNNNNN'6NNNNNNNNNNNNNNNNNNNNNNZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON ; THIS_ROM EQU MR_RNUM ; ; BANK NNNNNNNNNNNNNNNNN'pNNNNNNNNNNNNNNNNNNNNNNJP XMOVE ;SELECT MEMORY BANKS FOR MOVE ; JP BMOVE ;BANKED MEMORY BLOCK MOVE ; JP REST ;(NOT IMPLIMENTED) ;EXECUTE BANK F FFFFH)! **** ENDIF END zNNNNNNNNNNNNNNNNNN'sNNNNNNNNNNNNNNNNNNNNNNit. ; ; 1.23 2-21-91 GRH ; Add function #7, return current bank #. Remove reading THIS_BNK. ; VERSN EQU 123 ; ;********OHNNNNNNNNNNNNNNNNN' PNNNNNNNNNNNNNNNNNNNNNNRY ORG MONROM ; ; COLD START VECTOR ; JP INIT ;COLD START (RESET) ; JP CI ;RETURN NEXT SYSTEM CONSOLE CHAR IN A ;NNNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNNNRNAL EXECUTE REGISTERS PROCEDURE (GOTO) ; JP RSTER ;RESTART ERROR ENTRY ; JP PRTS ;DISPLAY BIT7 TERMINATED TEXT ON SYSTEU'NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN; ; DONE ; RET ;**************************************************************************** ; ; CONSOLE INPUT ; fNNNNNNNNNNNNNNNNN'aNNNNNNNNNNNNNNNNNNNNNNC= DATA ; EXIT - A= ? ; ;**************************************************************************** ; PUTMEM: XRROM MF_:NNNNNNNNNNNNNNNNN'"NNNNNNNNNNNNNNNNNNNNNNORT DATA DW QPRT ;J DW DCLKC ;K CLOCK/CALENDAR DISPLAY DW DKLOG ;L LOGON DISK DW MOVE ;M MOVE MEMORY DW QPRT ;N #NNNNNNNNNNNNNNNNN'(00NNNNNNNNNNNNNNNNNNNNNN 'E',ELOC - RLOC DB 'F',FLOC - RLOC DB 'H',HLOC - RLOC DB 'L',LLOC - RLOC DB 80H + 'M',[HLOC - RLOC] + 0C0H DB 'P',[PL$NNNNNNNNNNNNNNNNNN'.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN'@NNNNNNNNNNNNNNNNNNNNNN******************************************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE ; ; INCLUDEїNNNNNNNNNNNNNNNN' cNNNNNNNNNNNNNNNNNNNNNN FUNENT: JP MONFUNC ;EXECUTE MONITOR FUNCTION IN A ; JP CO ;SEND CHAR IN C TO SYSTEM CONSOLE ; JP COS ;RETURN SYSTEM CrNNNNNNNNNNNNNNNN'=NNNNNNNNNNNNNNNNNNNNN!; ; FALLS INTO CO SUBR ; ;**************************************************************************** ; ; CONSOLE OUJNNNNNNNNNNNNNNNNN'%NNNNNNNNNNNNNNNNNNNNNNEXIT - A= CHAR (CTRL-Z: EOF) ; ;**************************************************************************** ; CI: XCROM MNNNNNNNNNNNNNNNNN'PNNNNNNNNNNNNNNNNNNNNNNPMEM ; ; DONE ; RET SUBTTL MESSAGES CRMSG: DM CR,LF BOOTEM: DM 'BOOT LOAD ERR',CR,LF QMSG: DM LF,'^??' SUBTT iBNNNNNNNNNNNNNNNNN'#NNNNNNNNNNNNNNNNNNNNNN DW OUPT ;O OUTPUT DATA TO OUTPUT PORT DW QPRT ;P DW QPRT ;Q DW DKREAD ;R READ DISK SECTOR DW SUBS ;S SUBSTITUTE M{%NNNNNNNNNNNNNNNNN')NNNNNNNNNNNNNNNNNNNNN!OC - RLOC + 1 ] + 80H DB 'S',[SLOC - RLOC + 1 ] + 80H DB 'I',ILOC - RLOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H G NNNNNNNNNNNNNNNNN'/NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF DNNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNNNONSOLE OUTPUT STATUS IN A ; JP LO ;SEND CHAR IN C TO SYSTEM LIST DEVICE ; JP CIS ;RETURN SYSTEM CONSOLE INPUT STATUS IN @KNNNNNNNNNNNNNNNNN'nNNNNNNNNNNNNNNNNNNNNNNTPUT ; ENTRY- C= CHAR ; ;**************************************************************************** ; CO: ; ; SAVE RENNNNNNNNNNNNNNNN'5NNNNNNNNNNNNNNNNNNNNNNF_CI ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKE}'NNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNL DATA CONSTANTS ;############################################################################ ; ; TBL CONTAINS THE ADDRESSESNNNNNNNNNNNNNNNNN'$u]NNNNNNNNNNNNNNNNNNNNNNEMORY DW MTEST ;T TEST MEMORY DW SCLKC ;U UPDATE CLOCK/CALENDAR DW COMP ;V VERIFY (COMPARE) MEMORY DW DKWRIT ;W WRITtNNNNNNNNNNNNNNNNN'*VRNNNNNNNNNNNNNNNNNNNNNN+ 'A',APLOC - RLOC DB 'B',BPLOC - RLOC DB 'C',CPLOC - RLOC DB 'D',DPLOC - RLOC DB 'E',EPLOC - RLOC DB 'F',FPLOC - RLOCNNNNNNNNNNNNNNNNN'0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺V$񅿆[(Ŋa/Ɏd2͒i7Җn< ؚtBݞzH㢰}LNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN'~NNNNNNNNNNNNNNNNNNNNNN DW LO ;13: SEND CHAR TO STANDARD LIST DEVICE ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL DEBUGGER FUNCTIONS ;+++++++++++++ XNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNN!TA ;SET TABLE PTR ; IOILP: LD C,(HL) ;FETCH PORT INC HL ; LD A,C ;IF PORT == -1 THEN DONE INC A JR Z,IOIDN ; LD NNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNNN ; ; PSIO SIO #0B ; DB PS_SER1S ;PORT DB 8 ;BYTE COUNT DB 18H ;CHANNEL RESET DB 4,44H ;WRITE REG #4: 16x CLOCK, 1rNNNNNNNNNNNNNNNN'oNNNNNNNNNNNNNNNNNNNNNN DTR, Tx 8-BIT CHAR, Tx ENABLE, RTS DB 0 ;READ REG #0 ; ; CTC TIMER 0: SIO 0A&B BAUD RATE ; DB PS_CTC0 ;PORT DB 2 NNNNNNNNNNNNNNNNN'1NNNNNNNNNNNNNNNNNNNNN!Y CHAR ; LD C,(HL) RES 7,C PUSH HL CALL CO POP HL ; ; IF CHAR < 128 THEN DO NEXT CHAR ; BIT 7,(HL) INC HL NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNN0, 1: CON1, 2: CON2, 3: CON3 ; C= CHAR ; ;**************************************************************************** ; `aNNNNNNNNNNNNNNNN'%q\NNNNNNNNNNNNNNNNNNNNNN******************** ; ; SYSTEM CONSOLE INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXITR9NNNNNNNNNNNNNNNN'+RSNNNNNNNNNNNNNNNNNNNNNN ;CONSOLE ;**************************************************************************** ; ; LIST DEVICE STATUS INPUT SELNNNNNNNNNNNNNNNNN'-NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION ; EXIT - HL= VERSION # (123D = 1.[NNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNN!B,(HL) ;FETCH COUNT INC HL OTIR JR IOILP ; ; SIO DONE ; IOIDN: ; ; DISPLAY SIGN-ON ; LD HL,LOGMSG CALL PRTNNNNNNNNNNNNNNNN'@NNNNNNNNNNNNNNNNNNNNNN STOP BIT DB 3,0C1H ;WRITE REG #3: Rx 8-BIT CHAR, Rx ENABLE DB 5,0EAH ;WRITE REG #5: DTR, Tx 8-BIT CHAR, Tx ENABLE, RTS ZNNNNNNNNNNNNNNNNN'GNNNNNNNNNNNNNNNNNNNNNN;COUNT DB 01000101B ;CONTROL WORD DB 8 ;9600 BAUD ; ; CTC TIMER 1: SIO 1A BAUD RATE ; DB PS_CTC1 ;PORT DB 2 ;COUINNNNNNNNNNNNNNNNN'dNNNNNNNNNNNNNNNNNNNNNNJR Z,PRTS ; RET SUBTTL IOBYTE HANDLERS ;**************************************************************************** `+^NNNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNNNCO: LD A,(IOBYTE) AND A,3 JP Z,CO0 ;CONSOLE 0 CP A,2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ~NNNNNNNNNNNNNNNN'&$NNNNNNNNNNNNNNNNNNNNNN - A= CHAR (CTRL-Z: EOF) ; ;**************************************************************************** ; CI: LD A,(IOBYTE)]!NNNNNNNNNNNNNNNN',NNNNNNNNNNNNNNNNNNNNNNECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EXIT - A= 0: BUSY, FFH: READY ; ;***************NNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;***yNNNNNNNNNNNNNNNN' 2NNNNNNNNNNNNNNNNNNNNNNS ; ; DONE ; RET ;############################################################################ ; ; SIO INITIALIZAT7NNNNNNNNNNNNNNNN'qNNNNNNNNNNNNNNNNNNNNNNDB 0 ;READ REG #0 ; ; PSIO SIO #1A ; DB PS_SER2S ;PORT DB 8 ;BYTE COUNT DB 18H ;CHANNEL RESET DB 4,44H ;WRITE R64'NNNNNNNNNNNNNNNNN'tNNNNNNNNNNNNNNNNNNNNN!NT DB 01000101B ;CONTROL WORD DB 8 ;9600 BAUD ; ; CTC TIMER 2: SIO 1B BAUD RATE ; DB PS_CTC2 ;PORT DB 2 ;COUNT HyNNNNNNNNNNNNNNNNN'WNNNNNNNNNNNNNNNNNNNNN!; ; SYSTEM CONSOLE OUTPUT STATUS SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= 0: BUSY,ӝNNNNNNNNNNNNNNNN'!NNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; SYSTEM CONSOLE INPUT STATUS SELECTOR ; 'NNNNNNNNNNNNNNNN''>NNNNNNNNNNNNNNNNNNNNNN AND A,3 JP Z,CI0 ;CONSOLE 0 CP A,2 JP M,CI1 ;CONSOLE 1 JP Z,CI2 ;CONSOLE 2 JP CI3 ;CONSOLE 3 ;************lyNNNNNNNNNNNNNNNN'-NNNNNNNNNNNNNNNNNNNNNN************************************************************* ; LOS: LD A,(IOBYTE) AND A,0C0H JP Z,LOS0 ;PRINTER 0 CP A,dNNNNNNNNNNNNNNNN'DNNNNNNNNNNNNNNNNNNNNNN************************************************************************* ; ; INITIALIZE I/O ; ;****************************nNNNNNNNNNNNNNNNNN' gNNNNNNNNNNNNNNNNNNNNNNION DATA TABLE ; ;############################################################################ ; IOIDTA: ; ; PSIO SIO #0ZNNNNNNNNNNNNNNNN' ٖvDzH㞰~K袷S NNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN(XNNNNNNNNNNNNNNNNNNNNNN READY THEN RETURN 0 AND A,1 SHL NT_READY RET Z LD A,-1 ;ELSE RETURN -1 RET ; ; ; RETURN INPUT CHAR ; CI0: CALL NNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN1B ;TEST RXRDY RET Z ; LD A,-1 RET ; ; CI1: CALL CIS1 ;WAIT FOR CHAR READY JR Z,CI1 ; IN A,(PS_SER0D) ;FETCH CNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNN************************************************* ; CIS3: EQU CIS0 CI3: EQU CI0 COS3: EQU COS0 CO3: EQU CO0 ;********* NNNNNNNNNNNNNNNNN(=NNNNNNNNNNNNNNNNNNNNNNCNT),A ;CLEAR STROBE RET ;**************************************************************************** ; ; LIST DEVICE$NNNNNNNNNNNNNNNN(zNNNNNNNNNNNNNNNNNNNNNNREPEAT CP A,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; LD A,IOBYTV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ; *tNNNNNNNNNNNNNNNNN(xNNNNNNNNNNNNNNNNNNNNNNLP SUBTTL DEBUGGER SUPPORT ROUTINES ;**************************************************************************** ; ; GOT&HNNNNNNNNNNNNNNNNN(%NNNNNNNNNNNNNNNNNNNNNNLSE OUTPUT '.' ; DIS6: CALL CO ; ; IF DONE THEN ABORT ; CALL HILOX RET C ; ; ELSE IF NOT ON EVEN 16 BYTE BOUNDARYNNNNNNNNNNNNNNNN(+NNNNNNNNNNNNNNNNNNNNNNDDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT GNNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNNCIS0 ;IF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NT_DATA) ;ELSE RETURN CHAR RET ; ; ; RETURN OUTPUT STATUS ; CO|NNNNNNNNNNNNNNN(8NNNNNNNNNNNNNNNNNNNNNNHAR RET ; ; COS1: IN A,(PS_SER0S) ;FETCH STATUS AND A,00000100B ;TEST TX BUFFER EMPTY RET Z ; LD A,-1 RET ; ; kNNNNNNNNNNNNNNNNN(HNNNNNNNNNNNNNNNNNNNNNN******************************************************************* ; ; LIST DEVICE 1 (LST1) : PRI CENTRONICS ; ;**********yBNNNNNNNNNNNNNNNN(&NNNNNNNNNNNNNNNNNNNNNN 1 (LST1) ; ;**************************************************************************** ; LOS1: EQU LOS0 LO1: EQU LO0 -,rNNNNNNNNNNNNNNNN()NNNNNNNNNNNNNNNNNNNNNN SET BANK STACK ; LD (THIS_STK),SP ; ; SET FUNCTION CALL RESTART ; LD HL,FUNENT LD (MFUNRSV),HL ; ; INIT ROMS (IZNNNNNNNNNNNNNNNNN( mwNNNNNNNNNNNNNNNNNNNNNNO FUNCTION #8 ; ;**************************************************************************** ; GOTOS: ; ; SCRUB FUNCTIO<NNNNNNNNNNNNNNNNN(&NNNNNNNNNNNNNNNNNNNNNN THEN REPEAT ; LD A,L AND A,0FH JR NZ,DIS4 ; ; ELSE NEXT LINE ; JR DIS1 ; ; ; PARTIAL HEX LINE, START ASCII O/coNNNNNNNNNNNNNNNNN(,(NNNNNNNNNNNNNNNNNNNNNNAT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;-------------------Z;NNNNNNNNNNNNNNNNN(>NNNNNNNNNNNNNNNNNNNNN!S0: IN A,(NT_STAT) ;IF NOT READY TO ACCEPT CHAR THEN WAIT CPL AND A,1 SHL NT_BUSY RET Z LD A,-1 RET ; ; ; OUTPUT JNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNN CO1: CALL COS1 ;WAIT IF BUSY JR Z,CO1 ; LD A,C ;SEND CHAR OUT (PS_SER0D),A RET ;*****************************NNNNNNNNNNNNNNNNN({NNNNNNNNNNNNNNNNNNNNNN****************************************************************** ; ; RETURN OUTPUT STATUS ; LOS0: LD A,0BFH ;THIS PR&$NNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNN! ;**************************************************************************** ; ; LIST DEVICE 2 (LST2) ; ;****************s0NNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN/O) ; LD HL,[CHR_RNUM SHL 8] + 1 ;CHAR PUSH HL CALL XROMF POP HL ; LD HL,[DEB_RNUM SHL 8] + 1 ;DEBUGGER PUSH HL ]DNNNNNNNNNNNNNNNNN(!^FNNNNNNNNNNNNNNNNNNNNNNVEN 16 BYTE BOUNDARY THEN REPEAT ; LD A,L ;READY FOR NEW LINE? AND A,0FH JR NZ,DIS2 ; ; DONE WITH HEX DISPLAY, DO ASNNNNNNNNNNNNNNNNN('NNNNNNNNNNNNNNNNNNNNN!N PROPER COLUMN ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ;-------------------------------------8NNNNNNNNNNNNNNNN(-+NNNNNNNNNNNNNNNNNNNNNN--------------------------------------------------------- ; GOTO: ; ; IF NO ARGS THEN USE CURRENT REGISTERS ; CALL PCHK NNNNNNNNNNNNNNNNN(UNNNNNNNNNNNNNNNNNNNNNNCHAR ; CO0: CALL COS0 ;IF BUSY THEN WAIT JR Z,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NT_DATA),A RET ;********HNNNNNNNNNNNNNNNN( ZNNNNNNNNNNNNNNNNNNNNNN*********************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;*************************************wNNNNNNNNNNNNNNNNN(hNNNNNNNNNNNNNNNNNNNNN!INTER NEEDS STB=F FOR BUSY OUT (PRI_2CNT),A ; TO WORK PROPERLY ; IN A,(PRI_1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI_1BLwNNNNNNNNNNNNNNNN(DNNNNNNNNNNNNNNNNNNNNNN************************************************************ ; LOS2: EQU LOS0 LO2: EQU LO0 LOGMSG DB ' M5b Character INNNNNNNNNNNNNNNNN(-NNNNNNNNNNNNNNNNNNNNNN CALL XROMF POP HL ; LD HL,[DK_RNUM SHL 8] + 1 ;DISK PUSH HL CALL XROMF POP HL ; LD HL,[CLK_RNUM SHL 8] + 1 ;MIΩNNNNNNNNNNNNNNNNN(" NNNNNNNNNNNNNNNNNNNNNNCII ; DIS3: ; ; RESTORE PTR ; POP HL ; ; POSITION START ON PROPER COLUMN ; LD A,L ;SKIP OVER TO RIGHT SPACE APNNNNNNNNNNNNNNNNNN((NNNNNNNNNNNNNNNNNNNNN!--------------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWSaNNNNNNNNNNNNNNNN(.NxNNNNNNNNNNNNNNNNNNNNNN JR C,GO3 ; ; IF NO GOTO ADDRESS THEN SET BREAKPOINTS ; JR Z,GO0 ; ; FETCH NEW GOTO ADDRESS & PUT INTO 'PC' REGISTEKNNNNNNNNNNNNNNNNN(dNNNNNNNNNNNNNNNNNNNNNN******************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON1) : SIO #0 ; ;*******i!NNNNNNNNNNNNNNNN( kNNNNNNNNNNNNNNNNNNNNNN*************************************** ; CIS2: EQU CIS0 CI2: EQU CI0 COS2: EQU COS0 CO2: EQU CO0 ;*******************NNNNNNNNNNNNNNNN([NNNNNNNNNNNNNNNNNNNNNNSB] ;TEST BUSY RET Z ; LD A,-1 RET ; ; ; OUTPUT CHAR ; LO0: CALL LOS0 ;WAIT FOR BUSY=FALSE JR Z,LO0 ; LD NNNNNNNNNNNNNNNN(uNNNNNNNNNNNNNNNNNNNNNN/O V. ' PVERS VERSN DM CR,LF END  3BNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNN!SC PUSH HL CALL XROMF POP HL ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; EXECUTE n NNNNNNNNNNNNNNNNN(#8$NNNNNNNNNNNNNNNNNNNNN!ND A,0FH CALL TRPL2 ; ; DISPLAY CHAR ; DIS4: PUSH DE ;FETCH BANK IN E LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA PuNNNNNNNNNNNNNNNN()NNNNNNNNNNNNNNNNNNNNN! THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERYHNNNNNNNNNNNNNNNN(/}INNNNNNNNNNNNNNNNNNNNN!R ; PUSH AF ;PRESET BANK # LD A,(BNKLOC) LD (A1_BNK),A ; CALL EXF POP DE ; LD (PLOC),DE ;PUT ADDR IN PC LOCATIOvzNNNNNNNNNNNNNNNN(7NNNNNNNNNNNNNNNNNNNNN!********************************************************************* ; CIS1: IN A,(PS_SER0S) ;FETCH STATUS AND A,0000000gNNNNNNNNNNNNNNNN( .NNNNNNNNNNNNNNNNNNNNNN********************************************************* ; ; ALTERNATE CONSOLE DEVICE (CON3) ; ;***************************?'NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNA,C ;OUTPUT CHARACTER OUT (PRI_1DO),A LD A,NOT [1 SHL PRI_1CSB] ;OUTPUT STROBE OUT (PRI_2CNT),A LD A,0BFH OUT (PRI_2|NNNNNNNNNNNNNNNNN(KNNNNNNNNNNNNNNNNNNNNNNION TO STORE BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMEM ; INC E ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEN ENNNNNNNNNNNNNNNNN(KNNNNNNNNNNNNNNNNNNNNNNTHE DEBUGGER ; MAINLP: LD SP,MONSTK LD HL,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL CALL XROMF POP HL JR MAIN/NNNNNNNNNNNNNNNNN($NNNNNNNNNNNNNNNNNNNNNNOP DE ; AND A,7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP A,' ' JR C,DIS5 ; CP A,7EH JR C,DIS6 ; DIS5: LD C,'.' ;E;NNNNNNNNNNNNNNNN(*NNNNNNNNNNNNNNNNNNNNN!RUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_A+-NNNNNNNNNNNNNNNN(0nNNNNNNNNNNNNNNNNNNNNNNN LD A,(A1_BNK) LD (BNKLOC),A ; ; IF LAST CHAR == CR THEN NO MORE ARGS ; LD A,C ;IF LAST = CR THEN EXIT CP A,CR NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNY&Æ_-Ȋe2Ύi7Ӓn;֖r@ ۚxFឰ}J梴PNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN(oNNNNNNNNNNNNNNNNNNNNNNJR Z,GO3 ; ; GET & SET UP TO NBKPTS BREAKPOINTS ; GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ; GO1: PUSH BC NNNNNNNNNNNNNNNNN(6NNNNNNNNNNNNNNNNNNNNNN WHILE HERE ; PUSH BC ;SAVE LAST CHAR IN C LD C,BP_RSTI CALL PUTMEM POP BC ; POP AF ;RESTORE DATA EX DE,HL ;DE=BNNNNNNNNNNNNNNNNN( *NNNNNNNNNNNNNNNNNNNNNNTERS & EXECUTES THE 'PC' ; ; FIRST RESTORE THE Z80 ALTERNATE REGISTERS ; LD HL,(FPLOC) PUSH HL POP AF ; LD BC,(CPLN mNNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNN-------------------------------------- ; INPT: ; ; GET PORT ARG FROM USER ; CALL EXPR1 ;GET INPUT PORT # INTO C CALL.NNNNNNNNNNNNNNNNN(JNNNNNNNNNNNNNNNNNNNNNNARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; NNNNNNNNNNNNNNNN(ONNNNNNNNNNNNNNNNNNNNNNVYES ; LD A,L ;ELSE IF IN 1ST 40H BYTES THEN IGNORE CP A,40H JR C,MOVNO ; MOVYES: CALL PUTMEM ; MOVNO: EX (SP),H#NNNNNNNNNNNNNNNNN(%NNNNNNNNNNNNNNNNNNNNNN NEW BANK ; OUT (BNKREG),A ; ; STORE IN BANK PAGE 0 ; LD (THIS_BNK),A ; ; ALSO STORE LOCALLY ; LD (CURBNK),A ;QRNNNNNNNNNNNNNNNN(+NNNNNNNNNNNNNNNNNNNNNN& DE ARE REVERSED ; (Z-80 COMPATABLE) ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - HL & DE= NuNNNNNNNNNNNNNNNNN(:NNNNNNNNNNNNNNNNNNNNNN;SAVE BREAKPOINTS REMAINING ; ; GET BREAKPOINT FROM USER ; PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAkNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN PTR POP HL ;HL= RECORD.DATA PTR ; LD (HL),A ;STORE DATA INTO TABLE INC HL ;NEXT TABLE RECORD ; ; IF NO MORE ARGS aNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNOC) LD DE,(EPLOC) LD HL,(LPLOC) EX AF,AF' EXX ; ; NOW DO THE Z80 & 8080 REGISTERS ; LD IY,(YLOC) LD IX,(XLOC) NNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN CRLF ;PUT DATA ON NEW LINE POP BC ; ; FETCH PORT DATA ; IN E,(C) JP BITS2 ;OUTPUT VALUE ;--------------------^KNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN M ; ;---------------------------------------------------------------------------- BNNNNNNNNNNNNNNNNN( ZGNNNNNNNNNNNNNNNNNNNNNNL ;HL= SRC PTR POP BC ;BC= DEST PTR POP DE ;DE= LAST PTR ; ; NEXT, IF SRC <= LAST THEN REPEAT ; CALL HILOXB JR Nt NNNNNNNNNNNNNNNNN(&NNNNNNNNNNNNNNNNNNNNNN ; DONE ; RET ;**************************************************************************** ; ; SET BANKS FOR A FOL NNNNNNNNNNNNNNNN(,*NNNNNNNNNNNNNNNNNNNNNNEXT BYTES TO MOVE PTRS ; A, BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BMOVE:'NNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNN!P ADDR POP HL ;SPTR ; ; IF BREAKPOINT == 0 (NONE) THEN STOP ; LD A,(A1_BNK) ;INSURE 0 WASN'T SPEC'D OR A,D OR A,E NNNNNNNNNNNNNNNNN( 9NNNNNNNNNNNNNNNNNNNNN!THEN DONE WITH BREAKPOINTS ; GO2: LD A,C CP A,CR POP BC ;BP COUNT JR Z,GO3 ; ; IF MORE ALLOWED THEN CONTINUE ; D'NNNNNNNNNNNNNNNN(LNNNNNNNNNNNNNNNNNNNNNN; LD DE,(ELOC) LD BC,(CLOC) ; ; DO STACK ; LD SP,(SLOC) ; ; PUSH PC ON STACK FOR RETURN INSTRUCTION TO EXECUTE ; NNNNNNNNNNNNNNNN('NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;---------------------------------------------------------------------------- ; OUPT: ; ; GET ARGS FROM USER ; CA$NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN MOVE 1 BYTE OF DATA ; PUSH DE ;SAVE LAST PTR PUSH BC ;SAVE DEST PTR ; LD DE,(A1_BNK) ;FETCH SRC DATA CALL GETMEM NNNNNNNNNNNNNNNNN("<%NNNNNNNNNNNNNNNNNNNNNN;**************************************************************************** ; ; BANK SELECT PROCEDURE ; NOTE: THIS FUNCTION$NNNNNNNNNNNNNNNN((NNNNNNNNNNNNNNNNNNNNNN*********************************************************************** ; XMOVE: ; ; STORE BANK #S ; LD (DBANK),BC ; >NNNNNNNNNNNNNNNN(.yHNNNNNNNNNNNNNNNNNNNNNN ; ; DONE WITH SIMPLE CASE ; RET ; ; ; ELSE USE INTER-BANK MOVE ; BMOVE2: ; ; SAVE CURRENT BANK # ; LD A,(CDNNNNNNNNNNNNNNNN(TNNNNNNNNNNNNNNNNNNNNNN A,(A1_BNK) LD (HL),A INC HL ; ; SAVE EXISTING LOCATION DATA IN TABLE ; PUSH HL ;SAVE REGS NEEDED FOR GETMEM & PUTMENNNNNNNNNNNNNNNN( [NNNNNNNNNNNNNNNNNNNNNNDRESS ; ; INSERT RESTART BREAKPOINT VECTOR TO RESTORE ROUTINE ; LD HL,BP_RSTV LD DE,(BNKLOC) LD C,0C3H CALL PUTMEM UNNNNNNNNNNNNNNNNN(lNNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------------- ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYx$NNNNNNNNNNNNNNNNN(ENNNNNNNNNNNNNNNNNNNNNNLL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC ; ; OUTPUT TO PORT ; OUT (C),E ; ; DONE ; JP WINIT NNNNNNNNNNNNNNNNN()NNNNNNNNNNNNNNNNNNNNNN; EX (SP),HL ;HL= DEST PTR LD DE,(A3_BNK) ;STORE SRC DATA IN DEST LD C,A ; ; IF DESTINATION == PROTECTED THEN IGNORE NNNNNNNNNNNNNNNN(#NNNNNNNNNNNNNNNNNNNNNN IS ONLY FOR CP/M 3.0 COMPATABILITY. ALL OTHER ; ROUTINES SHOULD USE GETMEM, PUTMEM & XROM ROUTINES. ; ENTRY- A= BANK ADDRESS sNNNNNNNNNNNNNNNNN()NNNNNNNNNNNNNNNNNNNNNN; SET BANKS CHANGED FLAG ; LD A,-1 LD (BNKCHG),A ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN(/JyNNNNNNNNNNNNNNNNNNNNN!URBNK) LD (CBANK),A ; ; CLEAR INTER-BANK MOVE FLAG FOR NEXT TIME ; XOR A,A LD (BNKCHG),A ; ; IF IN SAME BANK THENNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNM EX DE,HL ;HL= PTR ; LD E,A ;E= BANK # CALL GETMEM PUSH AF ;SAVE DATA ; ; SET BREAKPOINT TO RESTART INSTRUCTION(rNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNN INC HL LD C,LOW REST CALL PUTMEM INC HL LD C,HIGH REST CALL PUTMEM ; ; THE FOLLOWING CODE RESTORES THE Z80 REGIS6NNNNNNNNNNNNNNNNN(9NNNNNNNNNNNNNNNNNNNNNNTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;-------------------------------------- INNNNNNNNNNNNNNNNN({NNNNNNNNNNNNNNNNNNNNNN ;---------------------------------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PfNNNNNNNNNNNNNNNNN(|NNNNNNNNNNNNNNNNNNNNNN ; LD A,H ;IF IN MONITOR RAM THEN IGNORE CP A,HIGH MONSTK JR NC,MOVNO ; OR A,A ;ELSE IF NOT PAGE 0 THEN OK JP NZ,MO;:'NNNNNNNNNNNNNNNN($NNNNNNNNNNNNNNNNNNNNNN ; ;**************************************************************************** ; FBSEL: LD A,C ; BNKSEL: ; ; SELECTNNNNNNNNNNNNNNNN(*NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++ ; ; MEMORY TO MEMORY MOVE FUNCTION #5 ; NOTE: THIS FUNCTION IS NOT CP/M 3.0 COMPATABLE. HL HNNNNNNNNNNNNNNNN(0Y4NNNNNNNNNNNNNNNNNNNNNN USE INTRA_BANK MOVE ON IT ; PUSH HL ;SAVE PTR LD HL,(DBANK) LD A,H CP A,L POP HL ;PTR JP NZ,NTSAME ; ; SELEC$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"Z(ņa/ʊe3Ўl; גr@ ۖvCߚzH㞱~K梳NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN).NNNNNNNNNNNNNNNNNNNNN!T BANK OF MOVE ; DI ;NO INTERRUPTS WHILE BANK SWAPPED ; OUT (BNKREG),A ;A STILL HAS BANK (BOTH SAME, REMEMBER?) ; LDINNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!,C OR A,B EXX JP NZ,BMOVE4 ; ; DONE ; JP BMOVE3 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++BNNNNNNNNNNNNNNNNN) kyNNNNNNNNNNNNNNNNNNNNNNANKED MEMORY PROCEDURE FUNCTION #2 ; ENTRY- HL= OFFSET PTR ; E= BANK # ; C= DATA ; EXIT - A= ? ; ;**********************ҧNNNNNNNNNNNNNNNNN)KNNNNNNNNNNNNNNNNNNNNNNMONFUNC: ;EXTERNAL ENTRY ; ; IF NOT LOCAL FUNCTIONS THEN EXIT ; CP A,MAXFUNS JR NC,NOT_INT ; ; FUNCTION SEEMS LEGALMrNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!EM ;1: RETURN BANKED MEMORY DATA DW PUTMEM ;2: STORE DATA INTO BANKED MEMORY DW MFUNERR ;3: SPARE DW XMOVE ;4: SET BLO_qNNNNNNNNNNNNNNNNN)hNNNNNNNNNNNNNNNNNNNNNNNEXT GROUP ; CP A,16 JR NC,NOT_DEB ; ; ELSE EXECUTE DEBUGGER FUNCTION ; ADD A,2 ;BIAS UP PUSH HL LD H,DEB_RNUM NNNNNNNNNNNNNNNNN)%6NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_CHR: ; ; BIAS DOWN TO DISK FUNCTIONS ; SUB A,32 ; ;LNNNNNNNNNNNNNNNNNNN)+9NNNNNNNNNNNNNNNNNNNNNNRNUM ;SET ROM # LD L,A ;SET FUNCTION # EX (SP),HL CALL XROMF INC SP INC SP ; RET SUBTTL MONITOR FUNCTIONS [n NNNNNNNNNNNNNNNNN){GNNNNNNNNNNNNNNNNNNNNNNR ; ; DONE, RESTORE BANK TO CURRENT BANK WHEN CALLED ; BMOVE3: LD A,(CBANK) ;RESELECT CURRENT BANK & RETURN OUT (BNKRNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION #1 ; ENTRY- HL= OFFSET PTR ; E= BANK # ; EXIT - A= DATA ; ;++++++{PNNNNNNNNNNNNNNNNN)>*NNNNNNNNNNNNNNNNNNNNNN****************************************************** ; PUTMEM: ; ; SAVE REG ; PUSH BC ; ; SAVE CURRENT BANK TO RE vBNNNNNNNNNNNNNNNN)ҒNNNNNNNNNNNNNNNNNNNNN!, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ; ADD A,A ADD A,L LD L,A xrNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNCK MOVE BANKS DW BMOVE ;5: BANKED BLOCK MOVE DW MFUNERR ;6: SELECT NEW BUS PROCESSOR DW RETCBNK ;7: RETURN CURRENTLY SE9NNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNN! LD L,A EX (SP),HL CALL XROMF INC SP INC SP RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNN)&eNNNNNNNNNNNNNNNNNNNNNN IF NOT DISK FUNCTIONS THEN GO CHECK NEXT GROUP ; CP A,16 JR NC,NOT_DSK ; ; ELSE EXECUTE DISK ROM ; ADD A,2 ;ADD ;>NNNNNNNNNNNNNNNNN),^NNNNNNNNNNNNNNNNNNNNNN;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION #0 ; EXIT - HL= VERڏNNNNNNNNNNNNNNNN)HvNNNNNNNNNNNNNNNNNNNNNNEG),A ; EI ;ALLOW INTERRUPTS NOW RET ; ; ; BANKS NOT THE SAME, DO DISCRETE MOVE ; NTSAME: ; ; SAVE COUNT ; kNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETMEM: ; ; SAVE REGISTER ; PUSH BC ; ; SANHNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNNTURN TO ; LD A,(CURBNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERRUPTS WHILE BANK SWAPPED OUT (BNKREG),A ;xNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNLD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK ;A'NNNNNNNNNNNNNNNNN)¬NNNNNNNNNNNNNNNNNNNNNNLECTED BANK IN A DW GOTOS ;8: DEBUGGER EXECUTER DW FBSEL ;9: SELECT NEW BANK ; MAXFUNS EQU ($ - FUNTABL) / 2 ;+++++++ZNNNNNNNNNNNNNNNN)!(NNNNNNNNNNNNNNNNNNNNNN+++++++++++++ ; ; CHAR FUNCTIONS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DEBFNNNNNNNNNNNNNNNNN)'TNNNNNNNNNNNNNNNNNNNNNNOFFSET ; PUSH HL ;SAVE ARG LD H,DK_RNUM ;SET ROM # LD L,A ;SET FUNCTION # EX (SP),HL CALL XROMF INC SP INC SP NNNNNNNNNNNNNNNNN)-mNNNNNNNNNNNNNNNNNNNNN!SION # (123D = 1.23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSXNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!PUSH BC ;SAVE COUNT EXX POP BC EXX ; ; FETCH BANKS ; LD BC,(DBANK) ; ; NO INTERRUPTS WHILE MOVING ; DI ; NNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNNVE CURRENT BANK FOR RETURN ; LD A,(CURBNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERRUPTS OUT (BNKREG),A ;: NNNNNNNNNNNNNNNN)VNNNNNNNNNNNNNNNNNNNNNN ; STORE DATA ; LD (HL),C ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; EI ; ; DONE ; POP BC RET SINNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET \^NNNNNNNNNNNNNNNNN)[;NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; NOT INTERNAL FUNCTION, CHECK FOR DEBUGGER ; ;+++++NNNNNNNNNNNNNNNN)"}NNNNNNNNNNNNNNNNNNNNN!: ; ; BIAS DOWN TO CHAR FUNS ; SUB A,16 ; ; IF NOT CHAR FUNCS THEN CHECK NEXT GROUP ; CP A,32 JR NC,NOT_CHR ; ; %NNNNNNNNNNNNNNNN)(jNNNNNNNNNNNNNNNNNNNNNN; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTIONS 9NNNNNNNNNNNNNNNN).8NNNNNNNNNNNNNNNNNNNNNNN RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CURRENTLY SELECTED BANK JrNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN; TOP OF MOVE LOOP ; BMOVE4: LD A,B ;SELECT SOURCE BANK OUT (BNKREG),A LD A,(HL) EX AF,AF' ; LD A,C ;SELECT DESTINNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNN ; FETCH DATA ; LD C,(HL) ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; ; RETURN DATA ; LD A,C ; ; DONE -NNNNNNNNNNNNNNNN)-gNNNNNNNNNNNNNNNNNNNNN!UBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRS]NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN;############################################################################ ; ; MONITOR FUNCTION TABLE ; ;################zNNNNNNNNNNNNNNNN)h NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_INT: ; ; BIAS DOWN DEBUGGER FUNCTIONS ; SNNNNNNNNNNNNNNNN)#NNNNNNNNNNNNNNNNNNNNNNN ELSE EXECUTE CHAR ROM ; ADD A,2 PUSH HL LD L,A LD H,CHR_RNUM EX (SP),HL CALL XROMF INC SP INC SP RET ׫NNNNNNNNNNNNNNNNN))[NNNNNNNNNNNNNNNNNNNNN! ; ENTRY- D= DRIVER FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DSK: ;qyNNNNNNNNNNNNNNNN)/ NNNNNNNNNNNNNNNNNNNNNNFUNCTION #7 ; EXIT - A= BANK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETCBNK: LyNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!NATION BANK OUT (BNKREG),A EX AF,AF' LD (DE),A ; INC HL ;NEXT BYTE INC DE ; EXX ;CHECK FOR DONE DEC BC LD A=NNNNNNNNNNNNNNNN) XHNNNNNNNNNNNNNNNNNNNNNN; POP BC EI RET ;**************************************************************************** ; ; STORE DATA INTO B0S$NNNNNNNNNNNNNNNN)x4NNNNNNNNNNNNNNNNNNNNNNY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: ;ROM SWAP ENTRY NNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN############################################################ ; FUNTABL: DW RETVERS ;0: RETURN MONITOR ROM VERSION DW GETMOBNNNNNNNNNNNNNNNN)=YNNNNNNNNNNNNNNNNNNNNN!UB A,16 ; ; IF FUN# < START THEN INTERNAL FUNCTION RESERVED ERR ; JR C,MFUNERR ; ; ELSE IF FUN# > LAST THEN GO CHECK INNNNNNNNNNNNNNNN)$NNNNNNNNNNNNNNNNNNNNNN;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK DRIVER FUNCTIONS ; ;+++++++++++++++++NNNNNNNNNNNNNNNN)*NNNNNNNNNNNNNNNNNNNNNN ; BIAS DOWN TO MISC. FUNCTIONS ; SUB A,16 ; ; SET ROM # ; ADD A,2 ;ADD OFFSET ; PUSH HL ;SAVE ARG LD H,CLK_ØNNNNNNNNNNNNNNNN)0NNNNNNNNNNNNNNNNNNNNNND A,(CURBNK) CP A,A ;RETURN ZF RET SUBTTL INITIALIZATION CODE ;-----------------------------------------------------NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁹V$񅿆Z(Š],ǎc1Βi6іm:՚r? ٞuBޢxFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN)$NNNNNNNNNNNNNNNNNNNNN!----------------------- ; ; THIS IS THE COLD START INIT CODE ; ;------------------------------------------------------------dNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN HAS DEFAULT BANK # LD (CURBNK),A ; ; INIT ALL BANKS ; LD E,A ;START WITH ALL Z80 BANKS LD HL,THIS_BNK ;POINT TO LOCVaNNNNNNNNNNNNNNNN) \INNNNNNNNNNNNNNNNNNNNNNMISC PUSH HL CALL XROMF POP HL ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; EXECUT=NNNNNNNNNNNNNNNNN)|5NNNNNNNNNNNNNNNNNNNNNNLD HL,(LLOC) ;SET HL ; ; DO AT LAST MINUTE TO MINIMIZE REFRESH REGISTER CHANGE ; LD R,A ;SET R POP AF ;SET AF ; ; XNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN8080 REGS FIRST SO WE CAN WORK ; PUSH AF LD A,R ;DO REFRESH REGISTER AS SOON AS POSSIBLE LD (LLOC),HL POP HL LD (FLONNNNNNNNNNNNNNNNN)9XNNNNNNNNNNNNNNNNNNNNN!-------------------------------------------------- ; RSTER: PUSH AF PUSH HL LD HL,RSTMSG CALL PRTS POP HL POP AF J>aNNNNNNNNNNNNNNNN)%NNNNNNNNNNNNNNNNNNNNNNO ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN SYSTEM CONSOLE OUTPUT STATUS FUNCTjENNNNNNNNNNNNNNNNN)+ NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CIS: XCROM MF_CIS ; ; DONE ; RET ;+++++++++++++++!NNNNNNNNNNNNNNNN)LwNNNNNNNNNNNNNNNNNNNNNN---------------- ; ROM_INIT: ;XROM ENTRY INIT: ;EXTERNAL ENTRY ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGDNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNATION TO STORE BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMEM ; INC E ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEƥNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNNE THE DEBUGGER ; MAINLP: LD SP,MONSTK LD HL,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL CALL XROMF POP HL JR MAyNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN RESERVE SPACE FOR A EI INSTRUCTION TO BE PATCHED IN ; DB 0 ;'NOP' OR PLACE FOR 'EI' ; ; RETURN TO EXECUTION ADDRESS ON NNNNNNNNNNNNNNNN)ƭNNNNNNNNNNNNNNNNNNNNNNC),HL ; LD L,A ;REFRESH REGISTER LD A,I LD H,A LD (RLOC),HL ; LD (ELOC),DE LD (CLOC),BC ; ; FETCH RETURN ADDR2xNNNNNNNNNNNNNNNNN) ,NNNNNNNNNNNNNNNNNNNNN!P REST ;**************************************************************************** ; ; PRTS ROUTINE OUTPUTS AN ASCII STq3aNNNNNNNNNNNNNNNN)&UNNNNNNNNNNNNNNNNNNNNNNION ; EXIT - A= 0: BUSY, FFH: READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; COS: (NNNNNNNNNNNNNNNNNN),iNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NEXT SYSTEM CONSOLE INPUT CHAR FUNCTION ; EXIT - A= NNNNNNNNNNNNNNNN)FNNNNNNNNNNNNNNNNNNNNNNE 0 IMAGE ; OUT (M2_CLDRES),A ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DD_FREE ;REMOVE DD WINDOW, IF PRESENT OUT (DzNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNNN REPEAT CP A,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; LD A,IOBYTV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; NNNNNNNNNNNNNNNNN):+NNNNNNNNNNNNNNNNNNNNNNINLP SUBTTL DEBUGGER SUPPORT ROUTINES ;**************************************************************************** ; ; GNNNNNNNNNNNNNNNNN)֓NNNNNNNNNNNNNNNNNNNNNNSTACK ; RET ;**************************************************************************** ; ; REST ROUTINE TRAPS ALL O> ; ;-------------------------------------------------------------------------hNNNNNNNNNNNNNNNNNN*YpNNNNNNNNNNNNNNNNNNNNNN INPUT POP DE ;NEW VALUE POP HL ;PTR ; PUSH BC LD C,E LD DE,(A1_BNK) CALL PUTMEM ;LOAD VALUE ; POP BC ; ; /]BNNNNNNNNNNNNNNNN*!.NNNNNNNNNNNNNNNNNNNNNN_ADDR> ; ;---------------------------------------------------------------------------- ; MTEST: ; ; GET ARGS ڶNNNNNNNNNNNNNNNNN*'NNNNNNNNNNNNNNNNNNNNNNNE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODNNNNNNNNNNNNNNNNN*-CNNNNNNNNNNNNNNNNNNNNNN ;SET IT ON TEST VALUE JR XAC ; XAB: AND A,7FH ;RESET BIT 7 ; ; USER REQUESTED REGISTER SHOULD MATCH NOW ; XAC: ; ;bNNNNNNNNNNNNNNNNN*J=NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN* i2NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN*/,NNNNNNNNNNNNNNNNNNNNNN--- ; SUBS: ; ; GET ADDRESS FROM USER ; CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL ; ; TOP OF L^NNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN IF LAST CHAR == CR THEN DONE ; LD A,C ;IF DELIM = CR THEN DONE CP A,CR JP Z,WINIT ; ; NEXT LOCATION ; SUB2: INC H؎dNNNNNNNNNNNNNNNNN*"}NNNNNNNNNNNNNNNNNNNNN!FROM USER ; CALL EXLF ;HL= START, DE= LAST ; ; TOP OF LOOP ; MTEST1: PUSH DE LD DE,(A1_BNK) CALL GETMEM ;FETCH NNNNNNNNNNNNNNNNN*( NNNNNNNNNNNNNNNNNNNNNNIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R NNNNNNNNNNNNNNNN*.NNNNNNNNNNNNNNNNNNNNNN IF CHAR NOT MATCH THEN EXIT ; CP A,(HL) JR NZ,XAA ;NO MATCH, TRY AGAIN ; ; CHARS MATCH, SET UP TO DISPLAY CURRENT DNNNNNNNNNNNNNNNNN*y NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN* ZNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!C,MOV1 ; ; ELSE DONE ; JP WINIT ;---------------------------------------------------------------------------- ; ; z'NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNOOP ; SUB1: ; ; DISPLAY EXISTING CONTENTS ; LD DE,(A1_BNK) CALL GETMEM CALL DASH1 ; ; GET NEW VALUE FROM USER BNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNL ;PTR = PTR + 2 INC HL ; ; PREVIOUS LOCATION ; SUB3: DEC HL ;PTR = PTR - 1 ; ; IF ON MODULO 8 BOUNDARY, START ON BNNNNNNNNNNNNNNNNN*#LNNNNNNNNNNNNNNNNNNNNNNDATA PUSH AF ;SAVE IT CPL ;INVERT BITS LD C,A CALL PUTMEM ; ; TEST BY XORING WITH DATA, RESULT SHOULD BE 0 ; CNNNNNNNNNNNNNNNN*):NNNNNNNNNNNNNNNNNNNNNN ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;----------------------------------------------------------------------NNNNNNNNNNNNNNNNN*/!NNNNNNNNNNNNNNNNNNNNNNATA ; CALL BLK CALL PRTVAL CALL DASH ; ; GET USER DATA ; CALL PCHK ; ; IF USER ENTERED CR THEN DONE ; RET CYNNNNNNNNNNNNNNNNN*,_NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN* ÔNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNSUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED yGNNNNNNNNNNNNNNNN* #NNNNNNNNNNNNNNNNNNNNNN; CALL PCHK ;GET NEW VALUE ; ; IF NONE THEN RETURN ; JP C,WINIT ;IF CHAR = CR THEN RETURN ; ; IF LAST CHAR == SPANNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNNEW LINE & DISPLAY ADDRESS ; LD A,L AND A,7 CALL Z,LADRB ; ; CONTINUE ; JR SUB1 ;----------------------------UNNNNNNNNNNNNNNNNN*$LNNNNNNNNNNNNNNNNNNNNN!ALL GETMEM XOR A,C ; ; IF NOT 0 THEN DISPLAY DATA ('1' BIT IS ERROR) ; CALL NZ,BITS ;LOG ERR IF NOT ; ; RESTORE DA<NNNNNNNNNNNNNNNNN**oNNNNNNNNNNNNNNNNNNNNN!------ ; ; CHARS NOT MATCH, TRY NEXT TABLE ENTRY ; XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL ; ; ; CONTINUATIOBjNNNNNNNNNNNNNNNNN*0lNNNNNNNNNNNNNNNNNNNNNN ; ; IF NO CHANGE THEN EXIT ; JR Z,XF ; ; GET NEW DATA FROM USER ; PUSH HL ;PTR CALL EXF POP HL ;HL= DATA ;kNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN끹T"񅿆Z(Ê_.ʎe4Вl:֖r@ܚxF➰M颷S!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN ; PREFETCH DATA IN A ; LD A,L ; ; IF BYTE REGISTER THEN GO DO BYTE STORE ; EX (SP),HL ;HL= ATTRIBUTE PTR BIT 7,BrNNNNNNNNNNNNNNNN*(^NNNNNNNNNNNNNNNNNNNNN!F TABLE ; XE: POP HL ; ; IF LAST CHAR == CR THEN DONE ; XF: LD A,C ;IF LAST = CR THEN RETURN CP A,CR RET Z ; ;---'gNNNNNNNNNNNNNNNNN* ǕNNNNNNNNNNNNNNNNNNNNN!XA LD HL,PRMTB JR XMNE1 ; ; ; DISPLAY ALL REGISTER'S DATA ; XG: LD A,(HL) ;FETCH TABLE ENTRY LD C,A ; ; IF A]NNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN------------ ; DKREAD: ; ; SET COMMAND ; LD A,PB_READC LD (IOPB + PB_CMDO),A ; ; SET NO DOWNLOAD ; LD HL,0 ;XNNNNNNNNNNNNNNNN*"NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------------- ; ; LOGON DISK SECTOR COMMAND ;RB:A D:T S ; WHERE: B= ID{rNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNK) LD (IOPB + PB_DRVO),A ; ; EXECUTE ; LD HL,IOPB LD DE,(CURBNK) XKROM MF_XIOB ; ; IF ERROR THEN DISPLAY IT ; NNNNNNNNNNNNNNNNN*%HNNNNNNNNNNNNNNNNNNNNNN CALL BLK ; ; FETCH CALENDAR DATA ; XVROM MF_GCAL PUSH HL PUSH BC PUSH AF ; ; DISPLAY CALENDAR DATA ; LD C,%^NNNNNNNNNNNNNNNNN*+kNNNNNNNNNNNNNNNNNNNNNNS ; CALL EXPR3 ; ; TEST VALIDITY ; LD A,(A1_BNK) ;HRS CP A,24 JR NC,SCABRT ; LD A,L ;MINS CP A,60 JR NC,SC$NNNNNNNNNNNNNNNN*׫NNNNNNNNNNNNNNNNNNNNN!(HL) JR Z,XBREG ; ; ELSE IF WORD REGISTER THEN GO DO WORD STORE ; BIT 6,(HL) JR Z,XWREG ; ; ELSE DO INDIRECT BYTEnrNNNNNNNNNNNNNNNNN*8`NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------------------- ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; ;----}NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNT END OF TABLE THEN DONE ; INC A ;IF AT END OF TABLE THEN RETURN RET Z ; ; IF BIT 7 SET THEN DISPLAY NEW LINE ; CAL NNNNNNNNNNNNNNNN*~~NNNNNNNNNNNNNNNNNNNNNNFER COUNT = 0 ; LD A,L ;ENABLE READ XFER ; ; GO TO COMMON CODE ; JR DODISK ;------------------------------------)NNNNNNNNNNNNNNNNN*]qNNNNNNNNNNNNNNNNNNNNNN SECTOR DATA LOAD ADDRESS BANK ; A= ID SECTOR DATA LOAD ADDRESS ; D= DRIVE # ; T= TRACK # {0..N-1} ; S= SECTOR # {1..N} NNNNNNNNNNNNNNNNN* /NNNNNNNNNNNNNNNNNNNNN! INC A JP Z,QPRT ; LD A,(IOPB + PB_STATO) OR A,A RET Z ; LD HL,IOPB LD DE,(CURBNK) XKROM MF_DIOB ; ; DONE ; 9NNNNNNNNNNNNNNNNNN*&NNNNNNNNNNNNNNNNNNNNNNB ;MONTH CALL PUTHXB CALL DASH ; POP AF ;DAY LD C,A CALL PUTHXB CALL DASH ; POP BC ;YEAR CALL PUTHXB ; CFANNNNNNNNNNNNNNNNN*,BNNNNNNNNNNNNNNNNNNNNNNABRT ; LD A,(A2_BNK) ;MONTH DEC A CP A,12 JR NC,SCABRT ; LD A,E ;DATE DEC A CP A,31 JR NC,SCABRT ; LD A,(AN NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN STORE ; EX (SP),HL ;HL= DATA EX DE,HL ;HL= PTR LD DE,(BNKLOC) ;E= PC BANK PUSH BC ;SAVE LAST CHAR LD C,A CALL PzNNNNNNNNNNNNNNNN* QNNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------------------ ; XMNE: ; ; START AT BEGINNING OF TABLE ; LD HrNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNL M,CRLF ;NEW LINE IF BIT 7 SET ; ; DISPLAY REGISTER ; LD C,(HL) PUSH HL CALL CO CALL DASH ; ; DISPLAY REGISTENNNNNNNNNNNNNNNNN*MONNNNNNNNNNNNNNNNNNNNNN---------------------------------------- ; ; WRITE DISK SECTOR COMMAND ;WB:A D:T S ; WHERE: B= XFER ADDRESS BANK ; A= XFERNNNNNNNNNNNNNNNNNN*n@NNNNNNNNNNNNNNNNNNNNNN ; ;---------------------------------------------------------------------------- ; DKLOG: ; ; SET COMMAND ; LD A,PB_LOg6NNNNNNNNNNNNNNNNN*!NNNNNNNNNNNNNNNNNNNNNN RET ;---------------------------------------------------------------------------- ; ; DISPLAY CLOCK DATA COMMAND ;K ; gNNNNNNNNNNNNNNNNN*'.NNNNNNNNNNNNNNNNNNNNN!ALL BLK CALL BLK POP BC ;DAY-OF-WEEK {0 (SUN)..6} CALL PUTHXB ; ; DONE ; RET ;-------------------------------NNNNNNNNNNNNNNNNN*-sNNNNNNNNNNNNNNNNNNNNNN3_BNK) ;YEAR CP A,100 JR NC,SCABRT ; LD A,C ;DAY OF WEEK CP A,7 JR C,SCLK1 ; ; ILLEGAL ENTRY ; SCABRT: JP QPNNNNNNNNNNNNNNNNN*} NNNNNNNNNNNNNNNNNNNNNNUTMEM POP BC JR XE ; ; ; WORD REGISTER WRITE ; XWREG: EX (SP),HL ;HL= DATA EX DE,HL ;DE= DATA, HL= PTR INC HL NNNNNNNNNNNNNNNNNN* ^NNNNNNNNNNNNNNNNNNNNNNL,ACTBL ;ADDR OF REG LOOK-UP TABLE ; ; IF NO ARGS THEN DISPLAY ALL REGS ; XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SmNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!R VALUE ; POP HL CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ;-----------------------------------------------ū NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN ADDRESS ; D= DRIVE # ; T= TRACK # {0..N-1} ; S= SECTOR # {1..N} ; ;----------------------------------------------------NNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!GC LD (IOPB + PB_CMDO),A ; ; SET NO DOWNLOAD ; LD HL,0 ;XFER COUNT = 0 ; LD A,L ;ENABLE READ XFER ; ; GO TO COHNNNNNNNNNNNNNNNN*"MNNNNNNNNNNNNNNNNNNNNNN ;---------------------------------------------------------------------------- ; DCLKC: ; ; START ON NEW LINE ; CALL CTdNNNNNNNNNNNNNNNNN*(>NNNNNNNNNNNNNNNNNNNNNN--------------------------------------------- ; ; SET CLOCK/CALENDAR COMMAND ;UH:M MM:D Y:DOW ; ; WHERE: H= HOURS (24 HR FOYNNNNNNNNNNNNNNNNN*. NNNNNNNNNNNNNNNNNNNNNNRT ; SCLK1: ; ; SAVE CALENDAR DATA ; PUSH BC PUSH DE ; ; SET TIME ; LD DE,(A1_BNK) ;E=HRS LD D,L ;D=MINS NNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNNALL ECHO ;GET NEXT # ; ; CONVERT CHAR TO BINARY ; EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE ; ; IF NOT NUMBER TmNNNNNNNNNNNNNNNN+YNNNNNNNNNNNNNNNNNNNNNN NEXT ARGUMENT ; LD A,C CALL P2C JR NC,EX3 ; ; ELSE IF COUNT NOT EXHUSTED THEN ERROR ; DJNZ EX2B ; ; ELSE RETUuNNNNNNNNNNNNNNNNN+SNNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; BITS PROCEDURE DISPLAYS ADDRESS AND DATA AVrNNNNNNNNNNNNNNNN+"NNNNNNNNNNNNNNNNNNNNNN; ; BIT COUNT = 8 ; LD B,8 ;BIT COUNT ; ; TOP OF OUTPUT LOOP ; BITS1: PUSH BC ; LD A,E ;USE MS BIT RLCA LD \SNNNNNNNNNNNNNNNN+(NNNNNNNNNNNNNNNNNNNNNNGISTER CHAR LD A,(HL) ;GET OFFSET & ATTRIBUTES ; AND A,3FH ;ISOLATE OFFSET LD DE,RLOC ADD A,E ;BUILD ADDR OF REG CON`'NNNNNNNNNNNNNNNNN+.դNNNNNNNNNNNNNNNNNNNNNN PV2 ;ALLWAYS JUMP ; ; ; FETCH DATA ; PV1: LD A,(DE) ;GET REG CONTENTS ; ; DISPLAY DATA ; PV2: CALL HEX1 ;OUTPUTONNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN************************************* ; ; EXPR3 ROUTINE GETS 3 ARGUMENTS FROM USER, DOES A CR-LF & THEN ; LOADS BC, DE & HL NNNNNNNNNNNNNNNN+ ,NNNNNNNNNNNNNNNNNNNNN!LY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A INNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNHEN EXIT LOOP ; JR C,EX2 ; ; ELSE ADD TO ARGUMENT ; ADD HL,HL ;ARG *= 16 ADD HL,HL ADD HL,HL ADD HL,HL OR A,LNNNNNNNNNNNNNNNNN+jNNNNNNNNNNNNNNNNNNNNN!RN ; RET ; ; ; RELATIVE JUMP EXTENSION ; EX2B: JP QPRT ;**********************************************************NNNNNNNNNNNNNNNNN+bNNNNNNNNNNNNNNNNNNNNN!S BINARY BITS ; ENTRY- HL= ADDRESS ; A= BINARY DATA ; EXIT - A= ? ; ;*****************************************************>;NNNNNNNNNNNNNNNN+#NNNNNNNNNNNNNNNNNNNNNNE,A ; ; CONVERT TO ASCII ; LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA ; ; DISPLAY ASCII DATA ; LD C,A PUSH DE CALLP&yNNNNNNNNNNNNNNNN+)L3NNNNNNNNNNNNNNNNNNNNNNTENTS LD E,A LD A,0 ADC A,D LD D,A ; ; IF BIT 7 == 0 THEN SINGLE REGISTER (BYTE) VALUE ; LD A,(HL) ;NOW FIND ATTNNNNNNNNNNNNNNNNN+/NNNNNNNNNNNNNNNNNNNNNN VALUE ; ; NOW DO LOW BYTE IF NEEDED ; DEC DE ;MEM PTR ; ; IF --BYTE_COUNT > 0 THEN REPEAT FOR LOW BYTE ; DJNZ PV\NNNNNNNNNNNNNNNN+ZNNNNNNNNNNNNNNNNNNNNN!WITH THE PARAMS. ; ENTRY- B= 2 ; EXIT - HL= ARG1 ; DE= ARG2 ; BC= ARG3 ; ;**********************************************YNNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNNNWARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;*************************************NNNNNNNNNNNNNNNNN+\NNNNNNNNNNNNNNNNNNNNNN ;ADD IN NEW DIGIT LD L,A ; ; GET NEXT DIGIT ; JR EX0 ;GET NEXT ; ; ; NOT HEX NUMBER ENTERED, IF COLON THEN SAVEYNNNNNNNNNNNNNNNNN+zNNNNNNNNNNNNNNNNNNNNNN******************* ; ; OUTPUT 3 SPACES EACH COLUMN TO POSITION ON COLUMN PROCEDURE ; ENTRY- A= NUMBER OF COLUMNS - 1 {0..15}NNNNNNNNNNNNNNNNNN+1NNNNNNNNNNNNNNNNNNNNNN*********************** ; BITS ; ; SAVE REG ; PUSH DE ; ; SAVE DATA ; PUSH AF ; ; DISPLAY ADDRESS ; CALL gNNNNNNNNNNNNNNNN+$:oNNNNNNNNNNNNNNNNNNNNN! CO POP DE ; ; IF NOT DONE THEN REPEAT ; POP BC DJNZ BITS1 ; ; DONE ; RET ;******************************mNNNNNNNNNNNNNNNNN+*`NNNNNNNNNNNNNNNNNNNNNNRIBUTES LD B,1 ;ASSUME BYTE VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT ; ; ELSE WORD VALUE ; INC B ; ; IF 0NNNNNNNNNNNNNNNNNN+0NNNNNNNNNNNNNNNNNNNNNN1 ; ; ELSE DONE ; RET ;**************************************************************************** ; ; ECHO ROUTI%NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁻W$\+NJc1Ύj8Ӓn< ؖsAݚyF➯|J䢲MNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+LNNNNNNNNNNNNNNNNNNNNNNNE READS A BYTE FROM CONSOLE DEVICE & ECHOS THE CHAR BACK ; TO THE CONSOLE DEVICE. ; EXIT - A= CHAR ; ;*********************=NNNNNNNNNNNNNNNNN+^NNNNNNNNNNNNNNNNNNNNNNDE= LAST LOCATION ; EXIT - HL = HL + 1 ; CF = HL == 0 OR HL > DE ; A = ? ; ;+++++++++++++++++++++++++++++++++++++++++++++Q HNNNNNNNNNNNNNNNNN+ !NNNNNNNNNNNNNNNNNNNNNNNTRY- HL = PTR ; DE = LAST PTR ; EXIT - HL = HL + 1 ; BC = BC + 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; A=eNNNNNNNNNNNNNNNNN+]NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HILOX: ; ; BUMP & TEST HL ; CALL HILO RET C ;DGNNNNNNNNNNNNNNNNN+~NNNNNNNNNNNNNNNNNNNNNNALUE OF 'CHAR' ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NIBBLE: ; ; IF CHAR < 0dBNNNNNNNNNNNNNNNN+0NNNNNNNNNNNNNNNNNNNNNNCTER IS A CR, THE CARRY FLAG IS SET. A BLANK OR A ; COMMA RESETS THE CARRY FLAG. ; EXIT - A= CHAR ; NC, ZF= DELIMITER (' ' O85NNNNNNNNNNNNNNNN+%>nNNNNNNNNNNNNNNNNNNNNNNAPS ALL OF THE REGISTER CONTENTS WHENEVER A BREAKPOINT ; RESTART INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THNNNNNNNNNNNNNNNNN++aNNNNNNNNNNNNNNNNNNNNNNOINTS MATCH, ASSUME NOT SET ; INC BC ;BACK UP PTR TO RETURN ADDRESS ; RS5: ; ; DISPLAY BREAKPOINT INDICATOR ; PUSH ~NNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN******************************************************* ; ; 1ST ENTRY DISPLAYS A '-' FIRST ; DECHO: CALL DASH ;OUTPUT AiWNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++ ; HILO: ; ; BUMP HL ; INC HL ; ; IF HL == 0 THEN RETURN CF ; LD A,H ;IF HL = 0 NNNNNNNNNNNNNNNNN+rNNNNNNNNNNNNNNNNNNNNNN ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HILOXB: ; ; BUMP BC 1ST ; INC BC NNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNONE IF CF ; ; NOT DONE, CHECK FOR CONSOLE ABORT ; CALL CIS ;IF NO CONSOLE BREAK THEN OR A,A ; RETURN RET Z ; ; _NNNNNNNNNNNNNNNNN++NNNNNNNNNNNNNNNNNNNNNN THEN RETURN ERROR ; SUB A,'0' RET C ; ; IF CHAR > F THEN RETURN ERROR ; CP A,'G' - '0' CCF RET C ; ; IF CHA'NNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNNNR ',') ; CF, ZF= CR ; NC. NZ= ANY OTHER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;ImNNNNNNNNNNNNNNNNN+&k=NNNNNNNNNNNNNNNNNNNNNNE ; MONITOR VARIABLE AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE ; REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISATrNNNNNNNNNNNNNNNNN+,NNNNNNNNNNNNNNNNNNNNNNBC LD C,'*' ;OUTPUT BREAK INDICATION CALL CO ; ; STORE PC ; POP DE LD (PLOC),DE LD A,(CURBNK) LD (BNKLOC),A ;u NNNNNNNNNNNNNNNN+.NNNNNNNNNNNNNNNNNNNNNN '-' ; ; GET CHAR FROM USER ; ECHO: CALL CONI ; ; ECHO TO USER ; PUSH BC LD C,A ;OUTPUT CHAR CALL CO LD A,C ONNNNNNNNNNNNNNNNN+ }NNNNNNNNNNNNNNNNNNNNNNTHEN RETURN CF OR A,L SCF RET Z ; ; ELSE CP DE,HL ; LD A,E ;ELSE COMPARE HL TO DE SUB A,L LD A,D SBC A,H ; NNNNNNNNNNNNNNNNN+CNNNNNNNNNNNNNNNNNNNNNN ; ; FALL INTO HILOX ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILO FUNCTINNNNNNNNNNNNNNNNN+;NNNNNNNNNNNNNNNNNNNNNN IF CHAR != CONTROL-S THEN BREAK ; CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP A,CTRLS SCF RET NZ ; ; ELSE PAUSE ;HgNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNR <= 9 THEN RETURN OK ; CP A,'9' - '0' + 1 CCF RET NC ; ; ELSE IF CHAR < A THEN RETURN ERROR ; SUB A,'A' - '9' - 1aNNNNNNNNNNNNNNNN+!NNNNNNNNNNNNNNNNNNNNNN PCHK: ; ; GET CHAR FROM USER ; CALL ECHO P2C: ; ; IF CHAR == SPACE THEN RETURN NC,ZF ; CP A,' ' ;IF CHAR = 'eNNNNNNNNNNNNNNNNN+'X NNNNNNNNNNNNNNNNNNNNNNBLER SOFTWARE AT START OF REST. ; ;**************************************************************************** ; REST: ; i6NNNNNNNNNNNNNNNNN+-NNNNNNNNNNNNNNNNNNNNNN ; DISPLAY BREAK ADDRESS ; EX DE,HL ;HL= ADDR LD E,A ;E= BANK CALL LADR ; ; CLEAR BREAKPOINTS ; LD HL,TLOC qBNNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNNN ;RESTORE CHAR IN A POP BC ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++DNNNNNNNNNNNNNNNNN+ (NNNNNNNNNNNNNNNNNNNNNN ; RETURN RESULTS ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILOXB ROUzXdNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNON INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN1INNNNNNNNNNNNNNNNN+nNNNNNNNNNNNNNNNNNNNNN! CALL CONI ;ELSE WAIT FOR NEXT CHAR ; ; RETURN CONTINUE ; OR A,A RET ;+++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN+cNNNNNNNNNNNNNNNNNNNNNN CP 10 ; ; ELSE RETURN CHAR - 7 ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++dNNNNNNNNNNNNNNNNN+"NNNNNNNNNNNNNNNNNNNNNN ' THEN RETURN RET Z ; ; IF CHAR == COMMA THEN RETURN NC, ZF ; CP A,',' RET Z ; ; IF CHAR == RETURN THEN RETURN C NNNNNNNNNNNNNNNNN+(H2NNNNNNNNNNNNNNNNNNNNNN; SET UP TO RESTORE BREAKPOINT(S) ; LD HL,TLOC ;SET TABLE PTR LD D,NBKPTS ; RS2: LD A,C SUB A,(HL) ;SEE IF SOFTWARENNNNNNNNNNNNNNNN+.NNNNNNNNNNNNNNNNNNNNNNLD B,NBKPTS ; ; TOP OF RESTORATION LOOP ; RS7: LD E,(HL) ;FETCH BREAKPOINT ADDRESS LD (HL),0 ;CLEAR BREAKPOINT INC HNNNNNNNNNNNNNNNNN+8NNNNNNNNNNNNNNNNNNNNNN+++++ ; ; HILO FUNCTION INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIINNNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNNNTINE BUMPS BC & HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETU xNNNNNNNNNNNNNNNNN+?NNNNNNNNNNNNNNNNNNNNNN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ; ACCORDINGLY. IT ALSO CHECKS FOR A KEYBOARD ABORT. ; ENNNNNNNNNNNNNNNNNN+]NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++ ; ; NIBBLE FUNCTION CONVERTS THE ASCII CHARACTERS 0-9 & A-F TO THEIR ; EQUIVALENT HEX VAL:aNNNNNNNNNNNNNNNN+RNNNNNNNNNNNNNNNNNNNNN!+ ; ; PCHK FUNCTION READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; SPECIAL CHARACTER. IF IT IS NOT A SPECIAL CHARNNNNNNNNNNNNNNNNNN+#NNNNNNNNNNNNNNNNNNNNNNF, ZF ; CP A,CR SCF RET Z ; ; ELSE RETURN NC,NZ ; CCF ;ELSE RETURN NC RET ;******************************NNNNNNNNNNNNNNNN+){NNNNNNNNNNNNNNNNNNNNN! TRAP INC HL LD A,B SBC A,(HL) ;MAYBE, TRY REST OF ADDR INC HL LD A,(CURBNK) SBC A,(HL) JR Z,RS5 ;FOUND 1, RESETNNNNNNNNNNNNNNNN+/ѥNNNNNNNNNNNNNNNNNNNNNNL LD D,(HL) LD (HL),0 INC HL LD C,(HL) LD (HL),0 INC HL ;SET PTR TO DATA ; ; IF BREAKPOINT ALREADY CLEARED THENHNNNNNNNNNNNNNNNN+mNNNNNNNNNNNNNNNNNNNNNNT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ENTRY- HL= PTR ; aNNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNN!RN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ; ACCORDINGLY. IT ALSO TESTS FOR A KEYBOARD ABORT. ; EINNNNNNNNNNNNNNNN+lNNNNNNNNNNNNNNNNNNNNNNTRY- HL = PTR ; DE = LAST PTR ; EXIT - HL = HL + 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; A= ? ; ;+++++++++NNNNNNNNNNNNNNNN+MNNNNNNNNNNNNNNNNNNNNNNUE. IF THE CHARACTER IS NOT IN RANGE, THE CARRY BIT IS ; SET TO FLAG THE ERR. ; ENTRY- A= ASCII-HEX CHAR ; EXIT - A= BINARY VI9NNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNACTER, A NON-ZERO CONDITION ; IS RETURNED. IF IT IS A SPECIAL CHARACTER, A ZERO CONDITION IS RETURNED. ; FURTHER, IF THE CHARANNNNNNNNNNNNNNNN+$ _NNNNNNNNNNNNNNNNNNNNNN********************************************** ; ; CONTINUATION OF BREAKPOINT CODE STARTED IN RESIDENT ROM. ; REST ROUTINE TRNNNNNNNNNNNNNNNN+*.PNNNNNNNNNNNNNNNNNNNNNN IT ; ; NOT FOUND, SKIP TO NEXT RECORD ; INC HL ;SKIP BANK INC HL ;SKIP DATA ; DEC D JR NZ,RS2 ; ; NO BREAKPNNNNNNNNNNNNNNNN+0NNNNNNNNNNNNNNNNNNNNNN SKIP RESTORE ; LD A,E ;IF LOC = 0:0 THEN SKIP RESTORE OR A,D OR A,C JR Z,RS8 ; ; ELSE RESTORE ORIGINAL DATA ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!Y'Æ_,Ȋc0͎i7Ԓp= ٖuC}K瞵Q좻W$NNNNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,QNNNNNNNNNNNNNNNNNNNNN!LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. PUSH HL EX DE,HL ;HL= MEMPTR LD E,C ;E= BANK LD C,A ;C= DATA CALL PUTMEM NNNNNNNNNNNNNNNNN,8NNNNNNNNNNNNNNNNNNNNN! ; IF UPPER CASE THEN RETURN ; CP A,'a' RET C ; ; ELSE IF LOWER CASE THEN ; CP A,'z' + 1 RET NC ; ; CONVERTNNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNN************************************** ; ; CONSOLE INPUT ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;*******************************.mNNNNNNNNNNNNNNNNN,-NNNNNNNNNNNNNNNNNNNNNN*************************************** ; PUTMEM: XRROM MF_PMEM ; ; DONE ; RET SUBTTL MESSAGES CRMSG: DM CR,LForNNNNNNNNNNNNNNNNN,mNNNNNNNNNNNNNNNNNNNNNN ; JP WINIT ;RETURN TO MONITOR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONI AmNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNNNNG. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; ; 1ST ENTRY SNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN******************************* ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;*********?NNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNHL CALL CRLF POP HL POP DE ; ; ENTRY TO CONTINUE AT CURRENT CURSOR LOCATION ; LADR EQU PUTHXA JP PUTHXA ;****xNNNNNNNNNNNNNNNNN,~NNNNNNNNNNNNNNNNNNNNNNS ONLY THE DASH ; DASH: LD C,'-' JR CO ;**************************************************************************** ;NNNNNNNNNNNNNNNN,"NNNNNNNNNNNNNNNNNNNNN!********************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR ; ;*************************************HNNNNNNNNNNNNNNNNN,(./NNNNNNNNNNNNNNNNNNNNNN********************************************* ; CI: XCROM MF_CI ; ; DONE ; RET ;++++++++++++++++++++++++++++++++N'NNNNNNNNNNNNNNNNN,.NNNNNNNNNNNNNNNNNNNNNN BOOTEM: DM 'BOOT LOAD ERR',CR,LF QMSG: DM LF,'^??' SUBTTL DATA CONSTANTS ;##############################################@NNNNNNNNNNNNNNNNNN,^NNNNNNNNNNNNNNNNNNNNNNROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; EXIT - A= CHAR AND 7FH ; ;++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN, }NNNNNNNNNNNNNNNNNNNNNNTARTS ON A NEW LINE ; PRTWD: CALL CRLF ; ; THIS ENTRY STARTS WHEREVER THE CURSOR IS ; PRTWA: EQU PRTS ;++++++++++++ NNNNNNNNNNNNNNNNN,"NNNNNNNNNNNNNNNNNNNNNN******************************************************************* ; CRLF: ; ; SAVE REG ; PUSH HL ; ; DISPLAY CRLFe]NNNNNNNNNNNNNNNNN,;NNNNNNNNNNNNNNNNNNNNNN************************************************************************ ; ; DISPLAY HEX BYTE ON SYSTEM CONSOLE PROCEDURE ; EDzNNNNNNNNNNNNNNNN,ONNNNNNNNNNNNNNNNNNNNNN ; PRINT ADDR PROCEDURE DISPLAYS A WORD VALUE FOLLOWED BY A SPACE. ; ENTRY- E:HL= WORD VALUE TO DISPLAY ; ;*****************NNNNNNNNNNNNNNNN,#NNNNNNNNNNNNNNNNNNNNNN*************************************** ; CO: ; ; SAVE REGS ; PUSH HL PUSH DE PUSH BC XCROM MF_CO ; ; RESTORE7aNNNNNNNNNNNNNNNNN,)NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION ; ENTRY- HL= OFFSET PTR ; E= BANK # ; NNNNNNNNNNNNNNNNN,/NNNNNNNNNNNNNNNNNNNNNN############################## ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIREDNNNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++ ; CONI: ; ; GET CHAR FROM CONSOLE ; CALL CI ; ; MASK OUT BIT 7 ; AND A,7FH ;#rNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXLF FUNCTION READS 2 ARGUMENTS FROM THE SYSTEM CONSOLE ANNNNNNNNNNNNNNNNN,qNNNNNNNNNNNNNNNNNNNNNN MESSAGE ; CRLFA: LD HL,CRMSG CALL PRTS ; ; RESTORE REG & RETURN ; POP HL RET ;*******************************+NNNNNNNNNNNNNNNNN,+NNNNNNNNNNNNNNNNNNNNNNNTRY- A= BYTE TO DISPLAY ; ;**************************************************************************** ; HEX1: PUSH BC NNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN!*********************************************************** ; LADRB: ; ; DISPLAY WORD VALUE ; CALL LADRA ; ; FALL I NNNNNNNNNNNNNNNNN,$kBNNNNNNNNNNNNNNNNNNNNNN REGS ; POP BC POP DE POP HL ; ; DONE ; RET ;****************************************************************NNNNNNNNNNNNNNNN,*HMNNNNNNNNNNNNNNNNNNNNNNEXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETMEM: XRROM MF_GMEM ; } NNNNNNNNNNNNNNNN,0NNNNNNNNNNNNNNNNNNNNNN ADDR. ; ;############################################################################ ; TBL: DW QPRT ;A DW BOOTC ;B BOaNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁹V$񅿆[*Ɗb0̎h6Ғn< ؖvDᚯ}K螶R!Z(NNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,aNNNNNNNNNNNNNNNNNNNNNNOT DISK DW QPRT ;C CHECKSUM MEMORY DW DISP ;D DISPLAY MEMORY DW QPRT ;E DW FILL ;F FILL MEMORY DW GOTO ;G GOTO PGNNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNTABLE ; ;---------------------------------------------------------------------------- ; ACTBL: DB 80H + 'A',ALOC - RLOC DB(kNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNN! ; DB 80H + 'K',BNKLOC - RLOC DB -1 IF ($ AND 7FFFH) < 7800H CONMSG **** Code Too Large ( > FFFFH)! **** ENDIF 'NNNNNNNNNNNNNNNNN,pNNNNNNNNNNNNNNNNNNNNNN************************************************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. ; 1.>NNNNNNNNNNNNNNNNNN,/NNNNNNNNNNNNNNNNNNNNNNh the request thus ; yanking the processor out of it's sleep. ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option and boot NNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN = 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; 3.01 4 JUN 88 GRH \NNNNNNNNNNNNNNNN,%oCNNNNNNNNNNNNNNNNNNNNNNard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 5" ISHA Hard Disk ; 1NNNNNNNNNNNNNNNNN,+LLNNNNNNNNNNNNNNNNNNNNNN SUBTTL DECLARATIONS ;============================================================================ ; ; CONSTANTS ; ;===NNNNNNNNNNNNNNNNN,2NNNNNNNNNNNNNNNNNNNNNNM & SET BREAKPOINTS DW QPRT ;H DW INPT ;I DISPLAY INPUT PORT DATA DW QPRT ;J DW DCLKC ;K CLOCK/CALENDAR DISPLAY DWFNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN 'B',BLOC - RLOC DB 'C',CLOC - RLOC DB 'D',DLOC - RLOC DB 'E',ELOC - RLOC DB 'F',FLOC - RLOC DB 'H',HLOC - RLOC DB 'NPHNNNNNNNNNNNNNNNNN,_NNNNNNNNNNNNNNNNNNNNN! END [NNNNNNNNNNNNNNNNN,YNNNNNNNNNNNNNNNNNNNNNN2 - 18 JUL 82, Move DD to high memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true recalib,rNNNNNNNNNNNNNNNNN,zNNNNNNNNNNNNNNNNNNNNNNcommand source disk option. ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also G^NNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNN ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; 3.02 12 JUN 88 GRH ; Change 'RET'urns KNNNNNNNNNNNNNNNNN,&:NNNNNNNNNNNNNNNNNNNNNN0..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3" Jade floppy ; Change ?xxx syNNNNNNNNNNNNNNNNN,,NNNNNNNNNNNNNNNNNNNNNN========================================================================= FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ~NNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN DKLOG ;L LOGON DISK DW MOVE ;M MOVE MEMORY DW QPRT ;N DW OUPT ;O OUTPUT DATA TO OUTPUT PORT DW QPRT ;P DW QPRT oNNNNNNNNNNNNNNNNNN, ,NNNNNNNNNNNNNNNNNNNNNNL',LLOC - RLOC DB 80H + 'M',[HLOC - RLOC] + 0C0H DB 'P',[PLOC - RLOC + 1 ] + 80H DB 'S',[SLOC - RLOC + 1 ] + 80H DB 'I',pNNNNNNNNNNNNNNNN,nNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN,jNNNNNNNNNNNNNNNNNNNNNNrate ; on boot in case the head is outside track 0. ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; 1.5 - 23 MAR 83 GRNNNNNNNNNNNNNNNNN,INNNNNNNNNNNNNNNNNNNNNNallow boot from 2nd platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD 2 ; 62 C DRIVE 1 HEAD 0 fNNNNNNNNNNNNNNNN,!NNNNNNNNNNNNNNNNNNNNNNin 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; 3.03 25 JUN 88 GRH ; Modify fl]NNNNNNNNNNNNNNNNN,' !NNNNNNNNNNNNNNNNNNNNNNmbols to x_xx symbols. ; First interim version supporting Monitor function calls. All Rom ; functions are supported thru the rNNNNNNNNNNNNNNNNN,-NNNNNNNNNNNNNNNNNNNNNN; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURR(NNNNNNNNNNNNNNNNN,ZNNNNNNNNNNNNNNNNNNNNNN;Q DW DKREAD ;R READ DISK SECTOR DW SUBS ;S SUBSTITUTE MEMORY DW MTEST ;T TEST MEMORY DW SCLKC ;U UPDATE CLOCK/CALEhqNNNNNNNNNNNNNNNNNN, yNNNNNNNNNNNNNNNNNNNNNNILOC - RLOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC - RLOC DB 'B',BPLOC - RLOC DB 'C',CPLOC - RLOC NNNNNNNNNNNNNNNN,#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN,?NNNNNNNNNNNNNNNNNNNNNNH ; Fix bug in recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; 1.6 - 3 NNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNN; 72 D DRIVE 1 HEAD 2 ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement disk I/O driver fu?ONNNNNNNNNNNNNNNNN,"NNNNNNNNNNNNNNNNNNNNNNoppy boot to include new disk format with disk system tracks ; directory like the hard disk has (removed DCM & BLT loader). ^NNNNNNNNNNNNNNNNN,(NNNNNNNNNNNNNNNNNNNNNNRom swap address from the Monitor ; Rom. ; 3.07 11-25-90 GRH ; Modify slightly for ZMON Vers. 1.22. ; ; 3.08 2-20-91 GrNNNNNNNNNNNNNNNNN,.NNNNNNNNNNNNNNNNNNNNNNENT DRIVE & USER BYTE DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE O NNNNNNNNNNNNNNNNNN,iNNNNNNNNNNNNNNNNNNNNNNNDAR DW COMP ;V VERIFY (COMPARE) MEMORY DW DKWRIT ;W WRITE DISK SECTOR DW XMNE ;X EXAMINE & CHANGE REGISTERS DW QPRT NNNNNNNNNNNNNNNNN, JNNNNNNNNNNNNNNNNNNNNNNDB 'D',DPLOC - RLOC DB 'E',EPLOC - RLOC DB 'F',FPLOC - RLOC DB 'H',HPLOC - RLOC DB 'L',LPLOC - RLOC DB 'M' + 80H,[HPLONNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN TITLE M5b BANKED MONITOR DISK DRIVER ROM LIST NOCOND ;**********************************************************************NNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNN!APR 83 GRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out that if 'NNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNnctions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives now assigned the fINNNNNNNNNNNNNNNNN,#NNNNNNNNNNNNNNNNNNNNN!; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory references to new format. ; nNNNNNNNNNNNNNNNNN,)*.NNNNNNNNNNNNNNNNNNNNNNRH ; Make IOPB Sector for ISHA the same as floppies (0..n -> 1..n-1). ; This also make 5" ISHA same as 8". ; Change referencNNNNNNNNNNNNNNNNNN,/NNNNNNNNNNNNNNNNNNNNNNF THIS PROM FOR CODE CHECKING ;============================================================================ ; ;*MACLIB HNNNNNNNNNNNNNNNNN,;NNNNNNNNNNNNNNNNN-^}NNNNNNNNNNNNNNNNNNNNNNNTRY DURING INTERRUPT ; DS (MONROM + 6) - $ JP I_STUB ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++$rNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN: ; ; SET STACK ; LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET XNNNNNNNNNNNNNNNNN-cNNNNNNNNNNNNNNNNNNNNNN** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR V NNNNNNNNNNNNNNNNN-;lNNNNNNNNNNNNNNNNNNNNNN********************** ; BNKSEL: XRROM MF_SBNK RET ;*****************************************************************NNNNNNNNNNNNNNNNN- 2NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++M$NNNNNNNNNNNNNNNNN-&{NNNNNNNNNNNNNNNNNNNNNN####################### ; FUNTABL: DW RETVERS ;0: RETURN ROM VERSION DW MBOOT ;1: BOOT DISK WITH ARGUMENT IN BC DW TSTNNNNNNNNNNNNNNNNN-,_NNNNNNNNNNNNNNNNNNNNNN 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOPPY ; C..F = 5" HARD DISK ; 10..13 = NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU DK_RNUM ;ROM # OF THIS ROM DSKBNK EQU 0FEH ;BANK # OF FLOPPY DISK NNNNNNNNNNNNNNNN- mLNNNNNNNNNNNNNNNNNNNNNN+++++++++++++ ; ; EXTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNPUSH HL CALL XROMF ; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDEbNNNNNNNNNNNNNNNNN-+RNNNNNNNNNNNNNNNNNNNNNNOF THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; PUTS~ D0..D7 SRL B RR C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT ; LD A,B OR A,A JP NZ,ABORT\NNNNNNNNNNNNNNNN-}rNNNNNNNNNNNNNNNNNNNNN!# ORG 0040H ; ; BOOT VARIABLES ; DK_PROM DS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT'/NNNNNNNNNNNNNNNNN- NNNNNNNNNNNNNNNNNNNNNNC SP ;BALANCE STACK INC SP RET ;**************************************************************************** ; ; COLNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' M5b Disk Driver V. ' PVER;NNNNNNNNNNNNNNNN-]NNNNNNNNNNNNNNNNNNNNNN RET ;**************************************************************************** ; ; SETUP BANKS FOR BLOCK MOVE ; ENuNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN; ENTRY- E:HL= PTR TO LOCATION OF DATA ; EXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ANNNNNNNNNNNNNNNNN-$NNNNNNNNNNNNNNNNNNNNNNDDRESS ; DKRET: RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET ;####################################WNNNNNNNNNNNNNNNNN-*>NNNNNNNNNNNNNNNNNNNNNN1.23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;-uNNNNNNNNNNNNNNNNN-0ANNNNNNNNNNNNNNNNNNNNNN ; ; SAVE DRIVE # AS LOGIN DRIVE FOR BIOS ; LD A,C LD (LOGINBYTE),A LD (DK_PROM + 1),A ; ; NOW VECTOR TO DISK BOO NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN큻W%\*Ɗa.ʎe3ϒl:֖r@ܚvD|J墳PNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNT ROUTINE ; CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JP C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JP C,H8BOOT ; CP A,0yNNNNNNNNNNNNNNNNN-ysNNNNNNNNNNNNNNNNNNNNNN; ; TEST IOPB STATUS FOR ERROR FUNCTION 2 ; ENTRY- E:HL= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++\NNNNNNNNNNNNNNNNN- NNNNNNNNNNNNNNNNNNNNN!PBPTR + 2) ; ; IF NO ERROR THEN RETURN IT ; OR A,A RET Z ; ; ELSE FALL INTO ERROR OUTPUT ; ;+++++++++++++++++ANNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) LD B,PB_SIZE ; DBTE1: PUSH DE PUSH HL CALL GETB ; CALL HTOA ; CALL SPACEqNNNNNNNNNNNNNNNN-YNNNNNNNNNNNNNNNNNNNNNNPB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISK EXECUTER FUNCTION ; ;++ {NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN,4 JP C,ISHAX5 ; ; ELSE FALL INTO SELECT ERROR ; ;******************************************************************% NNNNNNNNNNNNNNNNN-%NNNNNNNNNNNNNNNNNNNNNNOPB.PB_STAT)= CONTROLLER NOT PRESENT ERROR ; ;**************************************************************************** ; /NNNNNNNNNNNNNNNNNN-+:NNNNNNNNNNNNNNNNNNNNNN CALL DQERR JP NZ,ABORT ; ; PREPARE IOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNCH ;IF 5" FLOPPY THEN EXIT JP C,F5BOOT ; CP A,10H ;IF 5" HARD DISK THEN EXIT JP C,H5BOOT ; CP A,14H ;IF MICROMATIONy NNNNNNNNNNNNNNNNN-iMNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++ ; TST_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO LOCA pNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION 3 ; ENTRY- E:HL= IOPB PTR ; ;+++{ANNNNNNNNNNNNNNNN-/SNNNNNNNNNNNNNNNNNNNNNN ;DISPLAY SEPARATOR ; POP HL POP DE INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # NNNNNNNNNNNNNNNNN- \NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPdNNNNNNNNNNNNNNNNN- NNNNNNNNNNNNNNNNNNNNNN********** ; ; ILLEGAL DRIVE REQUESTED ; EXIT - AF= -2 ; (IOPB.PB_STAT)= ILLEGAL COMMAND ERROR ; ;***********************qhNNNNNNNNNNNNNNNN-&LNNNNNNNNNNNNNNNNNNNNNN JCNP: LD (IX + PB_STATO),PB_CNP JR DSKERR SUBTTL JADE 5" & 8" FLOPPY CONTROLLER DRIVER ;++++++++++++++++++++++++++++hrNNNNNNNNNNNNNNNN-,oNNNNNNNNNNNNNNNNNNNNNNB_DRVO),A ; LD A,ID_SECT ;SET SECTOR LD (IOPB + PB_SECO),A ; ; LOG ON DRIVE ; CALL JADEX8R CALL NZ,DBERR JP NZ,WNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN THEN EXIT JP C,M8BOOT ; CP A,18H ;IF 3" FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ;NNNNNNNNNNNNNNNNN- Z|NNNNNNNNNNNNNNNNNNNNNNL FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB STATUS FOR ERRO HNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DIS_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL i2rNNNNNNNNNNNNNNNN-bNNNNNNNNNNNNNNNNNNNNNN ; CALL SPACE CALL SPACE ;OUTPUT PORT # LD A,(DDPORT) CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE LDzpNNNNNNNNNNNNNNNNN-?mNNNNNNNNNNNNNNNNNNNNNNTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++d> NNNNNNNNNNNNNNNNN-!3NNNNNNNNNNNNNNNNNNNNNN***************************************************** ; JSELERR: LD (IX + PB_STATO),PB_ILCMD ; ; FALL INTO DISK ERROR ;>NNNNNNNNNNNNNNNN-'NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" JADE FLOPPY BOOT ; THIS ROUTINE NOW ACCESSES THE NEW JADE CONTROLLER NNNNNNNNNNNNNNNNN--^NNNNNNNNNNNNNNNNNNNNNNDKRET ; ; READ THE DIRECTORY SECTOR ; LD A,BD_SEC LD (IOPB + PB_SECO),A LD A,PB_READC LD (IOPB + PB_CMDO),A CALL NNNNNNNNNNNNNNNNN-, NNNNNNNNNNNNNNNNNNNNNN ;---------------------------------------------------------------------------- ; ; ABORT RETURNS CONTROL TO THE MONITOR RNNNNNNNNNNNNNNNNN- /NNNNNNNNNNNNNNNNNNNNNNR FUNCTION 2 ; ENTRY- (IOPBPTR)= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISPLAY ROUTINE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++INNNNNNNNNNNNNNNNN-I1NNNNNNNNNNNNNNNNNNNNN! A,(DDADDR + 1) CALL HTOA LD A,(DDADDR) CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR ;+++++++HNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++ ; DSKX: ; ; FETCH DRIVE # ; LD HL,(IOPBPTR) INC HL LD A,(HL) ; ; IF JADE 8" FLOPPNNNNNNNNNNNNNNNNN-"`NNNNNNNNNNNNNNNNNNNNN! ;**************************************************************************** ; ; COMMON ERROR CODE ; EXIT - AF= -2 ; qNNNNNNNNNNNNNNNNN-(oNNNNNNNNNNNNNNNNNNNNNNWITH ON-BOARD PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM THE DISK AND ; EXECUTE THE COLD START ENTp'NNNNNNNNNNNNNNNNN-. NNNNNNNNNNNNNNNNNNNNNNJADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; IF NOT DIRECTORY SECTOR THEN ERROR ; LD A,(DEFBFR) CP A,BTENTS JP C,DKRET !NNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNN!OM WITH ERROR FLAG (CF) SET ; ;---------------------------------------------------------------------------- ; ABORT: SCF ;NNNNNNNNNNNNNNNN- <NNNNNNNNNNNNNNNNNNNNNN DQERR: ; ; RESTORE PTRS ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) ; ; CALCULATE PTR TO STATUS ; LD A,PB_STATO ADD_ NNNNNNNNNNNNNNNN-ЦNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION ; ENTRY- (IOPBPTR)= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN-zNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION 4 ; ENTRY- E:HL= IOPB PTR ; *NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNN!Y THEN GO EXECUTE IT ; SUB A,4 JP C,JADE8 ; ; ELSE IF SASI 8" HARD DISK THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX8 $NNNNNNNNNNNNNNNNN-#QNNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; DSKERR: LD A,-2 OR A,A RET ;******NNNNNNNNNNNNNNNNN-)\NNNNNNNNNNNNNNNNNNNNN!RY IN THE BIOS. ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F8BOOT: ; ; RESET THE (NNNNNNNNNNNNNNNNN-/NNNNNNNNNNNNNNNNNNNNNNEXIT - IOPB.STATUS= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EX_IO@.NNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN; ; ELSE IF JADE 5" FLOPPY THEN GO EXECUTE IT ; SUB A,4 JP C,JADE5 ; ; ELSE IF SASI 5" THEN GO EXECUTE IT ; SUB AHNNNNNNNNNNNNNNNNN-$*NNNNNNNNNNNNNNNNNNNNNN********************************************************************** ; ; CONTROLLER NOT SENSED ERROR ; EXIT - AF= -2 ; (I`NNNNNNNNNNNNNNNNN-* NNNNNNNNNNNNNNNNNNNNN!CONTROLLER ; LD HL,CLRIOPB CALL IIOPB ; LD HL,IOPB LD (IOPBPTR),HL LD A,(CURBNK) LD (IOPBPTR + 2),A CALL JADEX8 ?NNNNNNNNNNNNNNNNN-0qNNNNNNNNNNNNNNNNNNNNNN LD (IOPB + PB_TRKO),HL ; ; READ 1ST BIOS SECTOR INTO BUFFER ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"񁿂[*ņa/ˊf4юm; גtBޖzI䚳PꞸR!W%NNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.9NNNNNNNNNNNNNNNNNNNNNNIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1ST SECTOR ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CALL JAD 1024 THEN ERROR ; NNNNNNNNNNNNNNNNN.*jNNNNNNNNNNNNNNNNNNNNN!EX8R CALL NZ,DBERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB ?NNNNNNNNNNNNNNNNN.šNNNNNNNNNNNNNNNNNNNNNNL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 5" ENTRY ; JADE5: LD 'NNNNNNNNNNNNNNNN.oNNNNNNNNNNNNNNNNNNNNNN++++++++++++ ; JADEX8R: LD HL,0 LD (IOPB + PB_BCNTO),HL ; ; FALL INTO LOCAL READ FUNCTION ; ;+++++++++++++++++++ctrNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++ ; JADEX: ; ; SAVE PORT # ; LD A,C LD (DDPORT),A ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(CxNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNFETCH COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO DOWNLOAD ; LD A,C OR A,B JNNNNNNNNNNNNNNNNN. JNNNNNNNNNNNNNNNNNNNNNNPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C),A ; ; XFER THE IOPB TO THE CONTROLLER ; LD A,(IOPBPTR + 2) ;SET SRC BANK NNNNNNNNNNNNNNNN.&HNNNNNNNNNNNNNNNNNNNNNN HL,DE ; EX DE,HL LD HL,(IOPBPTR) LD BC,PB_BCNTO ADD HL,BC EX DE,HL ; LD BC,PB_SIZE - PB_BCNTO ; CALL BMOVE ; CNNNNNNNNNNNNNNNN.,NNNNNNNNNNNNNNNNNNNNNN LD A,C OR A,A JR NZ,JXERR ; ; UPLOAD SECTOR DATA ; JXUP: PUSH DE ;DEST PTR PUSH BC ;BYTE CNT ; LD C,(IX + PB_./oNNNNNNNNNNNNNNNNNN.[NNNNNNNNNNNNNNNNNNNNNN+ PB_DMAO) ;BUMP LOAD ADDRESS LD DE,(IOPB + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF --CONNNNNNNNNNNNNNNNN. NNNNNNNNNNNNNNNNNNNNNNC,DD_PRT5 JP JADEC ; ; ; JADE 8" ENTRY ; JADE8: LD C,DD_PRT8 ; ; COMMON INITIAL CODE ; JADEC: ADD A,4 ;BIAS DRlNNNNNNNNNNNNNNNN.\6NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK IOPB FUNCTION ; ENTRY- (IOPBPTRNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!) INC A ;0FFH IF NOT THERE JP Z,JCNP ; ; COMPUTE JADE CONTROLLER BASE ADDRESS ; DEC A ;FETCH ADDRESS SELECT SWITCH vNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!R Z,JEX ; ; ELSE IF COUNT < 1024 THEN DOWNLOAD DATA ; LD A,B CP A,4 JR C,JDOWN ; ; ELSE IF COUNT > 1024 THEN ERROBNNNNNNNNNNNNNNNNN.!yNNNNNNNNNNNNNNNNNNNNN! LD B,A LD C,DSKBNK CALL BNKSEL ; LD HL,(DDADDR) ;COMPUTE DEST PTR LD DE,DD_CBO ADD HL,DE EX DE,HL ; LD HL,(IOP{NNNNNNNNNNNNNNNNN.'yNNNNNNNNNNNNNNNNNNNNNN ; IF UPLOAD INHIBITED THEN SKIP IT ; BIT PB_INHX,(IX + PB_FLGO) JR NZ,JDONE ; ; XFER SECTOR DATA FROM CONTROLLER ; &NNNNNNNNNNNNNNNNN.-= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** &\!NNNNNNNNNNNNNNNNN. dNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++ ; ; 8" MICROMATION M2FM BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++kONNNNNNNNNNNNNNNNN.-NNNNNNNNNNNNNNNNNNNNNNEMOVED ; LD BC,0341H XOR A,A H8B1: OUT (C),A INC C DJNZ H8B1 ; ; ISSUE CLEAR CONTROLLER IOPB ; LD HL,CLRIOPB NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!1 ADD A,B LD (IOPB + PB_SECO),A EXX ; ; FORCE HOST ADAPTER LOG-ON ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; NKNNNNNNNNNNNNNNNNN.huNNNNNNNNNNNNNNNNNNNNNNOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ;NNNNNNNNNNNNNNNNNNN.%+NNNNNNNNNNNNNNNNNNNNNN---------------- ; ; 5" HARD DISK BOOT ; H5BOOT: ; ; BIAS DOWN DRIVE ; SUB A,8 ;5" = 8..B -> 4..7 ; ; COMPUTE FNNNNNNNNNNNNNNNNN.+$NNNNNNNNNNNNNNNNNNNNNNHAX CALL DQERR JP NZ,DKRET ; ; FETCH THE SECTOR SIZE ; LD A,(DEFBFR + ID_SSZ0O) EXX LD HL,128 ; OR A,A HBTSSZNNNNNNNNNNNNNNNN.ZNNNNNNNNNNNNNNNNNNNNN! OUTPUT ; EXIT - AF= 0: OK, /0: ERROR ; C= PORT # OF CONTROLLER ; DE,HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNENDIF SUBTTL JADE 5" FLOPPY DISK DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ;.`rNNNNNNNNNNNNNNNNN.X7NNNNNNNNNNNNNNNNNNNNNN++++++++ ; M8BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ KNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNCALL IIOPB ; LD HL,IOPB LD (IOPBPTR),HL LD A,(CURBNK) LD (IOPBPTR + 2),A ; CALL ISHAX ; ; CHECK SELF TEST STATUSNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNOW READ THE DIRECTORY SECTOR ; LD (IX + PB_CMDO),PB_READC ; EXX LD A,B EXX LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2)JNNNNNNNNNNNNNNNNN. }NNNNNNNNNNNNNNNNNNNNNN ; HDRDLP: CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL NNNNNNNNNNNNNNNNN.&xNNNNNNNNNNNNNNNNNNNNNNLOGICAL DRIVE FOR IOPB ; PUSH AF ;BIAS DRIVE UP ADD A,0CH ;ISHA5 - DRVPRT AND A,0FH LD (IOPB + PB_DRVO),A POP AF ;NNNNNNNNNNNNNNNNN.,8NNNNNNNNNNNNNNNNNNNNNN: JR Z,GOTSSZ ; ADD HL,HL DEC A JR HBTSSZ ; ; ; SECTOR SIZE COMPUTED IN HL ; GOTSSZ: EXX ;SAVE IN ALT REG ; ; NNNNNNNNNNNNNNNNN..kNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++ ; JWAIT: ; ; ISSUE PASSED COMMAND ; LD BC,(DDPORT) OUT (C),A ; ; PAUSE A WHILE NNNNNNNNNNNNNNNNNN. NNNNNNNNNNNNNNNNNNNNNN 5" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F5BOOT: EQU ABOR>NNNNNNNNNNNNNNNN.kNNNNNNNNNNNNNNNNNNNNNN; ; MICROMATION DRIVER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M2X: EQU DSKERR lNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN ; CALL DQERR ; ; SET UP IOPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,(LOGANNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DNNNNNNNNNNNNNNNNN.!NNNNNNNNNNNNNNNNNNNNNN!; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS LD DE,(IOPB + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD A,(BAJNNNNNNNNNNNNNNNNN.'INNNNNNNNNNNNNNNNNNNNNN ; COMPUTE SECTOR FROM LOGICAL DRIVE ; ADD A,A ;UPPER NIBBLE = HEAD ADD A,A AND A,0C0H ;MASK OFF UNUSED BITS EXX NNNNNNNNNNNNNNNNNN.- NNNNNNNNNNNNNNNNNNNNNN NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_CMDO),PB_READC ; EXX ;FETCH LOGICAL DRIVE HEAD # LD A,B EXX ; LD HL3NNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!FOR CONTROLLER TO CATCH UP ; EX (SP),HL EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TINNNNNNNNNNNNNNNNN. NNNNNNNNNNNNNNNNNNNNNNT ;UNSUPPORTED SUBTTL JADE 3" FLOPPY DISK DRIVER ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}NNNNNNNNNNNNNNNN.xKNNNNNNNNNNNNNNNNNNNNNN SUBTTL ISHA 5" & 8" HARD DISK DRIVER ;**************************************************************************** ; ; HaDNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNINBYTE) ;COMPUTE & SET DRIVE SUB A,4 ;8" = 4..7 -> 0..3 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DqNNNNNNNNNNNNNNNNN.=&NNNNNNNNNNNNNNNNNNNNNNQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ;8 NNNNNNNNNNNNNNNNN."NNNNNNNNNNNNNNNNNNNNNNIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENTRY (iNNNNNNNNNNNNNNNNN.(wNNNNNNNNNNNNNNNNNNNNNN ;SAVE SECTOR OFFSET IN B' FOR LATER USE LD B,A ; ; SET ID SECTOR FOR LOGIN ; LD A,ID_SECT ADD A,B LD (IOPB + PB_9'NNNNNNNNNNNNNNNNN..^NNNNNNNNNNNNNNNNNNNNNN,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRnNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNMOUT LD DE,0 ; JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTINUE TO WAIT LD A,E OR A,D JR NZ,JWAIT2 ; DEC L ;IF TIME OUNNNNNNNNNNNNNNNN. NNNNNNNNNNNNNNNNNNNNN!+++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F3BOONNNNNNNNNNNNNNNNN.KzNNNNNNNNNNNNNNNNNNNNNNrd disk boot function. ; This module reads the BIOS image to the proper system ; address & jumps to the BIOS cold start entry NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNRIVE / 2 LD (IOPB + PB_DRVO),A ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,8|NNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN! SAVE TRACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A LD _NNNNNNNNNNNNNNNN.#(NNNNNNNNNNNNNNNNNNNNN!BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT PUSH HL XRROM 8 JP DKRET ELSE ;IFTNNNNNNNNNNNNNNNNN.)FNNNNNNNNNNNNNNNNNNNNNNSECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD IX,IOPB CALL ISHAX ; ; $NNNNNNNNNNNNNNNNN./mNNNNNNNNNNNNNNNNNNNNNNECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETBNNNNNNNNNNNNNNNN.ўNNNNNNNNNNNNNNNNNNNNN!T THEN RETURN TO MONITOR OR A,L JP Z,DSKERR ; JWAIT2: IN A,(C) ;IF NOT DONE THEN WAIT AND A,DD_SHLT JR NZ,JWAIT1 ;/NNNNNNNNNNNNNNNN. >UNNNNNNNNNNNNNNNNNNNNNNT: EQU ABORT ;UNSUPPORTED SUBTTL MICROMATION 8" FLOPPY DISK DRIVER ;+++++++++++++++++++++++++++++++++++++++++++++++++++++ONNNNNNNNNNNNNNNNN.)NNNNNNNNNNNNNNNNNNNNNNpoint. ; ;**************************************************************************** ; H8BOOT: ; ; INSURE FDC WINDOW R^NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN0H EXX ;SAVE SECTOR OFFSET IN B' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THEN USE PLATTER SoNNNNNNNNNNNNNNNNN.[DNNNNNNNNNNNNNNNNNNNNNNB,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX ;LNNNNNNNNNNNNNNNN.$NNNNNNNNNNNNNNNNNNNNNN DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF FORM ;------------------------------------------------------------NNNNNNNNNNNNNNNNN.*NNNNNNNNNNNNNNNNNNNNNN CHECK SELF TEST STATUS ; CALL DQERR ; ; FORCE HOST ADAPTER LOG-ON ; LD A,PB_LOGC LD (IOPB + PB_CMDO),A ; CALL ISNNNNNNNNNNNNNNNNN.0~NNNNNNNNNNNNNNNNNNNNNNCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE ^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"Z(ņb0̊i7Ԏq@ݒyG㖱MꚸU#񞿟[)ţb0NNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN/ NNNNNNNNNNNNNNNNNNNNNNOFFSET LD A,B EXX LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOhuNNNNNNNNNNNNNNNN/+NNNNNNNNNNNNNNNNNNNNN!M ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROM 8 JP DKRET ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET EINNNNNNNNNNNNNNNNN/ LNNNNNNNNNNNNNNNNNNNNNN ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD DE,(DEFBFR + 1) LD D,A ADD HL,DE ; ; FETCH LOAD ADDRESS & SAvNNNNNNNNNNNNNNNNN/lNNNNNNNNNNNNNNNNNNNNNN DEC A ;ALREADY HAVE 1ST SECTOR ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A RwNNNNNNNNNNNNNNNN/WNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA 5" DRIVER ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS 3NNNNNNNNNNNNNNNNN/)NNNNNNNNNNNNNNNNNNNNN!N CODE ; ISHAC: ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; LD BC,(IOPBPTR) ; ; OUTPUT THE IOPB ADDR`NNNNNNNNNNNNNNNNN/%ïNNNNNNNNNNNNNNNNNNNNNNRESB ;ISSUE CONTROLLER RESET OUT (ISH_CMD),A XOR A,A OUT (ISH_CMD),A ; CLRWT: IN A,(ISH_STATUS) ;WAIT FOR CONTROLLER RHNNNNNNNNNNNNNNNNNN/+NNNNNNNNNNNNNNNNNNNNNN- A= STATUS ; ZF= TRUE ; ;**************************************************************************** ; HWBUSY: ; ; IPNNNNNNNNNNNNNNNNN/\NNNNNNNNNNNNNNNNNNNNNNPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL SETBIOPB ;SETJHNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNNDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SETUP IOPB FOR BIOS READ SUBR ; ENNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DNNNNNNNNNNNNNNNNN/ NNNNNNNNNNNNNNNNNNNNNNET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA 8" DRIVE HARD DISK DRIVER ; ENeNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN ; BC= SECTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISHAX5: ; ADD A,8 ;BIAScuNNNNNNNNNNNNNNNNN/ ږuCߚ{I垲NꢸT!NNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN/>NNNNNNNNNNNNNNNNNNNNN!FBFR LD E,A LD D,0 ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIO+NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNLN),A ; ; DONE, RETURN NO ERROR ; OR A,A RET ;********************************************************************4rNNNNNNNNNNNNNNNN/ {NNNNNNNNNNNNNNNNNNNNNN************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;************************NNNNNNNNNNNNNNNNN/[NNNNNNNNNNNNNNNNNNNNNN################################################ ; ; MESSAGES ; ;#########################################################NNNNNNNNNNNNNNNNN/gNNNNNNNNNNNNNNNNNNNNNNS (INHIBIT READ XFER) DW DEFBFR ;DMA DB 0 ;DMA BANK DW 0 ;XFER COUNT DB 0,0,0,0 ;STATUS, RESULTS IF ($ - PROMgNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN/%NNNNNNNNNNNNNNNNNNNNNNFACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;AaNNNNNNNNNNNNNNNNN/+אNNNNNNNNNNNNNNNNNNNNNN ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AXNNNNNNNNNNNNNNNNN/kNNNNNNNNNNNNNNNNNNNNNNSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECT1HNNNNNNNNNNNNNNNNN/%NNNNNNNNNNNNNNNNNNNNNN******** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;*****NNNNNNNNNNNNNNNN/.NNNNNNNNNNNNNNNNNNNNN!**************************************************** ; CO: XCROM MF_CO ; ; DONE ; RET ;***************************9NNNNNNNNNNNNNNNNN/;NNNNNNNNNNNNNNNNNNNNNN################### ; DERM: DB CR,LF,'Disk Error! IOPB data:' DB CR,LF DB 'CM DR TL TH SL SH FG AL AH AX CL CH ST R1 R2 R3NNNNNNNNNNNNNNNNN/4NNNNNNNNNNNNNNNNNNNNNNST) > PROMSIZ CONMSG **** ERROR! Code Too Large for PROM! **** ENDIF END NNNNNNNNNNNNNNNNN/ jNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN/&NNNNNNNNNNNNNNNNNNNNN!LLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DB 0 ;T'NNNNNNNNNNNNNNNNN/,NNNNNNNNNNNNNNNNNNNNNNNL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIF5NNNNNNNNNNNNNNNN/XNNNNNNNNNNNNNNNNNNNNNNOR TO PROPER LOCATION ; LD HL,DEFBFR LD BC,(IOPB + PB_BCNTO) ;USE COUNT ACTUALLY READ LDIR ; ; SET UP FOR NEXT SECTOR+bNNNNNNNNNNNNNNNN/ NNNNNNNNNNNNNNNNNNNNNN*********************************************************************** ; IIOPB: ; ; MOVE THE IOPB ; LD DE,IOPB LD BCNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN************************************************** ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;******************************* NNNNNNNNNNNNNNNNN/ NNNNNNNNNNNNNNNNNNNNNN PT CA' DM CR,LF ;############################################################################ ; ; LOGIN IOPB ; ;##QWNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN/!8[NNNNNNNNNNNNNNNNNNNNNN ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,3NNNNNNNNNNNNNNNNN/'NNNNNNNNNNNNNNNNNNNNNNRACK SHIFT FACTOR ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS DB 26,0,26,0,26,0 ;SECTORS PER TRACK, SECTOR SIZENNNNNNNNNNNNNNNNN/-}6NNNNNNNNNNNNNNNNNNNNNNT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DB 1 ;TRACK SHIFT FACTOR (TSH) ; ; ; DB 01100000B ;FLAGS 256 BPS, HNNNNNNNNNNNNNNNNNN/HNNNNNNNNNNNNNNNNNNNNNN READ ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; LD HL,IOPB + PB_SECO ;NEXT SECTOR INC (HL) ; ; COMPUTE SECT7NNNNNNNNNNNNNNNN/ GNNNNNNNNNNNNNNNNNNNNNN,PB_SIZE LDIR RET SUBTTL ASCII CHAR ROUTINES ;***********************************************************************rNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN********************************************* ; CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;**************************NNNNNNNNNNNNNNNNNN/YNNNNNNNNNNNNNNNNNNNNN!########################################################################## ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE rNNNNNNNNNNNNNNNN/KNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN/"mNNNNNNNNNNNNNNNNNNNNNN2,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ENDIF LIST ON ;#########################################;NNNNNNNNNNNNNNNNN/(NNNNNNNNNNNNNNNNNNNNNN (128) DB 0 ;TYPE DW 77 ;CYLS DB 1 ;HEADS ;#######################################################################aNNNNNNNNNNNNNNNNN/.(eNNNNNNNNNNNNNNNNNNNNNNARD, SSSD DB 32,1,32,1,32,1 ;32 SPT, 256 BPS DB 10H ;TYPE DW 256 ;CYLS DB 4 ;HEADS ;############################BNNNNNNNNNNNNNNNN/yNNNNNNNNNNNNNNNNNNNNNNOR COUNT FROM LENGTH ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD DE,(IOPB + PB_BCNTO) ;USE BYTES READ XOR A,A ; BUMP: INC A GNNNNNNNNNNNNNNNNN/ vNNNNNNNNNNNNNNNNNNNNN!***** ; ; DISPLAY BYTE ON SYSTEM CONSOLE PROCEDURE ; ENTRY- A= BINARY ; ;**************************************************NNNNNNNNNNNNNNNNN/=NNNNNNNNNNNNNNNNNNNNNN************************************************** ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;*************************************m*rNNNNNNNNNNNNNNNNN/hNNNNNNNNNNNNNNNNNNNNNNDW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DW 0 ;XFER COUNT DB 0,0,0,0 ;STA#NNNNNNNNNNNNNNNNN/xNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN/#^9NNNNNNNNNNNNNNNNNNNNN!################################### ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;########jBNNNNNNNNNNNNNNNN/)NNNNNNNNNNNNNNNNNNNNNN##### ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;##########################################################################RNNNNNNNNNNNNNNNNN//TNNNNNNNNNNNNNNNNNNNNNN################################################ ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;######################################)INNNNNNNNNNNNNNNNN/*NNNNNNNNNNNNNNNNNNNNNN SBC HL,DE ;KEEP SUBTRACTING UNTIL UNDERFLOW JR Z,NOBUMP JR NC,BUMP ; NOBUMP: ; ; SAVE COUNT IN LENGTH ; LD (BIOS_NNNNNNNNNNNNNNNNNN/ HNNNNNNNNNNNNNNNNNNNNNN************************** ; HTOA: LD C,A XDROM MF_PHXB ; ; DONE ; RET ;**************************************NNNNNNNNNNNNNNNN/hNNNNNNNNNNNNNNNNNNNNNN*************************************** ; SPACE: LD C,' ' JR CO SUBTTL INITIALIZED DATA ;############################NNNNNNNNNNNNNNNNN/VNNNNNNNNNNNNNNNNNNNNNNTUS ; CLRIOPB: DB PB_CLRC ;COMMAND DB -1 ;DRIVE (-1= HARD RESET) DW 0 ;TRACK DW 0 ;SECTOR DB 1 SHL PB_INHX ;FLAG=NNNNNNNNNNNNNNNNN/-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN/$ǮNNNNNNNNNNNNNNNNNNNNNN#################################################################### ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT NNNNNNNNNNNNNNNN/*NNNNNNNNNNNNNNNNNNNNN!## ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 3NNNNNNNNNNNNNNNNN/0NNNNNNNNNNNNNNNNNNNNNN###################################### ; ; START ON AN EVEN PAGE BOUNDARY ; IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDI/NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"Y&†\*NJb0̎j8Ւq> ږvDޚzH䞲M颶T"NNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT LIST ON ENDM ; DW ITRAP ;INT 8 IS USER INTERRUPT E6GNNNNNNNNNNNNNNNNN0lbNNNNNNNNNNNNNNNNNNNNNN###################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PDNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNNF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ )$ NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER EXECUTIONNNNNNNNNNNNNNNNNN0LNNNNNNNNNNNNNNNNNNNNNN@@ ; ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8rNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 1?NNNNNNNNNNNNNNNNN0% NNNNNNNNNNNNNNNNNNNNN!T FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC NNNNNNNNNNNNNNNN0+/NNNNNNNNNNNNNNNNNNNNN!@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNNDIF ;############################################################################ ; ; MESSAGES ; ;##################>9NNNNNNNNNNNNNNNN0|\NNNNNNNNNNNNNNNNNNNNNNARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACRO #D LINNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN SUBTTL UNINITIALIZED DATA AREA ;############################################################################ ; ; THE FOLLNNNNNNNNNNNNNNNNN0:BNNNNNNNNNNNNNNNNNNNNNN ADDRESS SECOFF DS 2 ;LOGICAL DRIVE SECTOR OFFSET (ADD TO SECTOR) ; ROMSAV EQU 0048H ;DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM SPwNNNNNNNNNNNNNNNNN0MNNNNNNNNNNNNNNNNNNNNNN" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" D+NNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNN5, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 2559NNNNNNNNNNNNNNNNN0&YNNNNNNNNNNNNNNNNNNNNNN ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL HEAD SELECTION DATA ; DPBTSH DS 1 ;TSH- TRACK SHIFT FACTOR INTO HEAD FIENNNNNNNNNNNNNNNNN0,~NNNNNNNNNNNNNNNNNNNNNNALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!########################################################## ; MSGLE: DM CR,LF,'LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, NNNNNNNNNNNNNNNNN0 OmNNNNNNNNNNNNNNNNNNNNNNST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;;SCRATCH ARE NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;###############################################################NNNNNNNNNNNNNNNNNN0 sNNNNNNNNNNNNNNNNNNNNNNSAV DS 2 ;USER SP SAVE WHILE USING LOCAL STACK DS 64 ;LOCAL STACK (32 ENTRIES) LSTACK EQU $ ;###########################$NNNNNNNNNNNNNNNNN0*|NNNNNNNNNNNNNNNNNNNNNNRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THDNNNNNNNNNNNNNNNN0!"NNNNNNNNNNNNNNNNNNNNNN : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER $NNNNNNNNNNNNNNNNN0'jNNNNNNNNNNNNNNNNNNNNNNLD ; 0: NONE, 1: 2 HEADS, 2: 4 HEADS, 3: 8 HEADS ; ; ADDITIONAL DISK PARTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. TNNNNNNNNNNNNNNNNN0-ONNNNNNNNNNNNNNNNNNNNNN ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM IF (($ - 8000H) > 07700H) O1$NNNNNNNNNNNNNNNNN091NNNNNNNNNNNNNNNNNNNNN!Retry, (BDOS) - ' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF IF INTRPTS ITMSG DM CR,LF,'User' ILLIMNNNNNNNNNNNNNNNNNNNNNNA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD)BNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN############# ; BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR # BTFLG DS 1 ;RESERVED FOR FLAGS BTDMA DS 2 ;DL{NNNNNNNNNNNNNNNNN0\ NNNNNNNNNNNNNNNNNNNNNN################################################# ; ; DRIVE ALLOCATION AREAS ; ;##########################################(NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;################KNNNNNNNNNNNNNNNNN0"qNNNNNNNNNNNNNNNNNNNNNNSECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DIRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTrrNNNNNNNNNNNNNNNNN0(zNNNNNNNNNNNNNNNNNNNNNN ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF ABOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FO(NNNNNNNNNNNNNNNN0.NNNNNNNNNNNNNNNNNNNNNNR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END SNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNN DM CR,LF,'Ill.' IQMSG DM ' Int. Abort? (Y/N/I/M) - ' ENDIF ;#########################################################QNNNNNNNNNNNNNNNN0 )NNNNNNNNNNNNNNNNNNNNNN AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DԋNNNNNNNNNNNNNNNNN0ŷNNNNNNNNNNNNNNNNNNNNNNMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;############################################################################ANNNNNNNNNNNNNNNNN0oNNNNNNNNNNNNNNNNNNNNNN################################## ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRONNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN############################################################ ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;####################### NNNNNNNNNNNNNNNNN0#@NNNNNNNNNNNNNNNNNNNNNNORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (UStNNNNNNNNNNNNNNNN0)INNNNNNNNNNNNNNNNNNNNN!LLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UPPER BITS) ; ;DPBSOFF DS 2 ;SECTOR OFFSET (FOR LOGICAL DRIVE) ; NNNNNNNNNNNNNNNN0/-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN0_SNNNNNNNNNNNNNNNNNNNNNN################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;######################################################\NNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNNW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN ; ; VARIABLES ; ;############################################################################ ; DTPTR: DS 2 ;DRIVE TABLdNNNNNNNNNNNNNNNN0/NNNNNNNNNNNNNNNNNNNNNN TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@m=NNNNNNNNNNNNNNNNN0ՉNNNNNNNNNNNNNNNNNNNNNN##################################################### ; STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHNNNNNNNNNNNNNNNNNN0$?NNNNNNNNNNNNNNNNNNNNN!UALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFNNNNNNNNNNNNNNNNN0*NNNNNNNNNNNNNNNNNNNNNN 0: NONE, 1..65535: OFFSET DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XNNNNNNNNNNNNNNNNN00`NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺V$[)Ɗa/ʎf4Βk:Ֆq? ۚwEឮ|J墳PNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN:1CEA0000C33AEAC3BCEAC3FFEDC3FBEDC303EEC30AEEC309EEC307EEC358ECC3A5 :1CEA1C00C4EBC35BECC360ECC365ECC3A5EBC3B4EBC30EEEC370ECC355NNNNNNNNNNNNNNNNN0[RNNNNNNNNNNNNNNNNNNNNNN002106DC3205002206002155ED3228002229000180006B :1CEB8000CD65EC2A07DC22BAED21B6ED2207DC3E56CDECEDB73E3828023E1832A3 :1CEB9C00BC $NNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNN6F01196EE010800EDB03294EEFDE5FD2AE109 :1CECB400F021BDECE52AE3F0E9FDE1C8CDA1ED5F2194EE3E43CDECED211CF0CD9B :1CECD00012EECDFBEDF{d NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNAF6F674F47C90601C93E531804C6 :1CEDE8003E541800ED73E7F03129F1CD06F8ED7BE7F0C93E2918ED3E2818E93EFF :1CEE04002B18E53E1AC93E2D18DECNNNNNNNNNNNNNNNNNNNNNN06F8F1FE03CA0000E65FFE59CA0000FE492007D1C1E1F14E :1CEE5800C33800FE4D2007D1C1E1F1C308003A4800D3F8D1C1E1F1FBC9F5E5C5EE :1CEE7400pNNNNNNNNNNNNNNNNN0LNNNNNNNNNNNNNNNNNNNNNN2DA00D0A494C4C205359532043414C4C2C20233DA00D0A5573D5 :1CF0540065F20D0A496C6CAE20496E742E2041626F72743F2028592F4E2F492FCE :1CF0NNNNNNNNNNNNNNNN0!NNNNNNNNNNNNNNNNNNNNNN JDDCONT.DEF ;*INCLUDE ISHA.DEF ;*INCLUDE DISKS3.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ; ;=============BNNNNNNNNNNNNNNNN0']NNNNNNNNNNNNNNNNNNNNNNDS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT BIOSNT DS 2 ;BIOS ENTRY SUBTTL EXTERNAL EF NNNNNNNNNNNNNNNN0-NNNNNNNNNNNNNNNNNNNNNN********************************************************************* ; ; COLD INIT ONLY SWITCHES TO RESIDENT ROM ; ;*******GNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNFBDBD8CB47280845 :1CEAD8003E0F3294EECD29ED3A4100E6034F1E00CDC4EB7DB4286A018000CD657B :1CEAF400EC010300CD60EC010000CD5BECCDA5EB2NNNNNNNNNNNNNNNNN0 -NNNNNNNNNNNNNNNNNNNNNNDCDFA7F :1CEC0C00EC3AC000E624CCF0ECCDFFEC21A000011200EDB021C000E52AE1F01159 :1CEC2800040019EBE1010B00EDB02ADEF0AFC93AD5F0FE043`NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!:1CED4000EEB7C9FD7E033295EE2A98EEE5CD29EDE12298EEC979FE033EFFD0E5E0 :1CED5C00216DED7987856F3E008C677E23666FE3C973ED78ED8EED2134NNNNNNNNNNNNNNNN0kNNNNNNNNNNNNNNNNNNNNNND52156F018B001070D1319050B111703090F1502080E141A060C121853 :14EE9000040A1016000000000000000000000000000000003A :1CEEA4000AED00rNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN70004D29202DA000000000000000003CEAD7F3000029F10000000000000017 :1CF08C00003CEAE9F30000A8F100000000000000003CEAFBF3000027F200000pBNNNNNNNNNNNNNNNN0"ANNNNNNNNNNNNNNNNNNNNNN=============================================================== LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INNNNNNNNNNNNNNNN0(MNNNNNNNNNNNNNNNNNNNNNNNTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ; DS (MONROM + 6) - $ sxNNNNNNNNNNNNNNNNN0.,NNNNNNNNNNNNNNNNNNNNN!********************************************************************* ; CINIT: ; ; SET STACK ; LD SP,MONSTK ; ; RESNNNNNNNNNNNNNNNNN0=0NNNNNNNNNNNNNNNNNNNNNN20533A8000FE86384C2A8900A3 :1CEB1000E52A85004D0600CD60EC4CCD5BEC0100D4CD65ECCDA5EB203021D8F000 :1CEB2C0034ED5B9EEE2ADBF01922DB)}!NNNNNNNNNNNNNNNN0 ?NNNNNNNNNNNNNNNNNNNNNN012CDFAEC211BEFAD :1CEC4400E5CDFFECE1011200EDB018D3CDF0EC21FEEE18EC010000ED43D6F0C921 :1CEC6000ED43D8F0C9ED43DBF0CDA1ED32DDF0CO$NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN01AFC9CB :1CED78004B21A4EE79B7C8FE063802B7C941110F001910FDAFC9CDA1ED5FDDE550 :1CED9400E13E44CDECEDB7C0DD7E0CB7C93E07C306F84F3E'NNNNNNNNNNNNNNNN0X!NNNNNNNNNNNNNNNNNNNNNN0460200120012001100001040AED0004602001200120011000B1 :1CEEC00001040AED000560200120012001100001040AED0005602001200120019E :1CEE"$NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN0A0 :1CF0A80000000000003CEA0DF40000A6F200000000000000003CEA1FF45EF325DE :11F0C400F300000000000000003CEA31F4B7F37EF3E2 :000000rNNNNNNNNNNNNNNNNN0#pNNNNNNNNNNNNNNNNNNNNNNNCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE DISKS3.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THΓNNNNNNNNNNNNNNNN0)~NNNNNNNNNNNNNNNNNNNNNNJP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXTERNAL FUNCTION STUB FOR USxVNNNNNNNNNNNNNNNNN0/NNNNNNNNNNNNNNNNNNNNNNET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; IF RETURNED THEN HALg=NNNNNNNNNNNNNNNNN0hcNNNNNNNNNNNNNNNNNNNNN!F01100DCAFED5238E4280B11000EED52DA68 :1CEB480024EBC360EBE14D47CD60EC4CCD5BEC18CB2110F0CD12EE763EC321033A :1CEB6400EA3200002201%NNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNN97AB3CA7BECEB096E2600C921E9 :1CEC7C00010009C9218000229BEECDA1ED329DEE2102002298EE6C2296EE7D32B9 :1CEC98009AEE229EEE3E00180B21DBNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN14C3ECED0E0DCD03CE :1CEDB000EE0E0AC303EE79FE29DA11DC380EFE8D281FFE903806281CFE92281C2A :1CEDCC00C5213DF0CD12EEE17DCDA6EDCDACED]NNNNNNNNNNNNNNNN0HNNNNNNNNNNNNNNNNNNNNNNDC001000010443ED0000001A001A001A00004D000143ED0001001A001A00D4 :1CEEF8001A00004D00011A00030700F2003F00C00010000200000000001A001NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN0000 8NNNNNNNNNNNNNNNNN0$NNNNNNNNNNNNNNNNNNNNN!IS_ROM EQU DK_RNUM ;ROM # OF THIS ROM DSKBNK EQU 0FEH ;BANK # OF FLOPPY DISK CONTROLLERS BTENTS EQU 86H ;BOOT DIRECTORY VAL9'NNNNNNNNNNNNNNNNN0*+NNNNNNNNNNNNNNNNNNNNN!E DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A= FUNCTION # ; ;++++++++++NNNNNNNNNNNNNNNNN00PNNNNNNNNNNNNNNNNNNNNNNT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE B:XROM.Z80 SUBTTL INITIALIZATION CODE ;----NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"[)Ɔb0ˊh5юl: גrAܖxF⚰}K鞷R X'NNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN1pNNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------------------ ; ; THIS IS THE COLD START INIT CODE ; ;-----------NNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNN ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO ; LD A,(HL) ;IF BIT i4NNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNN************************************************** ; BMOVE: XRROM MF_BMOV RET ;++++++++++++++++++++++++++++++++++++++eNNNNNNNNNNNNNNNNNN1aNNNNNNNNNNNNNNNNNNNNNNL,FUNTABL ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; RESTORE ARGCNNNNNNNNNNNNNNNNN1:NNNNNNNNNNNNNNNNNNNNNNB ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++qnNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNNR BIOS ; LD A,C AND A,7 LD (DK_PROM),A ; ; EXTRACT DRIVE # FROM ARGUMENT ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR.NNNNNNNNNNNNNNNNNN1%zRNNNNNNNNNNNNNNNNNNNNNN------------------------------------ ; ; ABORT RETURNS CONTROL TO THE MONITOR ROM WITH ERROR FLAG (CF) SET ; ;--------------pNNNNNNNNNNNNNNNNN1+Y]NNNNNNNNNNNNNNNNNNNNNN;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DQERR: ; ; RESTORE PTRS ; LD HL,(IOPBPTwNNNNNNNNNNNNNNNNN1#NNNNNNNNNNNNNNNNNNNNN!----------------------------------------------------------------- ; ROM_INIT: ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSGNNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNN!7 = 1 THEN STOP INC HL RLCA JR NC,PRTA ; ; RESTORE & RETURN ; POP BC RET ;**********************************]KNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY BYTE FUNCTION ; ENTRY- E:HL= PTR TO LOCATION OF DATA ; EXIT NNNNNNNNNNNNNNNNN1LNNNNNNNNNNNNNNNNNNNNNNUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; DKRET: RET ; ; ; FUNCTION ERROR!NNNNNNNNNNNNNNNN1oNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++ ; ; RETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ; ;++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNN C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT ; LD A,B OR A,A JP NZ,ABORT ; ; SAVE DRIVE # AS LOGIN DRIVE FOR BIOS nNNNNNNNNNNNNNNNNNN1&/NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------- ; ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JP DKRET VNNNNNNNNNNNNNNNN1,NNNNNNNNNNNNNNNNNNNNNNR) LD DE,(IOPBPTR + 2) ; ; CALCULATE PTR TO STATUS ; LD A,PB_STATO ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; NNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNN ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' M5b Disk Driver V. ' PVERS VERSN DM CR,LF SUBTTL LOW MEMORY PROCEDNNNNNNNNNNNNNNNNN1 9NNNNNNNNNNNNNNNNNNNNNN****************************************** ; ; SETUP BANKS FOR BLOCK MOVE ; ENTRY- C= DESTINATION BANK ; B= SOURCE BANK ; BNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNN- A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETB: XRROM MF_GMEM RET BrNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNN! ; MFUNERR: LD A,-1 OR A,A RET ;############################################################################ ; ; R-NNNNNNNNNNNNNNNNN1\NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;------------------------------------------------NNNNNNNNNNNNNNNNNN1!NNNNNNNNNNNNNNNNNNNNN!; LD A,C LD (LOGINBYTE),A LD (DK_PROM + 1),A ; ; NOW VECTOR TO DISK BOOT ROUTINE ; CP A,4 ;IF 8" FLOPPY DISK THEN xNNNNNNNNNNNNNNNNN1'0NNNNNNNNNNNNNNNNNNNNN! ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB STATUS FOR ERROR FUNCTION 2 ; EriNNNNNNNNNNNNNNNN1-NNNNNNNNNNNNNNNNNNNNNN FETCH DATA ; CALL GETB ; ; RESTORE PTR ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) ; ; IF NO ERROR THEN RETURN IT `NNNNNNNNNNNNNNNNN1ONNNNNNNNNNNNNNNNNNNNNNURES ;**************************************************************************** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING OMINNNNNNNNNNNNNNNNN1 lNNNNNNNNNNNNNNNNNNNNNNEXIT - AF=BC=DE=HL= ? ; ;**************************************************************************** ; BNKSEL: XRROM MF_S1-NNNNNNNNNNNNNNNNN12NNNNNNNNNNNNNNNNNNNNN! SUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EaVNNNNNNNNNNNNNNNN1*NNNNNNNNNNNNNNNNNNNNNNMONITOR FUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RETVE] NNNNNNNNNNNNNNNNN1_NNNNNNNNNNNNNNNNNNNNNN---------------------------- ; ; BOOT DISK FUNCTION #1 ; ENTRY- B= DRIVE # ; 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD WNNNNNNNNNNNNNNNNN1"NNNNNNNNNNNNNNNNNNNNNNEXIT JP C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JP C,H8BOOT ; CP A,0CH ;IF 5" FLOPPY THEN EXIT JP C,F5BOOT ; poNNNNNNNNNNNNNNNNN1( NNNNNNNNNNNNNNNNNNNNNNNTRY- E:HL= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; TST_PB: ; ; SET I$NNNNNNNNNNNNNNNNN1.NNNNNNNNNNNNNNNNNNNNNN; OR A,A RET Z ; ; ELSE FALL INTO ERROR OUTPUT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ߍNNNNNNNNNNNNNNNNN1|NNNNNNNNNNNNNNNNNNNNNNNTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;****NNNNNNNNNNNNNNNNN1 _NNNNNNNNNNNNNNNNNNNNNNBNK RET ;**************************************************************************** ; ; PERFORM BANKED MEMORY BLOCK MZBNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNNTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS NNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNRS ;0: RETURN ROM VERSION DW MBOOT ;1: BOOT DISK WITH ARGUMENT IN BC DW TST_PB ;2: TEST IOPB STATUS FOR ERROR ; E:HLNNNNNNNNNNNNNNNNNN1nNNNNNNNNNNNNNNNNNNNNNNDISK (ISHA) ; 8..B = 5" JADE FLOPPY ; C..F = 5" HARD DISK ; 10..13 = 8" MICROMATION (INTEL M2FM) ; 14..17 = 3"NNNNNNNNNNNNNNNNN1#NNNNNNNNNNNNNNNNNNNNNNCP A,10H ;IF 5" HARD DISK THEN EXIT JP C,H5BOOT ; CP A,14H ;IF MICROMATION THEN EXIT JP C,M8BOOT ; CP A,18H ;IF 3" }NNNNNNNNNNNNNNNN1)??NNNNNNNNNNNNNNNNNNNNNNOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO LOCAL FUNCTION ; ;+++++++++++++++++++++++++++rNNNNNNNNNNNNNNNN1/NNNNNNNNNNNNNNNNNNNNNN++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION 3 ; ENTRY- E:HL= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++QHNNNNNNNNNNNNNNNNN1)NNNNNNNNNNNNNNNNNNNNNN************************************************************************ ; PUTS: PRTS: ; ; SAVE REGISTER ; PUSH BC ; `rNNNNNNNNNNNNNNNNN1 ,NNNNNNNNNNNNNNNNNNNNNNOVE ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - AF=BC=DE=HL= ? ; ;**************************NNNNNNNNNNNNNNNN1PNNNNNNNNNNNNNNNNNNNNNN JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HrNNNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNN= PTR TO IOPB DW DIS_PB ;3: DISPLAY IOPB DATA ; E:HL= PTR TO IOPB DW EX_IOPB ;4: EXECUTE IOPB ; E:HL= PTR TO IOPNNNNNNNNNNNNNNNNN1=NNNNNNNNNNNNNNNNNNNNNN JADE FLOPPY ; ;---------------------------------------------------------------------------- ; MBOOT: ; ; SAVE PROM # FO%NNNNNNNNNNNNNNNN1$IcNNNNNNNNNNNNNNNNNNNNNNFLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; ;----------------------------------------1NNNNNNNNNNNNNNNNN1*jlNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB STATUS FOR ERROR FUNCTION 2 ; ENTRY- (IOPBPTR)= IOPB PTR ; #NNNNNNNNNNNNNNNNN10NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++ ; DIS_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO>rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺X%[)Ŋb/ˎh5ђo= ږvD|I垲M袶R!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN1@NNNNNNNNNNNNNNNNNNNNNN DISPLAY ROUTINE ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA F{_NNNNNNNNNNNNNNNNN1-NNNNNNNNNNNNNNNNNNNNNNALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++4NNNNNNNNNNNNNNNNN1 -NNNNNNNNNNNNNNNNNNNNNN FETCH DRIVE # ; LD HL,(IOPBPTR) INC HL LD A,(HL) ; ; IF JADE 8" FLOPPY THEN GO EXECUTE IT ; SUB A,4 JP C,JADE8 NNNNNNNNNNNNNNNNN1QNNNNNNNNNNNNNNNNNNNNNN************************************ ; ; COMMON ERROR CODE ; EXIT - AF= -2 ; ;*********************************************NNNNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNNTHE CONTROLLER TO READ THE BIOS FROM THE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOS. ; ;++++++++++++++++++++++++++ʜNNNNNNNNNNNNNNNN1HNNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNN LD HL,(DEFBFR + BD_SIOSS) LD A,H LD H,0 LD (IOPB + PB_SECO),HL LD L,A LD (IOPB + PB_TRKO),HL ; ; READ 1ST BIOS S5NNNNNNNNNNNNNNNNNNN1&1NNNNNNNNNNNNNNNNNNNNNNTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROM 8 JP DKRET ENDIF ;+++++++++++++++++++++++HBNNNNNNNNNNNNNNNN1,NNNNNNNNNNNNNNNNNNNNN!PBPTR) INC HL LD (HL),B ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++eWHNNNNNNNNNNNNNNNNN1"NNNNNNNNNNNNNNNNNNNNNNR: ; ; DISPLAY HEADER ; LD HL,DERM CALL PUTS ; ; DISPLAY IOPB DATA ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) LD ^rNNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EX_IOPB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL !NNNNNNNNNNNNNNNNNN1ONNNNNNNNNNNNNNNNNNNNN!T ; SUB A,4 JP C,JADE5 ; ; ELSE IF SASI 5" THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX5 ; ; ELSE FALL INTO SELECT NdNNNNNNNNNNNNNNNNN1HNNNNNNNNNNNNNNNNNNNNNN*********************** ; ; CONTROLLER NOT SENSED ERROR ; EXIT - AF= -2 ; (IOPB.PB_STAT)= CONTROLLER NOT PRESENT ERROR ; NNNNNNNNNNNNNNNN1kNNNNNNNNNNNNNNNNNNNNNN LD HL,IOPB LD (IOPBPTR),HL LD A,(CURBNK) LD (IOPBPTR + 2),A CALL JADEX8 CALL DQERR JP NZ,ABORT ; ; PREPARE IOP7NNNNNNNNNNNNNNNNN1!NNNNNNNNNNNNNNNNNNNNN!ECTOR INTO BUFFER ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1SX0NNNNNNNNNNNNNNNNN1'+NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; ̌HNNNNNNNNNNNNNNNNN1-NNNNNNNNNNNNNNNNNNNNNN++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK READ IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ANNNNNNNNNNNNNNNNNN1xNNNNNNNNNNNNNNNNNNNNNNB,PB_SIZE ; DBTE1: PUSH DE PUSH HL CALL GETB ; CALL HTOA ; CALL SPACE ;DISPLAY SEPARATOR ; POP HL POP DE INCcNNNNNNNNNNNNNNNNN1 [NNNNNNNNNNNNNNNNNNNNNN LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISK EXECUTER FUNCTION ; ;+++++++++++++++++++++++++++++++++++++++++++++++++]$NNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNERROR ; ;**************************************************************************** ; ; ILLEGAL DRIVE REQUESTED ; EXINNNNNNNNNNNNNNNNNNNNN! A= DRIVE# -4 ; EXIT - AF= 0: NO ERRORS ; C= CONTROLLER PORT ADDRESS ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN1.NNNNNNNNNNNNNNNNNNNNNN,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX8R: LD HL,0 LD (IOPB ZNNNNNNNNNNNNNNNNN1KNNNNNNNNNNNNNNNNNNNNNN HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ; CALL SPACE CALL SPACE ;OUTPUT PORT # CNNNNNNNNNNNNNNNNN1 hNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ;NNNNNNNNNNNNNNNNN13NNNNNNNNNNNNNNNNNNNNNNT - AF= -2 ; (IOPB.PB_STAT)= ILLEGAL COMMAND ERROR ; ;**********************************************************************mlNNNNNNNNNNNNNNNN1.NNNNNNNNNNNNNNNNNNNNN! SUBTTL JADE 5" & 8" FLOPPY CONTROLLER DRIVER ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@BNNNNNNNNNNNNNNNNN1^NNNNNNNNNNNNNNNNNNNNNNIOPB + PB_SECO),A ; ; LOG ON DRIVE ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; READ THE DIRECTORY SECTOR ; LDH=NNNNNNNNNNNNNNNNN1#NNNNNNNNNNNNNNNNNNNNN!IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP LOAD ADDRESS LD DE,(IOPB + PF NNNNNNNNNNNNNNNN1)NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 5" ENTRY ; JADE5: LD C,DD_PRT5 JP JADEC ; ; ; JADE 8" ENTRY >NNNNNNNNNNNNNNNNN1/NNNNNNNNNNNNNNNNNNNNNN+ PB_BCNTO),HL ; ; FALL INTO LOCAL READ FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNN!LD A,(DDPORT) CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE LD A,(DDADDR + 1) CALL HTOA LD A,(DDADDR) C]9NNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNN! ; A,BC,BC',HL,HL',DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DSKX: ; ; [NNNNNNNNNNNNNNNNN1`NNNNNNNNNNNNNNNNNNNNN!****** ; JSELERR: LD (IX + PB_STATO),PB_ILCMD ; ; FALL INTO DISK ERROR ; ;****************************************ʅNNNNNNNNNNNNNNNNNN1>NNNNNNNNNNNNNNNNNNNNNN+ ; ; 8" JADE FLOPPY BOOT ; THIS ROUTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODE WILL COMMAND 4!NNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNN A,BD_SEC LD (IOPB + PB_SECO),A LD A,PB_READC LD (IOPB + PB_CMDO),A CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; IJNNNNNNNNNNNNNNNNNN1$~SNNNNNNNNNNNNNNNNNNNNNNB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF --COUNT != 0 THEN REPEAT DEC (HL) JR NZ,JADRDB iu$NNNNNNNNNNNNNNNNN1*]\NNNNNNNNNNNNNNNNNNNNNN; JADE8: LD C,DD_PRT8 ; ; COMMON INITIAL CODE ; JADEC: ADD A,4 ;BIAS DRIVE BACK UP LD B,A ; LD A,(HL) ;SAVE CURRYE$NNNNNNNNNNNNNNNNNN10NNNNNNNNNNNNNNNNNNNNNN++++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; TNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"X&†_-Ȋf4Ўk9Ւq? ږxFᚯ|J垳P뢺V$NNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN2+NNNNNNNNNNNNNNNNNNNNNNA,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX8: LD C,DD_PRT8 ; ; {uNNNNNNNNNNNNNNNN2 NNNNNNNNNNNNNNNNNNNNNN LD H,A LD L,0 LD (DDADDR),HL LD A,(CURBNK) LD (DDADDR + 2),A ; ; SETUP IOPB PTR ; LD HL,(IOPBPTR) PUSH IX 6rNNNNNNNNNNNNNNNNN2 nNNNNNNNNNNNNNNNNNNNNN!P NZ,JXERR ; ; DOWNLOAD SECTOR DATA TO CONTROLLER ; JDOWN: ; ; OPEN WINDOW TO SECTOR BUFFER ; PUSH BC ;SAVE COUNT rNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNNNTO ;ONLY XFER PERTINENT BYTES CALL BMOVE ; ; EXECUTE THE COMMAND ; LD A,DD_EXC ;START COMMAND ; JDOCMD: CALL JWAIT ;`NNNNNNNNNNNNNNNN2vNNNNNNNNNNNNNNNNNNNNNNOURCES WITHOUT INTERRUPT OUT (C),A LD A,DD_MB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; ; FETCH DESTINATION )&NNNNNNNNNNNNNNNN2 NNNNNNNNNNNNNNNNNNNNN!RT) OUT (C),A ; ; CHECK FOR ERROR ; LD A,(IX + PB_STATO) OR A,A ; ; DONE ; POP IX RET ; ; ; SECTOR SIZE/rNNNNNNNNNNNNNNNNN2%NNNNNNNNNNNNNNNNNNNNNN (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TIMOUT LD DE,0 ; JWAIT1: DEC DE ;IF NOT TIMOA*NNNNNNNNNNNNNNNNN2+NNNNNNNNNNNNNNNNNNNNNN DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;+++++U'NNNNNNNNNNNNNNNNN2~NNNNNNNNNNNNNNNNNNNNNNFALL INTO JADE EXECUTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE uNNNNNNNNNNNNNNNNN24NNNNNNNNNNNNNNNNNNNNN!LD IX,(IOPBPTR) ; ; IF COMMAND == CLEAR THEN EXIT ; LD A,(IX + PB_CMDO) CP A,PB_CLRC JP NZ,JNOCLR8 ; ; IF ALL DRI$NNNNNNNNNNNNNNNNN2;NNNNNNNNNNNNNNNNNNNNNN LD BC,(DDPORT) LD A,DD_MB1 OUT (C),A PUSH HL ;SAVE SRC PTR ; LD B,(IX + PB_DMAXO) ;SET BANKS LD C,DSKBNK CALL BN~NNNNNNNNNNNNNNNN2*NNNNNNNNNNNNNNNNNNNNNNWAIT FOR COMPLETION JP NZ,JERET ;IF ERROR THEN RETURN ERROR ; ; COMMAND EXECUTED, XFER RESULTS FUNCTION ; SELECT COMMANNNNNNNNNNNNNNNNN2%NNNNNNNNNNNNNNNNNNNNNNADDRESS ; LD E,(IX + PB_DMAO) LD D,(IX + PB_DMAO + 1) ; ; FETCH XFER COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BC&NNNNNNNNNNNNNNNNN2 {NNNNNNNNNNNNNNNNNNNNN! TOO BIG ERROR ; JXERR: LD (IX + PB_STATO),PB_BADPB ;PASS BACK ERROR JR JDONE ; ; ; RETURN ERROR STATUS EXIT ; ENTRYLNNNNNNNNNNNNNNNNNNN2&NNNNNNNNNNNNNNNNNNNNN!UT THEN CONTINUE TO WAIT LD A,E OR A,D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THEN RETURN TO MONITOR OR A,L JP Z,DSKERR,NNNNNNNNNNNNNNNNN2,[NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F3BOOT: EQU ABORT ;UNSUPPORTED SUBTTL MICROMATvNNNNNNNNNNNNNNNN2MNNNNNNNNNNNNNNNNNNNNNNJADE FLOPPY DISK IOPB COMMON FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; C= CONTROLLER PORT ADDRESS ; EXIT - AF= 0: NO ERROR׭NNNNNNNNNNNNNNNNN2 NNNNNNNNNNNNNNNNNNNNNNVES THEN HARD RESET ; LD A,(IX + PB_DRVO) INC A JP NZ,JNOCLR8 ; LD A,DD_BGN JR JDOCMD ; ; ; FETCH SOURCE ADDRES NNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNN!KSEL ; POP HL ;SRC PTR POP BC ;COUNT LD DE,(DDADDR) ;DEST PTR CALL BMOVE ; ; EXECUTE THE COMMAND ; JEX: ; ; !NNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNN!D BLOCK WINDOW ; LD BC,(DDPORT) LD A,DD_MB0 OUT (C),A ; ; XFER IOPB STATUS TO HOST ; LD BC,(IOPBPTR + 2) ;SET BANKRNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNNNTO + 1) ; ; IF COUNT == 0 THEN NO UPLOAD ; LD A,C OR A,B JR Z,JDONE ; ; ELSE IF COUNT < 1024 THEN UPLOAD SECTOR rNNNNNNNNNNNNNNNNN2!-JNNNNNNNNNNNNNNNNNNNNNN- A= ERROR CODE ; JERET: LD (IX + PB_STATO),A JR JDONE ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++yNNNNNNNNNNNNNNNNN2'NNNNNNNNNNNNNNNNNNNNN! ; JWAIT2: IN A,(C) ;IF NOT DONE THEN WAIT AND A,DD_SHLT JR NZ,JWAIT1 ; RET ;RETURN ZF IF ($ AND 7FFFH) >= (HNNNNNNNNNNNNNNNNN2-h'NNNNNNNNNNNNNNNNNNNNNNION 8" FLOPPY DISK DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" MICROMATION M2NNNNNNNNNNNNNNNN2YNNNNNNNNNNNNNNNNNNNNN!S ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX: ; ; SAVE POR|@yNNNNNNNNNNNNNNNNN2 VNNNNNNNNNNNNNNNNNNNNNNS FROM IOPB ; JNOCLR8: LD L,(IX + PB_DMAO) LD H,(IX + PB_DMAO + 1) ; ; FETCH COUNT ; LD C,(IX + PB_BCNTO) LD B,(INNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNN OPEN WINDOW TO COMMAND BUFFER ; LD BC,(DDPORT) ;FETCH PORT # LD A,DD_MB0 ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C)zNNNNNNNNNNNNNNNNN2HNNNNNNNNNNNNNNNNNNNNN!S LD B,DSKBNK CALL BNKSEL ; LD HL,(DDADDR) LD DE,DD_CBO + PB_BCNTO ADD HL,DE ; EX DE,HL LD HL,(IOPBPTR) LD BC,MNNNNNNNNNNNNNNNNNN2^NNNNNNNNNNNNNNNNNNNNN!DATA ; LD A,B CP A,4 JP C,JXUP ; ; ELSE IF COUNT > 1024 THEN ERROR ; LD A,C OR A,A JR NZ,JXERR ; ; UPLOAD NNNNNNNNNNNNNNNNNNN2"xNNNNNNNNNNNNNNNNNNNNNN+++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; EXIT - AF= 0: OK, /0: ERROR ; C= P_NNNNNNNNNNNNNNNNN2(NNNNNNNNNNNNNNNNNNNNN!0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL JADE 5" FLOPPY DISK DRIVER ;+ NNNNNNNNNNNNNNNN2.=tNNNNNNNNNNNNNNNNNNNNNNFM BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M8BOOT: EQU ABORT ;UNSUPPORTED NNNNNNNNNNNNNNNNN2hNNNNNNNNNNNNNNNNNNNNNNT # ; LD A,C LD (DDPORT),A ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(C) INC A ;0FFH IF NOT THERE JP Z,JCNP ; ;"rNNNNNNNNNNNNNNNNN2 gNNNNNNNNNNNNNNNNNNNNN!X + PB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO DOWNLOAD ; LD A,C OR A,B JR Z,JEX ; ; ELSE IF COUNT < 1024 THEN DOWNLf1NNNNNNNNNNNNNNNN2(NNNNNNNNNNNNNNNNNNNNNN,A ; ; XFER THE IOPB TO THE CONTROLLER ; LD A,(IOPBPTR + 2) ;SET SRC BANK LD B,A LD C,DSKBNK CALL BNKSEL ; LD HLCNNNNNNNNNNNNNNNNN2yNNNNNNNNNNNNNNNNNNNNNNPB_BCNTO ADD HL,BC EX DE,HL ; LD BC,PB_SIZE - PB_BCNTO ; CALL BMOVE ; ; IF UPLOAD INHIBITED THEN SKIP IT ; BIT qNNNNNNNNNNNNNNNN2mNNNNNNNNNNNNNNNNNNNNNNSECTOR DATA ; JXUP: PUSH DE ;DEST PTR PUSH BC ;BYTE CNT ; LD C,(IX + PB_DMAXO) LD B,DSKBNK CALL BNKSEL ; POP BC NNNNNNNNNNNNNNNNN2#K(NNNNNNNNNNNNNNNNNNNNNNORT # OF CONTROLLER ; DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JWAIT: ;PNNNNNNNNNNNNNNNNN2)NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++++++"NNNNNNNNNNNNNNNNN2/ENNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIVER ; ;++++++++++++++++++[NNNNNNNNNNNNNNNNNN2;NNNNNNNNNNNNNNNNNNNNNN COMPUTE JADE CONTROLLER BASE ADDRESS ; DEC A ;FETCH ADDRESS SELECT SWITCH DATA AND A,DD_SASW RLCA OR A,HIGH DD_BASENNNNNNNNNNNNNNNN2 ]NNNNNNNNNNNNNNNNNNNNNNOAD DATA ; LD A,B CP A,4 JR C,JDOWN ; ; ELSE IF COUNT > 1024 THEN ERROR, SECTOR SIZE TOO BIG ; LD A,C OR A,A JKNNNNNNNNNNNNNNNN2}NNNNNNNNNNNNNNNNNNNNNN,(DDADDR) ;COMPUTE DEST PTR LD DE,DD_CBO ADD HL,DE EX DE,HL ; LD HL,(IOPBPTR) ;SRC PTR = IOPB ADDRESS ; LD BC,PB_STANNNNNNNNNNNNNNNNNN2GNNNNNNNNNNNNNNNNNNNNNNPB_INHX,(IX + PB_FLGO) JR NZ,JDONE ; ; XFER SECTOR DATA FROM CONTROLLER ; LD BC,(DDPORT) LD A,DD_MB0 ;SOFTLY GRAB RESNNNNNNNNNNNNNNNNN28NNNNNNNNNNNNNNNNNNNNN! ;BYTE CNT POP DE ;DEST PTR LD HL,(DDADDR) CALL BMOVE ; ; RELEASE IOPB WINDOW ; JDONE: LD A,DD_FREE LD BC,(DDPO7NNNNNNNNNNNNNNNNN2$ҿNNNNNNNNNNNNNNNNNNNNNN ; ISSUE PASSED COMMAND ; LD BC,(DDPORT) OUT (C),A ; ; PAUSE A WHILE FOR CONTROLLER TO CATCH UP ; EX (SP),HL EXgoNNNNNNNNNNNNNNNNN2*NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F5BOOT: EQU ABORT ;UNSUPPORTED SUBTTL JADE 3" FLOPPY DISKNNNNNNNNNNNNNNNNN20NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M2X: EQU DSKERR SUBTTL ISHA 5" & 8" HARD DISK DRIVER ;****89NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN끹U"X&^,Ȏd1͒h6Җo= ؚtBߞ|J梵Q nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNN************************************************************************ ; ; Hard disk boot function. ; This module reads the1NNNNNNNNNNNNNNNN2:NNNNNNNNNNNNNNNNNNNNNN..7 -> 0..3 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 LD (IOPB + PB_DRVO),A ; ; COMPUTP$NNNNNNNNNNNNNNNN2 YNNNNNNNNNNNNNNNNNNNNNN FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; PROCESS SECTOwNNNNNNNNNNNNNNNNN2yNNNNNNNNNNNNNNNNNNNNNNSLN),A JR NZ,HDRDLP IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BNNNNNNNNNNNNNNNNNN2FNNNNNNNNNNNNNNNNNNNNNN,A ; ; SET ID SECTOR FOR LOGIN ; LD A,ID_SECT ADD A,B LD (IOPB + PB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IONNNNNNNNNNNNNNNN2 4..7 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; PUSH AF ;BIAS DRIV]NNNNNNNNNNNNNNNNN2iNNNNNNNNNNNNNNNNNNNNNNE SECTOR SIZE ; LD A,(DEFBFR + ID_SSZ0O) EXX LD HL,128 ; OR A,A HBTSSZ: JR Z,GOTSSZ ; ADD HL,HL DEC A JR HBTSS#6NNNNNNNNNNNNNNNNN2"O)NNNNNNNNNNNNNNNNNNNNNNL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOOHINNNNNNNNNNNNNNNNN2(NNNNNNNNNNNNNNNNNNNNN! 8 JP DKRET ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF ;++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN2. DNNNNNNNNNNNNNNNNNNNNN!EFBFR LD DE,(DEFBFR + 1) LD D,A ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL)āNNNNNNNNNNNNNNNN2XNNNNNNNNNNNNNNNNNNNNN!LD A,(CURBNK) LD (IOPBPTR + 2),A ; CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; SET UP IOPB IN RAM ; kNNNNNNNNNNNNNNNNN2 WNNNNNNNNNNNNNNNNNNNNNNMDO),PB_READC ; EXX LD A,B EXX LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB*NNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNNKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS pNNNNNNNNNNNNNNNN2INNNNNNNNNNNNNNNNNNNNNNE UP ADD A,0CH ;ISHA5 - DRVPRT AND A,0FH LD (IOPB + PB_DRVO),A POP AF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; AD$NNNNNNNNNNNNNNNNNN2ZNNNNNNNNNNNNNNNNNNNNNNZ ; ; ; SECTOR SIZE COMPUTED IN HL ; GOTSSZ: EXX ;SAVE IN ALT REG ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PFNNNNNNNNNNNNNNNNN2#|NNNNNNNNNNNNNNNNNNNNNNS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL SETBIOPB ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP5KNNNNNNNNNNNNNNNNN2)NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++ ; ; SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; HL'= SECTORNNNNNNNNNNNNNNNNN2/9uNNNNNNNNNNNNNNNNNNNNNN ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MNNNNNNNNNNNNNNNNN2 NNNNNNNNNNNNNNNNNNNNNN LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,(LOGINBYTE) ;COMPUTE & SET DRIVE SUB A,4 ;8" = 4NNNNNNNNNNNNNNNNN2 jNNNNNNNNNNNNNNNNNNNNNN + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFONNNNNNNNNNNNNNNN2JNNNNNNNNNNNNNNNNNNNNNNLD DE,(IOPB + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIO&DNNNNNNNNNNNNNNNNN2wNNNNNNNNNNNNNNNNNNNNNND A,A ;UPPER NIBBLE = HEAD ADD A,A AND A,0C0H ;MASK OFF UNUSED BITS EXX ;SAVE SECTOR OFFSET IN B' FOR LATER USE LD BONNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNNB_CMDO),PB_READC ; EXX ;FETCH LOGICAL DRIVE HEAD # LD A,B EXX ; LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LDGdNNNNNNNNNNNNNNNN2$NNNNNNNNNNNNNNNNNNNNNN: CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,GNNNNNNNNNNNNNNNNN2*ƀNNNNNNNNNNNNNNNNNNNNNN BYTE COUNT {128, 256, 512, 1024} ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++1#NNNNNNNNNNNNNNNNN20*8NNNNNNNNNNNNNNNNNNNNNNOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR POP BC ;SECTOR SIZE LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (Y dNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"[)ņb/̊h6Ҏm; גtBޖzI暴QힻW&\*NNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN3]NNNNNNNNNNNNNNNNNNNNNNIOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; INC (IX + PB_SECO) ;NEXT SECTOR ; ; COMPUTE SECTOR COUNT FROM LENGTH ; EXNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++ ; ISHAX8: ; ADD A,4 ;RESTORE DRIVE TO {0..3} ; ; COMMON ISHAX CODE ; ISHAXC: LD B,A LD A,xNNNNNNNNNNNNNNNN3 uNNNNNNNNNNNNNNNNNNNNNN - AF= 0: NO ERRORS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISHAX: ; ; CHECK FrNNNNNNNNNNNNNNNNN38 NNNNNNNNNNNNNNNNNNNNNNSH_CMD),A CALL HWBUSY ; LD A,(CURBNK) OUT (ISH_DATA),A LD A,ISH_SPBX OUT (ISH_CMD),A CALL HWBUSY ; ; OUTPUT THENNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN OUT (ISH_CMD),A XOR A,A OUT (ISH_CMD),A ; CLRWT: IN A,(ISH_STATUS) ;WAIT FOR CONTROLLER READY BIT ISH_BSYB,A JR NZ,IyNNNNNNNNNNNNNNNNN3}dNNNNNNNNNNNNNNNNNNNNNN**************************************************************************** ; HWBUSY: ; ; IF CONTROLLER BUSY THEN WAIT ;29NNNNNNNNNNNNNNNNN3%:NNNNNNNNNNNNNNNNNNNNNN HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENNNNNNNNNNNNNNNNN3+5NNNNNNNNNNNNNNNNNNNNNNERROR ; OR A,A RET ;**************************************************************************** ; ; INITIALIZE THE @NNNNNNNNNNNNNNNNNN3KNNNNNNNNNNNNNNNNNNNNNNX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; XOR A,A ;COUNT = 0 ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LEN_LP: SBC HL,vNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN(HL) ;SAVE DRIVE ARG FROM IOPB LD (HL),B ;CONVERT TO CONTROLLER DRIVES PUSH AF CALL ISHAX POP BC ;RESTORE DRIVE ARG 5NNNNNNNNNNNNNNNN3M&NNNNNNNNNNNNNNNNNNNNNNOR CONTROLLER PRESENT ; IN A,(ISH_STATUS) INC A JP Z,JCNP ; ; SET UP IOPB PTR ; PUSH IX LD IX,(IOPBPTR) ; ; fNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN EXECUTE IOPB COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD),A CALL HWBUSY ; ; RETURN THE ERROR STATUS ; HDONE: LD A,(IX +NNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNCLRWT ; LD HL,0 ;DELAY A WHILE IN CASE ISHA FOOLING WITH STATUS PORT ; ISHA2: DEC HL LD A,H OR A,L JR NZ,ISHA2 ; I.$NNNNNNNNNNNNNNNNN3 hNNNNNNNNNNNNNNNNNNNNNN IN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,HWBUSY ; ; ELSE RETURN ZF ; RET ;+++++++++++++++++++++++++++++++++++++٫NNNNNNNNNNNNNNNNN3&iNNNNNNNNNNNNNNNNNNNNNNGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD !!NNNNNNNNNNNNNNNN3,-NNNNNNNNNNNNNNNNNNNNNNIOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;***********************************s NNNNNNNNNNNNNNNNN3;zNNNNNNNNNNNNNNNNNNNNNNDE JR C,LEN_OK ; INC A JP LEN_LP ; ; ; SECTOR COUNT IN A ; LEN_OK: DEC A ;ALREADY HAVE 1ST SECTOR ; ; SAVE|NNNNNNNNNNNNNNNN3 ԱNNNNNNNNNNNNNNNNNNNNNN LD HL,(IOPBPTR) INC HL LD (HL),B RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ (yNNNNNNNNNNNNNNNN3~NNNNNNNNNNNNNNNNNNNNNNIF CONTROLLER IS BUSY THEN CLEAR IT FIRST ; DEC A ;RESTORE STATUS BIT ISH_BSYB,A ;TEST BUSY JR NZ,ISHUNG ; ; IF COMM8NNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN PB_STATO) OR A,A POP IX RET ; ; ; CONTROLLER BUSY UPON ENTRY- CLEAR CONTROLLER FIRST ; ISHUNG: CALL ISHACC ;HARD >NNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; IF NO ERRORS THEN RETURN 0 ; ANDNNNNNNNNNNNNNNNNN3![NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++ ; ; COMMON SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; EXIT -NNNNNNNNNNNNNNNN3'XNNNNNNNNNNNNNNNNNNNNNNHL,DEFBFR LD BC,(IOPB + PB_BCNTO) ;USE COUNT ACTUALLY READ LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO)?NNNNNNNNNNNNNNNN3-NNNNNNNNNNNNNNNNNNNNNN***************************************** ; IIOPB: ; ; MOVE THE IOPB ; LD DE,IOPB LD BC,PB_SIZE LDIR RET SUBNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A RET ;++++++++++++++++++++++++++++++++++++++rNNNNNNNNNNNNNNNN3 NNNNNNNNNNNNNNNNNNNNNN; ; ISHA 5" DRIVER ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; BC= SECTOR ; ;+++++++++++++++++++++++++++YWNNNNNNNNNNNNNNNNN3mZNNNNNNNNNNNNNNNNNNNNNNAND == CLEAR THEN GO DO IT ; ISHANH: LD A,(IX + PB_CMDO) CP A,PB_CLRC JR Z,ISHACLR ; ; COMMON CODE ; ISHAC: ; ; `NNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNRESET CONTROLLER TO GET ITS ATTENTION RET NZ ;IF ERROR THEN RETURN IT ; PUSH IX ;ELSE RESTORE IOPB PTR & CONTINUE COMMANDBNNNNNNNNNNNNNNNN3(7NNNNNNNNNNNNNNNNNNNNNN A,(1 SHL ISH_ERRB) OR (1 SHL ISH_FERB) LD (IX + PB_STATO),A JR Z,HDONE ; ; ERROR ENCOUNTERED, RETURN FIRMWARE ERROR ; oNNNNNNNNNNNNNNNNN3"NNNNNNNNNNNNNNNNNNNNNN CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; STUPBIOS: ; !NNNNNNNNNNNNNNNNNN3(fNNNNNNNNNNNNNNNNNNNNNN,DE ;SET UP NEW DMA ADDRESS ; LD HL,IOPB + PB_SECO ;NEXT SECTOR INC (HL) ; ; COMPUTE SECTOR COUNT FROM LENGTH ; LD HNNNNNNNNNNNNNNNNN3.KNNNNNNNNNNNNNNNNNNNNNNBTTL ASCII CHAR ROUTINES ;**************************************************************************** ; ; DISPLAY BYTE ON SYcNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++ ; ; ISHA 8" DRIVE HARD DISK DRIVER ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; HL= IOPB.PB_DR:[NNNNNNNNNNNNNNNNN3 NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++ ; ISHAX5: ; ADD A,8 ;BIAS BACK TO 5..7 JP ISHAXC ;+++++++++++++++Q7NNNNNNNNNNNNNNNNN3^kNNNNNNNNNNNNNNNNNNNNNNPUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; LD BC,(IOPBPTR) ; ; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LbNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN LD IX,(IOPBPTR) JR ISHANH ; ; ; CLEAR COMMAND ; ISHACLR: ; ; IF NOT ALL DRIVES THEN EXECUTE NORMALLY ; LD A,(ISZNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN IN A,(ISH_DATA) LD (IX + PB_STATO),A ;RETURN NO ERRORS FOR NOW JR HDONE ;********************************************9rNNNNNNNNNNNNNNNNN3#=NNNNNNNNNNNNNNNNNNNNNN ; FETCH BIOS LOAD PARAMETER OFFSET FROM LO BYTE OF COLD START JUMP ADDRESS ; LD A,(DEFBFR + 1) ; ; IF NOT IN 1ST 128 BM'NNNNNNNNNNNNNNNNN3)WNNNNNNNNNNNNNNNNNNNNN!L,(BIOSLN) ;COMPUTE # SECTORS LD DE,(IOPB + PB_BCNTO) ;USE BYTES READ XOR A,A ; BUMP: INC A SBC HL,DE ;KEEP SUBTRACTINGNNNNNNNNNNNNNNNNN3/xNNNNNNNNNNNNNNNNNNNNNNSTEM CONSOLE PROCEDURE ; ENTRY- A= BINARY ; ;**************************************************************************** ; NNNNNNNNNNNNNNNNN3ďNNNNNNNNNNNNNNNNNNNNNNV PTR ; A= BASE DRIVE # -4 ; EXIT - AF= 0: NO ERRORS ; HL=BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN3 +DNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON ISHA DRIVER ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXITNNNNNNNNNNNNNNNN3 8NNNNNNNNNNNNNNNNNNNNNND A,C OUT (ISH_DATA),A LD A,ISH_SPBL OUT (ISH_CMD),A CALL HWBUSY ; LD A,B OUT (ISH_DATA),A LD A,ISH_SPBH OUT (Is$NNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNX + PB_DRVO) INC A JR NZ,ISHAC ; ; ELSE RESET THE CONTROLLER ; ISHACC: LD A,1 SHL ISH_RESB ;ISSUE CONTROLLER RESET O!NNNNNNNNNNNNNNNN3NUNNNNNNNNNNNNNNNNNNNNNN******************************** ; ; HWBUSY SUBR WAITS UNTIL HOST ADAPTOR GOES NOT BUSY ; EXIT - A= STATUS ; ZF= TRUE ; ;NNNNNNNNNNNNNNNNN3$ NNNNNNNNNNNNNNNNNNNNNNYTES THEN RETURN ERROR ; CP A,128 CCF RET C ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD E,A LD D,0 ADDrNNNNNNNNNNNNNNNNN3*NNNNNNNNNNNNNNNNNNNNNN UNTIL UNDERFLOW JR Z,NOBUMP JR NC,BUMP ; NOBUMP: ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO NNNNNNNNNNNNNNNNN30kNNNNNNNNNNNNNNNNNNNNNN HTOA: LD C,A XDROM MF_PHXB ; ; DONE ; RET ;********************************************************************VNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN큻W%^-Ȋd2Ύj8Ԓp? ږvD|J枴P뢹U#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN3j(NNNNNNNNNNNNNNNNNNNNNN******** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;******************************************************n.NNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN################## ; ; MESSAGES ; ;############################################################################ ; DERM: jN9NNNNNNNNNNNNNNNNN3 /ENNNNNNNNNNNNNNNNNNNNNNBFR ;DMA DB 0 ;DMA BANK DW 0 ;XFER COUNT DB 0,0,0,0 ;STATUS, RESULTS IF ($ - PROMST) > PROMSIZ CONMSG **** ER&HNNNNNNNNNNNNNNNNN39NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3JTNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3% NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3?{NNNNNNNNNNNNNNNNNNNNNN********************** ; CO: XCROM MF_CO ; ; DONE ; RET ;********************************************************kNNNNNNNNNNNNNNNNN3аNNNNNNNNNNNNNNNNNNNNNNDB CR,LF,'Disk Error! IOPB data:' DB CR,LF DB 'CM DR TL TH SL SH FG AL AH AX CL CH ST R1 R2 R3 PT CA' DM CR,LF ;###sNNNNNNNNNNNNNNNNNN3zNNNNNNNNNNNNNNNNNNNNNNROR! Code Too Large for PROM! **** ENDIF END NNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3 _NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3&YNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3 JNNNNNNNNNNNNNNNNNNNNNN******************** ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;*************************************************************NNNNNNNNNNNNNNNNN3 NNNNNNNNNNNNNNNNNNNNNN######################################################################### ; ; LOGIN IOPB ; ;################################ NNNNNNNNNNNNNNNNN3I'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3!lNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3'hNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3-)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN*************** ; CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;********************************************************NNNNNNNNNNNNNNNNNNN3 NNNNNNNNNNNNNNNNNNNNNN############################################ ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SEENNNNNNNNNNNNNNNN3ZjNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3"9NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3(VNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3.|NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN******************** ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;*******************************************************************NNNNNNNNNNNNNNNNN3 NNNNNNNNNNNNNNNNNNNNNNCTOR DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DW 0 ;XFER COUNT DB 0,0,0,0 ;STATUS ; CLRIOPB: DB PB_CLRC NNNNNNNNNNNNNNNN3i[NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3,6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3# NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3)gNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3/ONNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN********* ; SPACE: LD C,' ' JR CO SUBTTL INITIALIZED DATA ;########################################################## NNNNNNNNNNNNNNNN3 tNNNNNNNNNNNNNNNNNNNNNN ;COMMAND DB -1 ;DRIVE (-1= HARD RESET) DW 0 ;TRACK DW 0 ;SECTOR DB 1 SHL PB_INHX ;FLAGS (INHIBIT READ XFER) DW DEFP$NNNNNNNNNNNNNNNN3<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3yeNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3$;NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3*4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN30\NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"Z(Ć`.ʊf4Ўl:֒r@ܖxF⚰~L螶R X&NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN4 5NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4 IXNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4i$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4,INNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4YfNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4 NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4ӼNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4 9NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4&DNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4,|NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4jWNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4 NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4/:NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4ÂNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4! NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4'uNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4-ONNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4 NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6 ԊNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6&~,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6 hNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6RNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6'MNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6 =NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6{NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6rNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6(]#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6HNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6CNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6)nNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6/ĴNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6xNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6}NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6XNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6$NNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6*;ANNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN60NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN큻W%]+NJc1͎i7Ӓo= ٖuCߚ{I垳O뢹U#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN6mNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6|NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6|NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6\NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6%ONNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6+?@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6lNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6SNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6&INNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6 _NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6bNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6:NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6!ЋNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6'z-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6/NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6LNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6BNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6(jNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6 9NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6sNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6)Y"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6/NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6ONNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6 1NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6MNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6oNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6$/~NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6* qNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN60NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"Z(Ć`.ʊf4Ўl:֒r@ܖxF⚰~L螶R X&nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7=ONNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7 ҄NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN73NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7%]NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7+~NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7ºNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7-qNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7koNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7H`NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7 >NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7,SNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7 @NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7X^NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7{QNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7';NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7-bNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7hNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7 KNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7 NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7"\NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7(+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7.1NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7[-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7 x"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN;#oNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN;)`NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN;/NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN;v|NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN; NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN;VNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN;$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN;*5NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN;0ONNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"Z(Ć`.ʊf4Ўl:֒r@ܖxF⚰~L螶R X&NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<#PNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN< ̛NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<%CNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<+`NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<ܥNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<3nNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<upNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<VNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN< !NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<,LNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN< _NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<FANNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<eNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<'%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<-}NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<vNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN< U NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<"CNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<(5NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<..NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<E2NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN< f=NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN< #NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<#rNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN</NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<aNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN< NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<$pNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<*SNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<0RNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN큻W%]+NJc1͎i7Ӓo= ٖuCߚ{I垳O뢹U#NNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<`NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN< NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<%tNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<+WNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<^NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<B@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<aONNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN< NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<&!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<,|NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<ؤNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN< 7oNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<qqNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<R~NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<! NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<-MNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<A3NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN< bNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=%5`NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=+oNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=ENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=|NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN= NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN= ʕNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=&`3NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN= NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN= vNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=MNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN='SNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN= #NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=eNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=mNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN="NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN=(CdNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>8NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN> !NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>DNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>DNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>1NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>tNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN> QINNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>,$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN> 7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>GNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>!bxNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>-'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>kNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN> dNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>TNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>zNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>"7+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>.rFNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>ZNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN> UNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>gNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>KNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>/AwNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN> NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN> NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>2NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>uNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>wNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>0R:NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺V$\*Ɗb0̎h6Ғn< ؖtBޚzH䞲NꢸT"NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN>SNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN> NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>tNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>sNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>CNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN> fyNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>,#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>5NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN> NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>pNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>!UHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>-%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>[NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN> TNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>cNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>JNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>.EvNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>jNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN> eNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>PNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>{NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>#3*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>/vGNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>9NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN> %NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>ENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>0e NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#񁿂[)ņa/ˊg5юm; גsAݖyG㚱M鞷S!Y'NNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN?*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN? WGNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?w;NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?2VNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?GyNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?ͣNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN? 'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?&[NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?,bNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?tHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?1%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?ݝNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?'jNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?-QNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?"hNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?gNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?"ANNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?(TNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?YNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?T4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?#rNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?)eNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?/7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN? dvNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?D NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?gNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?$9NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?*6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?0$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN큻W%]+NJc1͎i7Ӓo= ٖuCߚ{I垳O뢹U#NNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN?%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN? `wNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?@ NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?fNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?%8NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?+7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?pINNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?5$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?ٜNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?&kNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?,UNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?CxNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?ɢNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?!#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?'ZNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?-fNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?XNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?P5NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?"vNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?(dNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?.3NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?&iNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?cNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?#ENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?)UNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?/NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN? SFNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?s:NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?6WNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?$ NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN?0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#񁿂[)ņa/ˊg5юm; גsAݖyG㚱M鞷S!Y'NNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@kNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@%NNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@+mNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@>)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@x7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@[8NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@ fNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@, NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@KNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@h NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@!WNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@'(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@-:NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@{DNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@ XKNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@UNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@(8NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@.iNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@HuNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@ kzNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@-dNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@¯NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@#5NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@) NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@/XNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@ґNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@=ZNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@$}NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@*^NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN쁺V$\*Ɗb0̎h6Ғn< ؖtBޚzH䞲NꢸT"NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@֐NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@9[NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@%yNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@+ZNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@ONNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@lNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@ VNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@&,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@,;NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@ :(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@|6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@_9NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@!gNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@- NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@LtNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@ o{NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@)eNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@ƮNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@"4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@.YNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@ENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@ \JNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@TNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN@)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNAvNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA[NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA)}JNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA/NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNAkNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA YNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNAKNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNAHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA$ NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA*(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA0ġNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN큻W%]+NJc1͎i7Ӓo= ٖuCߚ{I垳O뢹U#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNA5NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNAoNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA XNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNAONNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNAINNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA+,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNAfNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA9NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA&ZDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNAWNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA LNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA:NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA'iuNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA:NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNAwNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA_NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA(yKNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA *NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNAFNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNAlNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA)JzNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA/NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA\NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA iNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA|NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNAxNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA$<&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA*)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"Z(Ć`.ʊf4Ўl:֒r@ܖxF⚰~L螶R X&NNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBiNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB ,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNBINNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB,.SNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB8NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB @NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB}NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB^NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNBQNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB!XNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB-bNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNBnNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB" \NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB.H1NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB "NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB]NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNBmNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB)ѦNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB/{NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB~NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB (NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNBMNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNB0hMNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#񁿂[)ņa/ˊg5юm; גsAݖyG㚱M鞷S!Y'NNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCmNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC ZNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCz|NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC%ONNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC+@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCJ>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCSNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC *NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC,oNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCyNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC ǖNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC+.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCnCNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC#HNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC/ NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC ^NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC~}NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC;NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC$NNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC*ANNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNC0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#񁿂[)ņa/ˊg5юm; גsAݖyG㚱M鞷S!Y'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDN@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND -NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND+QNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDĚNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDnNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND("NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDmONNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND!HNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND- NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND~NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDԤNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND;oNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND(>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND.XNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDM3NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND^NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND#.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND/kNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND 8NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND`NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND] NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND$SNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND*\NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND0xNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN큻W%]+NJc1͎i7Ӓo= ٖuCߚ{I垳O뢹U#NNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDypNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND <NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDaNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDY NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND%RNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND+]NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND,#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDiNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND LNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND, NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDZNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND'0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND-:NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDI2NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND _NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND"*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND.oNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDzNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDХNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND?nNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND)?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND/\NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND ,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND/PNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDj=NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND$cNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND*lNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND0ONNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#񁿂[)ņa/ˊg5юm; גsAݖyG㚱M鞷S!Y'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNE8NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNERNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE }NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE]NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNEmNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNElNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNErNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE}NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE #NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE,HNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE^NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE ]NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNECNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNELNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE!>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE-{NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNEMNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE"kANNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE..,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE ?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE;NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE~NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE#XpNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE/NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNEcNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNEnNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE0PNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN큻W%]+NJc1͎i7Ӓo= ٖuCߚ{I垳O뢹U#NNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNEbNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE JNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNEjNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE/NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNEZNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE\NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNEBNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNEMNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE :NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE,~NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNEiNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE mNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNEsNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE|NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE! "NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE-LONNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE1NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE >NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNEzNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE"\qNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNEINNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE#o@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE/*-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNESNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE yNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNEYNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE/NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNE09`NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#񁿂[)ņa/ˊg5юm; גsAݖyG㚱M鞷S!Y'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNF(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF ENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF9NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFTNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF%i NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF+JNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF{NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF_NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF|NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF uNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFdNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF%^:NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF+}5NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFKNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFhNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFKNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF& iNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFzNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF[NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFxNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF'8XNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF-דNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFkNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF HNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFZNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF"ǭNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF((fNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFXNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF {NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFkNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF=NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF)WNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF/NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF DNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF8NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNFUNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF$m NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF*NNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNF0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#񁿂[)ņa/ˊg5юm; גsAݖyG㚱M鞷S!Y'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG՜NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG:NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG_FNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG+VNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNGxHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG(^NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG.tNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG.hNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG gNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNGKyNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG#(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG)mNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG/ENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG{;NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG[GNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG*8NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#񁿂[)ņa/ˊg5юm; גsAݖyG㚱M鞷S!Y'NNNNNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHrNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH DNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHdcNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH%PNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH+_NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHT!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH 4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH,qNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHgNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH"}NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH'2NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH-BNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH ݈NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH10NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHt]NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH"RNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH( NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHͶNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHGlNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH#aNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH)=NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH/$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH w.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHWRNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH$aNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH*nNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH07NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN큻W%]+NJc1͎i7Ӓo= ٖuCߚ{I垳O뢹U#nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNH6BNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH s/NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHSSNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH%`NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH+oNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHcNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH&|NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH&3NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH,FNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHP NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHMNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH!0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH-uNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHɷNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHCmNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH"eNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNH(